asic3.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. /*
  2. * driver/mfd/asic3.c
  3. *
  4. * Compaq ASIC3 support.
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. *
  10. * Copyright 2001 Compaq Computer Corporation.
  11. * Copyright 2004-2005 Phil Blundell
  12. * Copyright 2007-2008 OpenedHand Ltd.
  13. *
  14. * Authors: Phil Blundell <pb@handhelds.org>,
  15. * Samuel Ortiz <sameo@openedhand.com>
  16. *
  17. */
  18. #include <linux/version.h>
  19. #include <linux/kernel.h>
  20. #include <linux/irq.h>
  21. #include <linux/gpio.h>
  22. #include <linux/io.h>
  23. #include <linux/spinlock.h>
  24. #include <linux/platform_device.h>
  25. #include <linux/mfd/asic3.h>
  26. struct asic3 {
  27. void __iomem *mapping;
  28. unsigned int bus_shift;
  29. unsigned int irq_nr;
  30. unsigned int irq_base;
  31. spinlock_t lock;
  32. u16 irq_bothedge[4];
  33. struct gpio_chip gpio;
  34. struct device *dev;
  35. };
  36. static int asic3_gpio_get(struct gpio_chip *chip, unsigned offset);
  37. static inline void asic3_write_register(struct asic3 *asic,
  38. unsigned int reg, u32 value)
  39. {
  40. iowrite16(value, asic->mapping +
  41. (reg >> asic->bus_shift));
  42. }
  43. static inline u32 asic3_read_register(struct asic3 *asic,
  44. unsigned int reg)
  45. {
  46. return ioread16(asic->mapping +
  47. (reg >> asic->bus_shift));
  48. }
  49. /* IRQs */
  50. #define MAX_ASIC_ISR_LOOPS 20
  51. #define ASIC3_GPIO_Base_INCR \
  52. (ASIC3_GPIO_B_Base - ASIC3_GPIO_A_Base)
  53. static void asic3_irq_flip_edge(struct asic3 *asic,
  54. u32 base, int bit)
  55. {
  56. u16 edge;
  57. unsigned long flags;
  58. spin_lock_irqsave(&asic->lock, flags);
  59. edge = asic3_read_register(asic,
  60. base + ASIC3_GPIO_EdgeTrigger);
  61. edge ^= bit;
  62. asic3_write_register(asic,
  63. base + ASIC3_GPIO_EdgeTrigger, edge);
  64. spin_unlock_irqrestore(&asic->lock, flags);
  65. }
  66. static void asic3_irq_demux(unsigned int irq, struct irq_desc *desc)
  67. {
  68. int iter, i;
  69. unsigned long flags;
  70. struct asic3 *asic;
  71. desc->chip->ack(irq);
  72. asic = desc->handler_data;
  73. for (iter = 0 ; iter < MAX_ASIC_ISR_LOOPS; iter++) {
  74. u32 status;
  75. int bank;
  76. spin_lock_irqsave(&asic->lock, flags);
  77. status = asic3_read_register(asic,
  78. ASIC3_OFFSET(INTR, PIntStat));
  79. spin_unlock_irqrestore(&asic->lock, flags);
  80. /* Check all ten register bits */
  81. if ((status & 0x3ff) == 0)
  82. break;
  83. /* Handle GPIO IRQs */
  84. for (bank = 0; bank < ASIC3_NUM_GPIO_BANKS; bank++) {
  85. if (status & (1 << bank)) {
  86. unsigned long base, istat;
  87. base = ASIC3_GPIO_A_Base
  88. + bank * ASIC3_GPIO_Base_INCR;
  89. spin_lock_irqsave(&asic->lock, flags);
  90. istat = asic3_read_register(asic,
  91. base +
  92. ASIC3_GPIO_IntStatus);
  93. /* Clearing IntStatus */
  94. asic3_write_register(asic,
  95. base +
  96. ASIC3_GPIO_IntStatus, 0);
  97. spin_unlock_irqrestore(&asic->lock, flags);
  98. for (i = 0; i < ASIC3_GPIOS_PER_BANK; i++) {
  99. int bit = (1 << i);
  100. unsigned int irqnr;
  101. if (!(istat & bit))
  102. continue;
  103. irqnr = asic->irq_base +
  104. (ASIC3_GPIOS_PER_BANK * bank)
  105. + i;
  106. desc = irq_desc + irqnr;
  107. desc->handle_irq(irqnr, desc);
  108. if (asic->irq_bothedge[bank] & bit)
  109. asic3_irq_flip_edge(asic, base,
  110. bit);
  111. }
  112. }
  113. }
  114. /* Handle remaining IRQs in the status register */
  115. for (i = ASIC3_NUM_GPIOS; i < ASIC3_NR_IRQS; i++) {
  116. /* They start at bit 4 and go up */
  117. if (status & (1 << (i - ASIC3_NUM_GPIOS + 4))) {
  118. desc = irq_desc + + i;
  119. desc->handle_irq(asic->irq_base + i,
  120. desc);
  121. }
  122. }
  123. }
  124. if (iter >= MAX_ASIC_ISR_LOOPS)
  125. printk(KERN_ERR "%s: interrupt processing overrun\n",
  126. __func__);
  127. }
  128. static inline int asic3_irq_to_bank(struct asic3 *asic, int irq)
  129. {
  130. int n;
  131. n = (irq - asic->irq_base) >> 4;
  132. return (n * (ASIC3_GPIO_B_Base - ASIC3_GPIO_A_Base));
  133. }
  134. static inline int asic3_irq_to_index(struct asic3 *asic, int irq)
  135. {
  136. return (irq - asic->irq_base) & 0xf;
  137. }
  138. static void asic3_mask_gpio_irq(unsigned int irq)
  139. {
  140. struct asic3 *asic = get_irq_chip_data(irq);
  141. u32 val, bank, index;
  142. unsigned long flags;
  143. bank = asic3_irq_to_bank(asic, irq);
  144. index = asic3_irq_to_index(asic, irq);
  145. spin_lock_irqsave(&asic->lock, flags);
  146. val = asic3_read_register(asic, bank + ASIC3_GPIO_Mask);
  147. val |= 1 << index;
  148. asic3_write_register(asic, bank + ASIC3_GPIO_Mask, val);
  149. spin_unlock_irqrestore(&asic->lock, flags);
  150. }
  151. static void asic3_mask_irq(unsigned int irq)
  152. {
  153. struct asic3 *asic = get_irq_chip_data(irq);
  154. int regval;
  155. unsigned long flags;
  156. spin_lock_irqsave(&asic->lock, flags);
  157. regval = asic3_read_register(asic,
  158. ASIC3_INTR_Base +
  159. ASIC3_INTR_IntMask);
  160. regval &= ~(ASIC3_INTMASK_MASK0 <<
  161. (irq - (asic->irq_base + ASIC3_NUM_GPIOS)));
  162. asic3_write_register(asic,
  163. ASIC3_INTR_Base +
  164. ASIC3_INTR_IntMask,
  165. regval);
  166. spin_unlock_irqrestore(&asic->lock, flags);
  167. }
  168. static void asic3_unmask_gpio_irq(unsigned int irq)
  169. {
  170. struct asic3 *asic = get_irq_chip_data(irq);
  171. u32 val, bank, index;
  172. unsigned long flags;
  173. bank = asic3_irq_to_bank(asic, irq);
  174. index = asic3_irq_to_index(asic, irq);
  175. spin_lock_irqsave(&asic->lock, flags);
  176. val = asic3_read_register(asic, bank + ASIC3_GPIO_Mask);
  177. val &= ~(1 << index);
  178. asic3_write_register(asic, bank + ASIC3_GPIO_Mask, val);
  179. spin_unlock_irqrestore(&asic->lock, flags);
  180. }
  181. static void asic3_unmask_irq(unsigned int irq)
  182. {
  183. struct asic3 *asic = get_irq_chip_data(irq);
  184. int regval;
  185. unsigned long flags;
  186. spin_lock_irqsave(&asic->lock, flags);
  187. regval = asic3_read_register(asic,
  188. ASIC3_INTR_Base +
  189. ASIC3_INTR_IntMask);
  190. regval |= (ASIC3_INTMASK_MASK0 <<
  191. (irq - (asic->irq_base + ASIC3_NUM_GPIOS)));
  192. asic3_write_register(asic,
  193. ASIC3_INTR_Base +
  194. ASIC3_INTR_IntMask,
  195. regval);
  196. spin_unlock_irqrestore(&asic->lock, flags);
  197. }
  198. static int asic3_gpio_irq_type(unsigned int irq, unsigned int type)
  199. {
  200. struct asic3 *asic = get_irq_chip_data(irq);
  201. u32 bank, index;
  202. u16 trigger, level, edge, bit;
  203. unsigned long flags;
  204. bank = asic3_irq_to_bank(asic, irq);
  205. index = asic3_irq_to_index(asic, irq);
  206. bit = 1<<index;
  207. spin_lock_irqsave(&asic->lock, flags);
  208. level = asic3_read_register(asic,
  209. bank + ASIC3_GPIO_LevelTrigger);
  210. edge = asic3_read_register(asic,
  211. bank + ASIC3_GPIO_EdgeTrigger);
  212. trigger = asic3_read_register(asic,
  213. bank + ASIC3_GPIO_TriggerType);
  214. asic->irq_bothedge[(irq - asic->irq_base) >> 4] &= ~bit;
  215. if (type == IRQT_RISING) {
  216. trigger |= bit;
  217. edge |= bit;
  218. } else if (type == IRQT_FALLING) {
  219. trigger |= bit;
  220. edge &= ~bit;
  221. } else if (type == IRQT_BOTHEDGE) {
  222. trigger |= bit;
  223. if (asic3_gpio_get(&asic->gpio, irq - asic->irq_base))
  224. edge &= ~bit;
  225. else
  226. edge |= bit;
  227. asic->irq_bothedge[(irq - asic->irq_base) >> 4] |= bit;
  228. } else if (type == IRQT_LOW) {
  229. trigger &= ~bit;
  230. level &= ~bit;
  231. } else if (type == IRQT_HIGH) {
  232. trigger &= ~bit;
  233. level |= bit;
  234. } else {
  235. /*
  236. * if type == IRQT_NOEDGE, we should mask interrupts, but
  237. * be careful to not unmask them if mask was also called.
  238. * Probably need internal state for mask.
  239. */
  240. printk(KERN_NOTICE "asic3: irq type not changed.\n");
  241. }
  242. asic3_write_register(asic, bank + ASIC3_GPIO_LevelTrigger,
  243. level);
  244. asic3_write_register(asic, bank + ASIC3_GPIO_EdgeTrigger,
  245. edge);
  246. asic3_write_register(asic, bank + ASIC3_GPIO_TriggerType,
  247. trigger);
  248. spin_unlock_irqrestore(&asic->lock, flags);
  249. return 0;
  250. }
  251. static struct irq_chip asic3_gpio_irq_chip = {
  252. .name = "ASIC3-GPIO",
  253. .ack = asic3_mask_gpio_irq,
  254. .mask = asic3_mask_gpio_irq,
  255. .unmask = asic3_unmask_gpio_irq,
  256. .set_type = asic3_gpio_irq_type,
  257. };
  258. static struct irq_chip asic3_irq_chip = {
  259. .name = "ASIC3",
  260. .ack = asic3_mask_irq,
  261. .mask = asic3_mask_irq,
  262. .unmask = asic3_unmask_irq,
  263. };
  264. static int asic3_irq_probe(struct platform_device *pdev)
  265. {
  266. struct asic3 *asic = platform_get_drvdata(pdev);
  267. unsigned long clksel = 0;
  268. unsigned int irq, irq_base;
  269. asic->irq_nr = platform_get_irq(pdev, 0);
  270. if (asic->irq_nr < 0)
  271. return asic->irq_nr;
  272. /* turn on clock to IRQ controller */
  273. clksel |= CLOCK_SEL_CX;
  274. asic3_write_register(asic, ASIC3_OFFSET(CLOCK, SEL),
  275. clksel);
  276. irq_base = asic->irq_base;
  277. for (irq = irq_base; irq < irq_base + ASIC3_NR_IRQS; irq++) {
  278. if (irq < asic->irq_base + ASIC3_NUM_GPIOS)
  279. set_irq_chip(irq, &asic3_gpio_irq_chip);
  280. else
  281. set_irq_chip(irq, &asic3_irq_chip);
  282. set_irq_chip_data(irq, asic);
  283. set_irq_handler(irq, handle_level_irq);
  284. set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
  285. }
  286. asic3_write_register(asic, ASIC3_OFFSET(INTR, IntMask),
  287. ASIC3_INTMASK_GINTMASK);
  288. set_irq_chained_handler(asic->irq_nr, asic3_irq_demux);
  289. set_irq_type(asic->irq_nr, IRQT_RISING);
  290. set_irq_data(asic->irq_nr, asic);
  291. return 0;
  292. }
  293. static void asic3_irq_remove(struct platform_device *pdev)
  294. {
  295. struct asic3 *asic = platform_get_drvdata(pdev);
  296. unsigned int irq, irq_base;
  297. irq_base = asic->irq_base;
  298. for (irq = irq_base; irq < irq_base + ASIC3_NR_IRQS; irq++) {
  299. set_irq_flags(irq, 0);
  300. set_irq_handler(irq, NULL);
  301. set_irq_chip(irq, NULL);
  302. set_irq_chip_data(irq, NULL);
  303. }
  304. set_irq_chained_handler(asic->irq_nr, NULL);
  305. }
  306. /* GPIOs */
  307. static int asic3_gpio_direction(struct gpio_chip *chip,
  308. unsigned offset, int out)
  309. {
  310. u32 mask = ASIC3_GPIO_TO_MASK(offset), out_reg;
  311. unsigned int gpio_base;
  312. unsigned long flags;
  313. struct asic3 *asic;
  314. asic = container_of(chip, struct asic3, gpio);
  315. gpio_base = ASIC3_GPIO_TO_BASE(offset);
  316. if (gpio_base > ASIC3_GPIO_D_Base) {
  317. printk(KERN_ERR "Invalid base (0x%x) for gpio %d\n",
  318. gpio_base, offset);
  319. return -EINVAL;
  320. }
  321. spin_lock_irqsave(&asic->lock, flags);
  322. out_reg = asic3_read_register(asic, gpio_base + ASIC3_GPIO_Direction);
  323. /* Input is 0, Output is 1 */
  324. if (out)
  325. out_reg |= mask;
  326. else
  327. out_reg &= ~mask;
  328. asic3_write_register(asic, gpio_base + ASIC3_GPIO_Direction, out_reg);
  329. spin_unlock_irqrestore(&asic->lock, flags);
  330. return 0;
  331. }
  332. static int asic3_gpio_direction_input(struct gpio_chip *chip,
  333. unsigned offset)
  334. {
  335. return asic3_gpio_direction(chip, offset, 0);
  336. }
  337. static int asic3_gpio_direction_output(struct gpio_chip *chip,
  338. unsigned offset, int value)
  339. {
  340. return asic3_gpio_direction(chip, offset, 1);
  341. }
  342. static int asic3_gpio_get(struct gpio_chip *chip,
  343. unsigned offset)
  344. {
  345. unsigned int gpio_base;
  346. u32 mask = ASIC3_GPIO_TO_MASK(offset);
  347. struct asic3 *asic;
  348. asic = container_of(chip, struct asic3, gpio);
  349. gpio_base = ASIC3_GPIO_TO_BASE(offset);
  350. if (gpio_base > ASIC3_GPIO_D_Base) {
  351. printk(KERN_ERR "Invalid base (0x%x) for gpio %d\n",
  352. gpio_base, offset);
  353. return -EINVAL;
  354. }
  355. return asic3_read_register(asic, gpio_base + ASIC3_GPIO_Status) & mask;
  356. }
  357. static void asic3_gpio_set(struct gpio_chip *chip,
  358. unsigned offset, int value)
  359. {
  360. u32 mask, out_reg;
  361. unsigned int gpio_base;
  362. unsigned long flags;
  363. struct asic3 *asic;
  364. asic = container_of(chip, struct asic3, gpio);
  365. gpio_base = ASIC3_GPIO_TO_BASE(offset);
  366. if (gpio_base > ASIC3_GPIO_D_Base) {
  367. printk(KERN_ERR "Invalid base (0x%x) for gpio %d\n",
  368. gpio_base, offset);
  369. return;
  370. }
  371. mask = ASIC3_GPIO_TO_MASK(offset);
  372. spin_lock_irqsave(&asic->lock, flags);
  373. out_reg = asic3_read_register(asic, gpio_base + ASIC3_GPIO_Out);
  374. if (value)
  375. out_reg |= mask;
  376. else
  377. out_reg &= ~mask;
  378. asic3_write_register(asic, gpio_base + ASIC3_GPIO_Out, out_reg);
  379. spin_unlock_irqrestore(&asic->lock, flags);
  380. return;
  381. }
  382. static inline u32 asic3_get_gpio(struct asic3 *asic, unsigned int base,
  383. unsigned int function)
  384. {
  385. return asic3_read_register(asic, base + function);
  386. }
  387. static void asic3_set_gpio(struct asic3 *asic, unsigned int base,
  388. unsigned int function, u32 bits, u32 val)
  389. {
  390. unsigned long flags;
  391. spin_lock_irqsave(&asic->lock, flags);
  392. val |= (asic3_read_register(asic, base + function) & ~bits);
  393. asic3_write_register(asic, base + function, val);
  394. spin_unlock_irqrestore(&asic->lock, flags);
  395. }
  396. #define asic3_set_gpio_a(asic, fn, bits, val) \
  397. asic3_set_gpio(asic, ASIC3_GPIO_A_Base, ASIC3_GPIO_##fn, bits, val)
  398. #define asic3_set_gpio_b(asic, fn, bits, val) \
  399. asic3_set_gpio(asic, ASIC3_GPIO_B_Base, ASIC3_GPIO_##fn, bits, val)
  400. #define asic3_set_gpio_c(asic, fn, bits, val) \
  401. asic3_set_gpio(asic, ASIC3_GPIO_C_Base, ASIC3_GPIO_##fn, bits, val)
  402. #define asic3_set_gpio_d(asic, fn, bits, val) \
  403. asic3_set_gpio(asic, ASIC3_GPIO_D_Base, ASIC3_GPIO_##fn, bits, val)
  404. #define asic3_set_gpio_banks(asic, fn, bits, pdata, field) \
  405. do { \
  406. asic3_set_gpio_a((asic), fn, (bits), (pdata)->gpio_a.field); \
  407. asic3_set_gpio_b((asic), fn, (bits), (pdata)->gpio_b.field); \
  408. asic3_set_gpio_c((asic), fn, (bits), (pdata)->gpio_c.field); \
  409. asic3_set_gpio_d((asic), fn, (bits), (pdata)->gpio_d.field); \
  410. } while (0)
  411. static int asic3_gpio_probe(struct platform_device *pdev)
  412. {
  413. struct asic3_platform_data *pdata = pdev->dev.platform_data;
  414. struct asic3 *asic = platform_get_drvdata(pdev);
  415. asic3_write_register(asic, ASIC3_GPIO_OFFSET(A, Mask), 0xffff);
  416. asic3_write_register(asic, ASIC3_GPIO_OFFSET(B, Mask), 0xffff);
  417. asic3_write_register(asic, ASIC3_GPIO_OFFSET(C, Mask), 0xffff);
  418. asic3_write_register(asic, ASIC3_GPIO_OFFSET(D, Mask), 0xffff);
  419. asic3_set_gpio_a(asic, SleepMask, 0xffff, 0xffff);
  420. asic3_set_gpio_b(asic, SleepMask, 0xffff, 0xffff);
  421. asic3_set_gpio_c(asic, SleepMask, 0xffff, 0xffff);
  422. asic3_set_gpio_d(asic, SleepMask, 0xffff, 0xffff);
  423. if (pdata) {
  424. asic3_set_gpio_banks(asic, Out, 0xffff, pdata, init);
  425. asic3_set_gpio_banks(asic, Direction, 0xffff, pdata, dir);
  426. asic3_set_gpio_banks(asic, SleepMask, 0xffff, pdata,
  427. sleep_mask);
  428. asic3_set_gpio_banks(asic, SleepOut, 0xffff, pdata, sleep_out);
  429. asic3_set_gpio_banks(asic, BattFaultOut, 0xffff, pdata,
  430. batt_fault_out);
  431. asic3_set_gpio_banks(asic, SleepConf, 0xffff, pdata,
  432. sleep_conf);
  433. asic3_set_gpio_banks(asic, AltFunction, 0xffff, pdata,
  434. alt_function);
  435. }
  436. return gpiochip_add(&asic->gpio);
  437. }
  438. static int asic3_gpio_remove(struct platform_device *pdev)
  439. {
  440. struct asic3 *asic = platform_get_drvdata(pdev);
  441. return gpiochip_remove(&asic->gpio);
  442. }
  443. /* Core */
  444. static int asic3_probe(struct platform_device *pdev)
  445. {
  446. struct asic3_platform_data *pdata = pdev->dev.platform_data;
  447. struct asic3 *asic;
  448. struct resource *mem;
  449. unsigned long clksel;
  450. int ret = 0;
  451. asic = kzalloc(sizeof(struct asic3), GFP_KERNEL);
  452. if (asic == NULL) {
  453. printk(KERN_ERR "kzalloc failed\n");
  454. return -ENOMEM;
  455. }
  456. spin_lock_init(&asic->lock);
  457. platform_set_drvdata(pdev, asic);
  458. asic->dev = &pdev->dev;
  459. mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  460. if (!mem) {
  461. ret = -ENOMEM;
  462. printk(KERN_ERR "asic3: no MEM resource\n");
  463. goto out_free;
  464. }
  465. asic->mapping = ioremap(mem->start, PAGE_SIZE);
  466. if (!asic->mapping) {
  467. ret = -ENOMEM;
  468. printk(KERN_ERR "asic3: couldn't ioremap\n");
  469. goto out_free;
  470. }
  471. asic->irq_base = pdata->irq_base;
  472. if (pdata && pdata->bus_shift)
  473. asic->bus_shift = 2 - pdata->bus_shift;
  474. else
  475. asic->bus_shift = 0;
  476. clksel = 0;
  477. asic3_write_register(asic, ASIC3_OFFSET(CLOCK, SEL), clksel);
  478. ret = asic3_irq_probe(pdev);
  479. if (ret < 0) {
  480. printk(KERN_ERR "asic3: couldn't probe IRQs\n");
  481. goto out_unmap;
  482. }
  483. asic->gpio.base = pdata->gpio_base;
  484. asic->gpio.ngpio = ASIC3_NUM_GPIOS;
  485. asic->gpio.get = asic3_gpio_get;
  486. asic->gpio.set = asic3_gpio_set;
  487. asic->gpio.direction_input = asic3_gpio_direction_input;
  488. asic->gpio.direction_output = asic3_gpio_direction_output;
  489. ret = asic3_gpio_probe(pdev);
  490. if (ret < 0) {
  491. printk(KERN_ERR "GPIO probe failed\n");
  492. goto out_irq;
  493. }
  494. printk(KERN_INFO "ASIC3 Core driver\n");
  495. return 0;
  496. out_irq:
  497. asic3_irq_remove(pdev);
  498. out_unmap:
  499. iounmap(asic->mapping);
  500. out_free:
  501. kfree(asic);
  502. return ret;
  503. }
  504. static int asic3_remove(struct platform_device *pdev)
  505. {
  506. int ret;
  507. struct asic3 *asic = platform_get_drvdata(pdev);
  508. ret = asic3_gpio_remove(pdev);
  509. if (ret < 0)
  510. return ret;
  511. asic3_irq_remove(pdev);
  512. asic3_write_register(asic, ASIC3_OFFSET(CLOCK, SEL), 0);
  513. iounmap(asic->mapping);
  514. kfree(asic);
  515. return 0;
  516. }
  517. static void asic3_shutdown(struct platform_device *pdev)
  518. {
  519. }
  520. static struct platform_driver asic3_device_driver = {
  521. .driver = {
  522. .name = "asic3",
  523. },
  524. .probe = asic3_probe,
  525. .remove = __devexit_p(asic3_remove),
  526. .shutdown = asic3_shutdown,
  527. };
  528. static int __init asic3_init(void)
  529. {
  530. int retval = 0;
  531. retval = platform_driver_register(&asic3_device_driver);
  532. return retval;
  533. }
  534. subsys_initcall(asic3_init);