020-ssb_update.patch 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917
  1. --- a/drivers/ssb/b43_pci_bridge.c
  2. +++ b/drivers/ssb/b43_pci_bridge.c
  3. @@ -29,11 +29,14 @@ static const struct pci_device_id b43_pc
  4. { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4319) },
  5. { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4320) },
  6. { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4321) },
  7. + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4322) },
  8. + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43222) },
  9. { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4324) },
  10. { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4325) },
  11. { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4328) },
  12. { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4329) },
  13. { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x432b) },
  14. + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x432c) },
  15. { 0, },
  16. };
  17. MODULE_DEVICE_TABLE(pci, b43_pci_bridge_tbl);
  18. --- a/drivers/ssb/driver_chipcommon_pmu.c
  19. +++ b/drivers/ssb/driver_chipcommon_pmu.c
  20. @@ -13,6 +13,9 @@
  21. #include <linux/ssb/ssb_driver_chipcommon.h>
  22. #include <linux/delay.h>
  23. #include <linux/export.h>
  24. +#ifdef CONFIG_BCM47XX
  25. +#include <asm/mach-bcm47xx/nvram.h>
  26. +#endif
  27. #include "ssb_private.h"
  28. @@ -92,10 +95,6 @@ static void ssb_pmu0_pllinit_r0(struct s
  29. u32 pmuctl, tmp, pllctl;
  30. unsigned int i;
  31. - if ((bus->chip_id == 0x5354) && !crystalfreq) {
  32. - /* The 5354 crystal freq is 25MHz */
  33. - crystalfreq = 25000;
  34. - }
  35. if (crystalfreq)
  36. e = pmu0_plltab_find_entry(crystalfreq);
  37. if (!e)
  38. @@ -321,7 +320,11 @@ static void ssb_pmu_pll_init(struct ssb_
  39. u32 crystalfreq = 0; /* in kHz. 0 = keep default freq. */
  40. if (bus->bustype == SSB_BUSTYPE_SSB) {
  41. - /* TODO: The user may override the crystal frequency. */
  42. +#ifdef CONFIG_BCM47XX
  43. + char buf[20];
  44. + if (nvram_getenv("xtalfreq", buf, sizeof(buf)) >= 0)
  45. + crystalfreq = simple_strtoul(buf, NULL, 0);
  46. +#endif
  47. }
  48. switch (bus->chip_id) {
  49. @@ -330,7 +333,11 @@ static void ssb_pmu_pll_init(struct ssb_
  50. ssb_pmu1_pllinit_r0(cc, crystalfreq);
  51. break;
  52. case 0x4328:
  53. + ssb_pmu0_pllinit_r0(cc, crystalfreq);
  54. + break;
  55. case 0x5354:
  56. + if (crystalfreq == 0)
  57. + crystalfreq = 25000;
  58. ssb_pmu0_pllinit_r0(cc, crystalfreq);
  59. break;
  60. case 0x4322:
  61. @@ -607,3 +614,34 @@ void ssb_pmu_set_ldo_paref(struct ssb_ch
  62. EXPORT_SYMBOL(ssb_pmu_set_ldo_voltage);
  63. EXPORT_SYMBOL(ssb_pmu_set_ldo_paref);
  64. +
  65. +u32 ssb_pmu_get_cpu_clock(struct ssb_chipcommon *cc)
  66. +{
  67. + struct ssb_bus *bus = cc->dev->bus;
  68. +
  69. + switch (bus->chip_id) {
  70. + case 0x5354:
  71. + /* 5354 chip uses a non programmable PLL of frequency 240MHz */
  72. + return 240000000;
  73. + default:
  74. + ssb_printk(KERN_ERR PFX
  75. + "ERROR: PMU cpu clock unknown for device %04X\n",
  76. + bus->chip_id);
  77. + return 0;
  78. + }
  79. +}
  80. +
  81. +u32 ssb_pmu_get_controlclock(struct ssb_chipcommon *cc)
  82. +{
  83. + struct ssb_bus *bus = cc->dev->bus;
  84. +
  85. + switch (bus->chip_id) {
  86. + case 0x5354:
  87. + return 120000000;
  88. + default:
  89. + ssb_printk(KERN_ERR PFX
  90. + "ERROR: PMU controlclock unknown for device %04X\n",
  91. + bus->chip_id);
  92. + return 0;
  93. + }
  94. +}
  95. --- a/drivers/ssb/driver_mipscore.c
  96. +++ b/drivers/ssb/driver_mipscore.c
  97. @@ -190,16 +190,32 @@ static void ssb_mips_flash_detect(struct
  98. {
  99. struct ssb_bus *bus = mcore->dev->bus;
  100. - mcore->flash_buswidth = 2;
  101. - if (bus->chipco.dev) {
  102. - mcore->flash_window = 0x1c000000;
  103. - mcore->flash_window_size = 0x02000000;
  104. + /* When there is no chipcommon on the bus there is 4MB flash */
  105. + if (!bus->chipco.dev) {
  106. + mcore->pflash.present = true;
  107. + mcore->pflash.buswidth = 2;
  108. + mcore->pflash.window = SSB_FLASH1;
  109. + mcore->pflash.window_size = SSB_FLASH1_SZ;
  110. + return;
  111. + }
  112. +
  113. + /* There is ChipCommon, so use it to read info about flash */
  114. + switch (bus->chipco.capabilities & SSB_CHIPCO_CAP_FLASHT) {
  115. + case SSB_CHIPCO_FLASHT_STSER:
  116. + case SSB_CHIPCO_FLASHT_ATSER:
  117. + pr_err("Serial flash not supported\n");
  118. + break;
  119. + case SSB_CHIPCO_FLASHT_PARA:
  120. + pr_debug("Found parallel flash\n");
  121. + mcore->pflash.present = true;
  122. + mcore->pflash.window = SSB_FLASH2;
  123. + mcore->pflash.window_size = SSB_FLASH2_SZ;
  124. if ((ssb_read32(bus->chipco.dev, SSB_CHIPCO_FLASH_CFG)
  125. & SSB_CHIPCO_CFG_DS16) == 0)
  126. - mcore->flash_buswidth = 1;
  127. - } else {
  128. - mcore->flash_window = 0x1fc00000;
  129. - mcore->flash_window_size = 0x00400000;
  130. + mcore->pflash.buswidth = 1;
  131. + else
  132. + mcore->pflash.buswidth = 2;
  133. + break;
  134. }
  135. }
  136. @@ -208,6 +224,9 @@ u32 ssb_cpu_clock(struct ssb_mipscore *m
  137. struct ssb_bus *bus = mcore->dev->bus;
  138. u32 pll_type, n, m, rate = 0;
  139. + if (bus->chipco.capabilities & SSB_CHIPCO_CAP_PMU)
  140. + return ssb_pmu_get_cpu_clock(&bus->chipco);
  141. +
  142. if (bus->extif.dev) {
  143. ssb_extif_get_clockcontrol(&bus->extif, &pll_type, &n, &m);
  144. } else if (bus->chipco.dev) {
  145. --- a/drivers/ssb/main.c
  146. +++ b/drivers/ssb/main.c
  147. @@ -140,19 +140,6 @@ static void ssb_device_put(struct ssb_de
  148. put_device(dev->dev);
  149. }
  150. -static inline struct ssb_driver *ssb_driver_get(struct ssb_driver *drv)
  151. -{
  152. - if (drv)
  153. - get_driver(&drv->drv);
  154. - return drv;
  155. -}
  156. -
  157. -static inline void ssb_driver_put(struct ssb_driver *drv)
  158. -{
  159. - if (drv)
  160. - put_driver(&drv->drv);
  161. -}
  162. -
  163. static int ssb_device_resume(struct device *dev)
  164. {
  165. struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
  166. @@ -250,11 +237,9 @@ int ssb_devices_freeze(struct ssb_bus *b
  167. ssb_device_put(sdev);
  168. continue;
  169. }
  170. - sdrv = ssb_driver_get(drv_to_ssb_drv(sdev->dev->driver));
  171. - if (!sdrv || SSB_WARN_ON(!sdrv->remove)) {
  172. - ssb_device_put(sdev);
  173. + sdrv = drv_to_ssb_drv(sdev->dev->driver);
  174. + if (SSB_WARN_ON(!sdrv->remove))
  175. continue;
  176. - }
  177. sdrv->remove(sdev);
  178. ctx->device_frozen[i] = 1;
  179. }
  180. @@ -293,7 +278,6 @@ int ssb_devices_thaw(struct ssb_freeze_c
  181. dev_name(sdev->dev));
  182. result = err;
  183. }
  184. - ssb_driver_put(sdrv);
  185. ssb_device_put(sdev);
  186. }
  187. @@ -1094,6 +1078,9 @@ u32 ssb_clockspeed(struct ssb_bus *bus)
  188. u32 plltype;
  189. u32 clkctl_n, clkctl_m;
  190. + if (bus->chipco.capabilities & SSB_CHIPCO_CAP_PMU)
  191. + return ssb_pmu_get_controlclock(&bus->chipco);
  192. +
  193. if (ssb_extif_available(&bus->extif))
  194. ssb_extif_get_clockcontrol(&bus->extif, &plltype,
  195. &clkctl_n, &clkctl_m);
  196. --- a/drivers/ssb/pci.c
  197. +++ b/drivers/ssb/pci.c
  198. @@ -178,6 +178,18 @@ err_pci:
  199. #define SPEX(_outvar, _offset, _mask, _shift) \
  200. SPEX16(_outvar, _offset, _mask, _shift)
  201. +#define SPEX_ARRAY8(_field, _offset, _mask, _shift) \
  202. + do { \
  203. + SPEX(_field[0], _offset + 0, _mask, _shift); \
  204. + SPEX(_field[1], _offset + 2, _mask, _shift); \
  205. + SPEX(_field[2], _offset + 4, _mask, _shift); \
  206. + SPEX(_field[3], _offset + 6, _mask, _shift); \
  207. + SPEX(_field[4], _offset + 8, _mask, _shift); \
  208. + SPEX(_field[5], _offset + 10, _mask, _shift); \
  209. + SPEX(_field[6], _offset + 12, _mask, _shift); \
  210. + SPEX(_field[7], _offset + 14, _mask, _shift); \
  211. + } while (0)
  212. +
  213. static inline u8 ssb_crc8(u8 crc, u8 data)
  214. {
  215. @@ -331,7 +343,6 @@ static void sprom_extract_r123(struct ss
  216. {
  217. int i;
  218. u16 v;
  219. - s8 gain;
  220. u16 loc[3];
  221. if (out->revision == 3) /* rev 3 moved MAC */
  222. @@ -361,8 +372,9 @@ static void sprom_extract_r123(struct ss
  223. SPEX(et0mdcport, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET0M, 14);
  224. SPEX(et1mdcport, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET1M, 15);
  225. SPEX(board_rev, SSB_SPROM1_BINF, SSB_SPROM1_BINF_BREV, 0);
  226. - SPEX(country_code, SSB_SPROM1_BINF, SSB_SPROM1_BINF_CCODE,
  227. - SSB_SPROM1_BINF_CCODE_SHIFT);
  228. + if (out->revision == 1)
  229. + SPEX(country_code, SSB_SPROM1_BINF, SSB_SPROM1_BINF_CCODE,
  230. + SSB_SPROM1_BINF_CCODE_SHIFT);
  231. SPEX(ant_available_a, SSB_SPROM1_BINF, SSB_SPROM1_BINF_ANTA,
  232. SSB_SPROM1_BINF_ANTA_SHIFT);
  233. SPEX(ant_available_bg, SSB_SPROM1_BINF, SSB_SPROM1_BINF_ANTBG,
  234. @@ -388,22 +400,16 @@ static void sprom_extract_r123(struct ss
  235. SPEX(boardflags_lo, SSB_SPROM1_BFLLO, 0xFFFF, 0);
  236. if (out->revision >= 2)
  237. SPEX(boardflags_hi, SSB_SPROM2_BFLHI, 0xFFFF, 0);
  238. + SPEX(alpha2[0], SSB_SPROM1_CCODE, 0xff00, 8);
  239. + SPEX(alpha2[1], SSB_SPROM1_CCODE, 0x00ff, 0);
  240. /* Extract the antenna gain values. */
  241. - gain = r123_extract_antgain(out->revision, in,
  242. - SSB_SPROM1_AGAIN_BG,
  243. - SSB_SPROM1_AGAIN_BG_SHIFT);
  244. - out->antenna_gain.ghz24.a0 = gain;
  245. - out->antenna_gain.ghz24.a1 = gain;
  246. - out->antenna_gain.ghz24.a2 = gain;
  247. - out->antenna_gain.ghz24.a3 = gain;
  248. - gain = r123_extract_antgain(out->revision, in,
  249. - SSB_SPROM1_AGAIN_A,
  250. - SSB_SPROM1_AGAIN_A_SHIFT);
  251. - out->antenna_gain.ghz5.a0 = gain;
  252. - out->antenna_gain.ghz5.a1 = gain;
  253. - out->antenna_gain.ghz5.a2 = gain;
  254. - out->antenna_gain.ghz5.a3 = gain;
  255. + out->antenna_gain.a0 = r123_extract_antgain(out->revision, in,
  256. + SSB_SPROM1_AGAIN_BG,
  257. + SSB_SPROM1_AGAIN_BG_SHIFT);
  258. + out->antenna_gain.a1 = r123_extract_antgain(out->revision, in,
  259. + SSB_SPROM1_AGAIN_A,
  260. + SSB_SPROM1_AGAIN_A_SHIFT);
  261. }
  262. /* Revs 4 5 and 8 have partially shared layout */
  263. @@ -464,14 +470,17 @@ static void sprom_extract_r45(struct ssb
  264. SPEX(et0phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET0A, 0);
  265. SPEX(et1phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET1A,
  266. SSB_SPROM4_ETHPHY_ET1A_SHIFT);
  267. + SPEX(board_rev, SSB_SPROM4_BOARDREV, 0xFFFF, 0);
  268. if (out->revision == 4) {
  269. - SPEX(country_code, SSB_SPROM4_CCODE, 0xFFFF, 0);
  270. + SPEX(alpha2[0], SSB_SPROM4_CCODE, 0xff00, 8);
  271. + SPEX(alpha2[1], SSB_SPROM4_CCODE, 0x00ff, 0);
  272. SPEX(boardflags_lo, SSB_SPROM4_BFLLO, 0xFFFF, 0);
  273. SPEX(boardflags_hi, SSB_SPROM4_BFLHI, 0xFFFF, 0);
  274. SPEX(boardflags2_lo, SSB_SPROM4_BFL2LO, 0xFFFF, 0);
  275. SPEX(boardflags2_hi, SSB_SPROM4_BFL2HI, 0xFFFF, 0);
  276. } else {
  277. - SPEX(country_code, SSB_SPROM5_CCODE, 0xFFFF, 0);
  278. + SPEX(alpha2[0], SSB_SPROM5_CCODE, 0xff00, 8);
  279. + SPEX(alpha2[1], SSB_SPROM5_CCODE, 0x00ff, 0);
  280. SPEX(boardflags_lo, SSB_SPROM5_BFLLO, 0xFFFF, 0);
  281. SPEX(boardflags_hi, SSB_SPROM5_BFLHI, 0xFFFF, 0);
  282. SPEX(boardflags2_lo, SSB_SPROM5_BFL2LO, 0xFFFF, 0);
  283. @@ -504,16 +513,14 @@ static void sprom_extract_r45(struct ssb
  284. }
  285. /* Extract the antenna gain values. */
  286. - SPEX(antenna_gain.ghz24.a0, SSB_SPROM4_AGAIN01,
  287. + SPEX(antenna_gain.a0, SSB_SPROM4_AGAIN01,
  288. SSB_SPROM4_AGAIN0, SSB_SPROM4_AGAIN0_SHIFT);
  289. - SPEX(antenna_gain.ghz24.a1, SSB_SPROM4_AGAIN01,
  290. + SPEX(antenna_gain.a1, SSB_SPROM4_AGAIN01,
  291. SSB_SPROM4_AGAIN1, SSB_SPROM4_AGAIN1_SHIFT);
  292. - SPEX(antenna_gain.ghz24.a2, SSB_SPROM4_AGAIN23,
  293. + SPEX(antenna_gain.a2, SSB_SPROM4_AGAIN23,
  294. SSB_SPROM4_AGAIN2, SSB_SPROM4_AGAIN2_SHIFT);
  295. - SPEX(antenna_gain.ghz24.a3, SSB_SPROM4_AGAIN23,
  296. + SPEX(antenna_gain.a3, SSB_SPROM4_AGAIN23,
  297. SSB_SPROM4_AGAIN3, SSB_SPROM4_AGAIN3_SHIFT);
  298. - memcpy(&out->antenna_gain.ghz5, &out->antenna_gain.ghz24,
  299. - sizeof(out->antenna_gain.ghz5));
  300. sprom_extract_r458(out, in);
  301. @@ -523,14 +530,22 @@ static void sprom_extract_r45(struct ssb
  302. static void sprom_extract_r8(struct ssb_sprom *out, const u16 *in)
  303. {
  304. int i;
  305. - u16 v;
  306. + u16 v, o;
  307. + u16 pwr_info_offset[] = {
  308. + SSB_SROM8_PWR_INFO_CORE0, SSB_SROM8_PWR_INFO_CORE1,
  309. + SSB_SROM8_PWR_INFO_CORE2, SSB_SROM8_PWR_INFO_CORE3
  310. + };
  311. + BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) !=
  312. + ARRAY_SIZE(out->core_pwr_info));
  313. /* extract the MAC address */
  314. for (i = 0; i < 3; i++) {
  315. v = in[SPOFF(SSB_SPROM8_IL0MAC) + i];
  316. *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v);
  317. }
  318. - SPEX(country_code, SSB_SPROM8_CCODE, 0xFFFF, 0);
  319. + SPEX(board_rev, SSB_SPROM8_BOARDREV, 0xFFFF, 0);
  320. + SPEX(alpha2[0], SSB_SPROM8_CCODE, 0xff00, 8);
  321. + SPEX(alpha2[1], SSB_SPROM8_CCODE, 0x00ff, 0);
  322. SPEX(boardflags_lo, SSB_SPROM8_BFLLO, 0xFFFF, 0);
  323. SPEX(boardflags_hi, SSB_SPROM8_BFLHI, 0xFFFF, 0);
  324. SPEX(boardflags2_lo, SSB_SPROM8_BFL2LO, 0xFFFF, 0);
  325. @@ -596,16 +611,46 @@ static void sprom_extract_r8(struct ssb_
  326. SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, 0xFFFFFFFF, 0);
  327. /* Extract the antenna gain values. */
  328. - SPEX(antenna_gain.ghz24.a0, SSB_SPROM8_AGAIN01,
  329. + SPEX(antenna_gain.a0, SSB_SPROM8_AGAIN01,
  330. SSB_SPROM8_AGAIN0, SSB_SPROM8_AGAIN0_SHIFT);
  331. - SPEX(antenna_gain.ghz24.a1, SSB_SPROM8_AGAIN01,
  332. + SPEX(antenna_gain.a1, SSB_SPROM8_AGAIN01,
  333. SSB_SPROM8_AGAIN1, SSB_SPROM8_AGAIN1_SHIFT);
  334. - SPEX(antenna_gain.ghz24.a2, SSB_SPROM8_AGAIN23,
  335. + SPEX(antenna_gain.a2, SSB_SPROM8_AGAIN23,
  336. SSB_SPROM8_AGAIN2, SSB_SPROM8_AGAIN2_SHIFT);
  337. - SPEX(antenna_gain.ghz24.a3, SSB_SPROM8_AGAIN23,
  338. + SPEX(antenna_gain.a3, SSB_SPROM8_AGAIN23,
  339. SSB_SPROM8_AGAIN3, SSB_SPROM8_AGAIN3_SHIFT);
  340. - memcpy(&out->antenna_gain.ghz5, &out->antenna_gain.ghz24,
  341. - sizeof(out->antenna_gain.ghz5));
  342. +
  343. + /* Extract cores power info info */
  344. + for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) {
  345. + o = pwr_info_offset[i];
  346. + SPEX(core_pwr_info[i].itssi_2g, o + SSB_SROM8_2G_MAXP_ITSSI,
  347. + SSB_SPROM8_2G_ITSSI, SSB_SPROM8_2G_ITSSI_SHIFT);
  348. + SPEX(core_pwr_info[i].maxpwr_2g, o + SSB_SROM8_2G_MAXP_ITSSI,
  349. + SSB_SPROM8_2G_MAXP, 0);
  350. +
  351. + SPEX(core_pwr_info[i].pa_2g[0], o + SSB_SROM8_2G_PA_0, ~0, 0);
  352. + SPEX(core_pwr_info[i].pa_2g[1], o + SSB_SROM8_2G_PA_1, ~0, 0);
  353. + SPEX(core_pwr_info[i].pa_2g[2], o + SSB_SROM8_2G_PA_2, ~0, 0);
  354. +
  355. + SPEX(core_pwr_info[i].itssi_5g, o + SSB_SROM8_5G_MAXP_ITSSI,
  356. + SSB_SPROM8_5G_ITSSI, SSB_SPROM8_5G_ITSSI_SHIFT);
  357. + SPEX(core_pwr_info[i].maxpwr_5g, o + SSB_SROM8_5G_MAXP_ITSSI,
  358. + SSB_SPROM8_5G_MAXP, 0);
  359. + SPEX(core_pwr_info[i].maxpwr_5gh, o + SSB_SPROM8_5GHL_MAXP,
  360. + SSB_SPROM8_5GH_MAXP, 0);
  361. + SPEX(core_pwr_info[i].maxpwr_5gl, o + SSB_SPROM8_5GHL_MAXP,
  362. + SSB_SPROM8_5GL_MAXP, SSB_SPROM8_5GL_MAXP_SHIFT);
  363. +
  364. + SPEX(core_pwr_info[i].pa_5gl[0], o + SSB_SROM8_5GL_PA_0, ~0, 0);
  365. + SPEX(core_pwr_info[i].pa_5gl[1], o + SSB_SROM8_5GL_PA_1, ~0, 0);
  366. + SPEX(core_pwr_info[i].pa_5gl[2], o + SSB_SROM8_5GL_PA_2, ~0, 0);
  367. + SPEX(core_pwr_info[i].pa_5g[0], o + SSB_SROM8_5G_PA_0, ~0, 0);
  368. + SPEX(core_pwr_info[i].pa_5g[1], o + SSB_SROM8_5G_PA_1, ~0, 0);
  369. + SPEX(core_pwr_info[i].pa_5g[2], o + SSB_SROM8_5G_PA_2, ~0, 0);
  370. + SPEX(core_pwr_info[i].pa_5gh[0], o + SSB_SROM8_5GH_PA_0, ~0, 0);
  371. + SPEX(core_pwr_info[i].pa_5gh[1], o + SSB_SROM8_5GH_PA_1, ~0, 0);
  372. + SPEX(core_pwr_info[i].pa_5gh[2], o + SSB_SROM8_5GH_PA_2, ~0, 0);
  373. + }
  374. /* Extract FEM info */
  375. SPEX(fem.ghz2.tssipos, SSB_SPROM8_FEM2G,
  376. @@ -630,6 +675,63 @@ static void sprom_extract_r8(struct ssb_
  377. SPEX(fem.ghz5.antswlut, SSB_SPROM8_FEM5G,
  378. SSB_SROM8_FEM_ANTSWLUT, SSB_SROM8_FEM_ANTSWLUT_SHIFT);
  379. + SPEX(leddc_on_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_ON,
  380. + SSB_SPROM8_LEDDC_ON_SHIFT);
  381. + SPEX(leddc_off_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_OFF,
  382. + SSB_SPROM8_LEDDC_OFF_SHIFT);
  383. +
  384. + SPEX(txchain, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_TXCHAIN,
  385. + SSB_SPROM8_TXRXC_TXCHAIN_SHIFT);
  386. + SPEX(rxchain, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_RXCHAIN,
  387. + SSB_SPROM8_TXRXC_RXCHAIN_SHIFT);
  388. + SPEX(antswitch, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_SWITCH,
  389. + SSB_SPROM8_TXRXC_SWITCH_SHIFT);
  390. +
  391. + SPEX(opo, SSB_SPROM8_OFDM2GPO, 0x00ff, 0);
  392. +
  393. + SPEX_ARRAY8(mcs2gpo, SSB_SPROM8_2G_MCSPO, ~0, 0);
  394. + SPEX_ARRAY8(mcs5gpo, SSB_SPROM8_5G_MCSPO, ~0, 0);
  395. + SPEX_ARRAY8(mcs5glpo, SSB_SPROM8_5GL_MCSPO, ~0, 0);
  396. + SPEX_ARRAY8(mcs5ghpo, SSB_SPROM8_5GH_MCSPO, ~0, 0);
  397. +
  398. + SPEX(rawtempsense, SSB_SPROM8_RAWTS, SSB_SPROM8_RAWTS_RAWTEMP,
  399. + SSB_SPROM8_RAWTS_RAWTEMP_SHIFT);
  400. + SPEX(measpower, SSB_SPROM8_RAWTS, SSB_SPROM8_RAWTS_MEASPOWER,
  401. + SSB_SPROM8_RAWTS_MEASPOWER_SHIFT);
  402. + SPEX(tempsense_slope, SSB_SPROM8_OPT_CORRX,
  403. + SSB_SPROM8_OPT_CORRX_TEMP_SLOPE,
  404. + SSB_SPROM8_OPT_CORRX_TEMP_SLOPE_SHIFT);
  405. + SPEX(tempcorrx, SSB_SPROM8_OPT_CORRX, SSB_SPROM8_OPT_CORRX_TEMPCORRX,
  406. + SSB_SPROM8_OPT_CORRX_TEMPCORRX_SHIFT);
  407. + SPEX(tempsense_option, SSB_SPROM8_OPT_CORRX,
  408. + SSB_SPROM8_OPT_CORRX_TEMP_OPTION,
  409. + SSB_SPROM8_OPT_CORRX_TEMP_OPTION_SHIFT);
  410. + SPEX(freqoffset_corr, SSB_SPROM8_HWIQ_IQSWP,
  411. + SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR,
  412. + SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR_SHIFT);
  413. + SPEX(iqcal_swp_dis, SSB_SPROM8_HWIQ_IQSWP,
  414. + SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP,
  415. + SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP_SHIFT);
  416. + SPEX(hw_iqcal_en, SSB_SPROM8_HWIQ_IQSWP, SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL,
  417. + SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL_SHIFT);
  418. +
  419. + SPEX(bw40po, SSB_SPROM8_BW40PO, ~0, 0);
  420. + SPEX(cddpo, SSB_SPROM8_CDDPO, ~0, 0);
  421. + SPEX(stbcpo, SSB_SPROM8_STBCPO, ~0, 0);
  422. + SPEX(bwduppo, SSB_SPROM8_BWDUPPO, ~0, 0);
  423. +
  424. + SPEX(tempthresh, SSB_SPROM8_THERMAL, SSB_SPROM8_THERMAL_TRESH,
  425. + SSB_SPROM8_THERMAL_TRESH_SHIFT);
  426. + SPEX(tempoffset, SSB_SPROM8_THERMAL, SSB_SPROM8_THERMAL_OFFSET,
  427. + SSB_SPROM8_THERMAL_OFFSET_SHIFT);
  428. + SPEX(phycal_tempdelta, SSB_SPROM8_TEMPDELTA,
  429. + SSB_SPROM8_TEMPDELTA_PHYCAL,
  430. + SSB_SPROM8_TEMPDELTA_PHYCAL_SHIFT);
  431. + SPEX(temps_period, SSB_SPROM8_TEMPDELTA, SSB_SPROM8_TEMPDELTA_PERIOD,
  432. + SSB_SPROM8_TEMPDELTA_PERIOD_SHIFT);
  433. + SPEX(temps_hysteresis, SSB_SPROM8_TEMPDELTA,
  434. + SSB_SPROM8_TEMPDELTA_HYSTERESIS,
  435. + SSB_SPROM8_TEMPDELTA_HYSTERESIS_SHIFT);
  436. sprom_extract_r458(out, in);
  437. /* TODO - get remaining rev 8 stuff needed */
  438. @@ -759,7 +861,6 @@ static void ssb_pci_get_boardinfo(struct
  439. {
  440. bi->vendor = bus->host_pci->subsystem_vendor;
  441. bi->type = bus->host_pci->subsystem_device;
  442. - bi->rev = bus->host_pci->revision;
  443. }
  444. int ssb_pci_get_invariants(struct ssb_bus *bus,
  445. --- a/drivers/ssb/pcmcia.c
  446. +++ b/drivers/ssb/pcmcia.c
  447. @@ -676,14 +676,10 @@ static int ssb_pcmcia_do_get_invariants(
  448. case SSB_PCMCIA_CIS_ANTGAIN:
  449. GOTO_ERROR_ON(tuple->TupleDataLen != 2,
  450. "antg tpl size");
  451. - sprom->antenna_gain.ghz24.a0 = tuple->TupleData[1];
  452. - sprom->antenna_gain.ghz24.a1 = tuple->TupleData[1];
  453. - sprom->antenna_gain.ghz24.a2 = tuple->TupleData[1];
  454. - sprom->antenna_gain.ghz24.a3 = tuple->TupleData[1];
  455. - sprom->antenna_gain.ghz5.a0 = tuple->TupleData[1];
  456. - sprom->antenna_gain.ghz5.a1 = tuple->TupleData[1];
  457. - sprom->antenna_gain.ghz5.a2 = tuple->TupleData[1];
  458. - sprom->antenna_gain.ghz5.a3 = tuple->TupleData[1];
  459. + sprom->antenna_gain.a0 = tuple->TupleData[1];
  460. + sprom->antenna_gain.a1 = tuple->TupleData[1];
  461. + sprom->antenna_gain.a2 = tuple->TupleData[1];
  462. + sprom->antenna_gain.a3 = tuple->TupleData[1];
  463. break;
  464. case SSB_PCMCIA_CIS_BFLAGS:
  465. GOTO_ERROR_ON((tuple->TupleDataLen != 3) &&
  466. --- a/drivers/ssb/scan.c
  467. +++ b/drivers/ssb/scan.c
  468. @@ -90,6 +90,8 @@ const char *ssb_core_name(u16 coreid)
  469. return "ARM 1176";
  470. case SSB_DEV_ARM_7TDMI:
  471. return "ARM 7TDMI";
  472. + case SSB_DEV_ARM_CM3:
  473. + return "ARM Cortex M3";
  474. }
  475. return "UNKNOWN";
  476. }
  477. @@ -318,6 +320,9 @@ int ssb_bus_scan(struct ssb_bus *bus,
  478. bus->chip_package = 0;
  479. }
  480. }
  481. + ssb_printk(KERN_INFO PFX "Found chip with id 0x%04X, rev 0x%02X and "
  482. + "package 0x%02X\n", bus->chip_id, bus->chip_rev,
  483. + bus->chip_package);
  484. if (!bus->nr_devices)
  485. bus->nr_devices = chipid_to_nrcores(bus->chip_id);
  486. if (bus->nr_devices > ARRAY_SIZE(bus->devices)) {
  487. --- a/drivers/ssb/sdio.c
  488. +++ b/drivers/ssb/sdio.c
  489. @@ -551,14 +551,10 @@ int ssb_sdio_get_invariants(struct ssb_b
  490. case SSB_SDIO_CIS_ANTGAIN:
  491. GOTO_ERROR_ON(tuple->size != 2,
  492. "antg tpl size");
  493. - sprom->antenna_gain.ghz24.a0 = tuple->data[1];
  494. - sprom->antenna_gain.ghz24.a1 = tuple->data[1];
  495. - sprom->antenna_gain.ghz24.a2 = tuple->data[1];
  496. - sprom->antenna_gain.ghz24.a3 = tuple->data[1];
  497. - sprom->antenna_gain.ghz5.a0 = tuple->data[1];
  498. - sprom->antenna_gain.ghz5.a1 = tuple->data[1];
  499. - sprom->antenna_gain.ghz5.a2 = tuple->data[1];
  500. - sprom->antenna_gain.ghz5.a3 = tuple->data[1];
  501. + sprom->antenna_gain.a0 = tuple->data[1];
  502. + sprom->antenna_gain.a1 = tuple->data[1];
  503. + sprom->antenna_gain.a2 = tuple->data[1];
  504. + sprom->antenna_gain.a3 = tuple->data[1];
  505. break;
  506. case SSB_SDIO_CIS_BFLAGS:
  507. GOTO_ERROR_ON((tuple->size != 3) &&
  508. --- a/drivers/ssb/ssb_private.h
  509. +++ b/drivers/ssb/ssb_private.h
  510. @@ -207,4 +207,8 @@ static inline void b43_pci_ssb_bridge_ex
  511. }
  512. #endif /* CONFIG_SSB_B43_PCI_BRIDGE */
  513. +/* driver_chipcommon_pmu.c */
  514. +extern u32 ssb_pmu_get_cpu_clock(struct ssb_chipcommon *cc);
  515. +extern u32 ssb_pmu_get_controlclock(struct ssb_chipcommon *cc);
  516. +
  517. #endif /* LINUX_SSB_PRIVATE_H_ */
  518. --- a/include/linux/ssb/ssb.h
  519. +++ b/include/linux/ssb/ssb.h
  520. @@ -16,6 +16,12 @@ struct pcmcia_device;
  521. struct ssb_bus;
  522. struct ssb_driver;
  523. +struct ssb_sprom_core_pwr_info {
  524. + u8 itssi_2g, itssi_5g;
  525. + u8 maxpwr_2g, maxpwr_5gl, maxpwr_5g, maxpwr_5gh;
  526. + u16 pa_2g[4], pa_5gl[4], pa_5g[4], pa_5gh[4];
  527. +};
  528. +
  529. struct ssb_sprom {
  530. u8 revision;
  531. u8 il0mac[6]; /* MAC address for 802.11b/g */
  532. @@ -26,9 +32,12 @@ struct ssb_sprom {
  533. u8 et0mdcport; /* MDIO for enet0 */
  534. u8 et1mdcport; /* MDIO for enet1 */
  535. u16 board_rev; /* Board revision number from SPROM. */
  536. + u16 board_num; /* Board number from SPROM. */
  537. + u16 board_type; /* Board type from SPROM. */
  538. u8 country_code; /* Country Code */
  539. - u16 leddc_on_time; /* LED Powersave Duty Cycle On Count */
  540. - u16 leddc_off_time; /* LED Powersave Duty Cycle Off Count */
  541. + char alpha2[2]; /* Country Code as two chars like EU or US */
  542. + u8 leddc_on_time; /* LED Powersave Duty Cycle On Count */
  543. + u8 leddc_off_time; /* LED Powersave Duty Cycle Off Count */
  544. u8 ant_available_a; /* 2GHz antenna available bits (up to 4) */
  545. u8 ant_available_bg; /* 5GHz antenna available bits (up to 4) */
  546. u16 pa0b0;
  547. @@ -47,10 +56,10 @@ struct ssb_sprom {
  548. u8 gpio1; /* GPIO pin 1 */
  549. u8 gpio2; /* GPIO pin 2 */
  550. u8 gpio3; /* GPIO pin 3 */
  551. - u16 maxpwr_bg; /* 2.4GHz Amplifier Max Power (in dBm Q5.2) */
  552. - u16 maxpwr_al; /* 5.2GHz Amplifier Max Power (in dBm Q5.2) */
  553. - u16 maxpwr_a; /* 5.3GHz Amplifier Max Power (in dBm Q5.2) */
  554. - u16 maxpwr_ah; /* 5.8GHz Amplifier Max Power (in dBm Q5.2) */
  555. + u8 maxpwr_bg; /* 2.4GHz Amplifier Max Power (in dBm Q5.2) */
  556. + u8 maxpwr_al; /* 5.2GHz Amplifier Max Power (in dBm Q5.2) */
  557. + u8 maxpwr_a; /* 5.3GHz Amplifier Max Power (in dBm Q5.2) */
  558. + u8 maxpwr_ah; /* 5.8GHz Amplifier Max Power (in dBm Q5.2) */
  559. u8 itssi_a; /* Idle TSSI Target for A-PHY */
  560. u8 itssi_bg; /* Idle TSSI Target for B/G-PHY */
  561. u8 tri2g; /* 2.4GHz TX isolation */
  562. @@ -61,8 +70,8 @@ struct ssb_sprom {
  563. u8 txpid5gl[4]; /* 4.9 - 5.1GHz TX power index */
  564. u8 txpid5g[4]; /* 5.1 - 5.5GHz TX power index */
  565. u8 txpid5gh[4]; /* 5.5 - ...GHz TX power index */
  566. - u8 rxpo2g; /* 2GHz RX power offset */
  567. - u8 rxpo5g; /* 5GHz RX power offset */
  568. + s8 rxpo2g; /* 2GHz RX power offset */
  569. + s8 rxpo5g; /* 5GHz RX power offset */
  570. u8 rssisav2g; /* 2GHz RSSI params */
  571. u8 rssismc2g;
  572. u8 rssismf2g;
  573. @@ -82,16 +91,13 @@ struct ssb_sprom {
  574. u16 boardflags2_hi; /* Board flags (bits 48-63) */
  575. /* TODO store board flags in a single u64 */
  576. + struct ssb_sprom_core_pwr_info core_pwr_info[4];
  577. +
  578. /* Antenna gain values for up to 4 antennas
  579. * on each band. Values in dBm/4 (Q5.2). Negative gain means the
  580. * loss in the connectors is bigger than the gain. */
  581. struct {
  582. - struct {
  583. - s8 a0, a1, a2, a3;
  584. - } ghz24; /* 2.4GHz band */
  585. - struct {
  586. - s8 a0, a1, a2, a3;
  587. - } ghz5; /* 5GHz band */
  588. + s8 a0, a1, a2, a3;
  589. } antenna_gain;
  590. struct {
  591. @@ -103,14 +109,85 @@ struct ssb_sprom {
  592. } ghz5;
  593. } fem;
  594. - /* TODO - add any parameters needed from rev 2, 3, 4, 5 or 8 SPROMs */
  595. + u16 mcs2gpo[8];
  596. + u16 mcs5gpo[8];
  597. + u16 mcs5glpo[8];
  598. + u16 mcs5ghpo[8];
  599. + u8 opo;
  600. +
  601. + u8 rxgainerr2ga[3];
  602. + u8 rxgainerr5gla[3];
  603. + u8 rxgainerr5gma[3];
  604. + u8 rxgainerr5gha[3];
  605. + u8 rxgainerr5gua[3];
  606. +
  607. + u8 noiselvl2ga[3];
  608. + u8 noiselvl5gla[3];
  609. + u8 noiselvl5gma[3];
  610. + u8 noiselvl5gha[3];
  611. + u8 noiselvl5gua[3];
  612. +
  613. + u8 regrev;
  614. + u8 txchain;
  615. + u8 rxchain;
  616. + u8 antswitch;
  617. + u16 cddpo;
  618. + u16 stbcpo;
  619. + u16 bw40po;
  620. + u16 bwduppo;
  621. +
  622. + u8 tempthresh;
  623. + u8 tempoffset;
  624. + u16 rawtempsense;
  625. + u8 measpower;
  626. + u8 tempsense_slope;
  627. + u8 tempcorrx;
  628. + u8 tempsense_option;
  629. + u8 freqoffset_corr;
  630. + u8 iqcal_swp_dis;
  631. + u8 hw_iqcal_en;
  632. + u8 elna2g;
  633. + u8 elna5g;
  634. + u8 phycal_tempdelta;
  635. + u8 temps_period;
  636. + u8 temps_hysteresis;
  637. + u8 measpower1;
  638. + u8 measpower2;
  639. + u8 pcieingress_war;
  640. +
  641. + /* power per rate from sromrev 9 */
  642. + u16 cckbw202gpo;
  643. + u16 cckbw20ul2gpo;
  644. + u32 legofdmbw202gpo;
  645. + u32 legofdmbw20ul2gpo;
  646. + u32 legofdmbw205glpo;
  647. + u32 legofdmbw20ul5glpo;
  648. + u32 legofdmbw205gmpo;
  649. + u32 legofdmbw20ul5gmpo;
  650. + u32 legofdmbw205ghpo;
  651. + u32 legofdmbw20ul5ghpo;
  652. + u32 mcsbw202gpo;
  653. + u32 mcsbw20ul2gpo;
  654. + u32 mcsbw402gpo;
  655. + u32 mcsbw205glpo;
  656. + u32 mcsbw20ul5glpo;
  657. + u32 mcsbw405glpo;
  658. + u32 mcsbw205gmpo;
  659. + u32 mcsbw20ul5gmpo;
  660. + u32 mcsbw405gmpo;
  661. + u32 mcsbw205ghpo;
  662. + u32 mcsbw20ul5ghpo;
  663. + u32 mcsbw405ghpo;
  664. + u16 mcs32po;
  665. + u16 legofdm40duppo;
  666. + u8 sar2g;
  667. + u8 sar5g;
  668. };
  669. /* Information about the PCB the circuitry is soldered on. */
  670. struct ssb_boardinfo {
  671. u16 vendor;
  672. u16 type;
  673. - u8 rev;
  674. };
  675. @@ -166,6 +243,7 @@ struct ssb_bus_ops {
  676. #define SSB_DEV_MINI_MACPHY 0x823
  677. #define SSB_DEV_ARM_1176 0x824
  678. #define SSB_DEV_ARM_7TDMI 0x825
  679. +#define SSB_DEV_ARM_CM3 0x82A
  680. /* Vendor-ID values */
  681. #define SSB_VENDOR_BROADCOM 0x4243
  682. --- a/include/linux/ssb/ssb_driver_chipcommon.h
  683. +++ b/include/linux/ssb/ssb_driver_chipcommon.h
  684. @@ -504,7 +504,9 @@
  685. #define SSB_CHIPCO_FLASHCTL_ST_SE 0x02D8 /* Sector Erase */
  686. #define SSB_CHIPCO_FLASHCTL_ST_BE 0x00C7 /* Bulk Erase */
  687. #define SSB_CHIPCO_FLASHCTL_ST_DP 0x00B9 /* Deep Power-down */
  688. -#define SSB_CHIPCO_FLASHCTL_ST_RSIG 0x03AB /* Read Electronic Signature */
  689. +#define SSB_CHIPCO_FLASHCTL_ST_RES 0x03AB /* Read Electronic Signature */
  690. +#define SSB_CHIPCO_FLASHCTL_ST_CSA 0x1000 /* Keep chip select asserted */
  691. +#define SSB_CHIPCO_FLASHCTL_ST_SSE 0x0220 /* Sub-sector Erase */
  692. /* Status register bits for ST flashes */
  693. #define SSB_CHIPCO_FLASHSTA_ST_WIP 0x01 /* Write In Progress */
  694. --- a/include/linux/ssb/ssb_driver_gige.h
  695. +++ b/include/linux/ssb/ssb_driver_gige.h
  696. @@ -2,6 +2,7 @@
  697. #define LINUX_SSB_DRIVER_GIGE_H_
  698. #include <linux/ssb/ssb.h>
  699. +#include <linux/bug.h>
  700. #include <linux/pci.h>
  701. #include <linux/spinlock.h>
  702. --- a/include/linux/ssb/ssb_driver_mips.h
  703. +++ b/include/linux/ssb/ssb_driver_mips.h
  704. @@ -13,6 +13,12 @@ struct ssb_serial_port {
  705. unsigned int reg_shift;
  706. };
  707. +struct ssb_pflash {
  708. + bool present;
  709. + u8 buswidth;
  710. + u32 window;
  711. + u32 window_size;
  712. +};
  713. struct ssb_mipscore {
  714. struct ssb_device *dev;
  715. @@ -20,9 +26,7 @@ struct ssb_mipscore {
  716. int nr_serial_ports;
  717. struct ssb_serial_port serial_ports[4];
  718. - u8 flash_buswidth;
  719. - u32 flash_window;
  720. - u32 flash_window_size;
  721. + struct ssb_pflash pflash;
  722. };
  723. extern void ssb_mipscore_init(struct ssb_mipscore *mcore);
  724. --- a/include/linux/ssb/ssb_regs.h
  725. +++ b/include/linux/ssb/ssb_regs.h
  726. @@ -228,6 +228,7 @@
  727. #define SSB_SPROM1_AGAIN_BG_SHIFT 0
  728. #define SSB_SPROM1_AGAIN_A 0xFF00 /* A-PHY */
  729. #define SSB_SPROM1_AGAIN_A_SHIFT 8
  730. +#define SSB_SPROM1_CCODE 0x0076
  731. /* SPROM Revision 2 (inherits from rev 1) */
  732. #define SSB_SPROM2_BFLHI 0x0038 /* Boardflags (high 16 bits) */
  733. @@ -267,6 +268,7 @@
  734. #define SSB_SPROM3_OFDMGPO 0x107A /* G-PHY OFDM Power Offset (4 bytes, BigEndian) */
  735. /* SPROM Revision 4 */
  736. +#define SSB_SPROM4_BOARDREV 0x0042 /* Board revision */
  737. #define SSB_SPROM4_BFLLO 0x0044 /* Boardflags (low 16 bits) */
  738. #define SSB_SPROM4_BFLHI 0x0046 /* Board Flags Hi */
  739. #define SSB_SPROM4_BFL2LO 0x0048 /* Board flags 2 (low 16 bits) */
  740. @@ -389,6 +391,11 @@
  741. #define SSB_SPROM8_GPIOB_P2 0x00FF /* Pin 2 */
  742. #define SSB_SPROM8_GPIOB_P3 0xFF00 /* Pin 3 */
  743. #define SSB_SPROM8_GPIOB_P3_SHIFT 8
  744. +#define SSB_SPROM8_LEDDC 0x009A
  745. +#define SSB_SPROM8_LEDDC_ON 0xFF00 /* oncount */
  746. +#define SSB_SPROM8_LEDDC_ON_SHIFT 8
  747. +#define SSB_SPROM8_LEDDC_OFF 0x00FF /* offcount */
  748. +#define SSB_SPROM8_LEDDC_OFF_SHIFT 0
  749. #define SSB_SPROM8_ANTAVAIL 0x009C /* Antenna available bitfields*/
  750. #define SSB_SPROM8_ANTAVAIL_A 0xFF00 /* A-PHY bitfield */
  751. #define SSB_SPROM8_ANTAVAIL_A_SHIFT 8
  752. @@ -404,6 +411,13 @@
  753. #define SSB_SPROM8_AGAIN2_SHIFT 0
  754. #define SSB_SPROM8_AGAIN3 0xFF00 /* Antenna 3 */
  755. #define SSB_SPROM8_AGAIN3_SHIFT 8
  756. +#define SSB_SPROM8_TXRXC 0x00A2
  757. +#define SSB_SPROM8_TXRXC_TXCHAIN 0x000f
  758. +#define SSB_SPROM8_TXRXC_TXCHAIN_SHIFT 0
  759. +#define SSB_SPROM8_TXRXC_RXCHAIN 0x00f0
  760. +#define SSB_SPROM8_TXRXC_RXCHAIN_SHIFT 4
  761. +#define SSB_SPROM8_TXRXC_SWITCH 0xff00
  762. +#define SSB_SPROM8_TXRXC_SWITCH_SHIFT 8
  763. #define SSB_SPROM8_RSSIPARM2G 0x00A4 /* RSSI params for 2GHz */
  764. #define SSB_SPROM8_RSSISMF2G 0x000F
  765. #define SSB_SPROM8_RSSISMC2G 0x00F0
  766. @@ -430,6 +444,7 @@
  767. #define SSB_SPROM8_TRI5GH_SHIFT 8
  768. #define SSB_SPROM8_RXPO 0x00AC /* RX power offsets */
  769. #define SSB_SPROM8_RXPO2G 0x00FF /* 2GHz RX power offset */
  770. +#define SSB_SPROM8_RXPO2G_SHIFT 0
  771. #define SSB_SPROM8_RXPO5G 0xFF00 /* 5GHz RX power offset */
  772. #define SSB_SPROM8_RXPO5G_SHIFT 8
  773. #define SSB_SPROM8_FEM2G 0x00AE
  774. @@ -445,10 +460,71 @@
  775. #define SSB_SROM8_FEM_ANTSWLUT 0xF800
  776. #define SSB_SROM8_FEM_ANTSWLUT_SHIFT 11
  777. #define SSB_SPROM8_THERMAL 0x00B2
  778. -#define SSB_SPROM8_MPWR_RAWTS 0x00B4
  779. -#define SSB_SPROM8_TS_SLP_OPT_CORRX 0x00B6
  780. -#define SSB_SPROM8_FOC_HWIQ_IQSWP 0x00B8
  781. -#define SSB_SPROM8_PHYCAL_TEMPDELTA 0x00BA
  782. +#define SSB_SPROM8_THERMAL_OFFSET 0x00ff
  783. +#define SSB_SPROM8_THERMAL_OFFSET_SHIFT 0
  784. +#define SSB_SPROM8_THERMAL_TRESH 0xff00
  785. +#define SSB_SPROM8_THERMAL_TRESH_SHIFT 8
  786. +/* Temp sense related entries */
  787. +#define SSB_SPROM8_RAWTS 0x00B4
  788. +#define SSB_SPROM8_RAWTS_RAWTEMP 0x01ff
  789. +#define SSB_SPROM8_RAWTS_RAWTEMP_SHIFT 0
  790. +#define SSB_SPROM8_RAWTS_MEASPOWER 0xfe00
  791. +#define SSB_SPROM8_RAWTS_MEASPOWER_SHIFT 9
  792. +#define SSB_SPROM8_OPT_CORRX 0x00B6
  793. +#define SSB_SPROM8_OPT_CORRX_TEMP_SLOPE 0x00ff
  794. +#define SSB_SPROM8_OPT_CORRX_TEMP_SLOPE_SHIFT 0
  795. +#define SSB_SPROM8_OPT_CORRX_TEMPCORRX 0xfc00
  796. +#define SSB_SPROM8_OPT_CORRX_TEMPCORRX_SHIFT 10
  797. +#define SSB_SPROM8_OPT_CORRX_TEMP_OPTION 0x0300
  798. +#define SSB_SPROM8_OPT_CORRX_TEMP_OPTION_SHIFT 8
  799. +/* FOC: freiquency offset correction, HWIQ: H/W IOCAL enable, IQSWP: IQ CAL swap disable */
  800. +#define SSB_SPROM8_HWIQ_IQSWP 0x00B8
  801. +#define SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR 0x000f
  802. +#define SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR_SHIFT 0
  803. +#define SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP 0x0010
  804. +#define SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP_SHIFT 4
  805. +#define SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL 0x0020
  806. +#define SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL_SHIFT 5
  807. +#define SSB_SPROM8_TEMPDELTA 0x00BA
  808. +#define SSB_SPROM8_TEMPDELTA_PHYCAL 0x00ff
  809. +#define SSB_SPROM8_TEMPDELTA_PHYCAL_SHIFT 0
  810. +#define SSB_SPROM8_TEMPDELTA_PERIOD 0x0f00
  811. +#define SSB_SPROM8_TEMPDELTA_PERIOD_SHIFT 8
  812. +#define SSB_SPROM8_TEMPDELTA_HYSTERESIS 0xf000
  813. +#define SSB_SPROM8_TEMPDELTA_HYSTERESIS_SHIFT 12
  814. +
  815. +/* There are 4 blocks with power info sharing the same layout */
  816. +#define SSB_SROM8_PWR_INFO_CORE0 0x00C0
  817. +#define SSB_SROM8_PWR_INFO_CORE1 0x00E0
  818. +#define SSB_SROM8_PWR_INFO_CORE2 0x0100
  819. +#define SSB_SROM8_PWR_INFO_CORE3 0x0120
  820. +
  821. +#define SSB_SROM8_2G_MAXP_ITSSI 0x00
  822. +#define SSB_SPROM8_2G_MAXP 0x00FF
  823. +#define SSB_SPROM8_2G_ITSSI 0xFF00
  824. +#define SSB_SPROM8_2G_ITSSI_SHIFT 8
  825. +#define SSB_SROM8_2G_PA_0 0x02 /* 2GHz power amp settings */
  826. +#define SSB_SROM8_2G_PA_1 0x04
  827. +#define SSB_SROM8_2G_PA_2 0x06
  828. +#define SSB_SROM8_5G_MAXP_ITSSI 0x08 /* 5GHz ITSSI and 5.3GHz Max Power */
  829. +#define SSB_SPROM8_5G_MAXP 0x00FF
  830. +#define SSB_SPROM8_5G_ITSSI 0xFF00
  831. +#define SSB_SPROM8_5G_ITSSI_SHIFT 8
  832. +#define SSB_SPROM8_5GHL_MAXP 0x0A /* 5.2GHz and 5.8GHz Max Power */
  833. +#define SSB_SPROM8_5GH_MAXP 0x00FF
  834. +#define SSB_SPROM8_5GL_MAXP 0xFF00
  835. +#define SSB_SPROM8_5GL_MAXP_SHIFT 8
  836. +#define SSB_SROM8_5G_PA_0 0x0C /* 5.3GHz power amp settings */
  837. +#define SSB_SROM8_5G_PA_1 0x0E
  838. +#define SSB_SROM8_5G_PA_2 0x10
  839. +#define SSB_SROM8_5GL_PA_0 0x12 /* 5.2GHz power amp settings */
  840. +#define SSB_SROM8_5GL_PA_1 0x14
  841. +#define SSB_SROM8_5GL_PA_2 0x16
  842. +#define SSB_SROM8_5GH_PA_0 0x18 /* 5.8GHz power amp settings */
  843. +#define SSB_SROM8_5GH_PA_1 0x1A
  844. +#define SSB_SROM8_5GH_PA_2 0x1C
  845. +
  846. +/* TODO: Make it deprecated */
  847. #define SSB_SPROM8_MAXP_BG 0x00C0 /* Max Power 2GHz in path 1 */
  848. #define SSB_SPROM8_MAXP_BG_MASK 0x00FF /* Mask for Max Power 2GHz */
  849. #define SSB_SPROM8_ITSSI_BG 0xFF00 /* Mask for path 1 itssi_bg */
  850. @@ -473,12 +549,23 @@
  851. #define SSB_SPROM8_PA1HIB0 0x00D8 /* 5.8GHz power amp settings */
  852. #define SSB_SPROM8_PA1HIB1 0x00DA
  853. #define SSB_SPROM8_PA1HIB2 0x00DC
  854. +
  855. #define SSB_SPROM8_CCK2GPO 0x0140 /* CCK power offset */
  856. #define SSB_SPROM8_OFDM2GPO 0x0142 /* 2.4GHz OFDM power offset */
  857. #define SSB_SPROM8_OFDM5GPO 0x0146 /* 5.3GHz OFDM power offset */
  858. #define SSB_SPROM8_OFDM5GLPO 0x014A /* 5.2GHz OFDM power offset */
  859. #define SSB_SPROM8_OFDM5GHPO 0x014E /* 5.8GHz OFDM power offset */
  860. +#define SSB_SPROM8_2G_MCSPO 0x0152
  861. +#define SSB_SPROM8_5G_MCSPO 0x0162
  862. +#define SSB_SPROM8_5GL_MCSPO 0x0172
  863. +#define SSB_SPROM8_5GH_MCSPO 0x0182
  864. +
  865. +#define SSB_SPROM8_CDDPO 0x0192
  866. +#define SSB_SPROM8_STBCPO 0x0194
  867. +#define SSB_SPROM8_BW40PO 0x0196
  868. +#define SSB_SPROM8_BWDUPPO 0x0198
  869. +
  870. /* Values for boardflags_lo read from SPROM */
  871. #define SSB_BFL_BTCOEXIST 0x0001 /* implements Bluetooth coexistance */
  872. #define SSB_BFL_PACTRL 0x0002 /* GPIO 9 controlling the PA */