pinctrl-exynos-arm.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893
  1. // SPDX-License-Identifier: GPL-2.0+
  2. //
  3. // Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
  4. //
  5. // Copyright (c) 2012 Samsung Electronics Co., Ltd.
  6. // http://www.samsung.com
  7. // Copyright (c) 2012 Linaro Ltd
  8. // http://www.linaro.org
  9. //
  10. // Author: Thomas Abraham <[email protected]>
  11. //
  12. // This file contains the Samsung Exynos specific information required by the
  13. // the Samsung pinctrl/gpiolib driver. It also includes the implementation of
  14. // external gpio and wakeup interrupt support.
  15. #include <linux/device.h>
  16. #include <linux/of_address.h>
  17. #include <linux/slab.h>
  18. #include <linux/err.h>
  19. #include <linux/soc/samsung/exynos-regs-pmu.h>
  20. #include "pinctrl-samsung.h"
  21. #include "pinctrl-exynos.h"
  22. static const struct samsung_pin_bank_type bank_type_off = {
  23. .fld_width = { 4, 1, 2, 2, 2, 2, },
  24. .reg_offset = { 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, },
  25. };
  26. static const struct samsung_pin_bank_type bank_type_alive = {
  27. .fld_width = { 4, 1, 2, 2, },
  28. .reg_offset = { 0x00, 0x04, 0x08, 0x0c, },
  29. };
  30. /* Retention control for S5PV210 are located at the end of clock controller */
  31. #define S5P_OTHERS 0xE000
  32. #define S5P_OTHERS_RET_IO (1 << 31)
  33. #define S5P_OTHERS_RET_CF (1 << 30)
  34. #define S5P_OTHERS_RET_MMC (1 << 29)
  35. #define S5P_OTHERS_RET_UART (1 << 28)
  36. static void s5pv210_retention_disable(struct samsung_pinctrl_drv_data *drvdata)
  37. {
  38. void __iomem *clk_base = (void __iomem *)drvdata->retention_ctrl->priv;
  39. u32 tmp;
  40. tmp = __raw_readl(clk_base + S5P_OTHERS);
  41. tmp |= (S5P_OTHERS_RET_IO | S5P_OTHERS_RET_CF | S5P_OTHERS_RET_MMC |
  42. S5P_OTHERS_RET_UART);
  43. __raw_writel(tmp, clk_base + S5P_OTHERS);
  44. }
  45. static struct samsung_retention_ctrl *
  46. s5pv210_retention_init(struct samsung_pinctrl_drv_data *drvdata,
  47. const struct samsung_retention_data *data)
  48. {
  49. struct samsung_retention_ctrl *ctrl;
  50. struct device_node *np;
  51. void __iomem *clk_base;
  52. ctrl = devm_kzalloc(drvdata->dev, sizeof(*ctrl), GFP_KERNEL);
  53. if (!ctrl)
  54. return ERR_PTR(-ENOMEM);
  55. np = of_find_compatible_node(NULL, NULL, "samsung,s5pv210-clock");
  56. if (!np) {
  57. pr_err("%s: failed to find clock controller DT node\n",
  58. __func__);
  59. return ERR_PTR(-ENODEV);
  60. }
  61. clk_base = of_iomap(np, 0);
  62. of_node_put(np);
  63. if (!clk_base) {
  64. pr_err("%s: failed to map clock registers\n", __func__);
  65. return ERR_PTR(-EINVAL);
  66. }
  67. ctrl->priv = (void __force *)clk_base;
  68. ctrl->disable = s5pv210_retention_disable;
  69. return ctrl;
  70. }
  71. static const struct samsung_retention_data s5pv210_retention_data __initconst = {
  72. .init = s5pv210_retention_init,
  73. };
  74. /* pin banks of s5pv210 pin-controller */
  75. static const struct samsung_pin_bank_data s5pv210_pin_bank[] __initconst = {
  76. /* Must start with EINTG banks, ordered by EINT group number. */
  77. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  78. EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpa1", 0x04),
  79. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
  80. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
  81. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
  82. EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
  83. EXYNOS_PIN_BANK_EINTG(6, 0x0c0, "gpd1", 0x18),
  84. EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpe0", 0x1c),
  85. EXYNOS_PIN_BANK_EINTG(5, 0x100, "gpe1", 0x20),
  86. EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpf0", 0x24),
  87. EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpf1", 0x28),
  88. EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpf2", 0x2c),
  89. EXYNOS_PIN_BANK_EINTG(6, 0x180, "gpf3", 0x30),
  90. EXYNOS_PIN_BANK_EINTG(7, 0x1a0, "gpg0", 0x34),
  91. EXYNOS_PIN_BANK_EINTG(7, 0x1c0, "gpg1", 0x38),
  92. EXYNOS_PIN_BANK_EINTG(7, 0x1e0, "gpg2", 0x3c),
  93. EXYNOS_PIN_BANK_EINTG(7, 0x200, "gpg3", 0x40),
  94. EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x44),
  95. EXYNOS_PIN_BANK_EINTG(6, 0x260, "gpj1", 0x48),
  96. EXYNOS_PIN_BANK_EINTG(8, 0x280, "gpj2", 0x4c),
  97. EXYNOS_PIN_BANK_EINTG(8, 0x2a0, "gpj3", 0x50),
  98. EXYNOS_PIN_BANK_EINTG(5, 0x2c0, "gpj4", 0x54),
  99. EXYNOS_PIN_BANK_EINTN(7, 0x220, "gpi"),
  100. EXYNOS_PIN_BANK_EINTN(8, 0x2e0, "mp01"),
  101. EXYNOS_PIN_BANK_EINTN(4, 0x300, "mp02"),
  102. EXYNOS_PIN_BANK_EINTN(8, 0x320, "mp03"),
  103. EXYNOS_PIN_BANK_EINTN(8, 0x340, "mp04"),
  104. EXYNOS_PIN_BANK_EINTN(8, 0x360, "mp05"),
  105. EXYNOS_PIN_BANK_EINTN(8, 0x380, "mp06"),
  106. EXYNOS_PIN_BANK_EINTN(8, 0x3a0, "mp07"),
  107. EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gph0", 0x00),
  108. EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gph1", 0x04),
  109. EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gph2", 0x08),
  110. EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gph3", 0x0c),
  111. };
  112. static const struct samsung_pin_ctrl s5pv210_pin_ctrl[] __initconst = {
  113. {
  114. /* pin-controller instance 0 data */
  115. .pin_banks = s5pv210_pin_bank,
  116. .nr_banks = ARRAY_SIZE(s5pv210_pin_bank),
  117. .eint_gpio_init = exynos_eint_gpio_init,
  118. .eint_wkup_init = exynos_eint_wkup_init,
  119. .suspend = exynos_pinctrl_suspend,
  120. .resume = exynos_pinctrl_resume,
  121. .retention_data = &s5pv210_retention_data,
  122. },
  123. };
  124. const struct samsung_pinctrl_of_match_data s5pv210_of_data __initconst = {
  125. .ctrl = s5pv210_pin_ctrl,
  126. .num_ctrl = ARRAY_SIZE(s5pv210_pin_ctrl),
  127. };
  128. /* Pad retention control code for accessing PMU regmap */
  129. static atomic_t exynos_shared_retention_refcnt;
  130. /* pin banks of exynos3250 pin-controller 0 */
  131. static const struct samsung_pin_bank_data exynos3250_pin_banks0[] __initconst = {
  132. /* Must start with EINTG banks, ordered by EINT group number. */
  133. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  134. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  135. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
  136. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
  137. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
  138. EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
  139. EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpd1", 0x18),
  140. };
  141. /* pin banks of exynos3250 pin-controller 1 */
  142. static const struct samsung_pin_bank_data exynos3250_pin_banks1[] __initconst = {
  143. /* Must start with EINTG banks, ordered by EINT group number. */
  144. EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpe0"),
  145. EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpe1"),
  146. EXYNOS_PIN_BANK_EINTN(3, 0x180, "gpe2"),
  147. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpk0", 0x08),
  148. EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
  149. EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
  150. EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpl0", 0x18),
  151. EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
  152. EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
  153. EXYNOS_PIN_BANK_EINTG(5, 0x2a0, "gpm2", 0x2c),
  154. EXYNOS_PIN_BANK_EINTG(8, 0x2c0, "gpm3", 0x30),
  155. EXYNOS_PIN_BANK_EINTG(8, 0x2e0, "gpm4", 0x34),
  156. EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
  157. EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
  158. EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
  159. EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
  160. };
  161. /*
  162. * PMU pad retention groups for Exynos3250 doesn't match pin banks, so handle
  163. * them all together
  164. */
  165. static const u32 exynos3250_retention_regs[] = {
  166. S5P_PAD_RET_MAUDIO_OPTION,
  167. S5P_PAD_RET_GPIO_OPTION,
  168. S5P_PAD_RET_UART_OPTION,
  169. S5P_PAD_RET_MMCA_OPTION,
  170. S5P_PAD_RET_MMCB_OPTION,
  171. S5P_PAD_RET_EBIA_OPTION,
  172. S5P_PAD_RET_EBIB_OPTION,
  173. S5P_PAD_RET_MMC2_OPTION,
  174. S5P_PAD_RET_SPI_OPTION,
  175. };
  176. static const struct samsung_retention_data exynos3250_retention_data __initconst = {
  177. .regs = exynos3250_retention_regs,
  178. .nr_regs = ARRAY_SIZE(exynos3250_retention_regs),
  179. .value = EXYNOS_WAKEUP_FROM_LOWPWR,
  180. .refcnt = &exynos_shared_retention_refcnt,
  181. .init = exynos_retention_init,
  182. };
  183. /*
  184. * Samsung pinctrl driver data for Exynos3250 SoC. Exynos3250 SoC includes
  185. * two gpio/pin-mux/pinconfig controllers.
  186. */
  187. static const struct samsung_pin_ctrl exynos3250_pin_ctrl[] __initconst = {
  188. {
  189. /* pin-controller instance 0 data */
  190. .pin_banks = exynos3250_pin_banks0,
  191. .nr_banks = ARRAY_SIZE(exynos3250_pin_banks0),
  192. .eint_gpio_init = exynos_eint_gpio_init,
  193. .suspend = exynos_pinctrl_suspend,
  194. .resume = exynos_pinctrl_resume,
  195. .retention_data = &exynos3250_retention_data,
  196. }, {
  197. /* pin-controller instance 1 data */
  198. .pin_banks = exynos3250_pin_banks1,
  199. .nr_banks = ARRAY_SIZE(exynos3250_pin_banks1),
  200. .eint_gpio_init = exynos_eint_gpio_init,
  201. .eint_wkup_init = exynos_eint_wkup_init,
  202. .suspend = exynos_pinctrl_suspend,
  203. .resume = exynos_pinctrl_resume,
  204. .retention_data = &exynos3250_retention_data,
  205. },
  206. };
  207. const struct samsung_pinctrl_of_match_data exynos3250_of_data __initconst = {
  208. .ctrl = exynos3250_pin_ctrl,
  209. .num_ctrl = ARRAY_SIZE(exynos3250_pin_ctrl),
  210. };
  211. /* pin banks of exynos4210 pin-controller 0 */
  212. static const struct samsung_pin_bank_data exynos4210_pin_banks0[] __initconst = {
  213. /* Must start with EINTG banks, ordered by EINT group number. */
  214. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  215. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  216. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
  217. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
  218. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
  219. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
  220. EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
  221. EXYNOS_PIN_BANK_EINTG(5, 0x0E0, "gpe0", 0x1c),
  222. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpe1", 0x20),
  223. EXYNOS_PIN_BANK_EINTG(6, 0x120, "gpe2", 0x24),
  224. EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpe3", 0x28),
  225. EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpe4", 0x2c),
  226. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
  227. EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
  228. EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
  229. EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
  230. };
  231. /* pin banks of exynos4210 pin-controller 1 */
  232. static const struct samsung_pin_bank_data exynos4210_pin_banks1[] __initconst = {
  233. /* Must start with EINTG banks, ordered by EINT group number. */
  234. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpj0", 0x00),
  235. EXYNOS_PIN_BANK_EINTG(5, 0x020, "gpj1", 0x04),
  236. EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
  237. EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
  238. EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
  239. EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
  240. EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpl0", 0x18),
  241. EXYNOS_PIN_BANK_EINTG(3, 0x0E0, "gpl1", 0x1c),
  242. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
  243. EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
  244. EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
  245. EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
  246. EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
  247. EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
  248. EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
  249. EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
  250. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  251. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  252. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  253. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  254. };
  255. /* pin banks of exynos4210 pin-controller 2 */
  256. static const struct samsung_pin_bank_data exynos4210_pin_banks2[] __initconst = {
  257. /* Must start with EINTG banks, ordered by EINT group number. */
  258. EXYNOS_PIN_BANK_EINTN(7, 0x000, "gpz"),
  259. };
  260. /* PMU pad retention groups registers for Exynos4 (without audio) */
  261. static const u32 exynos4_retention_regs[] = {
  262. S5P_PAD_RET_GPIO_OPTION,
  263. S5P_PAD_RET_UART_OPTION,
  264. S5P_PAD_RET_MMCA_OPTION,
  265. S5P_PAD_RET_MMCB_OPTION,
  266. S5P_PAD_RET_EBIA_OPTION,
  267. S5P_PAD_RET_EBIB_OPTION,
  268. };
  269. static const struct samsung_retention_data exynos4_retention_data __initconst = {
  270. .regs = exynos4_retention_regs,
  271. .nr_regs = ARRAY_SIZE(exynos4_retention_regs),
  272. .value = EXYNOS_WAKEUP_FROM_LOWPWR,
  273. .refcnt = &exynos_shared_retention_refcnt,
  274. .init = exynos_retention_init,
  275. };
  276. /* PMU retention control for audio pins can be tied to audio pin bank */
  277. static const u32 exynos4_audio_retention_regs[] = {
  278. S5P_PAD_RET_MAUDIO_OPTION,
  279. };
  280. static const struct samsung_retention_data exynos4_audio_retention_data __initconst = {
  281. .regs = exynos4_audio_retention_regs,
  282. .nr_regs = ARRAY_SIZE(exynos4_audio_retention_regs),
  283. .value = EXYNOS_WAKEUP_FROM_LOWPWR,
  284. .init = exynos_retention_init,
  285. };
  286. /*
  287. * Samsung pinctrl driver data for Exynos4210 SoC. Exynos4210 SoC includes
  288. * three gpio/pin-mux/pinconfig controllers.
  289. */
  290. static const struct samsung_pin_ctrl exynos4210_pin_ctrl[] __initconst = {
  291. {
  292. /* pin-controller instance 0 data */
  293. .pin_banks = exynos4210_pin_banks0,
  294. .nr_banks = ARRAY_SIZE(exynos4210_pin_banks0),
  295. .eint_gpio_init = exynos_eint_gpio_init,
  296. .suspend = exynos_pinctrl_suspend,
  297. .resume = exynos_pinctrl_resume,
  298. .retention_data = &exynos4_retention_data,
  299. }, {
  300. /* pin-controller instance 1 data */
  301. .pin_banks = exynos4210_pin_banks1,
  302. .nr_banks = ARRAY_SIZE(exynos4210_pin_banks1),
  303. .eint_gpio_init = exynos_eint_gpio_init,
  304. .eint_wkup_init = exynos_eint_wkup_init,
  305. .suspend = exynos_pinctrl_suspend,
  306. .resume = exynos_pinctrl_resume,
  307. .retention_data = &exynos4_retention_data,
  308. }, {
  309. /* pin-controller instance 2 data */
  310. .pin_banks = exynos4210_pin_banks2,
  311. .nr_banks = ARRAY_SIZE(exynos4210_pin_banks2),
  312. .retention_data = &exynos4_audio_retention_data,
  313. },
  314. };
  315. const struct samsung_pinctrl_of_match_data exynos4210_of_data __initconst = {
  316. .ctrl = exynos4210_pin_ctrl,
  317. .num_ctrl = ARRAY_SIZE(exynos4210_pin_ctrl),
  318. };
  319. /* pin banks of exynos4x12 pin-controller 0 */
  320. static const struct samsung_pin_bank_data exynos4x12_pin_banks0[] __initconst = {
  321. /* Must start with EINTG banks, ordered by EINT group number. */
  322. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  323. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  324. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
  325. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
  326. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
  327. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
  328. EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
  329. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
  330. EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
  331. EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
  332. EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
  333. EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x40),
  334. EXYNOS_PIN_BANK_EINTG(5, 0x260, "gpj1", 0x44),
  335. };
  336. /* pin banks of exynos4x12 pin-controller 1 */
  337. static const struct samsung_pin_bank_data exynos4x12_pin_banks1[] __initconst = {
  338. /* Must start with EINTG banks, ordered by EINT group number. */
  339. EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
  340. EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
  341. EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
  342. EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
  343. EXYNOS_PIN_BANK_EINTG(7, 0x0C0, "gpl0", 0x18),
  344. EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpl1", 0x1c),
  345. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
  346. EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
  347. EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
  348. EXYNOS_PIN_BANK_EINTG(5, 0x2A0, "gpm2", 0x2c),
  349. EXYNOS_PIN_BANK_EINTG(8, 0x2C0, "gpm3", 0x30),
  350. EXYNOS_PIN_BANK_EINTG(8, 0x2E0, "gpm4", 0x34),
  351. EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
  352. EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
  353. EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
  354. EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
  355. EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
  356. EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
  357. EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
  358. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  359. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  360. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  361. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  362. };
  363. /* pin banks of exynos4x12 pin-controller 2 */
  364. static const struct samsung_pin_bank_data exynos4x12_pin_banks2[] __initconst = {
  365. /* Must start with EINTG banks, ordered by EINT group number. */
  366. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
  367. };
  368. /* pin banks of exynos4x12 pin-controller 3 */
  369. static const struct samsung_pin_bank_data exynos4x12_pin_banks3[] __initconst = {
  370. /* Must start with EINTG banks, ordered by EINT group number. */
  371. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
  372. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
  373. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpv2", 0x08),
  374. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv3", 0x0c),
  375. EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpv4", 0x10),
  376. };
  377. /*
  378. * Samsung pinctrl driver data for Exynos4x12 SoC. Exynos4x12 SoC includes
  379. * four gpio/pin-mux/pinconfig controllers.
  380. */
  381. static const struct samsung_pin_ctrl exynos4x12_pin_ctrl[] __initconst = {
  382. {
  383. /* pin-controller instance 0 data */
  384. .pin_banks = exynos4x12_pin_banks0,
  385. .nr_banks = ARRAY_SIZE(exynos4x12_pin_banks0),
  386. .eint_gpio_init = exynos_eint_gpio_init,
  387. .suspend = exynos_pinctrl_suspend,
  388. .resume = exynos_pinctrl_resume,
  389. .retention_data = &exynos4_retention_data,
  390. }, {
  391. /* pin-controller instance 1 data */
  392. .pin_banks = exynos4x12_pin_banks1,
  393. .nr_banks = ARRAY_SIZE(exynos4x12_pin_banks1),
  394. .eint_gpio_init = exynos_eint_gpio_init,
  395. .eint_wkup_init = exynos_eint_wkup_init,
  396. .suspend = exynos_pinctrl_suspend,
  397. .resume = exynos_pinctrl_resume,
  398. .retention_data = &exynos4_retention_data,
  399. }, {
  400. /* pin-controller instance 2 data */
  401. .pin_banks = exynos4x12_pin_banks2,
  402. .nr_banks = ARRAY_SIZE(exynos4x12_pin_banks2),
  403. .eint_gpio_init = exynos_eint_gpio_init,
  404. .suspend = exynos_pinctrl_suspend,
  405. .resume = exynos_pinctrl_resume,
  406. .retention_data = &exynos4_audio_retention_data,
  407. }, {
  408. /* pin-controller instance 3 data */
  409. .pin_banks = exynos4x12_pin_banks3,
  410. .nr_banks = ARRAY_SIZE(exynos4x12_pin_banks3),
  411. .eint_gpio_init = exynos_eint_gpio_init,
  412. .suspend = exynos_pinctrl_suspend,
  413. .resume = exynos_pinctrl_resume,
  414. },
  415. };
  416. const struct samsung_pinctrl_of_match_data exynos4x12_of_data __initconst = {
  417. .ctrl = exynos4x12_pin_ctrl,
  418. .num_ctrl = ARRAY_SIZE(exynos4x12_pin_ctrl),
  419. };
  420. /* pin banks of exynos5250 pin-controller 0 */
  421. static const struct samsung_pin_bank_data exynos5250_pin_banks0[] __initconst = {
  422. /* Must start with EINTG banks, ordered by EINT group number. */
  423. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  424. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  425. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
  426. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
  427. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
  428. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
  429. EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpb3", 0x18),
  430. EXYNOS_PIN_BANK_EINTG(7, 0x0E0, "gpc0", 0x1c),
  431. EXYNOS_PIN_BANK_EINTG(4, 0x100, "gpc1", 0x20),
  432. EXYNOS_PIN_BANK_EINTG(7, 0x120, "gpc2", 0x24),
  433. EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpc3", 0x28),
  434. EXYNOS_PIN_BANK_EINTG(4, 0x160, "gpd0", 0x2c),
  435. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpd1", 0x30),
  436. EXYNOS_PIN_BANK_EINTG(7, 0x2E0, "gpc4", 0x34),
  437. EXYNOS_PIN_BANK_EINTN(6, 0x1A0, "gpy0"),
  438. EXYNOS_PIN_BANK_EINTN(4, 0x1C0, "gpy1"),
  439. EXYNOS_PIN_BANK_EINTN(6, 0x1E0, "gpy2"),
  440. EXYNOS_PIN_BANK_EINTN(8, 0x200, "gpy3"),
  441. EXYNOS_PIN_BANK_EINTN(8, 0x220, "gpy4"),
  442. EXYNOS_PIN_BANK_EINTN(8, 0x240, "gpy5"),
  443. EXYNOS_PIN_BANK_EINTN(8, 0x260, "gpy6"),
  444. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  445. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  446. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  447. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  448. };
  449. /* pin banks of exynos5250 pin-controller 1 */
  450. static const struct samsung_pin_bank_data exynos5250_pin_banks1[] __initconst = {
  451. /* Must start with EINTG banks, ordered by EINT group number. */
  452. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
  453. EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
  454. EXYNOS_PIN_BANK_EINTG(4, 0x040, "gpf0", 0x08),
  455. EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpf1", 0x0c),
  456. EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
  457. EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
  458. EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
  459. EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gph0", 0x1c),
  460. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph1", 0x20),
  461. };
  462. /* pin banks of exynos5250 pin-controller 2 */
  463. static const struct samsung_pin_bank_data exynos5250_pin_banks2[] __initconst = {
  464. /* Must start with EINTG banks, ordered by EINT group number. */
  465. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
  466. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
  467. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv2", 0x08),
  468. EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpv3", 0x0c),
  469. EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpv4", 0x10),
  470. };
  471. /* pin banks of exynos5250 pin-controller 3 */
  472. static const struct samsung_pin_bank_data exynos5250_pin_banks3[] __initconst = {
  473. /* Must start with EINTG banks, ordered by EINT group number. */
  474. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
  475. };
  476. /*
  477. * Samsung pinctrl driver data for Exynos5250 SoC. Exynos5250 SoC includes
  478. * four gpio/pin-mux/pinconfig controllers.
  479. */
  480. static const struct samsung_pin_ctrl exynos5250_pin_ctrl[] __initconst = {
  481. {
  482. /* pin-controller instance 0 data */
  483. .pin_banks = exynos5250_pin_banks0,
  484. .nr_banks = ARRAY_SIZE(exynos5250_pin_banks0),
  485. .eint_gpio_init = exynos_eint_gpio_init,
  486. .eint_wkup_init = exynos_eint_wkup_init,
  487. .suspend = exynos_pinctrl_suspend,
  488. .resume = exynos_pinctrl_resume,
  489. .retention_data = &exynos4_retention_data,
  490. }, {
  491. /* pin-controller instance 1 data */
  492. .pin_banks = exynos5250_pin_banks1,
  493. .nr_banks = ARRAY_SIZE(exynos5250_pin_banks1),
  494. .eint_gpio_init = exynos_eint_gpio_init,
  495. .suspend = exynos_pinctrl_suspend,
  496. .resume = exynos_pinctrl_resume,
  497. .retention_data = &exynos4_retention_data,
  498. }, {
  499. /* pin-controller instance 2 data */
  500. .pin_banks = exynos5250_pin_banks2,
  501. .nr_banks = ARRAY_SIZE(exynos5250_pin_banks2),
  502. .eint_gpio_init = exynos_eint_gpio_init,
  503. .suspend = exynos_pinctrl_suspend,
  504. .resume = exynos_pinctrl_resume,
  505. }, {
  506. /* pin-controller instance 3 data */
  507. .pin_banks = exynos5250_pin_banks3,
  508. .nr_banks = ARRAY_SIZE(exynos5250_pin_banks3),
  509. .eint_gpio_init = exynos_eint_gpio_init,
  510. .suspend = exynos_pinctrl_suspend,
  511. .resume = exynos_pinctrl_resume,
  512. .retention_data = &exynos4_audio_retention_data,
  513. },
  514. };
  515. const struct samsung_pinctrl_of_match_data exynos5250_of_data __initconst = {
  516. .ctrl = exynos5250_pin_ctrl,
  517. .num_ctrl = ARRAY_SIZE(exynos5250_pin_ctrl),
  518. };
  519. /* pin banks of exynos5260 pin-controller 0 */
  520. static const struct samsung_pin_bank_data exynos5260_pin_banks0[] __initconst = {
  521. /* Must start with EINTG banks, ordered by EINT group number. */
  522. EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpa0", 0x00),
  523. EXYNOS_PIN_BANK_EINTG(7, 0x020, "gpa1", 0x04),
  524. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
  525. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
  526. EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpb1", 0x10),
  527. EXYNOS_PIN_BANK_EINTG(5, 0x0a0, "gpb2", 0x14),
  528. EXYNOS_PIN_BANK_EINTG(8, 0x0c0, "gpb3", 0x18),
  529. EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpb4", 0x1c),
  530. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpb5", 0x20),
  531. EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpd0", 0x24),
  532. EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpd1", 0x28),
  533. EXYNOS_PIN_BANK_EINTG(5, 0x160, "gpd2", 0x2c),
  534. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpe0", 0x30),
  535. EXYNOS_PIN_BANK_EINTG(5, 0x1a0, "gpe1", 0x34),
  536. EXYNOS_PIN_BANK_EINTG(4, 0x1c0, "gpf0", 0x38),
  537. EXYNOS_PIN_BANK_EINTG(8, 0x1e0, "gpf1", 0x3c),
  538. EXYNOS_PIN_BANK_EINTG(2, 0x200, "gpk0", 0x40),
  539. EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
  540. EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
  541. EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
  542. EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
  543. };
  544. /* pin banks of exynos5260 pin-controller 1 */
  545. static const struct samsung_pin_bank_data exynos5260_pin_banks1[] __initconst = {
  546. /* Must start with EINTG banks, ordered by EINT group number. */
  547. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpc0", 0x00),
  548. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpc1", 0x04),
  549. EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
  550. EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
  551. EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpc4", 0x10),
  552. };
  553. /* pin banks of exynos5260 pin-controller 2 */
  554. static const struct samsung_pin_bank_data exynos5260_pin_banks2[] __initconst = {
  555. /* Must start with EINTG banks, ordered by EINT group number. */
  556. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz0", 0x00),
  557. EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04),
  558. };
  559. /*
  560. * Samsung pinctrl driver data for Exynos5260 SoC. Exynos5260 SoC includes
  561. * three gpio/pin-mux/pinconfig controllers.
  562. */
  563. static const struct samsung_pin_ctrl exynos5260_pin_ctrl[] __initconst = {
  564. {
  565. /* pin-controller instance 0 data */
  566. .pin_banks = exynos5260_pin_banks0,
  567. .nr_banks = ARRAY_SIZE(exynos5260_pin_banks0),
  568. .eint_gpio_init = exynos_eint_gpio_init,
  569. .eint_wkup_init = exynos_eint_wkup_init,
  570. .suspend = exynos_pinctrl_suspend,
  571. .resume = exynos_pinctrl_resume,
  572. }, {
  573. /* pin-controller instance 1 data */
  574. .pin_banks = exynos5260_pin_banks1,
  575. .nr_banks = ARRAY_SIZE(exynos5260_pin_banks1),
  576. .eint_gpio_init = exynos_eint_gpio_init,
  577. .suspend = exynos_pinctrl_suspend,
  578. .resume = exynos_pinctrl_resume,
  579. }, {
  580. /* pin-controller instance 2 data */
  581. .pin_banks = exynos5260_pin_banks2,
  582. .nr_banks = ARRAY_SIZE(exynos5260_pin_banks2),
  583. .eint_gpio_init = exynos_eint_gpio_init,
  584. .suspend = exynos_pinctrl_suspend,
  585. .resume = exynos_pinctrl_resume,
  586. },
  587. };
  588. const struct samsung_pinctrl_of_match_data exynos5260_of_data __initconst = {
  589. .ctrl = exynos5260_pin_ctrl,
  590. .num_ctrl = ARRAY_SIZE(exynos5260_pin_ctrl),
  591. };
  592. /* pin banks of exynos5410 pin-controller 0 */
  593. static const struct samsung_pin_bank_data exynos5410_pin_banks0[] __initconst = {
  594. /* Must start with EINTG banks, ordered by EINT group number. */
  595. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  596. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  597. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
  598. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
  599. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
  600. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
  601. EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpb3", 0x18),
  602. EXYNOS_PIN_BANK_EINTG(7, 0x0E0, "gpc0", 0x1c),
  603. EXYNOS_PIN_BANK_EINTG(4, 0x100, "gpc3", 0x20),
  604. EXYNOS_PIN_BANK_EINTG(7, 0x120, "gpc1", 0x24),
  605. EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpc2", 0x28),
  606. EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpd1", 0x2c),
  607. EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpe0", 0x30),
  608. EXYNOS_PIN_BANK_EINTG(2, 0x1C0, "gpe1", 0x34),
  609. EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf0", 0x38),
  610. EXYNOS_PIN_BANK_EINTG(8, 0x200, "gpf1", 0x3c),
  611. EXYNOS_PIN_BANK_EINTG(8, 0x220, "gpg0", 0x40),
  612. EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpg1", 0x44),
  613. EXYNOS_PIN_BANK_EINTG(2, 0x260, "gpg2", 0x48),
  614. EXYNOS_PIN_BANK_EINTG(4, 0x280, "gph0", 0x4c),
  615. EXYNOS_PIN_BANK_EINTG(8, 0x2A0, "gph1", 0x50),
  616. EXYNOS_PIN_BANK_EINTN(2, 0x160, "gpm5"),
  617. EXYNOS_PIN_BANK_EINTN(8, 0x2C0, "gpm7"),
  618. EXYNOS_PIN_BANK_EINTN(6, 0x2E0, "gpy0"),
  619. EXYNOS_PIN_BANK_EINTN(4, 0x300, "gpy1"),
  620. EXYNOS_PIN_BANK_EINTN(6, 0x320, "gpy2"),
  621. EXYNOS_PIN_BANK_EINTN(8, 0x340, "gpy3"),
  622. EXYNOS_PIN_BANK_EINTN(8, 0x360, "gpy4"),
  623. EXYNOS_PIN_BANK_EINTN(8, 0x380, "gpy5"),
  624. EXYNOS_PIN_BANK_EINTN(8, 0x3A0, "gpy6"),
  625. EXYNOS_PIN_BANK_EINTN(8, 0x3C0, "gpy7"),
  626. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  627. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  628. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  629. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  630. };
  631. /* pin banks of exynos5410 pin-controller 1 */
  632. static const struct samsung_pin_bank_data exynos5410_pin_banks1[] __initconst = {
  633. /* Must start with EINTG banks, ordered by EINT group number. */
  634. EXYNOS_PIN_BANK_EINTG(5, 0x000, "gpj0", 0x00),
  635. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpj1", 0x04),
  636. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpj2", 0x08),
  637. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpj3", 0x0c),
  638. EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpj4", 0x10),
  639. EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpk0", 0x14),
  640. EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpk1", 0x18),
  641. EXYNOS_PIN_BANK_EINTG(8, 0x0E0, "gpk2", 0x1c),
  642. EXYNOS_PIN_BANK_EINTG(7, 0x100, "gpk3", 0x20),
  643. };
  644. /* pin banks of exynos5410 pin-controller 2 */
  645. static const struct samsung_pin_bank_data exynos5410_pin_banks2[] __initconst = {
  646. /* Must start with EINTG banks, ordered by EINT group number. */
  647. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
  648. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
  649. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv2", 0x08),
  650. EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpv3", 0x0c),
  651. EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpv4", 0x10),
  652. };
  653. /* pin banks of exynos5410 pin-controller 3 */
  654. static const struct samsung_pin_bank_data exynos5410_pin_banks3[] __initconst = {
  655. /* Must start with EINTG banks, ordered by EINT group number. */
  656. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
  657. };
  658. /*
  659. * Samsung pinctrl driver data for Exynos5410 SoC. Exynos5410 SoC includes
  660. * four gpio/pin-mux/pinconfig controllers.
  661. */
  662. static const struct samsung_pin_ctrl exynos5410_pin_ctrl[] __initconst = {
  663. {
  664. /* pin-controller instance 0 data */
  665. .pin_banks = exynos5410_pin_banks0,
  666. .nr_banks = ARRAY_SIZE(exynos5410_pin_banks0),
  667. .eint_gpio_init = exynos_eint_gpio_init,
  668. .eint_wkup_init = exynos_eint_wkup_init,
  669. .suspend = exynos_pinctrl_suspend,
  670. .resume = exynos_pinctrl_resume,
  671. }, {
  672. /* pin-controller instance 1 data */
  673. .pin_banks = exynos5410_pin_banks1,
  674. .nr_banks = ARRAY_SIZE(exynos5410_pin_banks1),
  675. .eint_gpio_init = exynos_eint_gpio_init,
  676. .suspend = exynos_pinctrl_suspend,
  677. .resume = exynos_pinctrl_resume,
  678. }, {
  679. /* pin-controller instance 2 data */
  680. .pin_banks = exynos5410_pin_banks2,
  681. .nr_banks = ARRAY_SIZE(exynos5410_pin_banks2),
  682. .eint_gpio_init = exynos_eint_gpio_init,
  683. .suspend = exynos_pinctrl_suspend,
  684. .resume = exynos_pinctrl_resume,
  685. }, {
  686. /* pin-controller instance 3 data */
  687. .pin_banks = exynos5410_pin_banks3,
  688. .nr_banks = ARRAY_SIZE(exynos5410_pin_banks3),
  689. .eint_gpio_init = exynos_eint_gpio_init,
  690. .suspend = exynos_pinctrl_suspend,
  691. .resume = exynos_pinctrl_resume,
  692. },
  693. };
  694. const struct samsung_pinctrl_of_match_data exynos5410_of_data __initconst = {
  695. .ctrl = exynos5410_pin_ctrl,
  696. .num_ctrl = ARRAY_SIZE(exynos5410_pin_ctrl),
  697. };
  698. /* pin banks of exynos5420 pin-controller 0 */
  699. static const struct samsung_pin_bank_data exynos5420_pin_banks0[] __initconst = {
  700. /* Must start with EINTG banks, ordered by EINT group number. */
  701. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpy7", 0x00),
  702. EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
  703. EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
  704. EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
  705. EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
  706. };
  707. /* pin banks of exynos5420 pin-controller 1 */
  708. static const struct samsung_pin_bank_data exynos5420_pin_banks1[] __initconst = {
  709. /* Must start with EINTG banks, ordered by EINT group number. */
  710. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpc0", 0x00),
  711. EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpc1", 0x04),
  712. EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
  713. EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
  714. EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpc4", 0x10),
  715. EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpd1", 0x14),
  716. EXYNOS_PIN_BANK_EINTN(6, 0x0C0, "gpy0"),
  717. EXYNOS_PIN_BANK_EINTN(4, 0x0E0, "gpy1"),
  718. EXYNOS_PIN_BANK_EINTN(6, 0x100, "gpy2"),
  719. EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpy3"),
  720. EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpy4"),
  721. EXYNOS_PIN_BANK_EINTN(8, 0x160, "gpy5"),
  722. EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy6"),
  723. };
  724. /* pin banks of exynos5420 pin-controller 2 */
  725. static const struct samsung_pin_bank_data exynos5420_pin_banks2[] __initconst = {
  726. /* Must start with EINTG banks, ordered by EINT group number. */
  727. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
  728. EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
  729. EXYNOS_PIN_BANK_EINTG(6, 0x040, "gpf0", 0x08),
  730. EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpf1", 0x0c),
  731. EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
  732. EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
  733. EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
  734. EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gpj4", 0x1c),
  735. };
  736. /* pin banks of exynos5420 pin-controller 3 */
  737. static const struct samsung_pin_bank_data exynos5420_pin_banks3[] __initconst = {
  738. /* Must start with EINTG banks, ordered by EINT group number. */
  739. EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
  740. EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
  741. EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
  742. EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
  743. EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
  744. EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
  745. EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpb3", 0x18),
  746. EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpb4", 0x1c),
  747. EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph0", 0x20),
  748. };
  749. /* pin banks of exynos5420 pin-controller 4 */
  750. static const struct samsung_pin_bank_data exynos5420_pin_banks4[] __initconst = {
  751. /* Must start with EINTG banks, ordered by EINT group number. */
  752. EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
  753. };
  754. /* PMU pad retention groups registers for Exynos5420 (without audio) */
  755. static const u32 exynos5420_retention_regs[] = {
  756. EXYNOS_PAD_RET_DRAM_OPTION,
  757. EXYNOS_PAD_RET_JTAG_OPTION,
  758. EXYNOS5420_PAD_RET_GPIO_OPTION,
  759. EXYNOS5420_PAD_RET_UART_OPTION,
  760. EXYNOS5420_PAD_RET_MMCA_OPTION,
  761. EXYNOS5420_PAD_RET_MMCB_OPTION,
  762. EXYNOS5420_PAD_RET_MMCC_OPTION,
  763. EXYNOS5420_PAD_RET_HSI_OPTION,
  764. EXYNOS_PAD_RET_EBIA_OPTION,
  765. EXYNOS_PAD_RET_EBIB_OPTION,
  766. EXYNOS5420_PAD_RET_SPI_OPTION,
  767. EXYNOS5420_PAD_RET_DRAM_COREBLK_OPTION,
  768. };
  769. static const struct samsung_retention_data exynos5420_retention_data __initconst = {
  770. .regs = exynos5420_retention_regs,
  771. .nr_regs = ARRAY_SIZE(exynos5420_retention_regs),
  772. .value = EXYNOS_WAKEUP_FROM_LOWPWR,
  773. .refcnt = &exynos_shared_retention_refcnt,
  774. .init = exynos_retention_init,
  775. };
  776. /*
  777. * Samsung pinctrl driver data for Exynos5420 SoC. Exynos5420 SoC includes
  778. * four gpio/pin-mux/pinconfig controllers.
  779. */
  780. static const struct samsung_pin_ctrl exynos5420_pin_ctrl[] __initconst = {
  781. {
  782. /* pin-controller instance 0 data */
  783. .pin_banks = exynos5420_pin_banks0,
  784. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks0),
  785. .eint_gpio_init = exynos_eint_gpio_init,
  786. .eint_wkup_init = exynos_eint_wkup_init,
  787. .suspend = exynos_pinctrl_suspend,
  788. .resume = exynos_pinctrl_resume,
  789. .retention_data = &exynos5420_retention_data,
  790. }, {
  791. /* pin-controller instance 1 data */
  792. .pin_banks = exynos5420_pin_banks1,
  793. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks1),
  794. .eint_gpio_init = exynos_eint_gpio_init,
  795. .suspend = exynos_pinctrl_suspend,
  796. .resume = exynos_pinctrl_resume,
  797. .retention_data = &exynos5420_retention_data,
  798. }, {
  799. /* pin-controller instance 2 data */
  800. .pin_banks = exynos5420_pin_banks2,
  801. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks2),
  802. .eint_gpio_init = exynos_eint_gpio_init,
  803. .suspend = exynos_pinctrl_suspend,
  804. .resume = exynos_pinctrl_resume,
  805. .retention_data = &exynos5420_retention_data,
  806. }, {
  807. /* pin-controller instance 3 data */
  808. .pin_banks = exynos5420_pin_banks3,
  809. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks3),
  810. .eint_gpio_init = exynos_eint_gpio_init,
  811. .suspend = exynos_pinctrl_suspend,
  812. .resume = exynos_pinctrl_resume,
  813. .retention_data = &exynos5420_retention_data,
  814. }, {
  815. /* pin-controller instance 4 data */
  816. .pin_banks = exynos5420_pin_banks4,
  817. .nr_banks = ARRAY_SIZE(exynos5420_pin_banks4),
  818. .eint_gpio_init = exynos_eint_gpio_init,
  819. .suspend = exynos_pinctrl_suspend,
  820. .resume = exynos_pinctrl_resume,
  821. .retention_data = &exynos4_audio_retention_data,
  822. },
  823. };
  824. const struct samsung_pinctrl_of_match_data exynos5420_of_data __initconst = {
  825. .ctrl = exynos5420_pin_ctrl,
  826. .num_ctrl = ARRAY_SIZE(exynos5420_pin_ctrl),
  827. };