pinctrl-exynos.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180
  1. /*
  2. * Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
  3. *
  4. * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  5. * http://www.samsung.com
  6. * Copyright (c) 2012 Linaro Ltd
  7. * http://www.linaro.org
  8. *
  9. * Author: Thomas Abraham <thomas.ab@samsung.com>
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This file contains the Samsung Exynos specific information required by the
  17. * the Samsung pinctrl/gpiolib driver. It also includes the implementation of
  18. * external gpio and wakeup interrupt support.
  19. */
  20. #include <linux/module.h>
  21. #include <linux/device.h>
  22. #include <linux/interrupt.h>
  23. #include <linux/irqdomain.h>
  24. #include <linux/irq.h>
  25. #include <linux/irqchip/chained_irq.h>
  26. #include <linux/of_irq.h>
  27. #include <linux/io.h>
  28. #include <linux/slab.h>
  29. #include <linux/spinlock.h>
  30. #include <linux/err.h>
  31. #include "pinctrl-samsung.h"
  32. #include "pinctrl-exynos.h"
  33. struct exynos_irq_chip {
  34. struct irq_chip chip;
  35. u32 eint_con;
  36. u32 eint_mask;
  37. u32 eint_pend;
  38. };
  39. static inline struct exynos_irq_chip *to_exynos_irq_chip(struct irq_chip *chip)
  40. {
  41. return container_of(chip, struct exynos_irq_chip, chip);
  42. }
  43. static struct samsung_pin_bank_type bank_type_off = {
  44. .fld_width = { 4, 1, 2, 2, 2, 2, },
  45. .reg_offset = { 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, },
  46. };
  47. static struct samsung_pin_bank_type bank_type_alive = {
  48. .fld_width = { 4, 1, 2, 2, },
  49. .reg_offset = { 0x00, 0x04, 0x08, 0x0c, },
  50. };
  51. /* list of external wakeup controllers supported */
  52. static const struct of_device_id exynos_wkup_irq_ids[] = {
  53. { .compatible = "samsung,exynos4210-wakeup-eint", },
  54. { }
  55. };
  56. static void exynos_irq_mask(struct irq_data *irqd)
  57. {
  58. struct irq_chip *chip = irq_data_get_irq_chip(irqd);
  59. struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
  60. struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
  61. struct samsung_pinctrl_drv_data *d = bank->drvdata;
  62. unsigned long reg_mask = our_chip->eint_mask + bank->eint_offset;
  63. unsigned long mask;
  64. unsigned long flags;
  65. spin_lock_irqsave(&bank->slock, flags);
  66. mask = readl(d->virt_base + reg_mask);
  67. mask |= 1 << irqd->hwirq;
  68. writel(mask, d->virt_base + reg_mask);
  69. spin_unlock_irqrestore(&bank->slock, flags);
  70. }
  71. static void exynos_irq_ack(struct irq_data *irqd)
  72. {
  73. struct irq_chip *chip = irq_data_get_irq_chip(irqd);
  74. struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
  75. struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
  76. struct samsung_pinctrl_drv_data *d = bank->drvdata;
  77. unsigned long reg_pend = our_chip->eint_pend + bank->eint_offset;
  78. writel(1 << irqd->hwirq, d->virt_base + reg_pend);
  79. }
  80. static void exynos_irq_unmask(struct irq_data *irqd)
  81. {
  82. struct irq_chip *chip = irq_data_get_irq_chip(irqd);
  83. struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
  84. struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
  85. struct samsung_pinctrl_drv_data *d = bank->drvdata;
  86. unsigned long reg_mask = our_chip->eint_mask + bank->eint_offset;
  87. unsigned long mask;
  88. unsigned long flags;
  89. /*
  90. * Ack level interrupts right before unmask
  91. *
  92. * If we don't do this we'll get a double-interrupt. Level triggered
  93. * interrupts must not fire an interrupt if the level is not
  94. * _currently_ active, even if it was active while the interrupt was
  95. * masked.
  96. */
  97. if (irqd_get_trigger_type(irqd) & IRQ_TYPE_LEVEL_MASK)
  98. exynos_irq_ack(irqd);
  99. spin_lock_irqsave(&bank->slock, flags);
  100. mask = readl(d->virt_base + reg_mask);
  101. mask &= ~(1 << irqd->hwirq);
  102. writel(mask, d->virt_base + reg_mask);
  103. spin_unlock_irqrestore(&bank->slock, flags);
  104. }
  105. static int exynos_irq_set_type(struct irq_data *irqd, unsigned int type)
  106. {
  107. struct irq_chip *chip = irq_data_get_irq_chip(irqd);
  108. struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
  109. struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
  110. struct samsung_pinctrl_drv_data *d = bank->drvdata;
  111. unsigned int shift = EXYNOS_EINT_CON_LEN * irqd->hwirq;
  112. unsigned int con, trig_type;
  113. unsigned long reg_con = our_chip->eint_con + bank->eint_offset;
  114. switch (type) {
  115. case IRQ_TYPE_EDGE_RISING:
  116. trig_type = EXYNOS_EINT_EDGE_RISING;
  117. break;
  118. case IRQ_TYPE_EDGE_FALLING:
  119. trig_type = EXYNOS_EINT_EDGE_FALLING;
  120. break;
  121. case IRQ_TYPE_EDGE_BOTH:
  122. trig_type = EXYNOS_EINT_EDGE_BOTH;
  123. break;
  124. case IRQ_TYPE_LEVEL_HIGH:
  125. trig_type = EXYNOS_EINT_LEVEL_HIGH;
  126. break;
  127. case IRQ_TYPE_LEVEL_LOW:
  128. trig_type = EXYNOS_EINT_LEVEL_LOW;
  129. break;
  130. default:
  131. pr_err("unsupported external interrupt type\n");
  132. return -EINVAL;
  133. }
  134. if (type & IRQ_TYPE_EDGE_BOTH)
  135. __irq_set_handler_locked(irqd->irq, handle_edge_irq);
  136. else
  137. __irq_set_handler_locked(irqd->irq, handle_level_irq);
  138. con = readl(d->virt_base + reg_con);
  139. con &= ~(EXYNOS_EINT_CON_MASK << shift);
  140. con |= trig_type << shift;
  141. writel(con, d->virt_base + reg_con);
  142. return 0;
  143. }
  144. static int exynos_irq_request_resources(struct irq_data *irqd)
  145. {
  146. struct irq_chip *chip = irq_data_get_irq_chip(irqd);
  147. struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
  148. struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
  149. struct samsung_pin_bank_type *bank_type = bank->type;
  150. struct samsung_pinctrl_drv_data *d = bank->drvdata;
  151. unsigned int shift = EXYNOS_EINT_CON_LEN * irqd->hwirq;
  152. unsigned long reg_con = our_chip->eint_con + bank->eint_offset;
  153. unsigned long flags;
  154. unsigned int mask;
  155. unsigned int con;
  156. int ret;
  157. ret = gpio_lock_as_irq(&bank->gpio_chip, irqd->hwirq);
  158. if (ret) {
  159. dev_err(bank->gpio_chip.dev, "unable to lock pin %s-%lu IRQ\n",
  160. bank->name, irqd->hwirq);
  161. return ret;
  162. }
  163. reg_con = bank->pctl_offset + bank_type->reg_offset[PINCFG_TYPE_FUNC];
  164. shift = irqd->hwirq * bank_type->fld_width[PINCFG_TYPE_FUNC];
  165. mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1;
  166. spin_lock_irqsave(&bank->slock, flags);
  167. con = readl(d->virt_base + reg_con);
  168. con &= ~(mask << shift);
  169. con |= EXYNOS_EINT_FUNC << shift;
  170. writel(con, d->virt_base + reg_con);
  171. spin_unlock_irqrestore(&bank->slock, flags);
  172. exynos_irq_unmask(irqd);
  173. return 0;
  174. }
  175. static void exynos_irq_release_resources(struct irq_data *irqd)
  176. {
  177. struct irq_chip *chip = irq_data_get_irq_chip(irqd);
  178. struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
  179. struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
  180. struct samsung_pin_bank_type *bank_type = bank->type;
  181. struct samsung_pinctrl_drv_data *d = bank->drvdata;
  182. unsigned int shift = EXYNOS_EINT_CON_LEN * irqd->hwirq;
  183. unsigned long reg_con = our_chip->eint_con + bank->eint_offset;
  184. unsigned long flags;
  185. unsigned int mask;
  186. unsigned int con;
  187. reg_con = bank->pctl_offset + bank_type->reg_offset[PINCFG_TYPE_FUNC];
  188. shift = irqd->hwirq * bank_type->fld_width[PINCFG_TYPE_FUNC];
  189. mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1;
  190. exynos_irq_mask(irqd);
  191. spin_lock_irqsave(&bank->slock, flags);
  192. con = readl(d->virt_base + reg_con);
  193. con &= ~(mask << shift);
  194. con |= FUNC_INPUT << shift;
  195. writel(con, d->virt_base + reg_con);
  196. spin_unlock_irqrestore(&bank->slock, flags);
  197. gpio_unlock_as_irq(&bank->gpio_chip, irqd->hwirq);
  198. }
  199. /*
  200. * irq_chip for gpio interrupts.
  201. */
  202. static struct exynos_irq_chip exynos_gpio_irq_chip = {
  203. .chip = {
  204. .name = "exynos_gpio_irq_chip",
  205. .irq_unmask = exynos_irq_unmask,
  206. .irq_mask = exynos_irq_mask,
  207. .irq_ack = exynos_irq_ack,
  208. .irq_set_type = exynos_irq_set_type,
  209. .irq_request_resources = exynos_irq_request_resources,
  210. .irq_release_resources = exynos_irq_release_resources,
  211. },
  212. .eint_con = EXYNOS_GPIO_ECON_OFFSET,
  213. .eint_mask = EXYNOS_GPIO_EMASK_OFFSET,
  214. .eint_pend = EXYNOS_GPIO_EPEND_OFFSET,
  215. };
  216. static int exynos_gpio_irq_map(struct irq_domain *h, unsigned int virq,
  217. irq_hw_number_t hw)
  218. {
  219. struct samsung_pin_bank *b = h->host_data;
  220. irq_set_chip_data(virq, b);
  221. irq_set_chip_and_handler(virq, &exynos_gpio_irq_chip.chip,
  222. handle_level_irq);
  223. set_irq_flags(virq, IRQF_VALID);
  224. return 0;
  225. }
  226. /*
  227. * irq domain callbacks for external gpio interrupt controller.
  228. */
  229. static const struct irq_domain_ops exynos_gpio_irqd_ops = {
  230. .map = exynos_gpio_irq_map,
  231. .xlate = irq_domain_xlate_twocell,
  232. };
  233. static irqreturn_t exynos_eint_gpio_irq(int irq, void *data)
  234. {
  235. struct samsung_pinctrl_drv_data *d = data;
  236. struct samsung_pin_ctrl *ctrl = d->ctrl;
  237. struct samsung_pin_bank *bank = ctrl->pin_banks;
  238. unsigned int svc, group, pin, virq;
  239. svc = readl(d->virt_base + EXYNOS_SVC_OFFSET);
  240. group = EXYNOS_SVC_GROUP(svc);
  241. pin = svc & EXYNOS_SVC_NUM_MASK;
  242. if (!group)
  243. return IRQ_HANDLED;
  244. bank += (group - 1);
  245. virq = irq_linear_revmap(bank->irq_domain, pin);
  246. if (!virq)
  247. return IRQ_NONE;
  248. generic_handle_irq(virq);
  249. return IRQ_HANDLED;
  250. }
  251. struct exynos_eint_gpio_save {
  252. u32 eint_con;
  253. u32 eint_fltcon0;
  254. u32 eint_fltcon1;
  255. };
  256. /*
  257. * exynos_eint_gpio_init() - setup handling of external gpio interrupts.
  258. * @d: driver data of samsung pinctrl driver.
  259. */
  260. static int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
  261. {
  262. struct samsung_pin_bank *bank;
  263. struct device *dev = d->dev;
  264. int ret;
  265. int i;
  266. if (!d->irq) {
  267. dev_err(dev, "irq number not available\n");
  268. return -EINVAL;
  269. }
  270. ret = devm_request_irq(dev, d->irq, exynos_eint_gpio_irq,
  271. 0, dev_name(dev), d);
  272. if (ret) {
  273. dev_err(dev, "irq request failed\n");
  274. return -ENXIO;
  275. }
  276. bank = d->ctrl->pin_banks;
  277. for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
  278. if (bank->eint_type != EINT_TYPE_GPIO)
  279. continue;
  280. bank->irq_domain = irq_domain_add_linear(bank->of_node,
  281. bank->nr_pins, &exynos_gpio_irqd_ops, bank);
  282. if (!bank->irq_domain) {
  283. dev_err(dev, "gpio irq domain add failed\n");
  284. ret = -ENXIO;
  285. goto err_domains;
  286. }
  287. bank->soc_priv = devm_kzalloc(d->dev,
  288. sizeof(struct exynos_eint_gpio_save), GFP_KERNEL);
  289. if (!bank->soc_priv) {
  290. irq_domain_remove(bank->irq_domain);
  291. ret = -ENOMEM;
  292. goto err_domains;
  293. }
  294. }
  295. return 0;
  296. err_domains:
  297. for (--i, --bank; i >= 0; --i, --bank) {
  298. if (bank->eint_type != EINT_TYPE_GPIO)
  299. continue;
  300. irq_domain_remove(bank->irq_domain);
  301. }
  302. return ret;
  303. }
  304. static u32 exynos_eint_wake_mask = 0xffffffff;
  305. u32 exynos_get_eint_wake_mask(void)
  306. {
  307. return exynos_eint_wake_mask;
  308. }
  309. static int exynos_wkup_irq_set_wake(struct irq_data *irqd, unsigned int on)
  310. {
  311. struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
  312. unsigned long bit = 1UL << (2 * bank->eint_offset + irqd->hwirq);
  313. pr_info("wake %s for irq %d\n", on ? "enabled" : "disabled", irqd->irq);
  314. if (!on)
  315. exynos_eint_wake_mask |= bit;
  316. else
  317. exynos_eint_wake_mask &= ~bit;
  318. return 0;
  319. }
  320. /*
  321. * irq_chip for wakeup interrupts
  322. */
  323. static struct exynos_irq_chip exynos_wkup_irq_chip = {
  324. .chip = {
  325. .name = "exynos_wkup_irq_chip",
  326. .irq_unmask = exynos_irq_unmask,
  327. .irq_mask = exynos_irq_mask,
  328. .irq_ack = exynos_irq_ack,
  329. .irq_set_type = exynos_irq_set_type,
  330. .irq_set_wake = exynos_wkup_irq_set_wake,
  331. .irq_request_resources = exynos_irq_request_resources,
  332. .irq_release_resources = exynos_irq_release_resources,
  333. },
  334. .eint_con = EXYNOS_WKUP_ECON_OFFSET,
  335. .eint_mask = EXYNOS_WKUP_EMASK_OFFSET,
  336. .eint_pend = EXYNOS_WKUP_EPEND_OFFSET,
  337. };
  338. /* interrupt handler for wakeup interrupts 0..15 */
  339. static void exynos_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
  340. {
  341. struct exynos_weint_data *eintd = irq_get_handler_data(irq);
  342. struct samsung_pin_bank *bank = eintd->bank;
  343. struct irq_chip *chip = irq_get_chip(irq);
  344. int eint_irq;
  345. chained_irq_enter(chip, desc);
  346. chip->irq_mask(&desc->irq_data);
  347. if (chip->irq_ack)
  348. chip->irq_ack(&desc->irq_data);
  349. eint_irq = irq_linear_revmap(bank->irq_domain, eintd->irq);
  350. generic_handle_irq(eint_irq);
  351. chip->irq_unmask(&desc->irq_data);
  352. chained_irq_exit(chip, desc);
  353. }
  354. static inline void exynos_irq_demux_eint(unsigned long pend,
  355. struct irq_domain *domain)
  356. {
  357. unsigned int irq;
  358. while (pend) {
  359. irq = fls(pend) - 1;
  360. generic_handle_irq(irq_find_mapping(domain, irq));
  361. pend &= ~(1 << irq);
  362. }
  363. }
  364. /* interrupt handler for wakeup interrupt 16 */
  365. static void exynos_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
  366. {
  367. struct irq_chip *chip = irq_get_chip(irq);
  368. struct exynos_muxed_weint_data *eintd = irq_get_handler_data(irq);
  369. struct samsung_pinctrl_drv_data *d = eintd->banks[0]->drvdata;
  370. unsigned long pend;
  371. unsigned long mask;
  372. int i;
  373. chained_irq_enter(chip, desc);
  374. for (i = 0; i < eintd->nr_banks; ++i) {
  375. struct samsung_pin_bank *b = eintd->banks[i];
  376. pend = readl(d->virt_base + EXYNOS_WKUP_EPEND_OFFSET
  377. + b->eint_offset);
  378. mask = readl(d->virt_base + EXYNOS_WKUP_EMASK_OFFSET
  379. + b->eint_offset);
  380. exynos_irq_demux_eint(pend & ~mask, b->irq_domain);
  381. }
  382. chained_irq_exit(chip, desc);
  383. }
  384. static int exynos_wkup_irq_map(struct irq_domain *h, unsigned int virq,
  385. irq_hw_number_t hw)
  386. {
  387. irq_set_chip_and_handler(virq, &exynos_wkup_irq_chip.chip,
  388. handle_level_irq);
  389. irq_set_chip_data(virq, h->host_data);
  390. set_irq_flags(virq, IRQF_VALID);
  391. return 0;
  392. }
  393. /*
  394. * irq domain callbacks for external wakeup interrupt controller.
  395. */
  396. static const struct irq_domain_ops exynos_wkup_irqd_ops = {
  397. .map = exynos_wkup_irq_map,
  398. .xlate = irq_domain_xlate_twocell,
  399. };
  400. /*
  401. * exynos_eint_wkup_init() - setup handling of external wakeup interrupts.
  402. * @d: driver data of samsung pinctrl driver.
  403. */
  404. static int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
  405. {
  406. struct device *dev = d->dev;
  407. struct device_node *wkup_np = NULL;
  408. struct device_node *np;
  409. struct samsung_pin_bank *bank;
  410. struct exynos_weint_data *weint_data;
  411. struct exynos_muxed_weint_data *muxed_data;
  412. unsigned int muxed_banks = 0;
  413. unsigned int i;
  414. int idx, irq;
  415. for_each_child_of_node(dev->of_node, np) {
  416. if (of_match_node(exynos_wkup_irq_ids, np)) {
  417. wkup_np = np;
  418. break;
  419. }
  420. }
  421. if (!wkup_np)
  422. return -ENODEV;
  423. bank = d->ctrl->pin_banks;
  424. for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
  425. if (bank->eint_type != EINT_TYPE_WKUP)
  426. continue;
  427. bank->irq_domain = irq_domain_add_linear(bank->of_node,
  428. bank->nr_pins, &exynos_wkup_irqd_ops, bank);
  429. if (!bank->irq_domain) {
  430. dev_err(dev, "wkup irq domain add failed\n");
  431. return -ENXIO;
  432. }
  433. if (!of_find_property(bank->of_node, "interrupts", NULL)) {
  434. bank->eint_type = EINT_TYPE_WKUP_MUX;
  435. ++muxed_banks;
  436. continue;
  437. }
  438. weint_data = devm_kzalloc(dev, bank->nr_pins
  439. * sizeof(*weint_data), GFP_KERNEL);
  440. if (!weint_data) {
  441. dev_err(dev, "could not allocate memory for weint_data\n");
  442. return -ENOMEM;
  443. }
  444. for (idx = 0; idx < bank->nr_pins; ++idx) {
  445. irq = irq_of_parse_and_map(bank->of_node, idx);
  446. if (!irq) {
  447. dev_err(dev, "irq number for eint-%s-%d not found\n",
  448. bank->name, idx);
  449. continue;
  450. }
  451. weint_data[idx].irq = idx;
  452. weint_data[idx].bank = bank;
  453. irq_set_handler_data(irq, &weint_data[idx]);
  454. irq_set_chained_handler(irq, exynos_irq_eint0_15);
  455. }
  456. }
  457. if (!muxed_banks)
  458. return 0;
  459. irq = irq_of_parse_and_map(wkup_np, 0);
  460. if (!irq) {
  461. dev_err(dev, "irq number for muxed EINTs not found\n");
  462. return 0;
  463. }
  464. muxed_data = devm_kzalloc(dev, sizeof(*muxed_data)
  465. + muxed_banks*sizeof(struct samsung_pin_bank *), GFP_KERNEL);
  466. if (!muxed_data) {
  467. dev_err(dev, "could not allocate memory for muxed_data\n");
  468. return -ENOMEM;
  469. }
  470. irq_set_chained_handler(irq, exynos_irq_demux_eint16_31);
  471. irq_set_handler_data(irq, muxed_data);
  472. bank = d->ctrl->pin_banks;
  473. idx = 0;
  474. for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
  475. if (bank->eint_type != EINT_TYPE_WKUP_MUX)
  476. continue;
  477. muxed_data->banks[idx++] = bank;
  478. }
  479. muxed_data->nr_banks = muxed_banks;
  480. return 0;
  481. }
  482. static void exynos_pinctrl_suspend_bank(
  483. struct samsung_pinctrl_drv_data *drvdata,
  484. struct samsung_pin_bank *bank)
  485. {
  486. struct exynos_eint_gpio_save *save = bank->soc_priv;
  487. void __iomem *regs = drvdata->virt_base;
  488. save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET
  489. + bank->eint_offset);
  490. save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
  491. + 2 * bank->eint_offset);
  492. save->eint_fltcon1 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
  493. + 2 * bank->eint_offset + 4);
  494. pr_debug("%s: save con %#010x\n", bank->name, save->eint_con);
  495. pr_debug("%s: save fltcon0 %#010x\n", bank->name, save->eint_fltcon0);
  496. pr_debug("%s: save fltcon1 %#010x\n", bank->name, save->eint_fltcon1);
  497. }
  498. static void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata)
  499. {
  500. struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
  501. struct samsung_pin_bank *bank = ctrl->pin_banks;
  502. int i;
  503. for (i = 0; i < ctrl->nr_banks; ++i, ++bank)
  504. if (bank->eint_type == EINT_TYPE_GPIO)
  505. exynos_pinctrl_suspend_bank(drvdata, bank);
  506. }
  507. static void exynos_pinctrl_resume_bank(
  508. struct samsung_pinctrl_drv_data *drvdata,
  509. struct samsung_pin_bank *bank)
  510. {
  511. struct exynos_eint_gpio_save *save = bank->soc_priv;
  512. void __iomem *regs = drvdata->virt_base;
  513. pr_debug("%s: con %#010x => %#010x\n", bank->name,
  514. readl(regs + EXYNOS_GPIO_ECON_OFFSET
  515. + bank->eint_offset), save->eint_con);
  516. pr_debug("%s: fltcon0 %#010x => %#010x\n", bank->name,
  517. readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
  518. + 2 * bank->eint_offset), save->eint_fltcon0);
  519. pr_debug("%s: fltcon1 %#010x => %#010x\n", bank->name,
  520. readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
  521. + 2 * bank->eint_offset + 4), save->eint_fltcon1);
  522. writel(save->eint_con, regs + EXYNOS_GPIO_ECON_OFFSET
  523. + bank->eint_offset);
  524. writel(save->eint_fltcon0, regs + EXYNOS_GPIO_EFLTCON_OFFSET
  525. + 2 * bank->eint_offset);
  526. writel(save->eint_fltcon1, regs + EXYNOS_GPIO_EFLTCON_OFFSET
  527. + 2 * bank->eint_offset + 4);
  528. }
  529. static void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata)
  530. {
  531. struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
  532. struct samsung_pin_bank *bank = ctrl->pin_banks;
  533. int i;
  534. for (i = 0; i < ctrl->nr_banks; ++i, ++bank)
  535. if (bank->eint_type == EINT_TYPE_GPIO)
  536. exynos_pinctrl_resume_bank(drvdata, bank);
  537. }
  538. /* pin banks of s5pv210 pin-controller */
  539. static struct samsung_pin_bank s5pv210_pin_bank[] = {
  540. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  541. EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpa1", 0x04),
  542. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
  543. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
  544. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
  545. EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
  546. EXYNOS_PIN_BANK_EINTG(6, 0x0c0, "gpd1", 0x18),
  547. EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpe0", 0x1c),
  548. EXYNOS_PIN_BANK_EINTG(5, 0x100, "gpe1", 0x20),
  549. EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpf0", 0x24),
  550. EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpf1", 0x28),
  551. EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpf2", 0x2c),
  552. EXYNOS_PIN_BANK_EINTG(6, 0x180, "gpf3", 0x30),
  553. EXYNOS_PIN_BANK_EINTG(7, 0x1a0, "gpg0", 0x34),
  554. EXYNOS_PIN_BANK_EINTG(7, 0x1c0, "gpg1", 0x38),
  555. EXYNOS_PIN_BANK_EINTG(7, 0x1e0, "gpg2", 0x3c),
  556. EXYNOS_PIN_BANK_EINTG(7, 0x200, "gpg3", 0x40),
  557. EXYNOS_PIN_BANK_EINTN(7, 0x220, "gpi"),
  558. EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x44),
  559. EXYNOS_PIN_BANK_EINTG(6, 0x260, "gpj1", 0x48),
  560. EXYNOS_PIN_BANK_EINTG(8, 0x280, "gpj2", 0x4c),
  561. EXYNOS_PIN_BANK_EINTG(8, 0x2a0, "gpj3", 0x50),
  562. EXYNOS_PIN_BANK_EINTG(5, 0x2c0, "gpj4", 0x54),
  563. EXYNOS_PIN_BANK_EINTN(8, 0x2e0, "mp01"),
  564. EXYNOS_PIN_BANK_EINTN(4, 0x300, "mp02"),
  565. EXYNOS_PIN_BANK_EINTN(8, 0x320, "mp03"),
  566. EXYNOS_PIN_BANK_EINTN(8, 0x340, "mp04"),
  567. EXYNOS_PIN_BANK_EINTN(8, 0x360, "mp05"),
  568. EXYNOS_PIN_BANK_EINTN(8, 0x380, "mp06"),
  569. EXYNOS_PIN_BANK_EINTN(8, 0x3a0, "mp07"),
  570. EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gph0", 0x00),
  571. EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gph1", 0x04),
  572. EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gph2", 0x08),
  573. EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gph3", 0x0c),
  574. };
  575. struct samsung_pin_ctrl s5pv210_pin_ctrl[] = {
  576. {
  577. /* pin-controller instance 0 data */
  578. .pin_banks = s5pv210_pin_bank,
  579. .nr_banks = ARRAY_SIZE(s5pv210_pin_bank),
  580. .eint_gpio_init = exynos_eint_gpio_init,
  581. .eint_wkup_init = exynos_eint_wkup_init,
  582. .suspend = exynos_pinctrl_suspend,
  583. .resume = exynos_pinctrl_resume,
  584. .label = "s5pv210-gpio-ctrl0",
  585. },
  586. };
  587. /* pin banks of exynos3250 pin-controller 0 */
  588. static struct samsung_pin_bank exynos3250_pin_banks0[] = {
  589. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  590. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  591. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
  592. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
  593. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
  594. EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
  595. EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpd1", 0x18),
  596. };
  597. /* pin banks of exynos3250 pin-controller 1 */
  598. static struct samsung_pin_bank exynos3250_pin_banks1[] = {
  599. EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpe0"),
  600. EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpe1"),
  601. EXYNOS_PIN_BANK_EINTN(3, 0x180, "gpe2"),
  602. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpk0", 0x08),
  603. EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
  604. EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
  605. EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpl0", 0x18),
  606. EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
  607. EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
  608. EXYNOS_PIN_BANK_EINTG(5, 0x2a0, "gpm2", 0x2c),
  609. EXYNOS_PIN_BANK_EINTG(8, 0x2c0, "gpm3", 0x30),
  610. EXYNOS_PIN_BANK_EINTG(8, 0x2e0, "gpm4", 0x34),
  611. EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
  612. EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
  613. EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
  614. EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
  615. };
  616. /*
  617. * Samsung pinctrl driver data for Exynos3250 SoC. Exynos3250 SoC includes
  618. * two gpio/pin-mux/pinconfig controllers.
  619. */
  620. struct samsung_pin_ctrl exynos3250_pin_ctrl[] = {
  621. {
  622. /* pin-controller instance 0 data */
  623. .pin_banks = exynos3250_pin_banks0,
  624. .nr_banks = ARRAY_SIZE(exynos3250_pin_banks0),
  625. .eint_gpio_init = exynos_eint_gpio_init,
  626. .suspend = exynos_pinctrl_suspend,
  627. .resume = exynos_pinctrl_resume,
  628. .label = "exynos3250-gpio-ctrl0",
  629. }, {
  630. /* pin-controller instance 1 data */
  631. .pin_banks = exynos3250_pin_banks1,
  632. .nr_banks = ARRAY_SIZE(exynos3250_pin_banks1),
  633. .eint_gpio_init = exynos_eint_gpio_init,
  634. .eint_wkup_init = exynos_eint_wkup_init,
  635. .suspend = exynos_pinctrl_suspend,
  636. .resume = exynos_pinctrl_resume,
  637. .label = "exynos3250-gpio-ctrl1",
  638. },
  639. };
  640. /* pin banks of exynos4210 pin-controller 0 */
  641. static struct samsung_pin_bank exynos4210_pin_banks0[] = {
  642. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  643. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  644. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
  645. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
  646. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
  647. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
  648. EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
  649. EXYNOS_PIN_BANK_EINTG(5, 0x0E0, "gpe0", 0x1c),
  650. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpe1", 0x20),
  651. EXYNOS_PIN_BANK_EINTG(6, 0x120, "gpe2", 0x24),
  652. EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpe3", 0x28),
  653. EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpe4", 0x2c),
  654. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
  655. EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
  656. EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
  657. EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
  658. };
  659. /* pin banks of exynos4210 pin-controller 1 */
  660. static struct samsung_pin_bank exynos4210_pin_banks1[] = {
  661. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpj0", 0x00),
  662. EXYNOS_PIN_BANK_EINTG(5, 0x020, "gpj1", 0x04),
  663. EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
  664. EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
  665. EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
  666. EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
  667. EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpl0", 0x18),
  668. EXYNOS_PIN_BANK_EINTG(3, 0x0E0, "gpl1", 0x1c),
  669. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
  670. EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
  671. EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
  672. EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
  673. EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
  674. EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
  675. EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
  676. EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
  677. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  678. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  679. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  680. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  681. };
  682. /* pin banks of exynos4210 pin-controller 2 */
  683. static struct samsung_pin_bank exynos4210_pin_banks2[] = {
  684. EXYNOS_PIN_BANK_EINTN(7, 0x000, "gpz"),
  685. };
  686. /*
  687. * Samsung pinctrl driver data for Exynos4210 SoC. Exynos4210 SoC includes
  688. * three gpio/pin-mux/pinconfig controllers.
  689. */
  690. struct samsung_pin_ctrl exynos4210_pin_ctrl[] = {
  691. {
  692. /* pin-controller instance 0 data */
  693. .pin_banks = exynos4210_pin_banks0,
  694. .nr_banks = ARRAY_SIZE(exynos4210_pin_banks0),
  695. .eint_gpio_init = exynos_eint_gpio_init,
  696. .suspend = exynos_pinctrl_suspend,
  697. .resume = exynos_pinctrl_resume,
  698. .label = "exynos4210-gpio-ctrl0",
  699. }, {
  700. /* pin-controller instance 1 data */
  701. .pin_banks = exynos4210_pin_banks1,
  702. .nr_banks = ARRAY_SIZE(exynos4210_pin_banks1),
  703. .eint_gpio_init = exynos_eint_gpio_init,
  704. .eint_wkup_init = exynos_eint_wkup_init,
  705. .suspend = exynos_pinctrl_suspend,
  706. .resume = exynos_pinctrl_resume,
  707. .label = "exynos4210-gpio-ctrl1",
  708. }, {
  709. /* pin-controller instance 2 data */
  710. .pin_banks = exynos4210_pin_banks2,
  711. .nr_banks = ARRAY_SIZE(exynos4210_pin_banks2),
  712. .label = "exynos4210-gpio-ctrl2",
  713. },
  714. };
  715. /* pin banks of exynos4x12 pin-controller 0 */
  716. static struct samsung_pin_bank exynos4x12_pin_banks0[] = {
  717. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  718. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  719. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
  720. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
  721. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
  722. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
  723. EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
  724. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
  725. EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
  726. EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
  727. EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
  728. EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x40),
  729. EXYNOS_PIN_BANK_EINTG(5, 0x260, "gpj1", 0x44),
  730. };
  731. /* pin banks of exynos4x12 pin-controller 1 */
  732. static struct samsung_pin_bank exynos4x12_pin_banks1[] = {
  733. EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
  734. EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
  735. EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
  736. EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
  737. EXYNOS_PIN_BANK_EINTG(7, 0x0C0, "gpl0", 0x18),
  738. EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpl1", 0x1c),
  739. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
  740. EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
  741. EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
  742. EXYNOS_PIN_BANK_EINTG(5, 0x2A0, "gpm2", 0x2c),
  743. EXYNOS_PIN_BANK_EINTG(8, 0x2C0, "gpm3", 0x30),
  744. EXYNOS_PIN_BANK_EINTG(8, 0x2E0, "gpm4", 0x34),
  745. EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
  746. EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
  747. EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
  748. EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
  749. EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
  750. EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
  751. EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
  752. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  753. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  754. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  755. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  756. };
  757. /* pin banks of exynos4x12 pin-controller 2 */
  758. static struct samsung_pin_bank exynos4x12_pin_banks2[] = {
  759. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
  760. };
  761. /* pin banks of exynos4x12 pin-controller 3 */
  762. static struct samsung_pin_bank exynos4x12_pin_banks3[] = {
  763. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
  764. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
  765. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpv2", 0x08),
  766. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv3", 0x0c),
  767. EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpv4", 0x10),
  768. };
  769. /*
  770. * Samsung pinctrl driver data for Exynos4x12 SoC. Exynos4x12 SoC includes
  771. * four gpio/pin-mux/pinconfig controllers.
  772. */
  773. struct samsung_pin_ctrl exynos4x12_pin_ctrl[] = {
  774. {
  775. /* pin-controller instance 0 data */
  776. .pin_banks = exynos4x12_pin_banks0,
  777. .nr_banks = ARRAY_SIZE(exynos4x12_pin_banks0),
  778. .eint_gpio_init = exynos_eint_gpio_init,
  779. .suspend = exynos_pinctrl_suspend,
  780. .resume = exynos_pinctrl_resume,
  781. .label = "exynos4x12-gpio-ctrl0",
  782. }, {
  783. /* pin-controller instance 1 data */
  784. .pin_banks = exynos4x12_pin_banks1,
  785. .nr_banks = ARRAY_SIZE(exynos4x12_pin_banks1),
  786. .eint_gpio_init = exynos_eint_gpio_init,
  787. .eint_wkup_init = exynos_eint_wkup_init,
  788. .suspend = exynos_pinctrl_suspend,
  789. .resume = exynos_pinctrl_resume,
  790. .label = "exynos4x12-gpio-ctrl1",
  791. }, {
  792. /* pin-controller instance 2 data */
  793. .pin_banks = exynos4x12_pin_banks2,
  794. .nr_banks = ARRAY_SIZE(exynos4x12_pin_banks2),
  795. .eint_gpio_init = exynos_eint_gpio_init,
  796. .suspend = exynos_pinctrl_suspend,
  797. .resume = exynos_pinctrl_resume,
  798. .label = "exynos4x12-gpio-ctrl2",
  799. }, {
  800. /* pin-controller instance 3 data */
  801. .pin_banks = exynos4x12_pin_banks3,
  802. .nr_banks = ARRAY_SIZE(exynos4x12_pin_banks3),
  803. .eint_gpio_init = exynos_eint_gpio_init,
  804. .suspend = exynos_pinctrl_suspend,
  805. .resume = exynos_pinctrl_resume,
  806. .label = "exynos4x12-gpio-ctrl3",
  807. },
  808. };
  809. /* pin banks of exynos5250 pin-controller 0 */
  810. static struct samsung_pin_bank exynos5250_pin_banks0[] = {
  811. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  812. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  813. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
  814. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
  815. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
  816. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
  817. EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpb3", 0x18),
  818. EXYNOS_PIN_BANK_EINTG(7, 0x0E0, "gpc0", 0x1c),
  819. EXYNOS_PIN_BANK_EINTG(4, 0x100, "gpc1", 0x20),
  820. EXYNOS_PIN_BANK_EINTG(7, 0x120, "gpc2", 0x24),
  821. EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpc3", 0x28),
  822. EXYNOS_PIN_BANK_EINTG(4, 0x160, "gpd0", 0x2c),
  823. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpd1", 0x30),
  824. EXYNOS_PIN_BANK_EINTG(7, 0x2E0, "gpc4", 0x34),
  825. EXYNOS_PIN_BANK_EINTN(6, 0x1A0, "gpy0"),
  826. EXYNOS_PIN_BANK_EINTN(4, 0x1C0, "gpy1"),
  827. EXYNOS_PIN_BANK_EINTN(6, 0x1E0, "gpy2"),
  828. EXYNOS_PIN_BANK_EINTN(8, 0x200, "gpy3"),
  829. EXYNOS_PIN_BANK_EINTN(8, 0x220, "gpy4"),
  830. EXYNOS_PIN_BANK_EINTN(8, 0x240, "gpy5"),
  831. EXYNOS_PIN_BANK_EINTN(8, 0x260, "gpy6"),
  832. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  833. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  834. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  835. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  836. };
  837. /* pin banks of exynos5250 pin-controller 1 */
  838. static struct samsung_pin_bank exynos5250_pin_banks1[] = {
  839. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
  840. EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
  841. EXYNOS_PIN_BANK_EINTG(4, 0x040, "gpf0", 0x08),
  842. EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpf1", 0x0c),
  843. EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
  844. EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
  845. EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
  846. EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gph0", 0x1c),
  847. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph1", 0x20),
  848. };
  849. /* pin banks of exynos5250 pin-controller 2 */
  850. static struct samsung_pin_bank exynos5250_pin_banks2[] = {
  851. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
  852. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
  853. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv2", 0x08),
  854. EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpv3", 0x0c),
  855. EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpv4", 0x10),
  856. };
  857. /* pin banks of exynos5250 pin-controller 3 */
  858. static struct samsung_pin_bank exynos5250_pin_banks3[] = {
  859. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
  860. };
  861. /*
  862. * Samsung pinctrl driver data for Exynos5250 SoC. Exynos5250 SoC includes
  863. * four gpio/pin-mux/pinconfig controllers.
  864. */
  865. struct samsung_pin_ctrl exynos5250_pin_ctrl[] = {
  866. {
  867. /* pin-controller instance 0 data */
  868. .pin_banks = exynos5250_pin_banks0,
  869. .nr_banks = ARRAY_SIZE(exynos5250_pin_banks0),
  870. .eint_gpio_init = exynos_eint_gpio_init,
  871. .eint_wkup_init = exynos_eint_wkup_init,
  872. .suspend = exynos_pinctrl_suspend,
  873. .resume = exynos_pinctrl_resume,
  874. .label = "exynos5250-gpio-ctrl0",
  875. }, {
  876. /* pin-controller instance 1 data */
  877. .pin_banks = exynos5250_pin_banks1,
  878. .nr_banks = ARRAY_SIZE(exynos5250_pin_banks1),
  879. .eint_gpio_init = exynos_eint_gpio_init,
  880. .suspend = exynos_pinctrl_suspend,
  881. .resume = exynos_pinctrl_resume,
  882. .label = "exynos5250-gpio-ctrl1",
  883. }, {
  884. /* pin-controller instance 2 data */
  885. .pin_banks = exynos5250_pin_banks2,
  886. .nr_banks = ARRAY_SIZE(exynos5250_pin_banks2),
  887. .eint_gpio_init = exynos_eint_gpio_init,
  888. .suspend = exynos_pinctrl_suspend,
  889. .resume = exynos_pinctrl_resume,
  890. .label = "exynos5250-gpio-ctrl2",
  891. }, {
  892. /* pin-controller instance 3 data */
  893. .pin_banks = exynos5250_pin_banks3,
  894. .nr_banks = ARRAY_SIZE(exynos5250_pin_banks3),
  895. .eint_gpio_init = exynos_eint_gpio_init,
  896. .suspend = exynos_pinctrl_suspend,
  897. .resume = exynos_pinctrl_resume,
  898. .label = "exynos5250-gpio-ctrl3",
  899. },
  900. };
  901. /* pin banks of exynos5260 pin-controller 0 */
  902. static struct samsung_pin_bank exynos5260_pin_banks0[] = {
  903. EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpa0", 0x00),
  904. EXYNOS_PIN_BANK_EINTG(7, 0x020, "gpa1", 0x04),
  905. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
  906. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
  907. EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpb1", 0x10),
  908. EXYNOS_PIN_BANK_EINTG(5, 0x0a0, "gpb2", 0x14),
  909. EXYNOS_PIN_BANK_EINTG(8, 0x0c0, "gpb3", 0x18),
  910. EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpb4", 0x1c),
  911. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpb5", 0x20),
  912. EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpd0", 0x24),
  913. EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpd1", 0x28),
  914. EXYNOS_PIN_BANK_EINTG(5, 0x160, "gpd2", 0x2c),
  915. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpe0", 0x30),
  916. EXYNOS_PIN_BANK_EINTG(5, 0x1a0, "gpe1", 0x34),
  917. EXYNOS_PIN_BANK_EINTG(4, 0x1c0, "gpf0", 0x38),
  918. EXYNOS_PIN_BANK_EINTG(8, 0x1e0, "gpf1", 0x3c),
  919. EXYNOS_PIN_BANK_EINTG(2, 0x200, "gpk0", 0x40),
  920. EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
  921. EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
  922. EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
  923. EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
  924. };
  925. /* pin banks of exynos5260 pin-controller 1 */
  926. static struct samsung_pin_bank exynos5260_pin_banks1[] = {
  927. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpc0", 0x00),
  928. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpc1", 0x04),
  929. EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
  930. EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
  931. EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpc4", 0x10),
  932. };
  933. /* pin banks of exynos5260 pin-controller 2 */
  934. static struct samsung_pin_bank exynos5260_pin_banks2[] = {
  935. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz0", 0x00),
  936. EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04),
  937. };
  938. /*
  939. * Samsung pinctrl driver data for Exynos5260 SoC. Exynos5260 SoC includes
  940. * three gpio/pin-mux/pinconfig controllers.
  941. */
  942. struct samsung_pin_ctrl exynos5260_pin_ctrl[] = {
  943. {
  944. /* pin-controller instance 0 data */
  945. .pin_banks = exynos5260_pin_banks0,
  946. .nr_banks = ARRAY_SIZE(exynos5260_pin_banks0),
  947. .eint_gpio_init = exynos_eint_gpio_init,
  948. .eint_wkup_init = exynos_eint_wkup_init,
  949. .label = "exynos5260-gpio-ctrl0",
  950. }, {
  951. /* pin-controller instance 1 data */
  952. .pin_banks = exynos5260_pin_banks1,
  953. .nr_banks = ARRAY_SIZE(exynos5260_pin_banks1),
  954. .eint_gpio_init = exynos_eint_gpio_init,
  955. .label = "exynos5260-gpio-ctrl1",
  956. }, {
  957. /* pin-controller instance 2 data */
  958. .pin_banks = exynos5260_pin_banks2,
  959. .nr_banks = ARRAY_SIZE(exynos5260_pin_banks2),
  960. .eint_gpio_init = exynos_eint_gpio_init,
  961. .label = "exynos5260-gpio-ctrl2",
  962. },
  963. };
  964. /* pin banks of exynos5420 pin-controller 0 */
  965. static struct samsung_pin_bank exynos5420_pin_banks0[] = {
  966. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpy7", 0x00),
  967. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  968. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  969. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  970. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  971. };
  972. /* pin banks of exynos5420 pin-controller 1 */
  973. static struct samsung_pin_bank exynos5420_pin_banks1[] = {
  974. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpc0", 0x00),
  975. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpc1", 0x04),
  976. EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
  977. EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
  978. EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpc4", 0x10),
  979. EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpd1", 0x14),
  980. EXYNOS_PIN_BANK_EINTN(6, 0x0C0, "gpy0"),
  981. EXYNOS_PIN_BANK_EINTN(4, 0x0E0, "gpy1"),
  982. EXYNOS_PIN_BANK_EINTN(6, 0x100, "gpy2"),
  983. EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpy3"),
  984. EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpy4"),
  985. EXYNOS_PIN_BANK_EINTN(8, 0x160, "gpy5"),
  986. EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy6"),
  987. };
  988. /* pin banks of exynos5420 pin-controller 2 */
  989. static struct samsung_pin_bank exynos5420_pin_banks2[] = {
  990. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
  991. EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
  992. EXYNOS_PIN_BANK_EINTG(6, 0x040, "gpf0", 0x08),
  993. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpf1", 0x0c),
  994. EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
  995. EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
  996. EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
  997. EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gpj4", 0x1c),
  998. };
  999. /* pin banks of exynos5420 pin-controller 3 */
  1000. static struct samsung_pin_bank exynos5420_pin_banks3[] = {
  1001. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  1002. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  1003. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
  1004. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
  1005. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
  1006. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
  1007. EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpb3", 0x18),
  1008. EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpb4", 0x1c),
  1009. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph0", 0x20),
  1010. };
  1011. /* pin banks of exynos5420 pin-controller 4 */
  1012. static struct samsung_pin_bank exynos5420_pin_banks4[] = {
  1013. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
  1014. };
  1015. /*
  1016. * Samsung pinctrl driver data for Exynos5420 SoC. Exynos5420 SoC includes
  1017. * four gpio/pin-mux/pinconfig controllers.
  1018. */
  1019. struct samsung_pin_ctrl exynos5420_pin_ctrl[] = {
  1020. {
  1021. /* pin-controller instance 0 data */
  1022. .pin_banks = exynos5420_pin_banks0,
  1023. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks0),
  1024. .eint_gpio_init = exynos_eint_gpio_init,
  1025. .eint_wkup_init = exynos_eint_wkup_init,
  1026. .label = "exynos5420-gpio-ctrl0",
  1027. }, {
  1028. /* pin-controller instance 1 data */
  1029. .pin_banks = exynos5420_pin_banks1,
  1030. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks1),
  1031. .eint_gpio_init = exynos_eint_gpio_init,
  1032. .label = "exynos5420-gpio-ctrl1",
  1033. }, {
  1034. /* pin-controller instance 2 data */
  1035. .pin_banks = exynos5420_pin_banks2,
  1036. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks2),
  1037. .eint_gpio_init = exynos_eint_gpio_init,
  1038. .label = "exynos5420-gpio-ctrl2",
  1039. }, {
  1040. /* pin-controller instance 3 data */
  1041. .pin_banks = exynos5420_pin_banks3,
  1042. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks3),
  1043. .eint_gpio_init = exynos_eint_gpio_init,
  1044. .label = "exynos5420-gpio-ctrl3",
  1045. }, {
  1046. /* pin-controller instance 4 data */
  1047. .pin_banks = exynos5420_pin_banks4,
  1048. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks4),
  1049. .eint_gpio_init = exynos_eint_gpio_init,
  1050. .label = "exynos5420-gpio-ctrl4",
  1051. },
  1052. };