gpio-u300.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. /*
  2. *
  3. * arch/arm/mach-u300/gpio.c
  4. *
  5. *
  6. * Copyright (C) 2007-2009 ST-Ericsson AB
  7. * License terms: GNU General Public License (GPL) version 2
  8. * U300 GPIO module.
  9. * This can driver either of the two basic GPIO cores
  10. * available in the U300 platforms:
  11. * COH 901 335 - Used in DB3150 (U300 1.0) and DB3200 (U330 1.0)
  12. * COH 901 571/3 - Used in DB3210 (U365 2.0) and DB3350 (U335 1.0)
  13. * Notice that you also have inline macros in <asm-arch/gpio.h>
  14. * Author: Linus Walleij <linus.walleij@stericsson.com>
  15. * Author: Jonas Aaberg <jonas.aberg@stericsson.com>
  16. *
  17. */
  18. #include <linux/module.h>
  19. #include <linux/interrupt.h>
  20. #include <linux/delay.h>
  21. #include <linux/errno.h>
  22. #include <linux/io.h>
  23. #include <linux/clk.h>
  24. #include <linux/err.h>
  25. #include <linux/platform_device.h>
  26. #include <linux/gpio.h>
  27. /* Reference to GPIO block clock */
  28. static struct clk *clk;
  29. /* Memory resource */
  30. static struct resource *memres;
  31. static void __iomem *virtbase;
  32. static struct device *gpiodev;
  33. struct u300_gpio_port {
  34. const char *name;
  35. int irq;
  36. int number;
  37. };
  38. static struct u300_gpio_port gpio_ports[] = {
  39. {
  40. .name = "gpio0",
  41. .number = 0,
  42. },
  43. {
  44. .name = "gpio1",
  45. .number = 1,
  46. },
  47. {
  48. .name = "gpio2",
  49. .number = 2,
  50. },
  51. #ifdef U300_COH901571_3
  52. {
  53. .name = "gpio3",
  54. .number = 3,
  55. },
  56. {
  57. .name = "gpio4",
  58. .number = 4,
  59. },
  60. #ifdef CONFIG_MACH_U300_BS335
  61. {
  62. .name = "gpio5",
  63. .number = 5,
  64. },
  65. {
  66. .name = "gpio6",
  67. .number = 6,
  68. },
  69. #endif
  70. #endif
  71. };
  72. #ifdef U300_COH901571_3
  73. /* Default input value */
  74. #define DEFAULT_OUTPUT_LOW 0
  75. #define DEFAULT_OUTPUT_HIGH 1
  76. /* GPIO Pull-Up status */
  77. #define DISABLE_PULL_UP 0
  78. #define ENABLE_PULL_UP 1
  79. #define GPIO_NOT_USED 0
  80. #define GPIO_IN 1
  81. #define GPIO_OUT 2
  82. struct u300_gpio_configuration_data {
  83. unsigned char pin_usage;
  84. unsigned char default_output_value;
  85. unsigned char pull_up;
  86. };
  87. /* Initial configuration */
  88. const struct u300_gpio_configuration_data
  89. u300_gpio_config[U300_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = {
  90. #ifdef CONFIG_MACH_U300_BS335
  91. /* Port 0, pins 0-7 */
  92. {
  93. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  94. {GPIO_OUT, DEFAULT_OUTPUT_HIGH, DISABLE_PULL_UP},
  95. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  96. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  97. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  98. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  99. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  100. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}
  101. },
  102. /* Port 1, pins 0-7 */
  103. {
  104. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  105. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  106. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  107. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  108. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  109. {GPIO_OUT, DEFAULT_OUTPUT_HIGH, DISABLE_PULL_UP},
  110. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  111. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}
  112. },
  113. /* Port 2, pins 0-7 */
  114. {
  115. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  116. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  117. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  118. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  119. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  120. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  121. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  122. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}
  123. },
  124. /* Port 3, pins 0-7 */
  125. {
  126. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  127. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  128. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  129. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  130. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  131. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  132. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  133. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}
  134. },
  135. /* Port 4, pins 0-7 */
  136. {
  137. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  138. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  139. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  140. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  141. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  142. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  143. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  144. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}
  145. },
  146. /* Port 5, pins 0-7 */
  147. {
  148. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  149. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  150. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  151. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  152. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  153. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  154. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  155. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}
  156. },
  157. /* Port 6, pind 0-7 */
  158. {
  159. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  160. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  161. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  162. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  163. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  164. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  165. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  166. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}
  167. }
  168. #endif
  169. #ifdef CONFIG_MACH_U300_BS365
  170. /* Port 0, pins 0-7 */
  171. {
  172. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  173. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  174. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  175. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  176. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  177. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  178. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  179. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}
  180. },
  181. /* Port 1, pins 0-7 */
  182. {
  183. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  184. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  185. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  186. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  187. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  188. {GPIO_OUT, DEFAULT_OUTPUT_HIGH, DISABLE_PULL_UP},
  189. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  190. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}
  191. },
  192. /* Port 2, pins 0-7 */
  193. {
  194. {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  195. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  196. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  197. {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP},
  198. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  199. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  200. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  201. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}
  202. },
  203. /* Port 3, pins 0-7 */
  204. {
  205. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  206. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  207. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  208. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  209. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  210. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  211. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  212. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}
  213. },
  214. /* Port 4, pins 0-7 */
  215. {
  216. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  217. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  218. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  219. {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  220. /* These 4 pins doesn't exist on DB3210 */
  221. {GPIO_OUT, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  222. {GPIO_OUT, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  223. {GPIO_OUT, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP},
  224. {GPIO_OUT, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}
  225. }
  226. #endif
  227. };
  228. #endif
  229. /* No users == we can power down GPIO */
  230. static int gpio_users;
  231. struct gpio_struct {
  232. int (*callback)(void *);
  233. void *data;
  234. int users;
  235. };
  236. static struct gpio_struct gpio_pin[U300_GPIO_MAX];
  237. /*
  238. * Let drivers register callback in order to get notified when there is
  239. * an interrupt on the gpio pin
  240. */
  241. int gpio_register_callback(unsigned gpio, int (*func)(void *arg), void *data)
  242. {
  243. if (gpio_pin[gpio].callback)
  244. dev_warn(gpiodev, "%s: WARNING: callback already "
  245. "registered for gpio pin#%d\n", __func__, gpio);
  246. gpio_pin[gpio].callback = func;
  247. gpio_pin[gpio].data = data;
  248. return 0;
  249. }
  250. EXPORT_SYMBOL(gpio_register_callback);
  251. int gpio_unregister_callback(unsigned gpio)
  252. {
  253. if (!gpio_pin[gpio].callback)
  254. dev_warn(gpiodev, "%s: WARNING: callback already "
  255. "unregistered for gpio pin#%d\n", __func__, gpio);
  256. gpio_pin[gpio].callback = NULL;
  257. gpio_pin[gpio].data = NULL;
  258. return 0;
  259. }
  260. EXPORT_SYMBOL(gpio_unregister_callback);
  261. /* Non-zero means valid */
  262. int gpio_is_valid(int number)
  263. {
  264. if (number >= 0 &&
  265. number < (U300_GPIO_NUM_PORTS * U300_GPIO_PINS_PER_PORT))
  266. return 1;
  267. return 0;
  268. }
  269. EXPORT_SYMBOL(gpio_is_valid);
  270. int gpio_request(unsigned gpio, const char *label)
  271. {
  272. if (gpio_pin[gpio].users)
  273. return -EINVAL;
  274. else
  275. gpio_pin[gpio].users++;
  276. gpio_users++;
  277. return 0;
  278. }
  279. EXPORT_SYMBOL(gpio_request);
  280. void gpio_free(unsigned gpio)
  281. {
  282. gpio_users--;
  283. gpio_pin[gpio].users--;
  284. if (unlikely(gpio_pin[gpio].users < 0)) {
  285. dev_warn(gpiodev, "warning: gpio#%d release mismatch\n",
  286. gpio);
  287. gpio_pin[gpio].users = 0;
  288. }
  289. return;
  290. }
  291. EXPORT_SYMBOL(gpio_free);
  292. /* This returns zero or nonzero */
  293. int gpio_get_value(unsigned gpio)
  294. {
  295. return readl(virtbase + U300_GPIO_PXPDIR +
  296. PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING) & (1 << (gpio & 0x07));
  297. }
  298. EXPORT_SYMBOL(gpio_get_value);
  299. /*
  300. * We hope that the compiler will optimize away the unused branch
  301. * in case "value" is a constant
  302. */
  303. void gpio_set_value(unsigned gpio, int value)
  304. {
  305. u32 val;
  306. unsigned long flags;
  307. local_irq_save(flags);
  308. if (value) {
  309. /* set */
  310. val = readl(virtbase + U300_GPIO_PXPDOR +
  311. PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING)
  312. & (1 << (gpio & 0x07));
  313. writel(val | (1 << (gpio & 0x07)), virtbase +
  314. U300_GPIO_PXPDOR +
  315. PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING);
  316. } else {
  317. /* clear */
  318. val = readl(virtbase + U300_GPIO_PXPDOR +
  319. PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING)
  320. & (1 << (gpio & 0x07));
  321. writel(val & ~(1 << (gpio & 0x07)), virtbase +
  322. U300_GPIO_PXPDOR +
  323. PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING);
  324. }
  325. local_irq_restore(flags);
  326. }
  327. EXPORT_SYMBOL(gpio_set_value);
  328. int gpio_direction_input(unsigned gpio)
  329. {
  330. unsigned long flags;
  331. u32 val;
  332. if (gpio > U300_GPIO_MAX)
  333. return -EINVAL;
  334. local_irq_save(flags);
  335. val = readl(virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) *
  336. U300_GPIO_PORTX_SPACING);
  337. /* Mask out this pin*/
  338. val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << ((gpio & 0x07) << 1));
  339. /* This is not needed since it sets the bits to zero.*/
  340. /* val |= (U300_GPIO_PXPCR_PIN_MODE_INPUT << (gpio*2)); */
  341. writel(val, virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) *
  342. U300_GPIO_PORTX_SPACING);
  343. local_irq_restore(flags);
  344. return 0;
  345. }
  346. EXPORT_SYMBOL(gpio_direction_input);
  347. int gpio_direction_output(unsigned gpio, int value)
  348. {
  349. unsigned long flags;
  350. u32 val;
  351. if (gpio > U300_GPIO_MAX)
  352. return -EINVAL;
  353. local_irq_save(flags);
  354. val = readl(virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) *
  355. U300_GPIO_PORTX_SPACING);
  356. /* Mask out this pin */
  357. val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << ((gpio & 0x07) << 1));
  358. /*
  359. * FIXME: configure for push/pull, open drain or open source per pin
  360. * in setup. The current driver will only support push/pull.
  361. */
  362. val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL
  363. << ((gpio & 0x07) << 1));
  364. writel(val, virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) *
  365. U300_GPIO_PORTX_SPACING);
  366. gpio_set_value(gpio, value);
  367. local_irq_restore(flags);
  368. return 0;
  369. }
  370. EXPORT_SYMBOL(gpio_direction_output);
  371. /*
  372. * Enable an IRQ, edge is rising edge (!= 0) or falling edge (==0).
  373. */
  374. void enable_irq_on_gpio_pin(unsigned gpio, int edge)
  375. {
  376. u32 val;
  377. unsigned long flags;
  378. local_irq_save(flags);
  379. val = readl(virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) *
  380. U300_GPIO_PORTX_SPACING);
  381. val |= (1 << (gpio & 0x07));
  382. writel(val, virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) *
  383. U300_GPIO_PORTX_SPACING);
  384. val = readl(virtbase + U300_GPIO_PXICR + PIN_TO_PORT(gpio) *
  385. U300_GPIO_PORTX_SPACING);
  386. if (edge)
  387. val |= (1 << (gpio & 0x07));
  388. else
  389. val &= ~(1 << (gpio & 0x07));
  390. writel(val, virtbase + U300_GPIO_PXICR + PIN_TO_PORT(gpio) *
  391. U300_GPIO_PORTX_SPACING);
  392. local_irq_restore(flags);
  393. }
  394. EXPORT_SYMBOL(enable_irq_on_gpio_pin);
  395. void disable_irq_on_gpio_pin(unsigned gpio)
  396. {
  397. u32 val;
  398. unsigned long flags;
  399. local_irq_save(flags);
  400. val = readl(virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) *
  401. U300_GPIO_PORTX_SPACING);
  402. val &= ~(1 << (gpio & 0x07));
  403. writel(val, virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) *
  404. U300_GPIO_PORTX_SPACING);
  405. local_irq_restore(flags);
  406. }
  407. EXPORT_SYMBOL(disable_irq_on_gpio_pin);
  408. /* Enable (value == 0) or disable (value == 1) internal pullup */
  409. void gpio_pullup(unsigned gpio, int value)
  410. {
  411. u32 val;
  412. unsigned long flags;
  413. local_irq_save(flags);
  414. if (value) {
  415. val = readl(virtbase + U300_GPIO_PXPER + PIN_TO_PORT(gpio) *
  416. U300_GPIO_PORTX_SPACING);
  417. writel(val | (1 << (gpio & 0x07)), virtbase + U300_GPIO_PXPER +
  418. PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING);
  419. } else {
  420. val = readl(virtbase + U300_GPIO_PXPER + PIN_TO_PORT(gpio) *
  421. U300_GPIO_PORTX_SPACING);
  422. writel(val & ~(1 << (gpio & 0x07)), virtbase + U300_GPIO_PXPER +
  423. PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING);
  424. }
  425. local_irq_restore(flags);
  426. }
  427. EXPORT_SYMBOL(gpio_pullup);
  428. static irqreturn_t gpio_irq_handler(int irq, void *dev_id)
  429. {
  430. struct u300_gpio_port *port = dev_id;
  431. u32 val;
  432. int pin;
  433. /* Read event register */
  434. val = readl(virtbase + U300_GPIO_PXIEV + port->number *
  435. U300_GPIO_PORTX_SPACING);
  436. /* Mask with enable register */
  437. val &= readl(virtbase + U300_GPIO_PXIEV + port->number *
  438. U300_GPIO_PORTX_SPACING);
  439. /* Mask relevant bits */
  440. val &= U300_GPIO_PXIEV_ALL_IRQ_EVENT_MASK;
  441. /* ACK IRQ (clear event) */
  442. writel(val, virtbase + U300_GPIO_PXIEV + port->number *
  443. U300_GPIO_PORTX_SPACING);
  444. /* Print message */
  445. while (val != 0) {
  446. unsigned gpio;
  447. pin = __ffs(val);
  448. /* mask off this pin */
  449. val &= ~(1 << pin);
  450. gpio = (port->number << 3) + pin;
  451. if (gpio_pin[gpio].callback)
  452. (void)gpio_pin[gpio].callback(gpio_pin[gpio].data);
  453. else
  454. dev_dbg(gpiodev, "stray GPIO IRQ on line %d\n",
  455. gpio);
  456. }
  457. return IRQ_HANDLED;
  458. }
  459. static void gpio_set_initial_values(void)
  460. {
  461. #ifdef U300_COH901571_3
  462. int i, j;
  463. unsigned long flags;
  464. u32 val;
  465. /* Write default values to all pins */
  466. for (i = 0; i < U300_GPIO_NUM_PORTS; i++) {
  467. val = 0;
  468. for (j = 0; j < 8; j++)
  469. val |= (u32) (u300_gpio_config[i][j].default_output_value != DEFAULT_OUTPUT_LOW) << j;
  470. local_irq_save(flags);
  471. writel(val, virtbase + U300_GPIO_PXPDOR + i * U300_GPIO_PORTX_SPACING);
  472. local_irq_restore(flags);
  473. }
  474. /*
  475. * Put all pins that are set to either 'GPIO_OUT' or 'GPIO_NOT_USED'
  476. * to output and 'GPIO_IN' to input for each port. And initialize
  477. * default value on outputs.
  478. */
  479. for (i = 0; i < U300_GPIO_NUM_PORTS; i++) {
  480. for (j = 0; j < U300_GPIO_PINS_PER_PORT; j++) {
  481. local_irq_save(flags);
  482. val = readl(virtbase + U300_GPIO_PXPCR +
  483. i * U300_GPIO_PORTX_SPACING);
  484. /* Mask out this pin */
  485. val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << (j << 1));
  486. if (u300_gpio_config[i][j].pin_usage != GPIO_IN)
  487. val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL << (j << 1));
  488. writel(val, virtbase + U300_GPIO_PXPCR +
  489. i * U300_GPIO_PORTX_SPACING);
  490. local_irq_restore(flags);
  491. }
  492. }
  493. /* Enable or disable the internal pull-ups in the GPIO ASIC block */
  494. for (i = 0; i < U300_GPIO_MAX; i++) {
  495. val = 0;
  496. for (j = 0; j < 8; j++)
  497. val |= (u32)((u300_gpio_config[i][j].pull_up == DISABLE_PULL_UP) << j);
  498. local_irq_save(flags);
  499. writel(val, virtbase + U300_GPIO_PXPER + i * U300_GPIO_PORTX_SPACING);
  500. local_irq_restore(flags);
  501. }
  502. #endif
  503. }
  504. static int __init gpio_probe(struct platform_device *pdev)
  505. {
  506. u32 val;
  507. int err = 0;
  508. int i;
  509. int num_irqs;
  510. gpiodev = &pdev->dev;
  511. memset(gpio_pin, 0, sizeof(gpio_pin));
  512. /* Get GPIO clock */
  513. clk = clk_get(&pdev->dev, NULL);
  514. if (IS_ERR(clk)) {
  515. err = PTR_ERR(clk);
  516. dev_err(gpiodev, "could not get GPIO clock\n");
  517. goto err_no_clk;
  518. }
  519. err = clk_enable(clk);
  520. if (err) {
  521. dev_err(gpiodev, "could not enable GPIO clock\n");
  522. goto err_no_clk_enable;
  523. }
  524. memres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  525. if (!memres)
  526. goto err_no_resource;
  527. if (request_mem_region(memres->start, memres->end - memres->start, "GPIO Controller")
  528. == NULL) {
  529. err = -ENODEV;
  530. goto err_no_ioregion;
  531. }
  532. virtbase = ioremap(memres->start, resource_size(memres));
  533. if (!virtbase) {
  534. err = -ENOMEM;
  535. goto err_no_ioremap;
  536. }
  537. dev_info(gpiodev, "remapped 0x%08x to %p\n",
  538. memres->start, virtbase);
  539. #ifdef U300_COH901335
  540. dev_info(gpiodev, "initializing GPIO Controller COH 901 335\n");
  541. /* Turn on the GPIO block */
  542. writel(U300_GPIO_CR_BLOCK_CLOCK_ENABLE, virtbase + U300_GPIO_CR);
  543. #endif
  544. #ifdef U300_COH901571_3
  545. dev_info(gpiodev, "initializing GPIO Controller COH 901 571/3\n");
  546. val = readl(virtbase + U300_GPIO_CR);
  547. dev_info(gpiodev, "COH901571/3 block version: %d, " \
  548. "number of cores: %d\n",
  549. ((val & 0x0000FE00) >> 9),
  550. ((val & 0x000001FC) >> 2));
  551. writel(U300_GPIO_CR_BLOCK_CLKRQ_ENABLE, virtbase + U300_GPIO_CR);
  552. #endif
  553. gpio_set_initial_values();
  554. for (num_irqs = 0 ; num_irqs < U300_GPIO_NUM_PORTS; num_irqs++) {
  555. gpio_ports[num_irqs].irq =
  556. platform_get_irq_byname(pdev,
  557. gpio_ports[num_irqs].name);
  558. err = request_irq(gpio_ports[num_irqs].irq,
  559. gpio_irq_handler, IRQF_DISABLED,
  560. gpio_ports[num_irqs].name,
  561. &gpio_ports[num_irqs]);
  562. if (err) {
  563. dev_err(gpiodev, "cannot allocate IRQ for %s!\n",
  564. gpio_ports[num_irqs].name);
  565. goto err_no_irq;
  566. }
  567. /* Turns off PortX_irq_force */
  568. writel(0x0, virtbase + U300_GPIO_PXIFR +
  569. num_irqs * U300_GPIO_PORTX_SPACING);
  570. }
  571. return 0;
  572. err_no_irq:
  573. for (i = 0; i < num_irqs; i++)
  574. free_irq(gpio_ports[i].irq, &gpio_ports[i]);
  575. iounmap(virtbase);
  576. err_no_ioremap:
  577. release_mem_region(memres->start, memres->end - memres->start);
  578. err_no_ioregion:
  579. err_no_resource:
  580. clk_disable(clk);
  581. err_no_clk_enable:
  582. clk_put(clk);
  583. err_no_clk:
  584. dev_info(gpiodev, "module ERROR:%d\n", err);
  585. return err;
  586. }
  587. static int __exit gpio_remove(struct platform_device *pdev)
  588. {
  589. int i;
  590. /* Turn off the GPIO block */
  591. writel(0x00000000U, virtbase + U300_GPIO_CR);
  592. for (i = 0 ; i < U300_GPIO_NUM_PORTS; i++)
  593. free_irq(gpio_ports[i].irq, &gpio_ports[i]);
  594. iounmap(virtbase);
  595. release_mem_region(memres->start, memres->end - memres->start);
  596. clk_disable(clk);
  597. clk_put(clk);
  598. return 0;
  599. }
  600. static struct platform_driver gpio_driver = {
  601. .driver = {
  602. .name = "u300-gpio",
  603. },
  604. .remove = __exit_p(gpio_remove),
  605. };
  606. static int __init u300_gpio_init(void)
  607. {
  608. return platform_driver_probe(&gpio_driver, gpio_probe);
  609. }
  610. static void __exit u300_gpio_exit(void)
  611. {
  612. platform_driver_unregister(&gpio_driver);
  613. }
  614. arch_initcall(u300_gpio_init);
  615. module_exit(u300_gpio_exit);
  616. MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>");
  617. #ifdef U300_COH901571_3
  618. MODULE_DESCRIPTION("ST-Ericsson AB COH 901 571/3 GPIO driver");
  619. #endif
  620. #ifdef U300_COH901335
  621. MODULE_DESCRIPTION("ST-Ericsson AB COH 901 335 GPIO driver");
  622. #endif
  623. MODULE_LICENSE("GPL");