Content-Security-Policy: default-src 'none'
Content-Type: text/plain; charset=UTF-8
Content-Length: 3878
Content-Disposition: inline; filename="365-MIPS-BCM63XX-allow-setting-a-pci-bus-device-for-fall.patch"
Last-Modified: Wed, 28 Aug 2024 05:26:54 GMT
Expires: Sat, 26 Aug 2034 05:26:54 GMT
ETag: "40591e5f2e0fe76c5f96d62cb9b0d2a68721028b"

From f393eaacf178e7e8a61eb11a96edd7dfb35cb49d Mon Sep 17 00:00:00 2001
From: Jonas Gorski <jogo@openwrt.org>
Date: Thu, 31 Jul 2014 20:39:44 +0200
Subject: [PATCH 10/10] MIPS: BCM63XX: allow setting a pci bus/device for
 fallback sprom

Warn if the set pci bus/slot does not match the actual request.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
---
 arch/mips/bcm63xx/sprom.c                          | 31 ++++++++++++++++++----
 .../asm/mach-bcm63xx/bcm63xx_fallback_sprom.h      |  3 +++
 2 files changed, 29 insertions(+), 5 deletions(-)

--- a/arch/mips/bcm63xx/sprom.c
+++ b/arch/mips/bcm63xx/sprom.c
@@ -381,13 +381,25 @@ static __initconst u16 bcm4331_sprom[] =
 
 #endif  /* CONFIG_BCMA_HOST_PCI */
 
