driver_chipcommon.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. /*
  2. * Sonics Silicon Backplane
  3. * Broadcom ChipCommon core driver
  4. *
  5. * Copyright 2005, Broadcom Corporation
  6. * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de>
  7. *
  8. * Licensed under the GNU/GPL. See COPYING for details.
  9. */
  10. #include <linux/ssb/ssb.h>
  11. #include <linux/ssb/ssb_regs.h>
  12. #include <linux/pci.h>
  13. #include "ssb_private.h"
  14. /* Clock sources */
  15. enum ssb_clksrc {
  16. /* PCI clock */
  17. SSB_CHIPCO_CLKSRC_PCI,
  18. /* Crystal slow clock oscillator */
  19. SSB_CHIPCO_CLKSRC_XTALOS,
  20. /* Low power oscillator */
  21. SSB_CHIPCO_CLKSRC_LOPWROS,
  22. };
  23. static inline u32 chipco_read32(struct ssb_chipcommon *cc,
  24. u16 offset)
  25. {
  26. return ssb_read32(cc->dev, offset);
  27. }
  28. static inline void chipco_write32(struct ssb_chipcommon *cc,
  29. u16 offset,
  30. u32 value)
  31. {
  32. ssb_write32(cc->dev, offset, value);
  33. }
  34. static inline u32 chipco_write32_masked(struct ssb_chipcommon *cc, u16 offset,
  35. u32 mask, u32 value)
  36. {
  37. value &= mask;
  38. value |= chipco_read32(cc, offset) & ~mask;
  39. chipco_write32(cc, offset, value);
  40. return value;
  41. }
  42. void ssb_chipco_set_clockmode(struct ssb_chipcommon *cc,
  43. enum ssb_clkmode mode)
  44. {
  45. struct ssb_device *ccdev = cc->dev;
  46. struct ssb_bus *bus;
  47. u32 tmp;
  48. if (!ccdev)
  49. return;
  50. bus = ccdev->bus;
  51. /* chipcommon cores prior to rev6 don't support dynamic clock control */
  52. if (ccdev->id.revision < 6)
  53. return;
  54. /* chipcommon cores rev10 are a whole new ball game */
  55. if (ccdev->id.revision >= 10)
  56. return;
  57. if (!(cc->capabilities & SSB_CHIPCO_CAP_PCTL))
  58. return;
  59. switch (mode) {
  60. case SSB_CLKMODE_SLOW:
  61. tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
  62. tmp |= SSB_CHIPCO_SLOWCLKCTL_FSLOW;
  63. chipco_write32(cc, SSB_CHIPCO_SLOWCLKCTL, tmp);
  64. break;
  65. case SSB_CLKMODE_FAST:
  66. ssb_pci_xtal(bus, SSB_GPIO_XTAL, 1); /* Force crystal on */
  67. tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
  68. tmp &= ~SSB_CHIPCO_SLOWCLKCTL_FSLOW;
  69. tmp |= SSB_CHIPCO_SLOWCLKCTL_IPLL;
  70. chipco_write32(cc, SSB_CHIPCO_SLOWCLKCTL, tmp);
  71. break;
  72. case SSB_CLKMODE_DYNAMIC:
  73. tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
  74. tmp &= ~SSB_CHIPCO_SLOWCLKCTL_FSLOW;
  75. tmp &= ~SSB_CHIPCO_SLOWCLKCTL_IPLL;
  76. tmp &= ~SSB_CHIPCO_SLOWCLKCTL_ENXTAL;
  77. if ((tmp & SSB_CHIPCO_SLOWCLKCTL_SRC) != SSB_CHIPCO_SLOWCLKCTL_SRC_XTAL)
  78. tmp |= SSB_CHIPCO_SLOWCLKCTL_ENXTAL;
  79. chipco_write32(cc, SSB_CHIPCO_SLOWCLKCTL, tmp);
  80. /* for dynamic control, we have to release our xtal_pu "force on" */
  81. if (tmp & SSB_CHIPCO_SLOWCLKCTL_ENXTAL)
  82. ssb_pci_xtal(bus, SSB_GPIO_XTAL, 0);
  83. break;
  84. default:
  85. SSB_WARN_ON(1);
  86. }
  87. }
  88. /* Get the Slow Clock Source */
  89. static enum ssb_clksrc chipco_pctl_get_slowclksrc(struct ssb_chipcommon *cc)
  90. {
  91. struct ssb_bus *bus = cc->dev->bus;
  92. u32 uninitialized_var(tmp);
  93. if (cc->dev->id.revision < 6) {
  94. if (bus->bustype == SSB_BUSTYPE_SSB ||
  95. bus->bustype == SSB_BUSTYPE_PCMCIA)
  96. return SSB_CHIPCO_CLKSRC_XTALOS;
  97. if (bus->bustype == SSB_BUSTYPE_PCI) {
  98. pci_read_config_dword(bus->host_pci, SSB_GPIO_OUT, &tmp);
  99. if (tmp & 0x10)
  100. return SSB_CHIPCO_CLKSRC_PCI;
  101. return SSB_CHIPCO_CLKSRC_XTALOS;
  102. }
  103. }
  104. if (cc->dev->id.revision < 10) {
  105. tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
  106. tmp &= 0x7;
  107. if (tmp == 0)
  108. return SSB_CHIPCO_CLKSRC_LOPWROS;
  109. if (tmp == 1)
  110. return SSB_CHIPCO_CLKSRC_XTALOS;
  111. if (tmp == 2)
  112. return SSB_CHIPCO_CLKSRC_PCI;
  113. }
  114. return SSB_CHIPCO_CLKSRC_XTALOS;
  115. }
  116. /* Get maximum or minimum (depending on get_max flag) slowclock frequency. */
  117. static int chipco_pctl_clockfreqlimit(struct ssb_chipcommon *cc, int get_max)
  118. {
  119. int uninitialized_var(limit);
  120. enum ssb_clksrc clocksrc;
  121. int divisor = 1;
  122. u32 tmp;
  123. clocksrc = chipco_pctl_get_slowclksrc(cc);
  124. if (cc->dev->id.revision < 6) {
  125. switch (clocksrc) {
  126. case SSB_CHIPCO_CLKSRC_PCI:
  127. divisor = 64;
  128. break;
  129. case SSB_CHIPCO_CLKSRC_XTALOS:
  130. divisor = 32;
  131. break;
  132. default:
  133. SSB_WARN_ON(1);
  134. }
  135. } else if (cc->dev->id.revision < 10) {
  136. switch (clocksrc) {
  137. case SSB_CHIPCO_CLKSRC_LOPWROS:
  138. break;
  139. case SSB_CHIPCO_CLKSRC_XTALOS:
  140. case SSB_CHIPCO_CLKSRC_PCI:
  141. tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
  142. divisor = (tmp >> 16) + 1;
  143. divisor *= 4;
  144. break;
  145. }
  146. } else {
  147. tmp = chipco_read32(cc, SSB_CHIPCO_SYSCLKCTL);
  148. divisor = (tmp >> 16) + 1;
  149. divisor *= 4;
  150. }
  151. switch (clocksrc) {
  152. case SSB_CHIPCO_CLKSRC_LOPWROS:
  153. if (get_max)
  154. limit = 43000;
  155. else
  156. limit = 25000;
  157. break;
  158. case SSB_CHIPCO_CLKSRC_XTALOS:
  159. if (get_max)
  160. limit = 20200000;
  161. else
  162. limit = 19800000;
  163. break;
  164. case SSB_CHIPCO_CLKSRC_PCI:
  165. if (get_max)
  166. limit = 34000000;
  167. else
  168. limit = 25000000;
  169. break;
  170. }
  171. limit /= divisor;
  172. return limit;
  173. }
  174. static void chipco_powercontrol_init(struct ssb_chipcommon *cc)
  175. {
  176. struct ssb_bus *bus = cc->dev->bus;
  177. if (bus->chip_id == 0x4321) {
  178. if (bus->chip_rev == 0)
  179. chipco_write32(cc, SSB_CHIPCO_CHIPCTL, 0x3A4);
  180. else if (bus->chip_rev == 1)
  181. chipco_write32(cc, SSB_CHIPCO_CHIPCTL, 0xA4);
  182. }
  183. if (!(cc->capabilities & SSB_CHIPCO_CAP_PCTL))
  184. return;
  185. if (cc->dev->id.revision >= 10) {
  186. /* Set Idle Power clock rate to 1Mhz */
  187. chipco_write32(cc, SSB_CHIPCO_SYSCLKCTL,
  188. (chipco_read32(cc, SSB_CHIPCO_SYSCLKCTL) &
  189. 0x0000FFFF) | 0x00040000);
  190. } else {
  191. int maxfreq;
  192. maxfreq = chipco_pctl_clockfreqlimit(cc, 1);
  193. chipco_write32(cc, SSB_CHIPCO_PLLONDELAY,
  194. (maxfreq * 150 + 999999) / 1000000);
  195. chipco_write32(cc, SSB_CHIPCO_FREFSELDELAY,
  196. (maxfreq * 15 + 999999) / 1000000);
  197. }
  198. }
  199. static void calc_fast_powerup_delay(struct ssb_chipcommon *cc)
  200. {
  201. struct ssb_bus *bus = cc->dev->bus;
  202. int minfreq;
  203. unsigned int tmp;
  204. u32 pll_on_delay;
  205. if (bus->bustype != SSB_BUSTYPE_PCI)
  206. return;
  207. if (!(cc->capabilities & SSB_CHIPCO_CAP_PCTL))
  208. return;
  209. minfreq = chipco_pctl_clockfreqlimit(cc, 0);
  210. pll_on_delay = chipco_read32(cc, SSB_CHIPCO_PLLONDELAY);
  211. tmp = (((pll_on_delay + 2) * 1000000) + (minfreq - 1)) / minfreq;
  212. SSB_WARN_ON(tmp & ~0xFFFF);
  213. cc->fast_pwrup_delay = tmp;
  214. }
  215. void ssb_chipcommon_init(struct ssb_chipcommon *cc)
  216. {
  217. if (!cc->dev)
  218. return; /* We don't have a ChipCommon */
  219. chipco_powercontrol_init(cc);
  220. ssb_chipco_set_clockmode(cc, SSB_CLKMODE_FAST);
  221. calc_fast_powerup_delay(cc);
  222. }
  223. void ssb_chipco_suspend(struct ssb_chipcommon *cc)
  224. {
  225. if (!cc->dev)
  226. return;
  227. ssb_chipco_set_clockmode(cc, SSB_CLKMODE_SLOW);
  228. }
  229. void ssb_chipco_resume(struct ssb_chipcommon *cc)
  230. {
  231. if (!cc->dev)
  232. return;
  233. chipco_powercontrol_init(cc);
  234. ssb_chipco_set_clockmode(cc, SSB_CLKMODE_FAST);
  235. }
  236. /* Get the processor clock */
  237. void ssb_chipco_get_clockcpu(struct ssb_chipcommon *cc,
  238. u32 *plltype, u32 *n, u32 *m)
  239. {
  240. *n = chipco_read32(cc, SSB_CHIPCO_CLOCK_N);
  241. *plltype = (cc->capabilities & SSB_CHIPCO_CAP_PLLT);
  242. switch (*plltype) {
  243. case SSB_PLLTYPE_2:
  244. case SSB_PLLTYPE_4:
  245. case SSB_PLLTYPE_6:
  246. case SSB_PLLTYPE_7:
  247. *m = chipco_read32(cc, SSB_CHIPCO_CLOCK_MIPS);
  248. break;
  249. case SSB_PLLTYPE_3:
  250. /* 5350 uses m2 to control mips */
  251. *m = chipco_read32(cc, SSB_CHIPCO_CLOCK_M2);
  252. break;
  253. default:
  254. *m = chipco_read32(cc, SSB_CHIPCO_CLOCK_SB);
  255. break;
  256. }
  257. }
  258. /* Get the bus clock */
  259. void ssb_chipco_get_clockcontrol(struct ssb_chipcommon *cc,
  260. u32 *plltype, u32 *n, u32 *m)
  261. {
  262. *n = chipco_read32(cc, SSB_CHIPCO_CLOCK_N);
  263. *plltype = (cc->capabilities & SSB_CHIPCO_CAP_PLLT);
  264. switch (*plltype) {
  265. case SSB_PLLTYPE_6: /* 100/200 or 120/240 only */
  266. *m = chipco_read32(cc, SSB_CHIPCO_CLOCK_MIPS);
  267. break;
  268. case SSB_PLLTYPE_3: /* 25Mhz, 2 dividers */
  269. if (cc->dev->bus->chip_id != 0x5365) {
  270. *m = chipco_read32(cc, SSB_CHIPCO_CLOCK_M2);
  271. break;
  272. }
  273. /* Fallthough */
  274. default:
  275. *m = chipco_read32(cc, SSB_CHIPCO_CLOCK_SB);
  276. }
  277. }
  278. void ssb_chipco_timing_init(struct ssb_chipcommon *cc,
  279. unsigned long ns)
  280. {
  281. struct ssb_device *dev = cc->dev;
  282. struct ssb_bus *bus = dev->bus;
  283. u32 tmp;
  284. /* set register for external IO to control LED. */
  285. chipco_write32(cc, SSB_CHIPCO_PROG_CFG, 0x11);
  286. tmp = DIV_ROUND_UP(10, ns) << SSB_PROG_WCNT_3_SHIFT; /* Waitcount-3 = 10ns */
  287. tmp |= DIV_ROUND_UP(40, ns) << SSB_PROG_WCNT_1_SHIFT; /* Waitcount-1 = 40ns */
  288. tmp |= DIV_ROUND_UP(240, ns); /* Waitcount-0 = 240ns */
  289. chipco_write32(cc, SSB_CHIPCO_PROG_WAITCNT, tmp); /* 0x01020a0c for a 100Mhz clock */
  290. /* Set timing for the flash */
  291. tmp = DIV_ROUND_UP(10, ns) << SSB_FLASH_WCNT_3_SHIFT; /* Waitcount-3 = 10nS */
  292. tmp |= DIV_ROUND_UP(10, ns) << SSB_FLASH_WCNT_1_SHIFT; /* Waitcount-1 = 10nS */
  293. tmp |= DIV_ROUND_UP(120, ns); /* Waitcount-0 = 120nS */
  294. if ((bus->chip_id == 0x5365) ||
  295. (dev->id.revision < 9))
  296. chipco_write32(cc, SSB_CHIPCO_FLASH_WAITCNT, tmp);
  297. if ((bus->chip_id == 0x5365) ||
  298. (dev->id.revision < 9) ||
  299. ((bus->chip_id == 0x5350) && (bus->chip_rev == 0)))
  300. chipco_write32(cc, SSB_CHIPCO_PCMCIA_MEMWAIT, tmp);
  301. if (bus->chip_id == 0x5350) {
  302. /* Enable EXTIF */
  303. tmp = DIV_ROUND_UP(10, ns) << SSB_PROG_WCNT_3_SHIFT; /* Waitcount-3 = 10ns */
  304. tmp |= DIV_ROUND_UP(20, ns) << SSB_PROG_WCNT_2_SHIFT; /* Waitcount-2 = 20ns */
  305. tmp |= DIV_ROUND_UP(100, ns) << SSB_PROG_WCNT_1_SHIFT; /* Waitcount-1 = 100ns */
  306. tmp |= DIV_ROUND_UP(120, ns); /* Waitcount-0 = 120ns */
  307. chipco_write32(cc, SSB_CHIPCO_PROG_WAITCNT, tmp); /* 0x01020a0c for a 100Mhz clock */
  308. }
  309. }
  310. /* Set chip watchdog reset timer to fire in 'ticks' backplane cycles */
  311. void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, u32 ticks)
  312. {
  313. /* instant NMI */
  314. chipco_write32(cc, SSB_CHIPCO_WATCHDOG, ticks);
  315. }
  316. void ssb_chipco_irq_mask(struct ssb_chipcommon *cc, u32 mask, u32 value)
  317. {
  318. chipco_write32_masked(cc, SSB_CHIPCO_IRQMASK, mask, value);
  319. }
  320. u32 ssb_chipco_irq_status(struct ssb_chipcommon *cc, u32 mask)
  321. {
  322. return chipco_read32(cc, SSB_CHIPCO_IRQSTAT) & mask;
  323. }
  324. u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, u32 mask)
  325. {
  326. return chipco_read32(cc, SSB_CHIPCO_GPIOIN) & mask;
  327. }
  328. u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value)
  329. {
  330. return chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUT, mask, value);
  331. }
  332. u32 ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value)
  333. {
  334. return chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUTEN, mask, value);
  335. }
  336. u32 ssb_chipco_gpio_control(struct ssb_chipcommon *cc, u32 mask, u32 value)
  337. {
  338. return chipco_write32_masked(cc, SSB_CHIPCO_GPIOCTL, mask, value);
  339. }
  340. u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc, u32 mask, u32 value)
  341. {
  342. return chipco_write32_masked(cc, SSB_CHIPCO_GPIOIRQ, mask, value);
  343. }
  344. u32 ssb_chipco_gpio_polarity(struct ssb_chipcommon *cc, u32 mask, u32 value)
  345. {
  346. return chipco_write32_masked(cc, SSB_CHIPCO_GPIOPOL, mask, value);
  347. }
  348. #ifdef CONFIG_SSB_SERIAL
  349. int ssb_chipco_serial_init(struct ssb_chipcommon *cc,
  350. struct ssb_serial_port *ports)
  351. {
  352. struct ssb_bus *bus = cc->dev->bus;
  353. int nr_ports = 0;
  354. u32 plltype;
  355. unsigned int irq;
  356. u32 baud_base, div;
  357. u32 i, n;
  358. unsigned int ccrev = cc->dev->id.revision;
  359. plltype = (cc->capabilities & SSB_CHIPCO_CAP_PLLT);
  360. irq = ssb_mips_irq(cc->dev);
  361. if (plltype == SSB_PLLTYPE_1) {
  362. /* PLL clock */
  363. baud_base = ssb_calc_clock_rate(plltype,
  364. chipco_read32(cc, SSB_CHIPCO_CLOCK_N),
  365. chipco_read32(cc, SSB_CHIPCO_CLOCK_M2));
  366. div = 1;
  367. } else {
  368. if (ccrev == 20) {
  369. /* BCM5354 uses constant 25MHz clock */
  370. baud_base = 25000000;
  371. div = 48;
  372. /* Set the override bit so we don't divide it */
  373. chipco_write32(cc, SSB_CHIPCO_CORECTL,
  374. chipco_read32(cc, SSB_CHIPCO_CORECTL)
  375. | SSB_CHIPCO_CORECTL_UARTCLK0);
  376. } else if ((ccrev >= 11) && (ccrev != 15)) {
  377. /* Fixed ALP clock */
  378. baud_base = 20000000;
  379. if (cc->capabilities & SSB_CHIPCO_CAP_PMU) {
  380. /* FIXME: baud_base is different for devices with a PMU */
  381. SSB_WARN_ON(1);
  382. }
  383. div = 1;
  384. if (ccrev >= 21) {
  385. /* Turn off UART clock before switching clocksource. */
  386. chipco_write32(cc, SSB_CHIPCO_CORECTL,
  387. chipco_read32(cc, SSB_CHIPCO_CORECTL)
  388. & ~SSB_CHIPCO_CORECTL_UARTCLKEN);
  389. }
  390. /* Set the override bit so we don't divide it */
  391. chipco_write32(cc, SSB_CHIPCO_CORECTL,
  392. chipco_read32(cc, SSB_CHIPCO_CORECTL)
  393. | SSB_CHIPCO_CORECTL_UARTCLK0);
  394. if (ccrev >= 21) {
  395. /* Re-enable the UART clock. */
  396. chipco_write32(cc, SSB_CHIPCO_CORECTL,
  397. chipco_read32(cc, SSB_CHIPCO_CORECTL)
  398. | SSB_CHIPCO_CORECTL_UARTCLKEN);
  399. }
  400. } else if (ccrev >= 3) {
  401. /* Internal backplane clock */
  402. baud_base = ssb_clockspeed(bus);
  403. div = chipco_read32(cc, SSB_CHIPCO_CLKDIV)
  404. & SSB_CHIPCO_CLKDIV_UART;
  405. } else {
  406. /* Fixed internal backplane clock */
  407. baud_base = 88000000;
  408. div = 48;
  409. }
  410. /* Clock source depends on strapping if UartClkOverride is unset */
  411. if ((ccrev > 0) &&
  412. !(chipco_read32(cc, SSB_CHIPCO_CORECTL) & SSB_CHIPCO_CORECTL_UARTCLK0)) {
  413. if ((cc->capabilities & SSB_CHIPCO_CAP_UARTCLK) ==
  414. SSB_CHIPCO_CAP_UARTCLK_INT) {
  415. /* Internal divided backplane clock */
  416. baud_base /= div;
  417. } else {
  418. /* Assume external clock of 1.8432 MHz */
  419. baud_base = 1843200;
  420. }
  421. }
  422. }
  423. /* Determine the registers of the UARTs */
  424. n = (cc->capabilities & SSB_CHIPCO_CAP_NRUART);
  425. for (i = 0; i < n; i++) {
  426. void __iomem *cc_mmio;
  427. void __iomem *uart_regs;
  428. cc_mmio = cc->dev->bus->mmio + (cc->dev->core_index * SSB_CORE_SIZE);
  429. uart_regs = cc_mmio + SSB_CHIPCO_UART0_DATA;
  430. /* Offset changed at after rev 0 */
  431. if (ccrev == 0)
  432. uart_regs += (i * 8);
  433. else
  434. uart_regs += (i * 256);
  435. nr_ports++;
  436. ports[i].regs = uart_regs;
  437. ports[i].irq = irq;
  438. ports[i].baud_base = baud_base;
  439. ports[i].reg_shift = 0;
  440. }
  441. return nr_ports;
  442. }
  443. #endif /* CONFIG_SSB_SERIAL */