driver_chipcommon.c 12 KB

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