-static struct ssb_sprom bcm63xx_sprom;
+struct fallback_sprom_match {
+	u8 pci_bus;
+	u8 pci_dev;
+	struct ssb_sprom sprom;
+};
+
+static struct fallback_sprom_match fallback_sprom;
 
 #if defined(CONFIG_SSB_PCIHOST)
 int bcm63xx_get_fallback_ssb_sprom(struct ssb_bus *bus, struct ssb_sprom *out)
 {
 	if (bus->bustype == SSB_BUSTYPE_PCI) {
-		memcpy(out, &bcm63xx_sprom, sizeof(struct ssb_sprom));
+		if (bus->host_pci->bus->number != fallback_sprom.pci_bus ||
+		    PCI_SLOT(bus->host_pci->devfn) != fallback_sprom.pci_dev)
+			pr_warn("ssb_fallback_sprom: pci bus/device num mismatch: expected %i/%i, but got %i/%i\n",
+				fallback_sprom.pci_bus, fallback_sprom.pci_dev,
+				bus->host_pci->bus->number,
+				PCI_SLOT(bus->host_pci->devfn));
+		memcpy(out, &fallback_sprom.sprom, sizeof(struct ssb_sprom));
 		return 0;
 	} else {
 		printk(KERN_ERR PFX "unable to fill SPROM for given bustype.\n");
@@ -400,7 +412,13 @@ int bcm63xx_get_fallback_ssb_sprom(struc
 int bcm63xx_get_fallback_bcma_sprom(struct bcma_bus *bus, struct ssb_sprom *out)
 {
 	if (bus->hosttype == BCMA_HOSTTYPE_PCI) {
-		memcpy(out, &bcm63xx_sprom, sizeof(struct ssb_sprom));
+		if (bus->host_pci->bus->number != fallback_sprom.pci_bus ||
+		    PCI_SLOT(bus->host_pci->devfn) != fallback_sprom.pci_dev)
+			pr_warn("bcma_fallback_sprom: pci bus/device num mismatch: expected %i/%i, but got %i/%i\n",
+				fallback_sprom.pci_bus, fallback_sprom.pci_dev,
+				bus->host_pci->bus->number,
+				PCI_SLOT(bus->host_pci->devfn));
+		memcpy(out, &fallback_sprom.sprom, sizeof(struct ssb_sprom));
 		return 0;
 	} else {
 		printk(KERN_ERR PFX "unable to fill SPROM for given bustype.\n");
@@ -962,8 +980,8 @@ int __init bcm63xx_register_fallback_spr
 		break;
 #endif
 	case SPROM_DEFAULT:
-		memcpy(&bcm63xx_sprom, &bcm63xx_default_sprom,
-		       sizeof(bcm63xx_sprom));
+		memcpy(&fallback_sprom.sprom, &bcm63xx_default_sprom,
+		       sizeof(bcm63xx_default_sprom));
 		break;
 	default:
 		return -EINVAL;
@@ -973,12 +991,15 @@ int __init bcm63xx_register_fallback_spr
 		sprom_apply_fixups(template_sprom, data->board_fixups,
 				   data->num_board_fixups);
 
-		sprom_extract(&bcm63xx_sprom, template_sprom, size);
+		sprom_extract(&fallback_sprom.sprom, template_sprom, size);
 	}
 
-	memcpy(bcm63xx_sprom.il0mac, data->mac_addr, ETH_ALEN);
-	memcpy(bcm63xx_sprom.et0mac, data->mac_addr, ETH_ALEN);
-	memcpy(bcm63xx_sprom.et1mac, data->mac_addr, ETH_ALEN);
+	memcpy(fallback_sprom.sprom.il0mac, data->mac_addr, ETH_ALEN);
+	memcpy(fallback_sprom.sprom.et0mac, data->mac_addr, ETH_ALEN);
+	memcpy(fallback_sprom.sprom.et1mac, data->mac_addr, ETH_ALEN);
+
+	fallback_sprom.pci_bus = data->pci_bus;
+	fallback_sprom.pci_dev = data->pci_dev;
 #endif /* defined(CONFIG_SSB_PCIHOST) || defined(CONFIG_BCMA_HOST_PCI) */
 
 #if defined(CONFIG_SSB_PCIHOST)
--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_fallback_sprom.h
+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_fallback_sprom.h
@@ -30,6 +30,9 @@ struct fallback_sprom_data {
 	u8 mac_addr[ETH_ALEN];
 	enum sprom_type type;
 
+	u8 pci_bus;
+	u8 pci_dev;
+
 	struct sprom_fixup *board_fixups;
 	unsigned int num_board_fixups;
 };
/em-br6478acv2/lede/master-31e0f0ae/tree/target?h=do-work/Edimax-v2&amp;id=d9194da8824b4a616d641e552e813a74faf542e1'>target</a>/<a href='/cgit/openwrt/em-br6478acv2/lede/master-31e0f0ae/tree/target/linux?h=do-work/Edimax-v2&amp;id=d9194da8824b4a616d641e552e813a74faf542e1'>linux</a>/<a href='/cgit/openwrt/em-br6478acv2/lede/master-31e0f0ae/tree/target/linux/brcm63xx?h=do-work/Edimax-v2&amp;id=d9194da8824b4a616d641e552e813a74faf542e1'>brcm63xx</a>/<a href='/cgit/openwrt/em-br6478acv2/lede/master-31e0f0ae/tree/target/linux/brcm63xx/patches-3.14?h=do-work/Edimax-v2&amp;id=d9194da8824b4a616d641e552e813a74faf542e1'>patches-3.14</a>/<a href='/cgit/openwrt/em-br6478acv2/lede/master-31e0f0ae/tree/target/linux/brcm63xx/patches-3.14/103-MIPS-BCM63XX-add-OHCI-EHCI-configuration-bits-to-com.patch?h=do-work/Edimax-v2&amp;id=d9194da8824b4a616d641e552e813a74faf542e1'>103-MIPS-BCM63XX-add-OHCI-EHCI-configuration-bits-to-com.patch</a></div><div class='content'>blob: 40bbe083a7bd8bef524c47a8b61a73cd46377ce2 (<a href='/cgit/openwrt/em-br6478acv2/lede/master-31e0f0ae/plain/target/linux/brcm63xx/patches-3.14/103-MIPS-BCM63XX-add-OHCI-EHCI-configuration-bits-to-com.patch?h=do-work/Edimax-v2&amp;id=d9194da8824b4a616d641e552e813a74faf542e1'>plain</a>)
<table summary='blob content' class='blob'>
<tr><td class='linenumbers'><pre><a id='n1' href='#n1'>1</a>
<a id='n2' href='#n2'>2</a>
<a id='n3' href='#n3'>3</a>
<a id='n4' href='#n4'>4</a>
<a id='n5' href='#n5'>5</a>
<a id='n6' href='#n6'>6</a>
<a id='n7' href='#n7'>7</a>
<a id='n8' href='#n8'>8</a>
<a id='n9' href='#n9'>9</a>
<a id='n10' href='#n10'>10</a>
<a id='n11' href='#n11'>11</a>
<a id='n12' href='#n12'>12</a>
<a id='n13' href='#n13'>13</a>
<a id='n14' href='#n14'>14</a>
<a id='n15' href='#n15'>15</a>
<a id='n16' href='#n16'>16</a>
<a id='n17' href='#n17'>17</a>
<a id='n18' href='#n18'>18</a>
<a id='n19' href='#n19'>19</a>
<a id='n20' href='#n20'>20</a>
<a id='n21' href='#n21'>21</a>
<a id='n22' href='#n22'>22</a>
<a id='n23' href='#n23'>23</a>
<a id='n24' href='#n24'>24</a>
<a id='n25' href='#n25'>25</a>
<a id='n26' href='#n26'>26</a>
<a id='n27' href='#n27'>27</a>
<a id='n28' href='#n28'>28</a>
<a id='n29' href='#n29'>29</a>
<a id='n30' href='#n30'>30</a>
<a id='n31' href='#n31'>31</a>
<a id='n32' href='#n32'>32</a>
<a id='n33' href='#n33'>33</a>
<a id='n34' href='#n34'>34</a>
<a id='n35' href='#n35'>35</a>
<a id='n36' href='#n36'>36</a>
<a id='n37' href='#n37'>37</a>
<a id='n38' href='#n38'>38</a>
<a id='n39' href='#n39'>39</a>
<a id='n40' href='#n40'>40</a>
<a id='n41' href='#n41'>41</a>
<a id='n42' href='#n42'>42</a>
<a id='n43' href='#n43'>43</a>
<a id='n44' href='#n44'>44</a>
<a id='n45' href='#n45'>45</a>
<a id='n46' href='#n46'>46</a>
<a id='n47' href='#n47'>47</a>
<a id='n48' href='#n48'>48</a>
<a id='n49' href='#n49'>49</a>
<a id='n50' href='#n50'>50</a>
<a id='n51' href='#n51'>51</a>
<a id='n52' href='#n52'>52</a>
<a id='n53' href='#n53'>53</a>
<a id='n54' href='#n54'>54</a>
<a id='n55' href='#n55'>55</a>
<a id='n56' href='#n56'>56</a>
<a id='n57' href='#n57'>57</a>
<a id='n58' href='#n58'>58</a>
<a id='n59' href='#n59'>59</a>
<a id='n60' href='#n60'>60</a>
<a id='n61' href='#n61'>61</a>
<a id='n62' href='#n62'>62</a>
<a id='n63' href='#n63'>63</a>
<a id='n64' href='#n64'>64</a>
<a id='n65' href='#n65'>65</a>
<a id='n66' href='#n66'>66</a>
<a id='n67' href='#n67'>67</a>
<a id='n68' href='#n68'>68</a>
<a id='n69' href='#n69'>69</a>
<a id='n70' href='#n70'>70</a>
<a id='n71' href='#n71'>71</a>
<a id='n72' href='#n72'>72</a>
<a id='n73' href='#n73'>73</a>
<a id='n74' href='#n74'>74</a>
<a id='n75' href='#n75'>75</a>
<a id='n76' href='#n76'>76</a>
<a id='n77' href='#n77'>77</a>
<a id='n78' href='#n78'>78</a>
<a id='n79' href='#n79'>79</a>
<a id='n80' href='#n80'>80</a>
<a id='n81' href='#n81'>81</a>
<a id='n82' href='#n82'>82</a>
<a id='n83' href='#n83'>83</a>
<a id='n84' href='#n84'>84</a>
<a id='n85' href='#n85'>85</a>
<a id='n86' href='#n86'>86</a>
<a id='n87' href='#n87'>87</a>
<a id='n88' href='#n88'>88</a>
<a id='n89' href='#n89'>89</a>
<a id='n90' href='#n90'>90</a>
<a id='n91' href='#n91'>91</a>
<a id='n92' href='#n92'>92</a>
<a id='n93' href='#n93'>93</a>
<a id='n94' href='#n94'>94</a>
<a id='n95' href='#n95'>95</a>
<a id='n96' href='#n96'>96</a>
<a id='n97' href='#n97'>97</a>
<a id='n98' href='#n98'>98</a>
<a id='n99' href='#n99'>99</a>
<a id='n100' href='#n100'>100</a>
<a id='n101' href='#n101'>101</a>
<a id='n102' href='#n102'>102</a>
<a id='n103' href='#n103'>103</a>
<a id='n104' href='#n104'>104</a>
<a id='n105' href='#n105'>105</a>
<a id='n106' href='#n106'>106</a>
<a id='n107' href='#n107'>107</a>
<a id='n108' href='#n108'>108</a>
<a id='n109' href='#n109'>109</a>
<a id='n110' href='#n110'>110</a>
<a id='n111' href='#n111'>111</a>
<a id='n112' href='#n112'>112</a>
<a id='n113' href='#n113'>113</a>
<a id='n114' href='#n114'>114</a>
<a id='n115' href='#n115'>115</a>
<a id='n116' href='#n116'>116</a>
<a id='n117' href='#n117'>117</a>
<a id='n118' href='#n118'>118</a>
<a id='n119' href='#n119'>119</a>
<a id='n120' href='#n120'>120</a>
<a id='n121' href='#n121'>121</a>
<a id='n122' href='#n122'>122</a>
<a id='n123' href='#n123'>123</a>
<a id='n124' href='#n124'>124</a>
<a id='n125' href='#n125'>125</a>
<a id='n126' href='#n126'>126</a>
<a id='n127' href='#n127'>127</a>
<a id='n128' href='#n128'>128</a>
<a id='n129' href='#n129'>129</a>
<a id='n130' href='#n130'>130</a>
<a id='n131' href='#n131'>131</a>
<a id='n132' href='#n132'>132</a>
<a id='n133' href='#n133'>133</a>
<a id='n134' href='#n134'>134</a>
<a id='n135' href='#n135'>135</a>
<a id='n136' href='#n136'>136</a>
<a id='n137' href='#n137'>137</a>
<a id='n138' href='#n138'>138</a>
<a id='n139' href='#n139'>139</a>
<a id='n140' href='#n140'>140</a>
<a id='n141' href='#n141'>141</a>
<a id='n142' href='#n142'>142</a>
<a id='n143' href='#n143'>143</a>
<a id='n144' href='#n144'>144</a>
<a id='n145' href='#n145'>145</a>
<a id='n146' href='#n146'>146</a>
<a id='n147' href='#n147'>147</a>
<a id='n148' href='#n148'>148</a>
<a id='n149' href='#n149'>149</a>
<a id='n150' href='#n150'>150</a>
<a id='n151' href='#n151'>151</a>
<a id='n152' href='#n152'>152</a>
<a id='n153' href='#n153'>153</a>
<a id='n154' href='#n154'>154</a>
<a id='n155' href='#n155'>155</a>
<a id='n156' href='#n156'>156</a>
<a id='n157' href='#n157'>157</a>
<a id='n158' href='#n158'>158</a>
<a id='n159' href='#n159'>159</a>
<a id='n160' href='#n160'>160</a>
<a id='n161' href='#n161'>161</a>
<a id='n162' href='#n162'>162</a>
<a id='n163' href='#n163'>163</a>
<a id='n164' href='#n164'>164</a>
<a id='n165' href='#n165'>165</a>
<a id='n166' href='#n166'>166</a>
<a id='n167' href='#n167'>167</a>
<a id='n168' href='#n168'>168</a>
<a id='n169' href='#n169'>169</a>
</pre></td>
<td class='lines'><pre><code><style>pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span>From 28758a9da77954ed323f86123ef448c6a563c037 Mon Sep 17 00:00:00 2001
From: Florian Fainelli &lt;florian@openwrt.org&gt;
Date: Mon, 28 Jan 2013 20:06:22 +0100
Subject: [PATCH 04/11] MIPS: BCM63XX: add OHCI/EHCI configuration bits to
 common USB code

This patch updates the common USB code touching the USB private
registers with the specific bits to properly enable OHCI and EHCI
controllers on BCM63xx SoCs. As a result we now need to protect access
to Read Modify Write sequences using a spinlock because we cannot
guarantee that any of the exposed helper will not be called
concurrently.

Signed-off-by: Maxime Bizon &lt;mbizon@freebox.fr&gt;
Signed-off-by: Florian Fainelli &lt;florian@openwrt.org&gt;
<span class="gd">---</span>
 arch/mips/bcm63xx/usb-common.c                     |   97 ++++++++++++++++++++
 .../include/asm/mach-bcm63xx/bcm63xx_usb_priv.h    |    2 +
 2 files changed, 99 insertions(+)

<span class="gd">--- a/arch/mips/bcm63xx/usb-common.c</span>
<span class="gi">+++ b/arch/mips/bcm63xx/usb-common.c</span>
<span class="gu">@@ -5,10 +5,12 @@</span>
  * License.  See the file &quot;COPYING&quot; in the main directory of this archive
  * for more details.
  *
<span class="gi">+ * Copyright (C) 2008 Maxime Bizon &lt;mbizon@freebox.fr&gt;</span>
  * Copyright (C) 2012 Kevin Cernekee &lt;cernekee@gmail.com&gt;
  * Copyright (C) 2012 Broadcom Corporation
  *
  */
<span class="gi">+#include &lt;linux/spinlock.h&gt;</span>
 #include &lt;linux/export.h&gt;
 
 #include &lt;bcm63xx_cpu.h&gt;
<span class="gu">@@ -16,9 +18,14 @@</span>
 #include &lt;bcm63xx_io.h&gt;
 #include &lt;bcm63xx_usb_priv.h&gt;
 
<span class="gi">+static DEFINE_SPINLOCK(usb_priv_reg_lock);</span>
<span class="gi">+</span>
 void bcm63xx_usb_priv_select_phy_mode(u32 portmask, bool is_device)
 {
 	u32 val;
<span class="gi">+	unsigned long flags;</span>
<span class="gi">+</span>
<span class="gi">+	spin_lock_irqsave(&amp;usb_priv_reg_lock, flags);</span>
 
 	val = bcm_rset_readl(RSET_USBH_PRIV, USBH_PRIV_UTMI_CTL_6368_REG);
 	if (is_device) {
<span class="gu">@@ -36,12 +43,17 @@ void bcm63xx_usb_priv_select_phy_mode(u3</span>
 	else
 		val &amp;= ~USBH_PRIV_SWAP_USBD_MASK;
 	bcm_rset_writel(RSET_USBH_PRIV, val, USBH_PRIV_SWAP_6368_REG);
<span class="gi">+</span>
<span class="gi">+	spin_unlock_irqrestore(&amp;usb_priv_reg_lock, flags);</span>
 }
 EXPORT_SYMBOL(bcm63xx_usb_priv_select_phy_mode);
 
 void bcm63xx_usb_priv_select_pullup(u32 portmask, bool is_on)
 {
 	u32 val;
<span class="gi">+	unsigned long flags;</span>
<span class="gi">+</span>
<span class="gi">+	spin_lock_irqsave(&amp;usb_priv_reg_lock, flags);</span>
 
 	val = bcm_rset_readl(RSET_USBH_PRIV, USBH_PRIV_UTMI_CTL_6368_REG);
 	if (is_on)
<span class="gu">@@ -49,5 +61,90 @@ void bcm63xx_usb_priv_select_pullup(u32</span>
 	else
 		val |= (portmask &lt;&lt; USBH_PRIV_UTMI_CTL_NODRIV_SHIFT);
 	bcm_rset_writel(RSET_USBH_PRIV, val, USBH_PRIV_UTMI_CTL_6368_REG);
<span class="gi">+</span>
<span class="gi">+	spin_unlock_irqrestore(&amp;usb_priv_reg_lock, flags);</span>
 }
 EXPORT_SYMBOL(bcm63xx_usb_priv_select_pullup);
<span class="gi">+</span>
<span class="gi">+/* The following array represents the meaning of the DESC/DATA</span>
<span class="gi">+ * endian swapping with respect to the CPU configured endianness</span>
<span class="gi">+ *</span>
<span class="gi">+ * DATA	ENDN	mmio	descriptor</span>
<span class="gi">+ * 0	0	BE	invalid</span>
<span class="gi">+ * 0	1	BE	LE</span>
<span class="gi">+ * 1	0	BE	BE</span>
<span class="gi">+ * 1	1	BE	invalid</span>
<span class="gi">+ *</span>
<span class="gi">+ * Since BCM63XX SoCs are configured to be in big-endian mode</span>
<span class="gi">+ * we want configuration at line 3.</span>
<span class="gi">+ */</span>
<span class="gi">+void bcm63xx_usb_priv_ohci_cfg_set(void)</span>
<span class="gi">+{</span>
<span class="gi">+	u32 reg;</span>
<span class="gi">+	unsigned long flags;</span>
<span class="gi">+</span>
<span class="gi">+	spin_lock_irqsave(&amp;usb_priv_reg_lock, flags);</span>
<span class="gi">+</span>
<span class="gi">+	if (BCMCPU_IS_6348())</span>
<span class="gi">+		bcm_rset_writel(RSET_OHCI_PRIV, 0, OHCI_PRIV_REG);</span>
<span class="gi">+	else if (BCMCPU_IS_6358()) {</span>
<span class="gi">+		reg = bcm_rset_readl(RSET_USBH_PRIV, USBH_PRIV_SWAP_6358_REG);</span>
<span class="gi">+		reg &amp;= ~USBH_PRIV_SWAP_OHCI_ENDN_MASK;</span>
<span class="gi">+		reg |= USBH_PRIV_SWAP_OHCI_DATA_MASK;</span>
<span class="gi">+		bcm_rset_writel(RSET_USBH_PRIV, reg, USBH_PRIV_SWAP_6358_REG);</span>
<span class="gi">+		/*</span>
<span class="gi">+		 * The magic value comes for the original vendor BSP</span>
<span class="gi">+		 * and is needed for USB to work. Datasheet does not</span>
<span class="gi">+		 * help, so the magic value is used as-is.</span>
<span class="gi">+		 */</span>
<span class="gi">+		bcm_rset_writel(RSET_USBH_PRIV, 0x1c0020,</span>
<span class="gi">+				USBH_PRIV_TEST_6358_REG);</span>
<span class="gi">+</span>
<span class="gi">+	} else if (BCMCPU_IS_6328() || BCMCPU_IS_6362() || BCMCPU_IS_6368()) {</span>
<span class="gi">+		reg = bcm_rset_readl(RSET_USBH_PRIV, USBH_PRIV_SWAP_6368_REG);</span>
<span class="gi">+		reg &amp;= ~USBH_PRIV_SWAP_OHCI_ENDN_MASK;</span>
<span class="gi">+		reg |= USBH_PRIV_SWAP_OHCI_DATA_MASK;</span>
<span class="gi">+		bcm_rset_writel(RSET_USBH_PRIV, reg, USBH_PRIV_SWAP_6368_REG);</span>
<span class="gi">+</span>
<span class="gi">+		reg = bcm_rset_readl(RSET_USBH_PRIV, USBH_PRIV_SETUP_6368_REG);</span>
<span class="gi">+		reg |= USBH_PRIV_SETUP_IOC_MASK;</span>
<span class="gi">+		bcm_rset_writel(RSET_USBH_PRIV, reg, USBH_PRIV_SETUP_6368_REG);</span>
<span class="gi">+	}</span>
<span class="gi">+</span>
<span class="gi">+	spin_unlock_irqrestore(&amp;usb_priv_reg_lock, flags);</span>
<span class="gi">+}</span>
<span class="gi">+</span>
<span class="gi">+void bcm63xx_usb_priv_ehci_cfg_set(void)</span>
<span class="gi">+{</span>
<span class="gi">+	u32 reg;</span>
<span class="gi">+	unsigned long flags;</span>
<span class="gi">+</span>
<span class="gi">+	spin_lock_irqsave(&amp;usb_priv_reg_lock, flags);</span>
<span class="gi">+</span>
<span class="gi">+	if (BCMCPU_IS_6358()) {</span>
<span class="gi">+		reg = bcm_rset_readl(RSET_USBH_PRIV, USBH_PRIV_SWAP_6358_REG);</span>
<span class="gi">+		reg &amp;= ~USBH_PRIV_SWAP_EHCI_ENDN_MASK;</span>
<span class="gi">+		reg |= USBH_PRIV_SWAP_EHCI_DATA_MASK;</span>
<span class="gi">+		bcm_rset_writel(RSET_USBH_PRIV, reg, USBH_PRIV_SWAP_6358_REG);</span>
<span class="gi">+</span>
<span class="gi">+		/*</span>
<span class="gi">+		 * The magic value comes for the original vendor BSP</span>
<span class="gi">+		 * and is needed for USB to work. Datasheet does not</span>
<span class="gi">+		 * help, so the magic value is used as-is.</span>
<span class="gi">+		 */</span>
<span class="gi">+		bcm_rset_writel(RSET_USBH_PRIV, 0x1c0020,</span>
<span class="gi">+				USBH_PRIV_TEST_6358_REG);</span>
<span class="gi">+</span>
<span class="gi">+	} else if (BCMCPU_IS_6328() || BCMCPU_IS_6362() || BCMCPU_IS_6368()) {</span>
<span class="gi">+		reg = bcm_rset_readl(RSET_USBH_PRIV, USBH_PRIV_SWAP_6368_REG);</span>
<span class="gi">+		reg &amp;= ~USBH_PRIV_SWAP_EHCI_ENDN_MASK;</span>
<span class="gi">+		reg |= USBH_PRIV_SWAP_EHCI_DATA_MASK;</span>
<span class="gi">+		bcm_rset_writel(RSET_USBH_PRIV, reg, USBH_PRIV_SWAP_6368_REG);</span>
<span class="gi">+</span>
<span class="gi">+		reg = bcm_rset_readl(RSET_USBH_PRIV, USBH_PRIV_SETUP_6368_REG);</span>
<span class="gi">+		reg |= USBH_PRIV_SETUP_IOC_MASK;</span>
<span class="gi">+		bcm_rset_writel(RSET_USBH_PRIV, reg, USBH_PRIV_SETUP_6368_REG);</span>
<span class="gi">+	}</span>
<span class="gi">+</span>
<span class="gi">+	spin_unlock_irqrestore(&amp;usb_priv_reg_lock, flags);</span>
<span class="gi">+}</span>
<span class="gd">--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_usb_priv.h</span>
<span class="gi">+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_usb_priv.h</span>
<span class="gu">@@ -5,5 +5,7 @@</span>
 
 void bcm63xx_usb_priv_select_phy_mode(u32 portmask, bool is_device);
 void bcm63xx_usb_priv_select_pullup(u32 portmask, bool is_on);
<span class="gi">+void bcm63xx_usb_priv_ohci_cfg_set(void);</span>
<span class="gi">+void bcm63xx_usb_priv_ehci_cfg_set(void);</span>
 
 #endif /* BCM63XX_USB_PRIV_H_ */
</pre></div>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.25.1</a>) at 2024-08-28 05:26:54 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
