sm501.c 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409
  1. /* linux/drivers/mfd/sm501.c
  2. *
  3. * Copyright (C) 2006 Simtec Electronics
  4. * Ben Dooks <ben@simtec.co.uk>
  5. * Vincent Sanders <vince@simtec.co.uk>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License version 2 as
  9. * published by the Free Software Foundation.
  10. *
  11. * SM501 MFD driver
  12. */
  13. #include <linux/kernel.h>
  14. #include <linux/module.h>
  15. #include <linux/delay.h>
  16. #include <linux/init.h>
  17. #include <linux/list.h>
  18. #include <linux/device.h>
  19. #include <linux/platform_device.h>
  20. #include <linux/pci.h>
  21. #include <linux/sm501.h>
  22. #include <linux/sm501-regs.h>
  23. #include <linux/serial_8250.h>
  24. #include <asm/io.h>
  25. struct sm501_device {
  26. struct list_head list;
  27. struct platform_device pdev;
  28. };
  29. struct sm501_devdata {
  30. spinlock_t reg_lock;
  31. struct mutex clock_lock;
  32. struct list_head devices;
  33. struct device *dev;
  34. struct resource *io_res;
  35. struct resource *mem_res;
  36. struct resource *regs_claim;
  37. struct sm501_platdata *platdata;
  38. unsigned int in_suspend;
  39. unsigned long pm_misc;
  40. int unit_power[20];
  41. unsigned int pdev_id;
  42. unsigned int irq;
  43. void __iomem *regs;
  44. unsigned int rev;
  45. };
  46. #define MHZ (1000 * 1000)
  47. #ifdef DEBUG
  48. static const unsigned int div_tab[] = {
  49. [0] = 1,
  50. [1] = 2,
  51. [2] = 4,
  52. [3] = 8,
  53. [4] = 16,
  54. [5] = 32,
  55. [6] = 64,
  56. [7] = 128,
  57. [8] = 3,
  58. [9] = 6,
  59. [10] = 12,
  60. [11] = 24,
  61. [12] = 48,
  62. [13] = 96,
  63. [14] = 192,
  64. [15] = 384,
  65. [16] = 5,
  66. [17] = 10,
  67. [18] = 20,
  68. [19] = 40,
  69. [20] = 80,
  70. [21] = 160,
  71. [22] = 320,
  72. [23] = 604,
  73. };
  74. static unsigned long decode_div(unsigned long pll2, unsigned long val,
  75. unsigned int lshft, unsigned int selbit,
  76. unsigned long mask)
  77. {
  78. if (val & selbit)
  79. pll2 = 288 * MHZ;
  80. return pll2 / div_tab[(val >> lshft) & mask];
  81. }
  82. #define fmt_freq(x) ((x) / MHZ), ((x) % MHZ), (x)
  83. /* sm501_dump_clk
  84. *
  85. * Print out the current clock configuration for the device
  86. */
  87. static void sm501_dump_clk(struct sm501_devdata *sm)
  88. {
  89. unsigned long misct = readl(sm->regs + SM501_MISC_TIMING);
  90. unsigned long pm0 = readl(sm->regs + SM501_POWER_MODE_0_CLOCK);
  91. unsigned long pm1 = readl(sm->regs + SM501_POWER_MODE_1_CLOCK);
  92. unsigned long pmc = readl(sm->regs + SM501_POWER_MODE_CONTROL);
  93. unsigned long sdclk0, sdclk1;
  94. unsigned long pll2 = 0;
  95. switch (misct & 0x30) {
  96. case 0x00:
  97. pll2 = 336 * MHZ;
  98. break;
  99. case 0x10:
  100. pll2 = 288 * MHZ;
  101. break;
  102. case 0x20:
  103. pll2 = 240 * MHZ;
  104. break;
  105. case 0x30:
  106. pll2 = 192 * MHZ;
  107. break;
  108. }
  109. sdclk0 = (misct & (1<<12)) ? pll2 : 288 * MHZ;
  110. sdclk0 /= div_tab[((misct >> 8) & 0xf)];
  111. sdclk1 = (misct & (1<<20)) ? pll2 : 288 * MHZ;
  112. sdclk1 /= div_tab[((misct >> 16) & 0xf)];
  113. dev_dbg(sm->dev, "MISCT=%08lx, PM0=%08lx, PM1=%08lx\n",
  114. misct, pm0, pm1);
  115. dev_dbg(sm->dev, "PLL2 = %ld.%ld MHz (%ld), SDCLK0=%08lx, SDCLK1=%08lx\n",
  116. fmt_freq(pll2), sdclk0, sdclk1);
  117. dev_dbg(sm->dev, "SDRAM: PM0=%ld, PM1=%ld\n", sdclk0, sdclk1);
  118. dev_dbg(sm->dev, "PM0[%c]: "
  119. "P2 %ld.%ld MHz (%ld), V2 %ld.%ld (%ld), "
  120. "M %ld.%ld (%ld), MX1 %ld.%ld (%ld)\n",
  121. (pmc & 3 ) == 0 ? '*' : '-',
  122. fmt_freq(decode_div(pll2, pm0, 24, 1<<29, 31)),
  123. fmt_freq(decode_div(pll2, pm0, 16, 1<<20, 15)),
  124. fmt_freq(decode_div(pll2, pm0, 8, 1<<12, 15)),
  125. fmt_freq(decode_div(pll2, pm0, 0, 1<<4, 15)));
  126. dev_dbg(sm->dev, "PM1[%c]: "
  127. "P2 %ld.%ld MHz (%ld), V2 %ld.%ld (%ld), "
  128. "M %ld.%ld (%ld), MX1 %ld.%ld (%ld)\n",
  129. (pmc & 3 ) == 1 ? '*' : '-',
  130. fmt_freq(decode_div(pll2, pm1, 24, 1<<29, 31)),
  131. fmt_freq(decode_div(pll2, pm1, 16, 1<<20, 15)),
  132. fmt_freq(decode_div(pll2, pm1, 8, 1<<12, 15)),
  133. fmt_freq(decode_div(pll2, pm1, 0, 1<<4, 15)));
  134. }
  135. static void sm501_dump_regs(struct sm501_devdata *sm)
  136. {
  137. void __iomem *regs = sm->regs;
  138. dev_info(sm->dev, "System Control %08x\n",
  139. readl(regs + SM501_SYSTEM_CONTROL));
  140. dev_info(sm->dev, "Misc Control %08x\n",
  141. readl(regs + SM501_MISC_CONTROL));
  142. dev_info(sm->dev, "GPIO Control Low %08x\n",
  143. readl(regs + SM501_GPIO31_0_CONTROL));
  144. dev_info(sm->dev, "GPIO Control Hi %08x\n",
  145. readl(regs + SM501_GPIO63_32_CONTROL));
  146. dev_info(sm->dev, "DRAM Control %08x\n",
  147. readl(regs + SM501_DRAM_CONTROL));
  148. dev_info(sm->dev, "Arbitration Ctrl %08x\n",
  149. readl(regs + SM501_ARBTRTN_CONTROL));
  150. dev_info(sm->dev, "Misc Timing %08x\n",
  151. readl(regs + SM501_MISC_TIMING));
  152. }
  153. static void sm501_dump_gate(struct sm501_devdata *sm)
  154. {
  155. dev_info(sm->dev, "CurrentGate %08x\n",
  156. readl(sm->regs + SM501_CURRENT_GATE));
  157. dev_info(sm->dev, "CurrentClock %08x\n",
  158. readl(sm->regs + SM501_CURRENT_CLOCK));
  159. dev_info(sm->dev, "PowerModeControl %08x\n",
  160. readl(sm->regs + SM501_POWER_MODE_CONTROL));
  161. }
  162. #else
  163. static inline void sm501_dump_gate(struct sm501_devdata *sm) { }
  164. static inline void sm501_dump_regs(struct sm501_devdata *sm) { }
  165. static inline void sm501_dump_clk(struct sm501_devdata *sm) { }
  166. #endif
  167. /* sm501_sync_regs
  168. *
  169. * ensure the
  170. */
  171. static void sm501_sync_regs(struct sm501_devdata *sm)
  172. {
  173. readl(sm->regs);
  174. }
  175. static inline void sm501_mdelay(struct sm501_devdata *sm, unsigned int delay)
  176. {
  177. /* during suspend/resume, we are currently not allowed to sleep,
  178. * so change to using mdelay() instead of msleep() if we
  179. * are in one of these paths */
  180. if (sm->in_suspend)
  181. mdelay(delay);
  182. else
  183. msleep(delay);
  184. }
  185. /* sm501_misc_control
  186. *
  187. * alters the miscellaneous control parameters
  188. */
  189. int sm501_misc_control(struct device *dev,
  190. unsigned long set, unsigned long clear)
  191. {
  192. struct sm501_devdata *sm = dev_get_drvdata(dev);
  193. unsigned long misc;
  194. unsigned long save;
  195. unsigned long to;
  196. spin_lock_irqsave(&sm->reg_lock, save);
  197. misc = readl(sm->regs + SM501_MISC_CONTROL);
  198. to = (misc & ~clear) | set;
  199. if (to != misc) {
  200. writel(to, sm->regs + SM501_MISC_CONTROL);
  201. sm501_sync_regs(sm);
  202. dev_dbg(sm->dev, "MISC_CONTROL %08lx\n", misc);
  203. }
  204. spin_unlock_irqrestore(&sm->reg_lock, save);
  205. return to;
  206. }
  207. EXPORT_SYMBOL_GPL(sm501_misc_control);
  208. /* sm501_modify_reg
  209. *
  210. * Modify a register in the SM501 which may be shared with other
  211. * drivers.
  212. */
  213. unsigned long sm501_modify_reg(struct device *dev,
  214. unsigned long reg,
  215. unsigned long set,
  216. unsigned long clear)
  217. {
  218. struct sm501_devdata *sm = dev_get_drvdata(dev);
  219. unsigned long data;
  220. unsigned long save;
  221. spin_lock_irqsave(&sm->reg_lock, save);
  222. data = readl(sm->regs + reg);
  223. data |= set;
  224. data &= ~clear;
  225. writel(data, sm->regs + reg);
  226. sm501_sync_regs(sm);
  227. spin_unlock_irqrestore(&sm->reg_lock, save);
  228. return data;
  229. }
  230. EXPORT_SYMBOL_GPL(sm501_modify_reg);
  231. unsigned long sm501_gpio_get(struct device *dev,
  232. unsigned long gpio)
  233. {
  234. struct sm501_devdata *sm = dev_get_drvdata(dev);
  235. unsigned long result;
  236. unsigned long reg;
  237. reg = (gpio > 32) ? SM501_GPIO_DATA_HIGH : SM501_GPIO_DATA_LOW;
  238. result = readl(sm->regs + reg);
  239. result >>= (gpio & 31);
  240. return result & 1UL;
  241. }
  242. EXPORT_SYMBOL_GPL(sm501_gpio_get);
  243. void sm501_gpio_set(struct device *dev,
  244. unsigned long gpio,
  245. unsigned int to,
  246. unsigned int dir)
  247. {
  248. struct sm501_devdata *sm = dev_get_drvdata(dev);
  249. unsigned long bit = 1 << (gpio & 31);
  250. unsigned long base;
  251. unsigned long save;
  252. unsigned long val;
  253. base = (gpio > 32) ? SM501_GPIO_DATA_HIGH : SM501_GPIO_DATA_LOW;
  254. base += SM501_GPIO;
  255. spin_lock_irqsave(&sm->reg_lock, save);
  256. val = readl(sm->regs + base) & ~bit;
  257. if (to)
  258. val |= bit;
  259. writel(val, sm->regs + base);
  260. val = readl(sm->regs + SM501_GPIO_DDR_LOW) & ~bit;
  261. if (dir)
  262. val |= bit;
  263. writel(val, sm->regs + SM501_GPIO_DDR_LOW);
  264. sm501_sync_regs(sm);
  265. spin_unlock_irqrestore(&sm->reg_lock, save);
  266. }
  267. EXPORT_SYMBOL_GPL(sm501_gpio_set);
  268. /* sm501_unit_power
  269. *
  270. * alters the power active gate to set specific units on or off
  271. */
  272. int sm501_unit_power(struct device *dev, unsigned int unit, unsigned int to)
  273. {
  274. struct sm501_devdata *sm = dev_get_drvdata(dev);
  275. unsigned long mode;
  276. unsigned long gate;
  277. unsigned long clock;
  278. mutex_lock(&sm->clock_lock);
  279. mode = readl(sm->regs + SM501_POWER_MODE_CONTROL);
  280. gate = readl(sm->regs + SM501_CURRENT_GATE);
  281. clock = readl(sm->regs + SM501_CURRENT_CLOCK);
  282. mode &= 3; /* get current power mode */
  283. if (unit >= ARRAY_SIZE(sm->unit_power)) {
  284. dev_err(dev, "%s: bad unit %d\n", __func__, unit);
  285. goto already;
  286. }
  287. dev_dbg(sm->dev, "%s: unit %d, cur %d, to %d\n", __func__, unit,
  288. sm->unit_power[unit], to);
  289. if (to == 0 && sm->unit_power[unit] == 0) {
  290. dev_err(sm->dev, "unit %d is already shutdown\n", unit);
  291. goto already;
  292. }
  293. sm->unit_power[unit] += to ? 1 : -1;
  294. to = sm->unit_power[unit] ? 1 : 0;
  295. if (to) {
  296. if (gate & (1 << unit))
  297. goto already;
  298. gate |= (1 << unit);
  299. } else {
  300. if (!(gate & (1 << unit)))
  301. goto already;
  302. gate &= ~(1 << unit);
  303. }
  304. switch (mode) {
  305. case 1:
  306. writel(gate, sm->regs + SM501_POWER_MODE_0_GATE);
  307. writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK);
  308. mode = 0;
  309. break;
  310. case 2:
  311. case 0:
  312. writel(gate, sm->regs + SM501_POWER_MODE_1_GATE);
  313. writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK);
  314. mode = 1;
  315. break;
  316. default:
  317. return -1;
  318. }
  319. writel(mode, sm->regs + SM501_POWER_MODE_CONTROL);
  320. sm501_sync_regs(sm);
  321. dev_dbg(sm->dev, "gate %08lx, clock %08lx, mode %08lx\n",
  322. gate, clock, mode);
  323. sm501_mdelay(sm, 16);
  324. already:
  325. mutex_unlock(&sm->clock_lock);
  326. return gate;
  327. }
  328. EXPORT_SYMBOL_GPL(sm501_unit_power);
  329. /* Perform a rounded division. */
  330. static long sm501fb_round_div(long num, long denom)
  331. {
  332. /* n / d + 1 / 2 = (2n + d) / 2d */
  333. return (2 * num + denom) / (2 * denom);
  334. }
  335. /* clock value structure. */
  336. struct sm501_clock {
  337. unsigned long mclk;
  338. int divider;
  339. int shift;
  340. unsigned int m, n, k;
  341. };
  342. /* sm501_calc_clock
  343. *
  344. * Calculates the nearest discrete clock frequency that
  345. * can be achieved with the specified input clock.
  346. * the maximum divisor is 3 or 5
  347. */
  348. static int sm501_calc_clock(unsigned long freq,
  349. struct sm501_clock *clock,
  350. int max_div,
  351. unsigned long mclk,
  352. long *best_diff)
  353. {
  354. int ret = 0;
  355. int divider;
  356. int shift;
  357. long diff;
  358. /* try dividers 1 and 3 for CRT and for panel,
  359. try divider 5 for panel only.*/
  360. for (divider = 1; divider <= max_div; divider += 2) {
  361. /* try all 8 shift values.*/
  362. for (shift = 0; shift < 8; shift++) {
  363. /* Calculate difference to requested clock */
  364. diff = sm501fb_round_div(mclk, divider << shift) - freq;
  365. if (diff < 0)
  366. diff = -diff;
  367. /* If it is less than the current, use it */
  368. if (diff < *best_diff) {
  369. *best_diff = diff;
  370. clock->mclk = mclk;
  371. clock->divider = divider;
  372. clock->shift = shift;
  373. ret = 1;
  374. }
  375. }
  376. }
  377. return ret;
  378. }
  379. /* sm501_calc_pll
  380. *
  381. * Calculates the nearest discrete clock frequency that can be
  382. * achieved using the programmable PLL.
  383. * the maximum divisor is 3 or 5
  384. */
  385. static unsigned long sm501_calc_pll(unsigned long freq,
  386. struct sm501_clock *clock,
  387. int max_div)
  388. {
  389. unsigned long mclk;
  390. unsigned int m, n, k;
  391. long best_diff = 999999999;
  392. /*
  393. * The SM502 datasheet doesn't specify the min/max values for M and N.
  394. * N = 1 at least doesn't work in practice.
  395. */
  396. for (m = 2; m <= 255; m++) {
  397. for (n = 2; n <= 127; n++) {
  398. for (k = 0; k <= 1; k++) {
  399. mclk = (24000000UL * m / n) >> k;
  400. if (sm501_calc_clock(freq, clock, max_div,
  401. mclk, &best_diff)) {
  402. clock->m = m;
  403. clock->n = n;
  404. clock->k = k;
  405. }
  406. }
  407. }
  408. }
  409. /* Return best clock. */
  410. return clock->mclk / (clock->divider << clock->shift);
  411. }
  412. /* sm501_select_clock
  413. *
  414. * Calculates the nearest discrete clock frequency that can be
  415. * achieved using the 288MHz and 336MHz PLLs.
  416. * the maximum divisor is 3 or 5
  417. */
  418. static unsigned long sm501_select_clock(unsigned long freq,
  419. struct sm501_clock *clock,
  420. int max_div)
  421. {
  422. unsigned long mclk;
  423. long best_diff = 999999999;
  424. /* Try 288MHz and 336MHz clocks. */
  425. for (mclk = 288000000; mclk <= 336000000; mclk += 48000000) {
  426. sm501_calc_clock(freq, clock, max_div, mclk, &best_diff);
  427. }
  428. /* Return best clock. */
  429. return clock->mclk / (clock->divider << clock->shift);
  430. }
  431. /* sm501_set_clock
  432. *
  433. * set one of the four clock sources to the closest available frequency to
  434. * the one specified
  435. */
  436. unsigned long sm501_set_clock(struct device *dev,
  437. int clksrc,
  438. unsigned long req_freq)
  439. {
  440. struct sm501_devdata *sm = dev_get_drvdata(dev);
  441. unsigned long mode = readl(sm->regs + SM501_POWER_MODE_CONTROL);
  442. unsigned long gate = readl(sm->regs + SM501_CURRENT_GATE);
  443. unsigned long clock = readl(sm->regs + SM501_CURRENT_CLOCK);
  444. unsigned char reg;
  445. unsigned int pll_reg = 0;
  446. unsigned long sm501_freq; /* the actual frequency acheived */
  447. struct sm501_clock to;
  448. /* find achivable discrete frequency and setup register value
  449. * accordingly, V2XCLK, MCLK and M1XCLK are the same P2XCLK
  450. * has an extra bit for the divider */
  451. switch (clksrc) {
  452. case SM501_CLOCK_P2XCLK:
  453. /* This clock is divided in half so to achive the
  454. * requested frequency the value must be multiplied by
  455. * 2. This clock also has an additional pre divisor */
  456. if (sm->rev >= 0xC0) {
  457. /* SM502 -> use the programmable PLL */
  458. sm501_freq = (sm501_calc_pll(2 * req_freq,
  459. &to, 5) / 2);
  460. reg = to.shift & 0x07;/* bottom 3 bits are shift */
  461. if (to.divider == 3)
  462. reg |= 0x08; /* /3 divider required */
  463. else if (to.divider == 5)
  464. reg |= 0x10; /* /5 divider required */
  465. reg |= 0x40; /* select the programmable PLL */
  466. pll_reg = 0x20000 | (to.k << 15) | (to.n << 8) | to.m;
  467. } else {
  468. sm501_freq = (sm501_select_clock(2 * req_freq,
  469. &to, 5) / 2);
  470. reg = to.shift & 0x07;/* bottom 3 bits are shift */
  471. if (to.divider == 3)
  472. reg |= 0x08; /* /3 divider required */
  473. else if (to.divider == 5)
  474. reg |= 0x10; /* /5 divider required */
  475. if (to.mclk != 288000000)
  476. reg |= 0x20; /* which mclk pll is source */
  477. }
  478. break;
  479. case SM501_CLOCK_V2XCLK:
  480. /* This clock is divided in half so to achive the
  481. * requested frequency the value must be multiplied by 2. */
  482. sm501_freq = (sm501_select_clock(2 * req_freq, &to, 3) / 2);
  483. reg=to.shift & 0x07; /* bottom 3 bits are shift */
  484. if (to.divider == 3)
  485. reg |= 0x08; /* /3 divider required */
  486. if (to.mclk != 288000000)
  487. reg |= 0x10; /* which mclk pll is source */
  488. break;
  489. case SM501_CLOCK_MCLK:
  490. case SM501_CLOCK_M1XCLK:
  491. /* These clocks are the same and not further divided */
  492. sm501_freq = sm501_select_clock( req_freq, &to, 3);
  493. reg=to.shift & 0x07; /* bottom 3 bits are shift */
  494. if (to.divider == 3)
  495. reg |= 0x08; /* /3 divider required */
  496. if (to.mclk != 288000000)
  497. reg |= 0x10; /* which mclk pll is source */
  498. break;
  499. default:
  500. return 0; /* this is bad */
  501. }
  502. mutex_lock(&sm->clock_lock);
  503. mode = readl(sm->regs + SM501_POWER_MODE_CONTROL);
  504. gate = readl(sm->regs + SM501_CURRENT_GATE);
  505. clock = readl(sm->regs + SM501_CURRENT_CLOCK);
  506. clock = clock & ~(0xFF << clksrc);
  507. clock |= reg<<clksrc;
  508. mode &= 3; /* find current mode */
  509. switch (mode) {
  510. case 1:
  511. writel(gate, sm->regs + SM501_POWER_MODE_0_GATE);
  512. writel(clock, sm->regs + SM501_POWER_MODE_0_CLOCK);
  513. mode = 0;
  514. break;
  515. case 2:
  516. case 0:
  517. writel(gate, sm->regs + SM501_POWER_MODE_1_GATE);
  518. writel(clock, sm->regs + SM501_POWER_MODE_1_CLOCK);
  519. mode = 1;
  520. break;
  521. default:
  522. mutex_unlock(&sm->clock_lock);
  523. return -1;
  524. }
  525. writel(mode, sm->regs + SM501_POWER_MODE_CONTROL);
  526. if (pll_reg)
  527. writel(pll_reg, sm->regs + SM501_PROGRAMMABLE_PLL_CONTROL);
  528. sm501_sync_regs(sm);
  529. dev_info(sm->dev, "gate %08lx, clock %08lx, mode %08lx\n",
  530. gate, clock, mode);
  531. sm501_mdelay(sm, 16);
  532. mutex_unlock(&sm->clock_lock);
  533. sm501_dump_clk(sm);
  534. return sm501_freq;
  535. }
  536. EXPORT_SYMBOL_GPL(sm501_set_clock);
  537. /* sm501_find_clock
  538. *
  539. * finds the closest available frequency for a given clock
  540. */
  541. unsigned long sm501_find_clock(struct device *dev,
  542. int clksrc,
  543. unsigned long req_freq)
  544. {
  545. struct sm501_devdata *sm = dev_get_drvdata(dev);
  546. unsigned long sm501_freq; /* the frequency achiveable by the 501 */
  547. struct sm501_clock to;
  548. switch (clksrc) {
  549. case SM501_CLOCK_P2XCLK:
  550. if (sm->rev >= 0xC0) {
  551. /* SM502 -> use the programmable PLL */
  552. sm501_freq = (sm501_calc_pll(2 * req_freq,
  553. &to, 5) / 2);
  554. } else {
  555. sm501_freq = (sm501_select_clock(2 * req_freq,
  556. &to, 5) / 2);
  557. }
  558. break;
  559. case SM501_CLOCK_V2XCLK:
  560. sm501_freq = (sm501_select_clock(2 * req_freq, &to, 3) / 2);
  561. break;
  562. case SM501_CLOCK_MCLK:
  563. case SM501_CLOCK_M1XCLK:
  564. sm501_freq = sm501_select_clock(req_freq, &to, 3);
  565. break;
  566. default:
  567. sm501_freq = 0; /* error */
  568. }
  569. return sm501_freq;
  570. }
  571. EXPORT_SYMBOL_GPL(sm501_find_clock);
  572. static struct sm501_device *to_sm_device(struct platform_device *pdev)
  573. {
  574. return container_of(pdev, struct sm501_device, pdev);
  575. }
  576. /* sm501_device_release
  577. *
  578. * A release function for the platform devices we create to allow us to
  579. * free any items we allocated
  580. */
  581. static void sm501_device_release(struct device *dev)
  582. {
  583. kfree(to_sm_device(to_platform_device(dev)));
  584. }
  585. /* sm501_create_subdev
  586. *
  587. * Create a skeleton platform device with resources for passing to a
  588. * sub-driver
  589. */
  590. static struct platform_device *
  591. sm501_create_subdev(struct sm501_devdata *sm, char *name,
  592. unsigned int res_count, unsigned int platform_data_size)
  593. {
  594. struct sm501_device *smdev;
  595. smdev = kzalloc(sizeof(struct sm501_device) +
  596. (sizeof(struct resource) * res_count) +
  597. platform_data_size, GFP_KERNEL);
  598. if (!smdev)
  599. return NULL;
  600. smdev->pdev.dev.release = sm501_device_release;
  601. smdev->pdev.name = name;
  602. smdev->pdev.id = sm->pdev_id;
  603. smdev->pdev.dev.parent = sm->dev;
  604. if (res_count) {
  605. smdev->pdev.resource = (struct resource *)(smdev+1);
  606. smdev->pdev.num_resources = res_count;
  607. }
  608. if (platform_data_size)
  609. smdev->pdev.dev.platform_data = (void *)(smdev+1);
  610. return &smdev->pdev;
  611. }
  612. /* sm501_register_device
  613. *
  614. * Register a platform device created with sm501_create_subdev()
  615. */
  616. static int sm501_register_device(struct sm501_devdata *sm,
  617. struct platform_device *pdev)
  618. {
  619. struct sm501_device *smdev = to_sm_device(pdev);
  620. int ptr;
  621. int ret;
  622. for (ptr = 0; ptr < pdev->num_resources; ptr++) {
  623. printk("%s[%d] flags %08lx: %08llx..%08llx\n",
  624. pdev->name, ptr,
  625. pdev->resource[ptr].flags,
  626. (unsigned long long)pdev->resource[ptr].start,
  627. (unsigned long long)pdev->resource[ptr].end);
  628. }
  629. ret = platform_device_register(pdev);
  630. if (ret >= 0) {
  631. dev_dbg(sm->dev, "registered %s\n", pdev->name);
  632. list_add_tail(&smdev->list, &sm->devices);
  633. } else
  634. dev_err(sm->dev, "error registering %s (%d)\n",
  635. pdev->name, ret);
  636. return ret;
  637. }
  638. /* sm501_create_subio
  639. *
  640. * Fill in an IO resource for a sub device
  641. */
  642. static void sm501_create_subio(struct sm501_devdata *sm,
  643. struct resource *res,
  644. resource_size_t offs,
  645. resource_size_t size)
  646. {
  647. res->flags = IORESOURCE_MEM;
  648. res->parent = sm->io_res;
  649. res->start = sm->io_res->start + offs;
  650. res->end = res->start + size - 1;
  651. }
  652. /* sm501_create_mem
  653. *
  654. * Fill in an MEM resource for a sub device
  655. */
  656. static void sm501_create_mem(struct sm501_devdata *sm,
  657. struct resource *res,
  658. resource_size_t *offs,
  659. resource_size_t size)
  660. {
  661. *offs -= size; /* adjust memory size */
  662. res->flags = IORESOURCE_MEM;
  663. res->parent = sm->mem_res;
  664. res->start = sm->mem_res->start + *offs;
  665. res->end = res->start + size - 1;
  666. }
  667. /* sm501_create_irq
  668. *
  669. * Fill in an IRQ resource for a sub device
  670. */
  671. static void sm501_create_irq(struct sm501_devdata *sm,
  672. struct resource *res)
  673. {
  674. res->flags = IORESOURCE_IRQ;
  675. res->parent = NULL;
  676. res->start = res->end = sm->irq;
  677. }
  678. static int sm501_register_usbhost(struct sm501_devdata *sm,
  679. resource_size_t *mem_avail)
  680. {
  681. struct platform_device *pdev;
  682. pdev = sm501_create_subdev(sm, "sm501-usb", 3, 0);
  683. if (!pdev)
  684. return -ENOMEM;
  685. sm501_create_subio(sm, &pdev->resource[0], 0x40000, 0x20000);
  686. sm501_create_mem(sm, &pdev->resource[1], mem_avail, 256*1024);
  687. sm501_create_irq(sm, &pdev->resource[2]);
  688. return sm501_register_device(sm, pdev);
  689. }
  690. static void sm501_setup_uart_data(struct sm501_devdata *sm,
  691. struct plat_serial8250_port *uart_data,
  692. unsigned int offset)
  693. {
  694. uart_data->membase = sm->regs + offset;
  695. uart_data->mapbase = sm->io_res->start + offset;
  696. uart_data->iotype = UPIO_MEM;
  697. uart_data->irq = sm->irq;
  698. uart_data->flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
  699. uart_data->regshift = 2;
  700. uart_data->uartclk = (9600 * 16);
  701. }
  702. static int sm501_register_uart(struct sm501_devdata *sm, int devices)
  703. {
  704. struct platform_device *pdev;
  705. struct plat_serial8250_port *uart_data;
  706. pdev = sm501_create_subdev(sm, "serial8250", 0,
  707. sizeof(struct plat_serial8250_port) * 3);
  708. if (!pdev)
  709. return -ENOMEM;
  710. uart_data = pdev->dev.platform_data;
  711. if (devices & SM501_USE_UART0) {
  712. sm501_setup_uart_data(sm, uart_data++, 0x30000);
  713. sm501_unit_power(sm->dev, SM501_GATE_UART0, 1);
  714. sm501_modify_reg(sm->dev, SM501_IRQ_MASK, 1 << 12, 0);
  715. sm501_modify_reg(sm->dev, SM501_GPIO63_32_CONTROL, 0x01e0, 0);
  716. }
  717. if (devices & SM501_USE_UART1) {
  718. sm501_setup_uart_data(sm, uart_data++, 0x30020);
  719. sm501_unit_power(sm->dev, SM501_GATE_UART1, 1);
  720. sm501_modify_reg(sm->dev, SM501_IRQ_MASK, 1 << 13, 0);
  721. sm501_modify_reg(sm->dev, SM501_GPIO63_32_CONTROL, 0x1e00, 0);
  722. }
  723. pdev->id = PLAT8250_DEV_SM501;
  724. return sm501_register_device(sm, pdev);
  725. }
  726. static int sm501_register_display(struct sm501_devdata *sm,
  727. resource_size_t *mem_avail)
  728. {
  729. struct platform_device *pdev;
  730. pdev = sm501_create_subdev(sm, "sm501-fb", 4, 0);
  731. if (!pdev)
  732. return -ENOMEM;
  733. sm501_create_subio(sm, &pdev->resource[0], 0x80000, 0x10000);
  734. sm501_create_subio(sm, &pdev->resource[1], 0x100000, 0x50000);
  735. sm501_create_mem(sm, &pdev->resource[2], mem_avail, *mem_avail);
  736. sm501_create_irq(sm, &pdev->resource[3]);
  737. return sm501_register_device(sm, pdev);
  738. }
  739. /* sm501_dbg_regs
  740. *
  741. * Debug attribute to attach to parent device to show core registers
  742. */
  743. static ssize_t sm501_dbg_regs(struct device *dev,
  744. struct device_attribute *attr, char *buff)
  745. {
  746. struct sm501_devdata *sm = dev_get_drvdata(dev) ;
  747. unsigned int reg;
  748. char *ptr = buff;
  749. int ret;
  750. for (reg = 0x00; reg < 0x70; reg += 4) {
  751. ret = sprintf(ptr, "%08x = %08x\n",
  752. reg, readl(sm->regs + reg));
  753. ptr += ret;
  754. }
  755. return ptr - buff;
  756. }
  757. static DEVICE_ATTR(dbg_regs, 0666, sm501_dbg_regs, NULL);
  758. /* sm501_init_reg
  759. *
  760. * Helper function for the init code to setup a register
  761. *
  762. * clear the bits which are set in r->mask, and then set
  763. * the bits set in r->set.
  764. */
  765. static inline void sm501_init_reg(struct sm501_devdata *sm,
  766. unsigned long reg,
  767. struct sm501_reg_init *r)
  768. {
  769. unsigned long tmp;
  770. tmp = readl(sm->regs + reg);
  771. tmp &= ~r->mask;
  772. tmp |= r->set;
  773. writel(tmp, sm->regs + reg);
  774. }
  775. /* sm501_init_regs
  776. *
  777. * Setup core register values
  778. */
  779. static void sm501_init_regs(struct sm501_devdata *sm,
  780. struct sm501_initdata *init)
  781. {
  782. sm501_misc_control(sm->dev,
  783. init->misc_control.set,
  784. init->misc_control.mask);
  785. sm501_init_reg(sm, SM501_MISC_TIMING, &init->misc_timing);
  786. sm501_init_reg(sm, SM501_GPIO31_0_CONTROL, &init->gpio_low);
  787. sm501_init_reg(sm, SM501_GPIO63_32_CONTROL, &init->gpio_high);
  788. if (init->m1xclk) {
  789. dev_info(sm->dev, "setting M1XCLK to %ld\n", init->m1xclk);
  790. sm501_set_clock(sm->dev, SM501_CLOCK_M1XCLK, init->m1xclk);
  791. }
  792. if (init->mclk) {
  793. dev_info(sm->dev, "setting MCLK to %ld\n", init->mclk);
  794. sm501_set_clock(sm->dev, SM501_CLOCK_MCLK, init->mclk);
  795. }
  796. }
  797. /* Check the PLL sources for the M1CLK and M1XCLK
  798. *
  799. * If the M1CLK and M1XCLKs are not sourced from the same PLL, then
  800. * there is a risk (see errata AB-5) that the SM501 will cease proper
  801. * function. If this happens, then it is likely the SM501 will
  802. * hang the system.
  803. */
  804. static int sm501_check_clocks(struct sm501_devdata *sm)
  805. {
  806. unsigned long pwrmode = readl(sm->regs + SM501_CURRENT_CLOCK);
  807. unsigned long msrc = (pwrmode & SM501_POWERMODE_M_SRC);
  808. unsigned long m1src = (pwrmode & SM501_POWERMODE_M1_SRC);
  809. return ((msrc == 0 && m1src != 0) || (msrc != 0 && m1src == 0));
  810. }
  811. static unsigned int sm501_mem_local[] = {
  812. [0] = 4*1024*1024,
  813. [1] = 8*1024*1024,
  814. [2] = 16*1024*1024,
  815. [3] = 32*1024*1024,
  816. [4] = 64*1024*1024,
  817. [5] = 2*1024*1024,
  818. };
  819. /* sm501_init_dev
  820. *
  821. * Common init code for an SM501
  822. */
  823. static int sm501_init_dev(struct sm501_devdata *sm)
  824. {
  825. struct sm501_initdata *idata;
  826. resource_size_t mem_avail;
  827. unsigned long dramctrl;
  828. unsigned long devid;
  829. int ret;
  830. mutex_init(&sm->clock_lock);
  831. spin_lock_init(&sm->reg_lock);
  832. INIT_LIST_HEAD(&sm->devices);
  833. devid = readl(sm->regs + SM501_DEVICEID);
  834. if ((devid & SM501_DEVICEID_IDMASK) != SM501_DEVICEID_SM501) {
  835. dev_err(sm->dev, "incorrect device id %08lx\n", devid);
  836. return -EINVAL;
  837. }
  838. /* disable irqs */
  839. writel(0, sm->regs + SM501_IRQ_MASK);
  840. dramctrl = readl(sm->regs + SM501_DRAM_CONTROL);
  841. mem_avail = sm501_mem_local[(dramctrl >> 13) & 0x7];
  842. dev_info(sm->dev, "SM501 At %p: Version %08lx, %ld Mb, IRQ %d\n",
  843. sm->regs, devid, (unsigned long)mem_avail >> 20, sm->irq);
  844. sm->rev = devid & SM501_DEVICEID_REVMASK;
  845. sm501_dump_gate(sm);
  846. ret = device_create_file(sm->dev, &dev_attr_dbg_regs);
  847. if (ret)
  848. dev_err(sm->dev, "failed to create debug regs file\n");
  849. sm501_dump_clk(sm);
  850. /* check to see if we have some device initialisation */
  851. idata = sm->platdata ? sm->platdata->init : NULL;
  852. if (idata) {
  853. sm501_init_regs(sm, idata);
  854. if (idata->devices & SM501_USE_USB_HOST)
  855. sm501_register_usbhost(sm, &mem_avail);
  856. if (idata->devices & (SM501_USE_UART0 | SM501_USE_UART1))
  857. sm501_register_uart(sm, idata->devices);
  858. }
  859. ret = sm501_check_clocks(sm);
  860. if (ret) {
  861. dev_err(sm->dev, "M1X and M clocks sourced from different "
  862. "PLLs\n");
  863. return -EINVAL;
  864. }
  865. /* always create a framebuffer */
  866. sm501_register_display(sm, &mem_avail);
  867. return 0;
  868. }
  869. static int sm501_plat_probe(struct platform_device *dev)
  870. {
  871. struct sm501_devdata *sm;
  872. int err;
  873. sm = kzalloc(sizeof(struct sm501_devdata), GFP_KERNEL);
  874. if (sm == NULL) {
  875. dev_err(&dev->dev, "no memory for device data\n");
  876. err = -ENOMEM;
  877. goto err1;
  878. }
  879. sm->dev = &dev->dev;
  880. sm->pdev_id = dev->id;
  881. sm->irq = platform_get_irq(dev, 0);
  882. sm->io_res = platform_get_resource(dev, IORESOURCE_MEM, 1);
  883. sm->mem_res = platform_get_resource(dev, IORESOURCE_MEM, 0);
  884. sm->platdata = dev->dev.platform_data;
  885. if (sm->irq < 0) {
  886. dev_err(&dev->dev, "failed to get irq resource\n");
  887. err = sm->irq;
  888. goto err_res;
  889. }
  890. if (sm->io_res == NULL || sm->mem_res == NULL) {
  891. dev_err(&dev->dev, "failed to get IO resource\n");
  892. err = -ENOENT;
  893. goto err_res;
  894. }
  895. sm->regs_claim = request_mem_region(sm->io_res->start,
  896. 0x100, "sm501");
  897. if (sm->regs_claim == NULL) {
  898. dev_err(&dev->dev, "cannot claim registers\n");
  899. err= -EBUSY;
  900. goto err_res;
  901. }
  902. platform_set_drvdata(dev, sm);
  903. sm->regs = ioremap(sm->io_res->start,
  904. (sm->io_res->end - sm->io_res->start) - 1);
  905. if (sm->regs == NULL) {
  906. dev_err(&dev->dev, "cannot remap registers\n");
  907. err = -EIO;
  908. goto err_claim;
  909. }
  910. return sm501_init_dev(sm);
  911. err_claim:
  912. release_resource(sm->regs_claim);
  913. kfree(sm->regs_claim);
  914. err_res:
  915. kfree(sm);
  916. err1:
  917. return err;
  918. }
  919. #ifdef CONFIG_PM
  920. /* power management support */
  921. static int sm501_plat_suspend(struct platform_device *pdev, pm_message_t state)
  922. {
  923. struct sm501_devdata *sm = platform_get_drvdata(pdev);
  924. sm->in_suspend = 1;
  925. sm->pm_misc = readl(sm->regs + SM501_MISC_CONTROL);
  926. sm501_dump_regs(sm);
  927. return 0;
  928. }
  929. static int sm501_plat_resume(struct platform_device *pdev)
  930. {
  931. struct sm501_devdata *sm = platform_get_drvdata(pdev);
  932. sm501_dump_regs(sm);
  933. sm501_dump_gate(sm);
  934. sm501_dump_clk(sm);
  935. /* check to see if we are in the same state as when suspended */
  936. if (readl(sm->regs + SM501_MISC_CONTROL) != sm->pm_misc) {
  937. dev_info(sm->dev, "SM501_MISC_CONTROL changed over sleep\n");
  938. writel(sm->pm_misc, sm->regs + SM501_MISC_CONTROL);
  939. /* our suspend causes the controller state to change,
  940. * either by something attempting setup, power loss,
  941. * or an external reset event on power change */
  942. if (sm->platdata && sm->platdata->init) {
  943. sm501_init_regs(sm, sm->platdata->init);
  944. }
  945. }
  946. /* dump our state from resume */
  947. sm501_dump_regs(sm);
  948. sm501_dump_clk(sm);
  949. sm->in_suspend = 0;
  950. return 0;
  951. }
  952. #else
  953. #define sm501_plat_suspend NULL
  954. #define sm501_plat_resume NULL
  955. #endif
  956. /* Initialisation data for PCI devices */
  957. static struct sm501_initdata sm501_pci_initdata = {
  958. .gpio_high = {
  959. .set = 0x3F000000, /* 24bit panel */
  960. .mask = 0x0,
  961. },
  962. .misc_timing = {
  963. .set = 0x010100, /* SDRAM timing */
  964. .mask = 0x1F1F00,
  965. },
  966. .misc_control = {
  967. .set = SM501_MISC_PNL_24BIT,
  968. .mask = 0,
  969. },
  970. .devices = SM501_USE_ALL,
  971. /* Errata AB-3 says that 72MHz is the fastest available
  972. * for 33MHZ PCI with proper bus-mastering operation */
  973. .mclk = 72 * MHZ,
  974. .m1xclk = 144 * MHZ,
  975. };
  976. static struct sm501_platdata_fbsub sm501_pdata_fbsub = {
  977. .flags = (SM501FB_FLAG_USE_INIT_MODE |
  978. SM501FB_FLAG_USE_HWCURSOR |
  979. SM501FB_FLAG_USE_HWACCEL |
  980. SM501FB_FLAG_DISABLE_AT_EXIT),
  981. };
  982. static struct sm501_platdata_fb sm501_fb_pdata = {
  983. .fb_route = SM501_FB_OWN,
  984. .fb_crt = &sm501_pdata_fbsub,
  985. .fb_pnl = &sm501_pdata_fbsub,
  986. };
  987. static struct sm501_platdata sm501_pci_platdata = {
  988. .init = &sm501_pci_initdata,
  989. .fb = &sm501_fb_pdata,
  990. };
  991. static int sm501_pci_probe(struct pci_dev *dev,
  992. const struct pci_device_id *id)
  993. {
  994. struct sm501_devdata *sm;
  995. int err;
  996. sm = kzalloc(sizeof(struct sm501_devdata), GFP_KERNEL);
  997. if (sm == NULL) {
  998. dev_err(&dev->dev, "no memory for device data\n");
  999. err = -ENOMEM;
  1000. goto err1;
  1001. }
  1002. /* set a default set of platform data */
  1003. dev->dev.platform_data = sm->platdata = &sm501_pci_platdata;
  1004. /* set a hopefully unique id for our child platform devices */
  1005. sm->pdev_id = 32 + dev->devfn;
  1006. pci_set_drvdata(dev, sm);
  1007. err = pci_enable_device(dev);
  1008. if (err) {
  1009. dev_err(&dev->dev, "cannot enable device\n");
  1010. goto err2;
  1011. }
  1012. sm->dev = &dev->dev;
  1013. sm->irq = dev->irq;
  1014. #ifdef __BIG_ENDIAN
  1015. /* if the system is big-endian, we most probably have a
  1016. * translation in the IO layer making the PCI bus little endian
  1017. * so make the framebuffer swapped pixels */
  1018. sm501_fb_pdata.flags |= SM501_FBPD_SWAP_FB_ENDIAN;
  1019. #endif
  1020. /* check our resources */
  1021. if (!(pci_resource_flags(dev, 0) & IORESOURCE_MEM)) {
  1022. dev_err(&dev->dev, "region #0 is not memory?\n");
  1023. err = -EINVAL;
  1024. goto err3;
  1025. }
  1026. if (!(pci_resource_flags(dev, 1) & IORESOURCE_MEM)) {
  1027. dev_err(&dev->dev, "region #1 is not memory?\n");
  1028. err = -EINVAL;
  1029. goto err3;
  1030. }
  1031. /* make our resources ready for sharing */
  1032. sm->io_res = &dev->resource[1];
  1033. sm->mem_res = &dev->resource[0];
  1034. sm->regs_claim = request_mem_region(sm->io_res->start,
  1035. 0x100, "sm501");
  1036. if (sm->regs_claim == NULL) {
  1037. dev_err(&dev->dev, "cannot claim registers\n");
  1038. err= -EBUSY;
  1039. goto err3;
  1040. }
  1041. sm->regs = ioremap(pci_resource_start(dev, 1),
  1042. pci_resource_len(dev, 1));
  1043. if (sm->regs == NULL) {
  1044. dev_err(&dev->dev, "cannot remap registers\n");
  1045. err = -EIO;
  1046. goto err4;
  1047. }
  1048. sm501_init_dev(sm);
  1049. return 0;
  1050. err4:
  1051. release_resource(sm->regs_claim);
  1052. kfree(sm->regs_claim);
  1053. err3:
  1054. pci_disable_device(dev);
  1055. err2:
  1056. pci_set_drvdata(dev, NULL);
  1057. kfree(sm);
  1058. err1:
  1059. return err;
  1060. }
  1061. static void sm501_remove_sub(struct sm501_devdata *sm,
  1062. struct sm501_device *smdev)
  1063. {
  1064. list_del(&smdev->list);
  1065. platform_device_unregister(&smdev->pdev);
  1066. }
  1067. static void sm501_dev_remove(struct sm501_devdata *sm)
  1068. {
  1069. struct sm501_device *smdev, *tmp;
  1070. list_for_each_entry_safe(smdev, tmp, &sm->devices, list)
  1071. sm501_remove_sub(sm, smdev);
  1072. device_remove_file(sm->dev, &dev_attr_dbg_regs);
  1073. }
  1074. static void sm501_pci_remove(struct pci_dev *dev)
  1075. {
  1076. struct sm501_devdata *sm = pci_get_drvdata(dev);
  1077. sm501_dev_remove(sm);
  1078. iounmap(sm->regs);
  1079. release_resource(sm->regs_claim);
  1080. kfree(sm->regs_claim);
  1081. pci_set_drvdata(dev, NULL);
  1082. pci_disable_device(dev);
  1083. }
  1084. static int sm501_plat_remove(struct platform_device *dev)
  1085. {
  1086. struct sm501_devdata *sm = platform_get_drvdata(dev);
  1087. sm501_dev_remove(sm);
  1088. iounmap(sm->regs);
  1089. release_resource(sm->regs_claim);
  1090. kfree(sm->regs_claim);
  1091. return 0;
  1092. }
  1093. static struct pci_device_id sm501_pci_tbl[] = {
  1094. { 0x126f, 0x0501, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
  1095. { 0, },
  1096. };
  1097. MODULE_DEVICE_TABLE(pci, sm501_pci_tbl);
  1098. static struct pci_driver sm501_pci_drv = {
  1099. .name = "sm501",
  1100. .id_table = sm501_pci_tbl,
  1101. .probe = sm501_pci_probe,
  1102. .remove = sm501_pci_remove,
  1103. };
  1104. static struct platform_driver sm501_plat_drv = {
  1105. .driver = {
  1106. .name = "sm501",
  1107. .owner = THIS_MODULE,
  1108. },
  1109. .probe = sm501_plat_probe,
  1110. .remove = sm501_plat_remove,
  1111. .suspend = sm501_plat_suspend,
  1112. .resume = sm501_plat_resume,
  1113. };
  1114. static int __init sm501_base_init(void)
  1115. {
  1116. platform_driver_register(&sm501_plat_drv);
  1117. return pci_register_driver(&sm501_pci_drv);
  1118. }
  1119. static void __exit sm501_base_exit(void)
  1120. {
  1121. platform_driver_unregister(&sm501_plat_drv);
  1122. pci_unregister_driver(&sm501_pci_drv);
  1123. }
  1124. module_init(sm501_base_init);
  1125. module_exit(sm501_base_exit);
  1126. MODULE_DESCRIPTION("SM501 Core Driver");
  1127. MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>, Vincent Sanders");
  1128. MODULE_LICENSE("GPL v2");