pinctrl-exynos.c 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637
  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 const 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 const struct samsung_pin_bank_type bank_type_alive = {
  48. .fld_width = { 4, 1, 2, 2, },
  49. .reg_offset = { 0x00, 0x04, 0x08, 0x0c, },
  50. };
  51. /* Exynos5433 has the 4bit widths for PINCFG_TYPE_DRV bitfields. */
  52. static const struct samsung_pin_bank_type exynos5433_bank_type_off = {
  53. .fld_width = { 4, 1, 2, 4, 2, 2, },
  54. .reg_offset = { 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, },
  55. };
  56. static const struct samsung_pin_bank_type exynos5433_bank_type_alive = {
  57. .fld_width = { 4, 1, 2, 4, },
  58. .reg_offset = { 0x00, 0x04, 0x08, 0x0c, },
  59. };
  60. static void exynos_irq_mask(struct irq_data *irqd)
  61. {
  62. struct irq_chip *chip = irq_data_get_irq_chip(irqd);
  63. struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
  64. struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
  65. unsigned long reg_mask = our_chip->eint_mask + bank->eint_offset;
  66. unsigned long mask;
  67. unsigned long flags;
  68. spin_lock_irqsave(&bank->slock, flags);
  69. mask = readl(bank->eint_base + reg_mask);
  70. mask |= 1 << irqd->hwirq;
  71. writel(mask, bank->eint_base + reg_mask);
  72. spin_unlock_irqrestore(&bank->slock, flags);
  73. }
  74. static void exynos_irq_ack(struct irq_data *irqd)
  75. {
  76. struct irq_chip *chip = irq_data_get_irq_chip(irqd);
  77. struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
  78. struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
  79. unsigned long reg_pend = our_chip->eint_pend + bank->eint_offset;
  80. writel(1 << irqd->hwirq, bank->eint_base + reg_pend);
  81. }
  82. static void exynos_irq_unmask(struct irq_data *irqd)
  83. {
  84. struct irq_chip *chip = irq_data_get_irq_chip(irqd);
  85. struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
  86. struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
  87. unsigned long reg_mask = our_chip->eint_mask + bank->eint_offset;
  88. unsigned long mask;
  89. unsigned long flags;
  90. /*
  91. * Ack level interrupts right before unmask
  92. *
  93. * If we don't do this we'll get a double-interrupt. Level triggered
  94. * interrupts must not fire an interrupt if the level is not
  95. * _currently_ active, even if it was active while the interrupt was
  96. * masked.
  97. */
  98. if (irqd_get_trigger_type(irqd) & IRQ_TYPE_LEVEL_MASK)
  99. exynos_irq_ack(irqd);
  100. spin_lock_irqsave(&bank->slock, flags);
  101. mask = readl(bank->eint_base + reg_mask);
  102. mask &= ~(1 << irqd->hwirq);
  103. writel(mask, bank->eint_base + reg_mask);
  104. spin_unlock_irqrestore(&bank->slock, flags);
  105. }
  106. static int exynos_irq_set_type(struct irq_data *irqd, unsigned int type)
  107. {
  108. struct irq_chip *chip = irq_data_get_irq_chip(irqd);
  109. struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
  110. struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
  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, handle_edge_irq);
  136. else
  137. irq_set_handler_locked(irqd, handle_level_irq);
  138. con = readl(bank->eint_base + reg_con);
  139. con &= ~(EXYNOS_EINT_CON_MASK << shift);
  140. con |= trig_type << shift;
  141. writel(con, bank->eint_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. const struct samsung_pin_bank_type *bank_type = bank->type;
  150. unsigned int shift = EXYNOS_EINT_CON_LEN * irqd->hwirq;
  151. unsigned long reg_con = our_chip->eint_con + bank->eint_offset;
  152. unsigned long flags;
  153. unsigned int mask;
  154. unsigned int con;
  155. int ret;
  156. ret = gpiochip_lock_as_irq(&bank->gpio_chip, irqd->hwirq);
  157. if (ret) {
  158. dev_err(bank->gpio_chip.parent,
  159. "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(bank->eint_base + reg_con);
  168. con &= ~(mask << shift);
  169. con |= EXYNOS_EINT_FUNC << shift;
  170. writel(con, bank->eint_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. const struct samsung_pin_bank_type *bank_type = bank->type;
  181. unsigned int shift = EXYNOS_EINT_CON_LEN * irqd->hwirq;
  182. unsigned long reg_con = our_chip->eint_con + bank->eint_offset;
  183. unsigned long flags;
  184. unsigned int mask;
  185. unsigned int con;
  186. reg_con = bank->pctl_offset + bank_type->reg_offset[PINCFG_TYPE_FUNC];
  187. shift = irqd->hwirq * bank_type->fld_width[PINCFG_TYPE_FUNC];
  188. mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1;
  189. exynos_irq_mask(irqd);
  190. spin_lock_irqsave(&bank->slock, flags);
  191. con = readl(bank->eint_base + reg_con);
  192. con &= ~(mask << shift);
  193. con |= FUNC_INPUT << shift;
  194. writel(con, bank->eint_base + reg_con);
  195. spin_unlock_irqrestore(&bank->slock, flags);
  196. gpiochip_unlock_as_irq(&bank->gpio_chip, irqd->hwirq);
  197. }
  198. /*
  199. * irq_chip for gpio interrupts.
  200. */
  201. static struct exynos_irq_chip exynos_gpio_irq_chip = {
  202. .chip = {
  203. .name = "exynos_gpio_irq_chip",
  204. .irq_unmask = exynos_irq_unmask,
  205. .irq_mask = exynos_irq_mask,
  206. .irq_ack = exynos_irq_ack,
  207. .irq_set_type = exynos_irq_set_type,
  208. .irq_request_resources = exynos_irq_request_resources,
  209. .irq_release_resources = exynos_irq_release_resources,
  210. },
  211. .eint_con = EXYNOS_GPIO_ECON_OFFSET,
  212. .eint_mask = EXYNOS_GPIO_EMASK_OFFSET,
  213. .eint_pend = EXYNOS_GPIO_EPEND_OFFSET,
  214. };
  215. static int exynos_eint_irq_map(struct irq_domain *h, unsigned int virq,
  216. irq_hw_number_t hw)
  217. {
  218. struct samsung_pin_bank *b = h->host_data;
  219. irq_set_chip_data(virq, b);
  220. irq_set_chip_and_handler(virq, &b->irq_chip->chip,
  221. handle_level_irq);
  222. return 0;
  223. }
  224. /*
  225. * irq domain callbacks for external gpio and wakeup interrupt controllers.
  226. */
  227. static const struct irq_domain_ops exynos_eint_irqd_ops = {
  228. .map = exynos_eint_irq_map,
  229. .xlate = irq_domain_xlate_twocell,
  230. };
  231. static irqreturn_t exynos_eint_gpio_irq(int irq, void *data)
  232. {
  233. struct samsung_pinctrl_drv_data *d = data;
  234. struct samsung_pin_bank *bank = d->pin_banks;
  235. unsigned int svc, group, pin, virq;
  236. svc = readl(bank->eint_base + EXYNOS_SVC_OFFSET);
  237. group = EXYNOS_SVC_GROUP(svc);
  238. pin = svc & EXYNOS_SVC_NUM_MASK;
  239. if (!group)
  240. return IRQ_HANDLED;
  241. bank += (group - 1);
  242. virq = irq_linear_revmap(bank->irq_domain, pin);
  243. if (!virq)
  244. return IRQ_NONE;
  245. generic_handle_irq(virq);
  246. return IRQ_HANDLED;
  247. }
  248. struct exynos_eint_gpio_save {
  249. u32 eint_con;
  250. u32 eint_fltcon0;
  251. u32 eint_fltcon1;
  252. };
  253. /*
  254. * exynos_eint_gpio_init() - setup handling of external gpio interrupts.
  255. * @d: driver data of samsung pinctrl driver.
  256. */
  257. static int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
  258. {
  259. struct samsung_pin_bank *bank;
  260. struct device *dev = d->dev;
  261. int ret;
  262. int i;
  263. if (!d->irq) {
  264. dev_err(dev, "irq number not available\n");
  265. return -EINVAL;
  266. }
  267. ret = devm_request_irq(dev, d->irq, exynos_eint_gpio_irq,
  268. 0, dev_name(dev), d);
  269. if (ret) {
  270. dev_err(dev, "irq request failed\n");
  271. return -ENXIO;
  272. }
  273. bank = d->pin_banks;
  274. for (i = 0; i < d->nr_banks; ++i, ++bank) {
  275. if (bank->eint_type != EINT_TYPE_GPIO)
  276. continue;
  277. bank->irq_domain = irq_domain_add_linear(bank->of_node,
  278. bank->nr_pins, &exynos_eint_irqd_ops, bank);
  279. if (!bank->irq_domain) {
  280. dev_err(dev, "gpio irq domain add failed\n");
  281. ret = -ENXIO;
  282. goto err_domains;
  283. }
  284. bank->soc_priv = devm_kzalloc(d->dev,
  285. sizeof(struct exynos_eint_gpio_save), GFP_KERNEL);
  286. if (!bank->soc_priv) {
  287. irq_domain_remove(bank->irq_domain);
  288. ret = -ENOMEM;
  289. goto err_domains;
  290. }
  291. bank->irq_chip = &exynos_gpio_irq_chip;
  292. }
  293. return 0;
  294. err_domains:
  295. for (--i, --bank; i >= 0; --i, --bank) {
  296. if (bank->eint_type != EINT_TYPE_GPIO)
  297. continue;
  298. irq_domain_remove(bank->irq_domain);
  299. }
  300. return ret;
  301. }
  302. static u32 exynos_eint_wake_mask = 0xffffffff;
  303. u32 exynos_get_eint_wake_mask(void)
  304. {
  305. return exynos_eint_wake_mask;
  306. }
  307. static int exynos_wkup_irq_set_wake(struct irq_data *irqd, unsigned int on)
  308. {
  309. struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
  310. unsigned long bit = 1UL << (2 * bank->eint_offset + irqd->hwirq);
  311. pr_info("wake %s for irq %d\n", on ? "enabled" : "disabled", irqd->irq);
  312. if (!on)
  313. exynos_eint_wake_mask |= bit;
  314. else
  315. exynos_eint_wake_mask &= ~bit;
  316. return 0;
  317. }
  318. /*
  319. * irq_chip for wakeup interrupts
  320. */
  321. static struct exynos_irq_chip exynos4210_wkup_irq_chip __initdata = {
  322. .chip = {
  323. .name = "exynos4210_wkup_irq_chip",
  324. .irq_unmask = exynos_irq_unmask,
  325. .irq_mask = exynos_irq_mask,
  326. .irq_ack = exynos_irq_ack,
  327. .irq_set_type = exynos_irq_set_type,
  328. .irq_set_wake = exynos_wkup_irq_set_wake,
  329. .irq_request_resources = exynos_irq_request_resources,
  330. .irq_release_resources = exynos_irq_release_resources,
  331. },
  332. .eint_con = EXYNOS_WKUP_ECON_OFFSET,
  333. .eint_mask = EXYNOS_WKUP_EMASK_OFFSET,
  334. .eint_pend = EXYNOS_WKUP_EPEND_OFFSET,
  335. };
  336. static struct exynos_irq_chip exynos7_wkup_irq_chip __initdata = {
  337. .chip = {
  338. .name = "exynos7_wkup_irq_chip",
  339. .irq_unmask = exynos_irq_unmask,
  340. .irq_mask = exynos_irq_mask,
  341. .irq_ack = exynos_irq_ack,
  342. .irq_set_type = exynos_irq_set_type,
  343. .irq_set_wake = exynos_wkup_irq_set_wake,
  344. .irq_request_resources = exynos_irq_request_resources,
  345. .irq_release_resources = exynos_irq_release_resources,
  346. },
  347. .eint_con = EXYNOS7_WKUP_ECON_OFFSET,
  348. .eint_mask = EXYNOS7_WKUP_EMASK_OFFSET,
  349. .eint_pend = EXYNOS7_WKUP_EPEND_OFFSET,
  350. };
  351. /* list of external wakeup controllers supported */
  352. static const struct of_device_id exynos_wkup_irq_ids[] = {
  353. { .compatible = "samsung,exynos4210-wakeup-eint",
  354. .data = &exynos4210_wkup_irq_chip },
  355. { .compatible = "samsung,exynos7-wakeup-eint",
  356. .data = &exynos7_wkup_irq_chip },
  357. { }
  358. };
  359. /* interrupt handler for wakeup interrupts 0..15 */
  360. static void exynos_irq_eint0_15(struct irq_desc *desc)
  361. {
  362. struct exynos_weint_data *eintd = irq_desc_get_handler_data(desc);
  363. struct samsung_pin_bank *bank = eintd->bank;
  364. struct irq_chip *chip = irq_desc_get_chip(desc);
  365. int eint_irq;
  366. chained_irq_enter(chip, desc);
  367. eint_irq = irq_linear_revmap(bank->irq_domain, eintd->irq);
  368. generic_handle_irq(eint_irq);
  369. chained_irq_exit(chip, desc);
  370. }
  371. static inline void exynos_irq_demux_eint(unsigned long pend,
  372. struct irq_domain *domain)
  373. {
  374. unsigned int irq;
  375. while (pend) {
  376. irq = fls(pend) - 1;
  377. generic_handle_irq(irq_find_mapping(domain, irq));
  378. pend &= ~(1 << irq);
  379. }
  380. }
  381. /* interrupt handler for wakeup interrupt 16 */
  382. static void exynos_irq_demux_eint16_31(struct irq_desc *desc)
  383. {
  384. struct irq_chip *chip = irq_desc_get_chip(desc);
  385. struct exynos_muxed_weint_data *eintd = irq_desc_get_handler_data(desc);
  386. unsigned long pend;
  387. unsigned long mask;
  388. int i;
  389. chained_irq_enter(chip, desc);
  390. for (i = 0; i < eintd->nr_banks; ++i) {
  391. struct samsung_pin_bank *b = eintd->banks[i];
  392. pend = readl(b->eint_base + b->irq_chip->eint_pend
  393. + b->eint_offset);
  394. mask = readl(b->eint_base + b->irq_chip->eint_mask
  395. + b->eint_offset);
  396. exynos_irq_demux_eint(pend & ~mask, b->irq_domain);
  397. }
  398. chained_irq_exit(chip, desc);
  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. struct exynos_irq_chip *irq_chip;
  413. unsigned int muxed_banks = 0;
  414. unsigned int i;
  415. int idx, irq;
  416. for_each_child_of_node(dev->of_node, np) {
  417. const struct of_device_id *match;
  418. match = of_match_node(exynos_wkup_irq_ids, np);
  419. if (match) {
  420. irq_chip = kmemdup(match->data,
  421. sizeof(*irq_chip), GFP_KERNEL);
  422. wkup_np = np;
  423. break;
  424. }
  425. }
  426. if (!wkup_np)
  427. return -ENODEV;
  428. bank = d->pin_banks;
  429. for (i = 0; i < d->nr_banks; ++i, ++bank) {
  430. if (bank->eint_type != EINT_TYPE_WKUP)
  431. continue;
  432. bank->irq_domain = irq_domain_add_linear(bank->of_node,
  433. bank->nr_pins, &exynos_eint_irqd_ops, bank);
  434. if (!bank->irq_domain) {
  435. dev_err(dev, "wkup irq domain add failed\n");
  436. return -ENXIO;
  437. }
  438. bank->irq_chip = irq_chip;
  439. if (!of_find_property(bank->of_node, "interrupts", NULL)) {
  440. bank->eint_type = EINT_TYPE_WKUP_MUX;
  441. ++muxed_banks;
  442. continue;
  443. }
  444. weint_data = devm_kzalloc(dev, bank->nr_pins
  445. * sizeof(*weint_data), GFP_KERNEL);
  446. if (!weint_data) {
  447. dev_err(dev, "could not allocate memory for weint_data\n");
  448. return -ENOMEM;
  449. }
  450. for (idx = 0; idx < bank->nr_pins; ++idx) {
  451. irq = irq_of_parse_and_map(bank->of_node, idx);
  452. if (!irq) {
  453. dev_err(dev, "irq number for eint-%s-%d not found\n",
  454. bank->name, idx);
  455. continue;
  456. }
  457. weint_data[idx].irq = idx;
  458. weint_data[idx].bank = bank;
  459. irq_set_chained_handler_and_data(irq,
  460. exynos_irq_eint0_15,
  461. &weint_data[idx]);
  462. }
  463. }
  464. if (!muxed_banks)
  465. return 0;
  466. irq = irq_of_parse_and_map(wkup_np, 0);
  467. if (!irq) {
  468. dev_err(dev, "irq number for muxed EINTs not found\n");
  469. return 0;
  470. }
  471. muxed_data = devm_kzalloc(dev, sizeof(*muxed_data)
  472. + muxed_banks*sizeof(struct samsung_pin_bank *), GFP_KERNEL);
  473. if (!muxed_data) {
  474. dev_err(dev, "could not allocate memory for muxed_data\n");
  475. return -ENOMEM;
  476. }
  477. irq_set_chained_handler_and_data(irq, exynos_irq_demux_eint16_31,
  478. muxed_data);
  479. bank = d->pin_banks;
  480. idx = 0;
  481. for (i = 0; i < d->nr_banks; ++i, ++bank) {
  482. if (bank->eint_type != EINT_TYPE_WKUP_MUX)
  483. continue;
  484. muxed_data->banks[idx++] = bank;
  485. }
  486. muxed_data->nr_banks = muxed_banks;
  487. return 0;
  488. }
  489. static void exynos_pinctrl_suspend_bank(
  490. struct samsung_pinctrl_drv_data *drvdata,
  491. struct samsung_pin_bank *bank)
  492. {
  493. struct exynos_eint_gpio_save *save = bank->soc_priv;
  494. void __iomem *regs = bank->eint_base;
  495. save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET
  496. + bank->eint_offset);
  497. save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
  498. + 2 * bank->eint_offset);
  499. save->eint_fltcon1 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
  500. + 2 * bank->eint_offset + 4);
  501. pr_debug("%s: save con %#010x\n", bank->name, save->eint_con);
  502. pr_debug("%s: save fltcon0 %#010x\n", bank->name, save->eint_fltcon0);
  503. pr_debug("%s: save fltcon1 %#010x\n", bank->name, save->eint_fltcon1);
  504. }
  505. static void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata)
  506. {
  507. struct samsung_pin_bank *bank = drvdata->pin_banks;
  508. int i;
  509. for (i = 0; i < drvdata->nr_banks; ++i, ++bank)
  510. if (bank->eint_type == EINT_TYPE_GPIO)
  511. exynos_pinctrl_suspend_bank(drvdata, bank);
  512. }
  513. static void exynos_pinctrl_resume_bank(
  514. struct samsung_pinctrl_drv_data *drvdata,
  515. struct samsung_pin_bank *bank)
  516. {
  517. struct exynos_eint_gpio_save *save = bank->soc_priv;
  518. void __iomem *regs = bank->eint_base;
  519. pr_debug("%s: con %#010x => %#010x\n", bank->name,
  520. readl(regs + EXYNOS_GPIO_ECON_OFFSET
  521. + bank->eint_offset), save->eint_con);
  522. pr_debug("%s: fltcon0 %#010x => %#010x\n", bank->name,
  523. readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
  524. + 2 * bank->eint_offset), save->eint_fltcon0);
  525. pr_debug("%s: fltcon1 %#010x => %#010x\n", bank->name,
  526. readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
  527. + 2 * bank->eint_offset + 4), save->eint_fltcon1);
  528. writel(save->eint_con, regs + EXYNOS_GPIO_ECON_OFFSET
  529. + bank->eint_offset);
  530. writel(save->eint_fltcon0, regs + EXYNOS_GPIO_EFLTCON_OFFSET
  531. + 2 * bank->eint_offset);
  532. writel(save->eint_fltcon1, regs + EXYNOS_GPIO_EFLTCON_OFFSET
  533. + 2 * bank->eint_offset + 4);
  534. }
  535. static void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata)
  536. {
  537. struct samsung_pin_bank *bank = drvdata->pin_banks;
  538. int i;
  539. for (i = 0; i < drvdata->nr_banks; ++i, ++bank)
  540. if (bank->eint_type == EINT_TYPE_GPIO)
  541. exynos_pinctrl_resume_bank(drvdata, bank);
  542. }
  543. /* pin banks of s5pv210 pin-controller */
  544. static const struct samsung_pin_bank_data s5pv210_pin_bank[] __initconst = {
  545. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  546. EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpa1", 0x04),
  547. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
  548. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
  549. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
  550. EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
  551. EXYNOS_PIN_BANK_EINTG(6, 0x0c0, "gpd1", 0x18),
  552. EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpe0", 0x1c),
  553. EXYNOS_PIN_BANK_EINTG(5, 0x100, "gpe1", 0x20),
  554. EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpf0", 0x24),
  555. EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpf1", 0x28),
  556. EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpf2", 0x2c),
  557. EXYNOS_PIN_BANK_EINTG(6, 0x180, "gpf3", 0x30),
  558. EXYNOS_PIN_BANK_EINTG(7, 0x1a0, "gpg0", 0x34),
  559. EXYNOS_PIN_BANK_EINTG(7, 0x1c0, "gpg1", 0x38),
  560. EXYNOS_PIN_BANK_EINTG(7, 0x1e0, "gpg2", 0x3c),
  561. EXYNOS_PIN_BANK_EINTG(7, 0x200, "gpg3", 0x40),
  562. EXYNOS_PIN_BANK_EINTN(7, 0x220, "gpi"),
  563. EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x44),
  564. EXYNOS_PIN_BANK_EINTG(6, 0x260, "gpj1", 0x48),
  565. EXYNOS_PIN_BANK_EINTG(8, 0x280, "gpj2", 0x4c),
  566. EXYNOS_PIN_BANK_EINTG(8, 0x2a0, "gpj3", 0x50),
  567. EXYNOS_PIN_BANK_EINTG(5, 0x2c0, "gpj4", 0x54),
  568. EXYNOS_PIN_BANK_EINTN(8, 0x2e0, "mp01"),
  569. EXYNOS_PIN_BANK_EINTN(4, 0x300, "mp02"),
  570. EXYNOS_PIN_BANK_EINTN(8, 0x320, "mp03"),
  571. EXYNOS_PIN_BANK_EINTN(8, 0x340, "mp04"),
  572. EXYNOS_PIN_BANK_EINTN(8, 0x360, "mp05"),
  573. EXYNOS_PIN_BANK_EINTN(8, 0x380, "mp06"),
  574. EXYNOS_PIN_BANK_EINTN(8, 0x3a0, "mp07"),
  575. EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gph0", 0x00),
  576. EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gph1", 0x04),
  577. EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gph2", 0x08),
  578. EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gph3", 0x0c),
  579. };
  580. const struct samsung_pin_ctrl s5pv210_pin_ctrl[] __initconst = {
  581. {
  582. /* pin-controller instance 0 data */
  583. .pin_banks = s5pv210_pin_bank,
  584. .nr_banks = ARRAY_SIZE(s5pv210_pin_bank),
  585. .eint_gpio_init = exynos_eint_gpio_init,
  586. .eint_wkup_init = exynos_eint_wkup_init,
  587. .suspend = exynos_pinctrl_suspend,
  588. .resume = exynos_pinctrl_resume,
  589. },
  590. };
  591. /* pin banks of exynos3250 pin-controller 0 */
  592. static const struct samsung_pin_bank_data exynos3250_pin_banks0[] __initconst = {
  593. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  594. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  595. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
  596. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
  597. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
  598. EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
  599. EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpd1", 0x18),
  600. };
  601. /* pin banks of exynos3250 pin-controller 1 */
  602. static const struct samsung_pin_bank_data exynos3250_pin_banks1[] __initconst = {
  603. EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpe0"),
  604. EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpe1"),
  605. EXYNOS_PIN_BANK_EINTN(3, 0x180, "gpe2"),
  606. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpk0", 0x08),
  607. EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
  608. EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
  609. EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpl0", 0x18),
  610. EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
  611. EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
  612. EXYNOS_PIN_BANK_EINTG(5, 0x2a0, "gpm2", 0x2c),
  613. EXYNOS_PIN_BANK_EINTG(8, 0x2c0, "gpm3", 0x30),
  614. EXYNOS_PIN_BANK_EINTG(8, 0x2e0, "gpm4", 0x34),
  615. EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
  616. EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
  617. EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
  618. EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
  619. };
  620. /*
  621. * Samsung pinctrl driver data for Exynos3250 SoC. Exynos3250 SoC includes
  622. * two gpio/pin-mux/pinconfig controllers.
  623. */
  624. const struct samsung_pin_ctrl exynos3250_pin_ctrl[] __initconst = {
  625. {
  626. /* pin-controller instance 0 data */
  627. .pin_banks = exynos3250_pin_banks0,
  628. .nr_banks = ARRAY_SIZE(exynos3250_pin_banks0),
  629. .eint_gpio_init = exynos_eint_gpio_init,
  630. .suspend = exynos_pinctrl_suspend,
  631. .resume = exynos_pinctrl_resume,
  632. }, {
  633. /* pin-controller instance 1 data */
  634. .pin_banks = exynos3250_pin_banks1,
  635. .nr_banks = ARRAY_SIZE(exynos3250_pin_banks1),
  636. .eint_gpio_init = exynos_eint_gpio_init,
  637. .eint_wkup_init = exynos_eint_wkup_init,
  638. .suspend = exynos_pinctrl_suspend,
  639. .resume = exynos_pinctrl_resume,
  640. },
  641. };
  642. /* pin banks of exynos4210 pin-controller 0 */
  643. static const struct samsung_pin_bank_data exynos4210_pin_banks0[] __initconst = {
  644. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  645. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  646. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
  647. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
  648. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
  649. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
  650. EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
  651. EXYNOS_PIN_BANK_EINTG(5, 0x0E0, "gpe0", 0x1c),
  652. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpe1", 0x20),
  653. EXYNOS_PIN_BANK_EINTG(6, 0x120, "gpe2", 0x24),
  654. EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpe3", 0x28),
  655. EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpe4", 0x2c),
  656. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
  657. EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
  658. EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
  659. EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
  660. };
  661. /* pin banks of exynos4210 pin-controller 1 */
  662. static const struct samsung_pin_bank_data exynos4210_pin_banks1[] __initconst = {
  663. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpj0", 0x00),
  664. EXYNOS_PIN_BANK_EINTG(5, 0x020, "gpj1", 0x04),
  665. EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
  666. EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
  667. EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
  668. EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
  669. EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpl0", 0x18),
  670. EXYNOS_PIN_BANK_EINTG(3, 0x0E0, "gpl1", 0x1c),
  671. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
  672. EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
  673. EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
  674. EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
  675. EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
  676. EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
  677. EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
  678. EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
  679. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  680. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  681. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  682. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  683. };
  684. /* pin banks of exynos4210 pin-controller 2 */
  685. static const struct samsung_pin_bank_data exynos4210_pin_banks2[] __initconst = {
  686. EXYNOS_PIN_BANK_EINTN(7, 0x000, "gpz"),
  687. };
  688. /*
  689. * Samsung pinctrl driver data for Exynos4210 SoC. Exynos4210 SoC includes
  690. * three gpio/pin-mux/pinconfig controllers.
  691. */
  692. const struct samsung_pin_ctrl exynos4210_pin_ctrl[] __initconst = {
  693. {
  694. /* pin-controller instance 0 data */
  695. .pin_banks = exynos4210_pin_banks0,
  696. .nr_banks = ARRAY_SIZE(exynos4210_pin_banks0),
  697. .eint_gpio_init = exynos_eint_gpio_init,
  698. .suspend = exynos_pinctrl_suspend,
  699. .resume = exynos_pinctrl_resume,
  700. }, {
  701. /* pin-controller instance 1 data */
  702. .pin_banks = exynos4210_pin_banks1,
  703. .nr_banks = ARRAY_SIZE(exynos4210_pin_banks1),
  704. .eint_gpio_init = exynos_eint_gpio_init,
  705. .eint_wkup_init = exynos_eint_wkup_init,
  706. .suspend = exynos_pinctrl_suspend,
  707. .resume = exynos_pinctrl_resume,
  708. }, {
  709. /* pin-controller instance 2 data */
  710. .pin_banks = exynos4210_pin_banks2,
  711. .nr_banks = ARRAY_SIZE(exynos4210_pin_banks2),
  712. },
  713. };
  714. /* pin banks of exynos4x12 pin-controller 0 */
  715. static const struct samsung_pin_bank_data exynos4x12_pin_banks0[] __initconst = {
  716. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  717. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  718. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
  719. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
  720. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
  721. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
  722. EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
  723. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
  724. EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
  725. EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
  726. EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
  727. EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x40),
  728. EXYNOS_PIN_BANK_EINTG(5, 0x260, "gpj1", 0x44),
  729. };
  730. /* pin banks of exynos4x12 pin-controller 1 */
  731. static const struct samsung_pin_bank_data exynos4x12_pin_banks1[] __initconst = {
  732. EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
  733. EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
  734. EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
  735. EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
  736. EXYNOS_PIN_BANK_EINTG(7, 0x0C0, "gpl0", 0x18),
  737. EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpl1", 0x1c),
  738. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
  739. EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
  740. EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
  741. EXYNOS_PIN_BANK_EINTG(5, 0x2A0, "gpm2", 0x2c),
  742. EXYNOS_PIN_BANK_EINTG(8, 0x2C0, "gpm3", 0x30),
  743. EXYNOS_PIN_BANK_EINTG(8, 0x2E0, "gpm4", 0x34),
  744. EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
  745. EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
  746. EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
  747. EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
  748. EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
  749. EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
  750. EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
  751. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  752. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  753. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  754. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  755. };
  756. /* pin banks of exynos4x12 pin-controller 2 */
  757. static const struct samsung_pin_bank_data exynos4x12_pin_banks2[] __initconst = {
  758. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
  759. };
  760. /* pin banks of exynos4x12 pin-controller 3 */
  761. static const struct samsung_pin_bank_data exynos4x12_pin_banks3[] __initconst = {
  762. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
  763. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
  764. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpv2", 0x08),
  765. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv3", 0x0c),
  766. EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpv4", 0x10),
  767. };
  768. /*
  769. * Samsung pinctrl driver data for Exynos4x12 SoC. Exynos4x12 SoC includes
  770. * four gpio/pin-mux/pinconfig controllers.
  771. */
  772. const struct samsung_pin_ctrl exynos4x12_pin_ctrl[] __initconst = {
  773. {
  774. /* pin-controller instance 0 data */
  775. .pin_banks = exynos4x12_pin_banks0,
  776. .nr_banks = ARRAY_SIZE(exynos4x12_pin_banks0),
  777. .eint_gpio_init = exynos_eint_gpio_init,
  778. .suspend = exynos_pinctrl_suspend,
  779. .resume = exynos_pinctrl_resume,
  780. }, {
  781. /* pin-controller instance 1 data */
  782. .pin_banks = exynos4x12_pin_banks1,
  783. .nr_banks = ARRAY_SIZE(exynos4x12_pin_banks1),
  784. .eint_gpio_init = exynos_eint_gpio_init,
  785. .eint_wkup_init = exynos_eint_wkup_init,
  786. .suspend = exynos_pinctrl_suspend,
  787. .resume = exynos_pinctrl_resume,
  788. }, {
  789. /* pin-controller instance 2 data */
  790. .pin_banks = exynos4x12_pin_banks2,
  791. .nr_banks = ARRAY_SIZE(exynos4x12_pin_banks2),
  792. .eint_gpio_init = exynos_eint_gpio_init,
  793. .suspend = exynos_pinctrl_suspend,
  794. .resume = exynos_pinctrl_resume,
  795. }, {
  796. /* pin-controller instance 3 data */
  797. .pin_banks = exynos4x12_pin_banks3,
  798. .nr_banks = ARRAY_SIZE(exynos4x12_pin_banks3),
  799. .eint_gpio_init = exynos_eint_gpio_init,
  800. .suspend = exynos_pinctrl_suspend,
  801. .resume = exynos_pinctrl_resume,
  802. },
  803. };
  804. /* pin banks of exynos4415 pin-controller 0 */
  805. static const struct samsung_pin_bank_data exynos4415_pin_banks0[] = {
  806. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  807. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  808. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
  809. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
  810. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
  811. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
  812. EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
  813. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
  814. EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
  815. EXYNOS_PIN_BANK_EINTG(1, 0x1C0, "gpf2", 0x38),
  816. };
  817. /* pin banks of exynos4415 pin-controller 1 */
  818. static const struct samsung_pin_bank_data exynos4415_pin_banks1[] = {
  819. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpk0", 0x08),
  820. EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
  821. EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
  822. EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
  823. EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpl0", 0x18),
  824. EXYNOS_PIN_BANK_EINTN(6, 0x120, "mp00"),
  825. EXYNOS_PIN_BANK_EINTN(4, 0x140, "mp01"),
  826. EXYNOS_PIN_BANK_EINTN(6, 0x160, "mp02"),
  827. EXYNOS_PIN_BANK_EINTN(8, 0x180, "mp03"),
  828. EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "mp04"),
  829. EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "mp05"),
  830. EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "mp06"),
  831. EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
  832. EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
  833. EXYNOS_PIN_BANK_EINTG(5, 0x2A0, "gpm2", 0x2c),
  834. EXYNOS_PIN_BANK_EINTG(8, 0x2C0, "gpm3", 0x30),
  835. EXYNOS_PIN_BANK_EINTG(8, 0x2E0, "gpm4", 0x34),
  836. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  837. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  838. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  839. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  840. };
  841. /* pin banks of exynos4415 pin-controller 2 */
  842. static const struct samsung_pin_bank_data exynos4415_pin_banks2[] = {
  843. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
  844. EXYNOS_PIN_BANK_EINTN(2, 0x000, "etc1"),
  845. };
  846. /*
  847. * Samsung pinctrl driver data for Exynos4415 SoC. Exynos4415 SoC includes
  848. * three gpio/pin-mux/pinconfig controllers.
  849. */
  850. const struct samsung_pin_ctrl exynos4415_pin_ctrl[] = {
  851. {
  852. /* pin-controller instance 0 data */
  853. .pin_banks = exynos4415_pin_banks0,
  854. .nr_banks = ARRAY_SIZE(exynos4415_pin_banks0),
  855. .eint_gpio_init = exynos_eint_gpio_init,
  856. .suspend = exynos_pinctrl_suspend,
  857. .resume = exynos_pinctrl_resume,
  858. }, {
  859. /* pin-controller instance 1 data */
  860. .pin_banks = exynos4415_pin_banks1,
  861. .nr_banks = ARRAY_SIZE(exynos4415_pin_banks1),
  862. .eint_gpio_init = exynos_eint_gpio_init,
  863. .eint_wkup_init = exynos_eint_wkup_init,
  864. .suspend = exynos_pinctrl_suspend,
  865. .resume = exynos_pinctrl_resume,
  866. }, {
  867. /* pin-controller instance 2 data */
  868. .pin_banks = exynos4415_pin_banks2,
  869. .nr_banks = ARRAY_SIZE(exynos4415_pin_banks2),
  870. .eint_gpio_init = exynos_eint_gpio_init,
  871. .suspend = exynos_pinctrl_suspend,
  872. .resume = exynos_pinctrl_resume,
  873. },
  874. };
  875. /* pin banks of exynos5250 pin-controller 0 */
  876. static const struct samsung_pin_bank_data exynos5250_pin_banks0[] __initconst = {
  877. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  878. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  879. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
  880. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
  881. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
  882. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
  883. EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpb3", 0x18),
  884. EXYNOS_PIN_BANK_EINTG(7, 0x0E0, "gpc0", 0x1c),
  885. EXYNOS_PIN_BANK_EINTG(4, 0x100, "gpc1", 0x20),
  886. EXYNOS_PIN_BANK_EINTG(7, 0x120, "gpc2", 0x24),
  887. EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpc3", 0x28),
  888. EXYNOS_PIN_BANK_EINTG(4, 0x160, "gpd0", 0x2c),
  889. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpd1", 0x30),
  890. EXYNOS_PIN_BANK_EINTG(7, 0x2E0, "gpc4", 0x34),
  891. EXYNOS_PIN_BANK_EINTN(6, 0x1A0, "gpy0"),
  892. EXYNOS_PIN_BANK_EINTN(4, 0x1C0, "gpy1"),
  893. EXYNOS_PIN_BANK_EINTN(6, 0x1E0, "gpy2"),
  894. EXYNOS_PIN_BANK_EINTN(8, 0x200, "gpy3"),
  895. EXYNOS_PIN_BANK_EINTN(8, 0x220, "gpy4"),
  896. EXYNOS_PIN_BANK_EINTN(8, 0x240, "gpy5"),
  897. EXYNOS_PIN_BANK_EINTN(8, 0x260, "gpy6"),
  898. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  899. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  900. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  901. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  902. };
  903. /* pin banks of exynos5250 pin-controller 1 */
  904. static const struct samsung_pin_bank_data exynos5250_pin_banks1[] __initconst = {
  905. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
  906. EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
  907. EXYNOS_PIN_BANK_EINTG(4, 0x040, "gpf0", 0x08),
  908. EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpf1", 0x0c),
  909. EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
  910. EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
  911. EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
  912. EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gph0", 0x1c),
  913. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph1", 0x20),
  914. };
  915. /* pin banks of exynos5250 pin-controller 2 */
  916. static const struct samsung_pin_bank_data exynos5250_pin_banks2[] __initconst = {
  917. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
  918. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
  919. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv2", 0x08),
  920. EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpv3", 0x0c),
  921. EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpv4", 0x10),
  922. };
  923. /* pin banks of exynos5250 pin-controller 3 */
  924. static const struct samsung_pin_bank_data exynos5250_pin_banks3[] __initconst = {
  925. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
  926. };
  927. /*
  928. * Samsung pinctrl driver data for Exynos5250 SoC. Exynos5250 SoC includes
  929. * four gpio/pin-mux/pinconfig controllers.
  930. */
  931. const struct samsung_pin_ctrl exynos5250_pin_ctrl[] __initconst = {
  932. {
  933. /* pin-controller instance 0 data */
  934. .pin_banks = exynos5250_pin_banks0,
  935. .nr_banks = ARRAY_SIZE(exynos5250_pin_banks0),
  936. .eint_gpio_init = exynos_eint_gpio_init,
  937. .eint_wkup_init = exynos_eint_wkup_init,
  938. .suspend = exynos_pinctrl_suspend,
  939. .resume = exynos_pinctrl_resume,
  940. }, {
  941. /* pin-controller instance 1 data */
  942. .pin_banks = exynos5250_pin_banks1,
  943. .nr_banks = ARRAY_SIZE(exynos5250_pin_banks1),
  944. .eint_gpio_init = exynos_eint_gpio_init,
  945. .suspend = exynos_pinctrl_suspend,
  946. .resume = exynos_pinctrl_resume,
  947. }, {
  948. /* pin-controller instance 2 data */
  949. .pin_banks = exynos5250_pin_banks2,
  950. .nr_banks = ARRAY_SIZE(exynos5250_pin_banks2),
  951. .eint_gpio_init = exynos_eint_gpio_init,
  952. .suspend = exynos_pinctrl_suspend,
  953. .resume = exynos_pinctrl_resume,
  954. }, {
  955. /* pin-controller instance 3 data */
  956. .pin_banks = exynos5250_pin_banks3,
  957. .nr_banks = ARRAY_SIZE(exynos5250_pin_banks3),
  958. .eint_gpio_init = exynos_eint_gpio_init,
  959. .suspend = exynos_pinctrl_suspend,
  960. .resume = exynos_pinctrl_resume,
  961. },
  962. };
  963. /* pin banks of exynos5260 pin-controller 0 */
  964. static const struct samsung_pin_bank_data exynos5260_pin_banks0[] __initconst = {
  965. EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpa0", 0x00),
  966. EXYNOS_PIN_BANK_EINTG(7, 0x020, "gpa1", 0x04),
  967. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
  968. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
  969. EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpb1", 0x10),
  970. EXYNOS_PIN_BANK_EINTG(5, 0x0a0, "gpb2", 0x14),
  971. EXYNOS_PIN_BANK_EINTG(8, 0x0c0, "gpb3", 0x18),
  972. EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpb4", 0x1c),
  973. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpb5", 0x20),
  974. EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpd0", 0x24),
  975. EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpd1", 0x28),
  976. EXYNOS_PIN_BANK_EINTG(5, 0x160, "gpd2", 0x2c),
  977. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpe0", 0x30),
  978. EXYNOS_PIN_BANK_EINTG(5, 0x1a0, "gpe1", 0x34),
  979. EXYNOS_PIN_BANK_EINTG(4, 0x1c0, "gpf0", 0x38),
  980. EXYNOS_PIN_BANK_EINTG(8, 0x1e0, "gpf1", 0x3c),
  981. EXYNOS_PIN_BANK_EINTG(2, 0x200, "gpk0", 0x40),
  982. EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
  983. EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
  984. EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
  985. EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
  986. };
  987. /* pin banks of exynos5260 pin-controller 1 */
  988. static const struct samsung_pin_bank_data exynos5260_pin_banks1[] __initconst = {
  989. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpc0", 0x00),
  990. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpc1", 0x04),
  991. EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
  992. EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
  993. EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpc4", 0x10),
  994. };
  995. /* pin banks of exynos5260 pin-controller 2 */
  996. static const struct samsung_pin_bank_data exynos5260_pin_banks2[] __initconst = {
  997. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz0", 0x00),
  998. EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04),
  999. };
  1000. /*
  1001. * Samsung pinctrl driver data for Exynos5260 SoC. Exynos5260 SoC includes
  1002. * three gpio/pin-mux/pinconfig controllers.
  1003. */
  1004. const struct samsung_pin_ctrl exynos5260_pin_ctrl[] __initconst = {
  1005. {
  1006. /* pin-controller instance 0 data */
  1007. .pin_banks = exynos5260_pin_banks0,
  1008. .nr_banks = ARRAY_SIZE(exynos5260_pin_banks0),
  1009. .eint_gpio_init = exynos_eint_gpio_init,
  1010. .eint_wkup_init = exynos_eint_wkup_init,
  1011. }, {
  1012. /* pin-controller instance 1 data */
  1013. .pin_banks = exynos5260_pin_banks1,
  1014. .nr_banks = ARRAY_SIZE(exynos5260_pin_banks1),
  1015. .eint_gpio_init = exynos_eint_gpio_init,
  1016. }, {
  1017. /* pin-controller instance 2 data */
  1018. .pin_banks = exynos5260_pin_banks2,
  1019. .nr_banks = ARRAY_SIZE(exynos5260_pin_banks2),
  1020. .eint_gpio_init = exynos_eint_gpio_init,
  1021. },
  1022. };
  1023. /* pin banks of exynos5410 pin-controller 0 */
  1024. static const struct samsung_pin_bank_data exynos5410_pin_banks0[] __initconst = {
  1025. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  1026. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  1027. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
  1028. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
  1029. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
  1030. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
  1031. EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpb3", 0x18),
  1032. EXYNOS_PIN_BANK_EINTG(7, 0x0E0, "gpc0", 0x1c),
  1033. EXYNOS_PIN_BANK_EINTG(4, 0x100, "gpc3", 0x20),
  1034. EXYNOS_PIN_BANK_EINTG(7, 0x120, "gpc1", 0x24),
  1035. EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpc2", 0x28),
  1036. EXYNOS_PIN_BANK_EINTN(2, 0x160, "gpm5"),
  1037. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpd1", 0x2c),
  1038. EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpe0", 0x30),
  1039. EXYNOS_PIN_BANK_EINTG(2, 0x1C0, "gpe1", 0x34),
  1040. EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf0", 0x38),
  1041. EXYNOS_PIN_BANK_EINTG(8, 0x200, "gpf1", 0x3c),
  1042. EXYNOS_PIN_BANK_EINTG(8, 0x220, "gpg0", 0x40),
  1043. EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpg1", 0x44),
  1044. EXYNOS_PIN_BANK_EINTG(2, 0x260, "gpg2", 0x48),
  1045. EXYNOS_PIN_BANK_EINTG(4, 0x280, "gph0", 0x4c),
  1046. EXYNOS_PIN_BANK_EINTG(8, 0x2A0, "gph1", 0x50),
  1047. EXYNOS_PIN_BANK_EINTN(8, 0x2C0, "gpm7"),
  1048. EXYNOS_PIN_BANK_EINTN(6, 0x2E0, "gpy0"),
  1049. EXYNOS_PIN_BANK_EINTN(4, 0x300, "gpy1"),
  1050. EXYNOS_PIN_BANK_EINTN(6, 0x320, "gpy2"),
  1051. EXYNOS_PIN_BANK_EINTN(8, 0x340, "gpy3"),
  1052. EXYNOS_PIN_BANK_EINTN(8, 0x360, "gpy4"),
  1053. EXYNOS_PIN_BANK_EINTN(8, 0x380, "gpy5"),
  1054. EXYNOS_PIN_BANK_EINTN(8, 0x3A0, "gpy6"),
  1055. EXYNOS_PIN_BANK_EINTN(8, 0x3C0, "gpy7"),
  1056. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  1057. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  1058. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  1059. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  1060. };
  1061. /* pin banks of exynos5410 pin-controller 1 */
  1062. static const struct samsung_pin_bank_data exynos5410_pin_banks1[] __initconst = {
  1063. EXYNOS_PIN_BANK_EINTG(5, 0x000, "gpj0", 0x00),
  1064. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpj1", 0x04),
  1065. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpj2", 0x08),
  1066. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpj3", 0x0c),
  1067. EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpj4", 0x10),
  1068. EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpk0", 0x14),
  1069. EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpk1", 0x18),
  1070. EXYNOS_PIN_BANK_EINTG(8, 0x0E0, "gpk2", 0x1c),
  1071. EXYNOS_PIN_BANK_EINTG(7, 0x100, "gpk3", 0x20),
  1072. };
  1073. /* pin banks of exynos5410 pin-controller 2 */
  1074. static const struct samsung_pin_bank_data exynos5410_pin_banks2[] __initconst = {
  1075. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
  1076. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
  1077. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv2", 0x08),
  1078. EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpv3", 0x0c),
  1079. EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpv4", 0x10),
  1080. };
  1081. /* pin banks of exynos5410 pin-controller 3 */
  1082. static const struct samsung_pin_bank_data exynos5410_pin_banks3[] __initconst = {
  1083. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
  1084. };
  1085. /*
  1086. * Samsung pinctrl driver data for Exynos5410 SoC. Exynos5410 SoC includes
  1087. * four gpio/pin-mux/pinconfig controllers.
  1088. */
  1089. const struct samsung_pin_ctrl exynos5410_pin_ctrl[] __initconst = {
  1090. {
  1091. /* pin-controller instance 0 data */
  1092. .pin_banks = exynos5410_pin_banks0,
  1093. .nr_banks = ARRAY_SIZE(exynos5410_pin_banks0),
  1094. .eint_gpio_init = exynos_eint_gpio_init,
  1095. .eint_wkup_init = exynos_eint_wkup_init,
  1096. .suspend = exynos_pinctrl_suspend,
  1097. .resume = exynos_pinctrl_resume,
  1098. }, {
  1099. /* pin-controller instance 1 data */
  1100. .pin_banks = exynos5410_pin_banks1,
  1101. .nr_banks = ARRAY_SIZE(exynos5410_pin_banks1),
  1102. .eint_gpio_init = exynos_eint_gpio_init,
  1103. .suspend = exynos_pinctrl_suspend,
  1104. .resume = exynos_pinctrl_resume,
  1105. }, {
  1106. /* pin-controller instance 2 data */
  1107. .pin_banks = exynos5410_pin_banks2,
  1108. .nr_banks = ARRAY_SIZE(exynos5410_pin_banks2),
  1109. .eint_gpio_init = exynos_eint_gpio_init,
  1110. .suspend = exynos_pinctrl_suspend,
  1111. .resume = exynos_pinctrl_resume,
  1112. }, {
  1113. /* pin-controller instance 3 data */
  1114. .pin_banks = exynos5410_pin_banks3,
  1115. .nr_banks = ARRAY_SIZE(exynos5410_pin_banks3),
  1116. .eint_gpio_init = exynos_eint_gpio_init,
  1117. .suspend = exynos_pinctrl_suspend,
  1118. .resume = exynos_pinctrl_resume,
  1119. },
  1120. };
  1121. /* pin banks of exynos5420 pin-controller 0 */
  1122. static const struct samsung_pin_bank_data exynos5420_pin_banks0[] __initconst = {
  1123. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpy7", 0x00),
  1124. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  1125. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  1126. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  1127. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  1128. };
  1129. /* pin banks of exynos5420 pin-controller 1 */
  1130. static const struct samsung_pin_bank_data exynos5420_pin_banks1[] __initconst = {
  1131. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpc0", 0x00),
  1132. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpc1", 0x04),
  1133. EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
  1134. EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
  1135. EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpc4", 0x10),
  1136. EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpd1", 0x14),
  1137. EXYNOS_PIN_BANK_EINTN(6, 0x0C0, "gpy0"),
  1138. EXYNOS_PIN_BANK_EINTN(4, 0x0E0, "gpy1"),
  1139. EXYNOS_PIN_BANK_EINTN(6, 0x100, "gpy2"),
  1140. EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpy3"),
  1141. EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpy4"),
  1142. EXYNOS_PIN_BANK_EINTN(8, 0x160, "gpy5"),
  1143. EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy6"),
  1144. };
  1145. /* pin banks of exynos5420 pin-controller 2 */
  1146. static const struct samsung_pin_bank_data exynos5420_pin_banks2[] __initconst = {
  1147. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
  1148. EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
  1149. EXYNOS_PIN_BANK_EINTG(6, 0x040, "gpf0", 0x08),
  1150. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpf1", 0x0c),
  1151. EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
  1152. EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
  1153. EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
  1154. EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gpj4", 0x1c),
  1155. };
  1156. /* pin banks of exynos5420 pin-controller 3 */
  1157. static const struct samsung_pin_bank_data exynos5420_pin_banks3[] __initconst = {
  1158. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  1159. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  1160. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
  1161. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
  1162. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
  1163. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
  1164. EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpb3", 0x18),
  1165. EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpb4", 0x1c),
  1166. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph0", 0x20),
  1167. };
  1168. /* pin banks of exynos5420 pin-controller 4 */
  1169. static const struct samsung_pin_bank_data exynos5420_pin_banks4[] __initconst = {
  1170. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
  1171. };
  1172. /*
  1173. * Samsung pinctrl driver data for Exynos5420 SoC. Exynos5420 SoC includes
  1174. * four gpio/pin-mux/pinconfig controllers.
  1175. */
  1176. const struct samsung_pin_ctrl exynos5420_pin_ctrl[] __initconst = {
  1177. {
  1178. /* pin-controller instance 0 data */
  1179. .pin_banks = exynos5420_pin_banks0,
  1180. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks0),
  1181. .eint_gpio_init = exynos_eint_gpio_init,
  1182. .eint_wkup_init = exynos_eint_wkup_init,
  1183. }, {
  1184. /* pin-controller instance 1 data */
  1185. .pin_banks = exynos5420_pin_banks1,
  1186. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks1),
  1187. .eint_gpio_init = exynos_eint_gpio_init,
  1188. }, {
  1189. /* pin-controller instance 2 data */
  1190. .pin_banks = exynos5420_pin_banks2,
  1191. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks2),
  1192. .eint_gpio_init = exynos_eint_gpio_init,
  1193. }, {
  1194. /* pin-controller instance 3 data */
  1195. .pin_banks = exynos5420_pin_banks3,
  1196. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks3),
  1197. .eint_gpio_init = exynos_eint_gpio_init,
  1198. }, {
  1199. /* pin-controller instance 4 data */
  1200. .pin_banks = exynos5420_pin_banks4,
  1201. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks4),
  1202. .eint_gpio_init = exynos_eint_gpio_init,
  1203. },
  1204. };
  1205. /* pin banks of exynos5433 pin-controller - ALIVE */
  1206. static const struct samsung_pin_bank_data exynos5433_pin_banks0[] = {
  1207. EXYNOS5433_PIN_BANK_EINTW(8, 0x000, "gpa0", 0x00),
  1208. EXYNOS5433_PIN_BANK_EINTW(8, 0x020, "gpa1", 0x04),
  1209. EXYNOS5433_PIN_BANK_EINTW(8, 0x040, "gpa2", 0x08),
  1210. EXYNOS5433_PIN_BANK_EINTW(8, 0x060, "gpa3", 0x0c),
  1211. EXYNOS5433_PIN_BANK_EINTW_EXT(8, 0x020, "gpf1", 0x1004, 1),
  1212. EXYNOS5433_PIN_BANK_EINTW_EXT(4, 0x040, "gpf2", 0x1008, 1),
  1213. EXYNOS5433_PIN_BANK_EINTW_EXT(4, 0x060, "gpf3", 0x100c, 1),
  1214. EXYNOS5433_PIN_BANK_EINTW_EXT(8, 0x080, "gpf4", 0x1010, 1),
  1215. EXYNOS5433_PIN_BANK_EINTW_EXT(8, 0x0a0, "gpf5", 0x1014, 1),
  1216. };
  1217. /* pin banks of exynos5433 pin-controller - AUD */
  1218. static const struct samsung_pin_bank_data exynos5433_pin_banks1[] = {
  1219. EXYNOS5433_PIN_BANK_EINTG(7, 0x000, "gpz0", 0x00),
  1220. EXYNOS5433_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04),
  1221. };
  1222. /* pin banks of exynos5433 pin-controller - CPIF */
  1223. static const struct samsung_pin_bank_data exynos5433_pin_banks2[] = {
  1224. EXYNOS5433_PIN_BANK_EINTG(2, 0x000, "gpv6", 0x00),
  1225. };
  1226. /* pin banks of exynos5433 pin-controller - eSE */
  1227. static const struct samsung_pin_bank_data exynos5433_pin_banks3[] = {
  1228. EXYNOS5433_PIN_BANK_EINTG(3, 0x000, "gpj2", 0x00),
  1229. };
  1230. /* pin banks of exynos5433 pin-controller - FINGER */
  1231. static const struct samsung_pin_bank_data exynos5433_pin_banks4[] = {
  1232. EXYNOS5433_PIN_BANK_EINTG(4, 0x000, "gpd5", 0x00),
  1233. };
  1234. /* pin banks of exynos5433 pin-controller - FSYS */
  1235. static const struct samsung_pin_bank_data exynos5433_pin_banks5[] = {
  1236. EXYNOS5433_PIN_BANK_EINTG(6, 0x000, "gph1", 0x00),
  1237. EXYNOS5433_PIN_BANK_EINTG(7, 0x020, "gpr4", 0x04),
  1238. EXYNOS5433_PIN_BANK_EINTG(5, 0x040, "gpr0", 0x08),
  1239. EXYNOS5433_PIN_BANK_EINTG(8, 0x060, "gpr1", 0x0c),
  1240. EXYNOS5433_PIN_BANK_EINTG(2, 0x080, "gpr2", 0x10),
  1241. EXYNOS5433_PIN_BANK_EINTG(8, 0x0a0, "gpr3", 0x14),
  1242. };
  1243. /* pin banks of exynos5433 pin-controller - IMEM */
  1244. static const struct samsung_pin_bank_data exynos5433_pin_banks6[] = {
  1245. EXYNOS5433_PIN_BANK_EINTG(8, 0x000, "gpf0", 0x00),
  1246. };
  1247. /* pin banks of exynos5433 pin-controller - NFC */
  1248. static const struct samsung_pin_bank_data exynos5433_pin_banks7[] = {
  1249. EXYNOS5433_PIN_BANK_EINTG(3, 0x000, "gpj0", 0x00),
  1250. };
  1251. /* pin banks of exynos5433 pin-controller - PERIC */
  1252. static const struct samsung_pin_bank_data exynos5433_pin_banks8[] = {
  1253. EXYNOS5433_PIN_BANK_EINTG(6, 0x000, "gpv7", 0x00),
  1254. EXYNOS5433_PIN_BANK_EINTG(5, 0x020, "gpb0", 0x04),
  1255. EXYNOS5433_PIN_BANK_EINTG(8, 0x040, "gpc0", 0x08),
  1256. EXYNOS5433_PIN_BANK_EINTG(2, 0x060, "gpc1", 0x0c),
  1257. EXYNOS5433_PIN_BANK_EINTG(6, 0x080, "gpc2", 0x10),
  1258. EXYNOS5433_PIN_BANK_EINTG(8, 0x0a0, "gpc3", 0x14),
  1259. EXYNOS5433_PIN_BANK_EINTG(2, 0x0c0, "gpg0", 0x18),
  1260. EXYNOS5433_PIN_BANK_EINTG(4, 0x0e0, "gpd0", 0x1c),
  1261. EXYNOS5433_PIN_BANK_EINTG(6, 0x100, "gpd1", 0x20),
  1262. EXYNOS5433_PIN_BANK_EINTG(8, 0x120, "gpd2", 0x24),
  1263. EXYNOS5433_PIN_BANK_EINTG(5, 0x140, "gpd4", 0x28),
  1264. EXYNOS5433_PIN_BANK_EINTG(2, 0x160, "gpd8", 0x2c),
  1265. EXYNOS5433_PIN_BANK_EINTG(7, 0x180, "gpd6", 0x30),
  1266. EXYNOS5433_PIN_BANK_EINTG(3, 0x1a0, "gpd7", 0x34),
  1267. EXYNOS5433_PIN_BANK_EINTG(5, 0x1c0, "gpg1", 0x38),
  1268. EXYNOS5433_PIN_BANK_EINTG(2, 0x1e0, "gpg2", 0x3c),
  1269. EXYNOS5433_PIN_BANK_EINTG(8, 0x200, "gpg3", 0x40),
  1270. };
  1271. /* pin banks of exynos5433 pin-controller - TOUCH */
  1272. static const struct samsung_pin_bank_data exynos5433_pin_banks9[] = {
  1273. EXYNOS5433_PIN_BANK_EINTG(3, 0x000, "gpj1", 0x00),
  1274. };
  1275. /*
  1276. * Samsung pinctrl driver data for Exynos5433 SoC. Exynos5433 SoC includes
  1277. * ten gpio/pin-mux/pinconfig controllers.
  1278. */
  1279. const struct samsung_pin_ctrl exynos5433_pin_ctrl[] = {
  1280. {
  1281. /* pin-controller instance 0 data */
  1282. .pin_banks = exynos5433_pin_banks0,
  1283. .nr_banks = ARRAY_SIZE(exynos5433_pin_banks0),
  1284. .eint_wkup_init = exynos_eint_wkup_init,
  1285. .suspend = exynos_pinctrl_suspend,
  1286. .resume = exynos_pinctrl_resume,
  1287. .nr_ext_resources = 1,
  1288. }, {
  1289. /* pin-controller instance 1 data */
  1290. .pin_banks = exynos5433_pin_banks1,
  1291. .nr_banks = ARRAY_SIZE(exynos5433_pin_banks1),
  1292. .eint_gpio_init = exynos_eint_gpio_init,
  1293. .suspend = exynos_pinctrl_suspend,
  1294. .resume = exynos_pinctrl_resume,
  1295. }, {
  1296. /* pin-controller instance 2 data */
  1297. .pin_banks = exynos5433_pin_banks2,
  1298. .nr_banks = ARRAY_SIZE(exynos5433_pin_banks2),
  1299. .eint_gpio_init = exynos_eint_gpio_init,
  1300. .suspend = exynos_pinctrl_suspend,
  1301. .resume = exynos_pinctrl_resume,
  1302. }, {
  1303. /* pin-controller instance 3 data */
  1304. .pin_banks = exynos5433_pin_banks3,
  1305. .nr_banks = ARRAY_SIZE(exynos5433_pin_banks3),
  1306. .eint_gpio_init = exynos_eint_gpio_init,
  1307. .suspend = exynos_pinctrl_suspend,
  1308. .resume = exynos_pinctrl_resume,
  1309. }, {
  1310. /* pin-controller instance 4 data */
  1311. .pin_banks = exynos5433_pin_banks4,
  1312. .nr_banks = ARRAY_SIZE(exynos5433_pin_banks4),
  1313. .eint_gpio_init = exynos_eint_gpio_init,
  1314. .suspend = exynos_pinctrl_suspend,
  1315. .resume = exynos_pinctrl_resume,
  1316. }, {
  1317. /* pin-controller instance 5 data */
  1318. .pin_banks = exynos5433_pin_banks5,
  1319. .nr_banks = ARRAY_SIZE(exynos5433_pin_banks5),
  1320. .eint_gpio_init = exynos_eint_gpio_init,
  1321. .suspend = exynos_pinctrl_suspend,
  1322. .resume = exynos_pinctrl_resume,
  1323. }, {
  1324. /* pin-controller instance 6 data */
  1325. .pin_banks = exynos5433_pin_banks6,
  1326. .nr_banks = ARRAY_SIZE(exynos5433_pin_banks6),
  1327. .eint_gpio_init = exynos_eint_gpio_init,
  1328. .suspend = exynos_pinctrl_suspend,
  1329. .resume = exynos_pinctrl_resume,
  1330. }, {
  1331. /* pin-controller instance 7 data */
  1332. .pin_banks = exynos5433_pin_banks7,
  1333. .nr_banks = ARRAY_SIZE(exynos5433_pin_banks7),
  1334. .eint_gpio_init = exynos_eint_gpio_init,
  1335. .suspend = exynos_pinctrl_suspend,
  1336. .resume = exynos_pinctrl_resume,
  1337. }, {
  1338. /* pin-controller instance 8 data */
  1339. .pin_banks = exynos5433_pin_banks8,
  1340. .nr_banks = ARRAY_SIZE(exynos5433_pin_banks8),
  1341. .eint_gpio_init = exynos_eint_gpio_init,
  1342. .suspend = exynos_pinctrl_suspend,
  1343. .resume = exynos_pinctrl_resume,
  1344. }, {
  1345. /* pin-controller instance 9 data */
  1346. .pin_banks = exynos5433_pin_banks9,
  1347. .nr_banks = ARRAY_SIZE(exynos5433_pin_banks9),
  1348. .eint_gpio_init = exynos_eint_gpio_init,
  1349. .suspend = exynos_pinctrl_suspend,
  1350. .resume = exynos_pinctrl_resume,
  1351. },
  1352. };
  1353. /* pin banks of exynos7 pin-controller - ALIVE */
  1354. static const struct samsung_pin_bank_data exynos7_pin_banks0[] __initconst = {
  1355. EXYNOS_PIN_BANK_EINTW(8, 0x000, "gpa0", 0x00),
  1356. EXYNOS_PIN_BANK_EINTW(8, 0x020, "gpa1", 0x04),
  1357. EXYNOS_PIN_BANK_EINTW(8, 0x040, "gpa2", 0x08),
  1358. EXYNOS_PIN_BANK_EINTW(8, 0x060, "gpa3", 0x0c),
  1359. };
  1360. /* pin banks of exynos7 pin-controller - BUS0 */
  1361. static const struct samsung_pin_bank_data exynos7_pin_banks1[] __initconst = {
  1362. EXYNOS_PIN_BANK_EINTG(5, 0x000, "gpb0", 0x00),
  1363. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpc0", 0x04),
  1364. EXYNOS_PIN_BANK_EINTG(2, 0x040, "gpc1", 0x08),
  1365. EXYNOS_PIN_BANK_EINTG(6, 0x060, "gpc2", 0x0c),
  1366. EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpc3", 0x10),
  1367. EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
  1368. EXYNOS_PIN_BANK_EINTG(6, 0x0c0, "gpd1", 0x18),
  1369. EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpd2", 0x1c),
  1370. EXYNOS_PIN_BANK_EINTG(5, 0x100, "gpd4", 0x20),
  1371. EXYNOS_PIN_BANK_EINTG(4, 0x120, "gpd5", 0x24),
  1372. EXYNOS_PIN_BANK_EINTG(6, 0x140, "gpd6", 0x28),
  1373. EXYNOS_PIN_BANK_EINTG(3, 0x160, "gpd7", 0x2c),
  1374. EXYNOS_PIN_BANK_EINTG(2, 0x180, "gpd8", 0x30),
  1375. EXYNOS_PIN_BANK_EINTG(2, 0x1a0, "gpg0", 0x34),
  1376. EXYNOS_PIN_BANK_EINTG(4, 0x1c0, "gpg3", 0x38),
  1377. };
  1378. /* pin banks of exynos7 pin-controller - NFC */
  1379. static const struct samsung_pin_bank_data exynos7_pin_banks2[] __initconst = {
  1380. EXYNOS_PIN_BANK_EINTG(3, 0x000, "gpj0", 0x00),
  1381. };
  1382. /* pin banks of exynos7 pin-controller - TOUCH */
  1383. static const struct samsung_pin_bank_data exynos7_pin_banks3[] __initconst = {
  1384. EXYNOS_PIN_BANK_EINTG(3, 0x000, "gpj1", 0x00),
  1385. };
  1386. /* pin banks of exynos7 pin-controller - FF */
  1387. static const struct samsung_pin_bank_data exynos7_pin_banks4[] __initconst = {
  1388. EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpg4", 0x00),
  1389. };
  1390. /* pin banks of exynos7 pin-controller - ESE */
  1391. static const struct samsung_pin_bank_data exynos7_pin_banks5[] __initconst = {
  1392. EXYNOS_PIN_BANK_EINTG(5, 0x000, "gpv7", 0x00),
  1393. };
  1394. /* pin banks of exynos7 pin-controller - FSYS0 */
  1395. static const struct samsung_pin_bank_data exynos7_pin_banks6[] __initconst = {
  1396. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpr4", 0x00),
  1397. };
  1398. /* pin banks of exynos7 pin-controller - FSYS1 */
  1399. static const struct samsung_pin_bank_data exynos7_pin_banks7[] __initconst = {
  1400. EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpr0", 0x00),
  1401. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpr1", 0x04),
  1402. EXYNOS_PIN_BANK_EINTG(5, 0x040, "gpr2", 0x08),
  1403. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpr3", 0x0c),
  1404. };
  1405. /* pin banks of exynos7 pin-controller - BUS1 */
  1406. static const struct samsung_pin_bank_data exynos7_pin_banks8[] __initconst = {
  1407. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpf0", 0x00),
  1408. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpf1", 0x04),
  1409. EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpf2", 0x08),
  1410. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpf3", 0x0c),
  1411. EXYNOS_PIN_BANK_EINTG(8, 0x0a0, "gpf4", 0x10),
  1412. EXYNOS_PIN_BANK_EINTG(8, 0x0c0, "gpf5", 0x14),
  1413. EXYNOS_PIN_BANK_EINTG(5, 0x0e0, "gpg1", 0x18),
  1414. EXYNOS_PIN_BANK_EINTG(5, 0x100, "gpg2", 0x1c),
  1415. EXYNOS_PIN_BANK_EINTG(6, 0x120, "gph1", 0x20),
  1416. EXYNOS_PIN_BANK_EINTG(3, 0x140, "gpv6", 0x24),
  1417. };
  1418. static const struct samsung_pin_bank_data exynos7_pin_banks9[] __initconst = {
  1419. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz0", 0x00),
  1420. EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04),
  1421. };
  1422. const struct samsung_pin_ctrl exynos7_pin_ctrl[] __initconst = {
  1423. {
  1424. /* pin-controller instance 0 Alive data */
  1425. .pin_banks = exynos7_pin_banks0,
  1426. .nr_banks = ARRAY_SIZE(exynos7_pin_banks0),
  1427. .eint_wkup_init = exynos_eint_wkup_init,
  1428. }, {
  1429. /* pin-controller instance 1 BUS0 data */
  1430. .pin_banks = exynos7_pin_banks1,
  1431. .nr_banks = ARRAY_SIZE(exynos7_pin_banks1),
  1432. .eint_gpio_init = exynos_eint_gpio_init,
  1433. }, {
  1434. /* pin-controller instance 2 NFC data */
  1435. .pin_banks = exynos7_pin_banks2,
  1436. .nr_banks = ARRAY_SIZE(exynos7_pin_banks2),
  1437. .eint_gpio_init = exynos_eint_gpio_init,
  1438. }, {
  1439. /* pin-controller instance 3 TOUCH data */
  1440. .pin_banks = exynos7_pin_banks3,
  1441. .nr_banks = ARRAY_SIZE(exynos7_pin_banks3),
  1442. .eint_gpio_init = exynos_eint_gpio_init,
  1443. }, {
  1444. /* pin-controller instance 4 FF data */
  1445. .pin_banks = exynos7_pin_banks4,
  1446. .nr_banks = ARRAY_SIZE(exynos7_pin_banks4),
  1447. .eint_gpio_init = exynos_eint_gpio_init,
  1448. }, {
  1449. /* pin-controller instance 5 ESE data */
  1450. .pin_banks = exynos7_pin_banks5,
  1451. .nr_banks = ARRAY_SIZE(exynos7_pin_banks5),
  1452. .eint_gpio_init = exynos_eint_gpio_init,
  1453. }, {
  1454. /* pin-controller instance 6 FSYS0 data */
  1455. .pin_banks = exynos7_pin_banks6,
  1456. .nr_banks = ARRAY_SIZE(exynos7_pin_banks6),
  1457. .eint_gpio_init = exynos_eint_gpio_init,
  1458. }, {
  1459. /* pin-controller instance 7 FSYS1 data */
  1460. .pin_banks = exynos7_pin_banks7,
  1461. .nr_banks = ARRAY_SIZE(exynos7_pin_banks7),
  1462. .eint_gpio_init = exynos_eint_gpio_init,
  1463. }, {
  1464. /* pin-controller instance 8 BUS1 data */
  1465. .pin_banks = exynos7_pin_banks8,
  1466. .nr_banks = ARRAY_SIZE(exynos7_pin_banks8),
  1467. .eint_gpio_init = exynos_eint_gpio_init,
  1468. }, {
  1469. /* pin-controller instance 9 AUD data */
  1470. .pin_banks = exynos7_pin_banks9,
  1471. .nr_banks = ARRAY_SIZE(exynos7_pin_banks9),
  1472. .eint_gpio_init = exynos_eint_gpio_init,
  1473. },
  1474. };