pinctrl-exynos-arm.c 34 KB

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