pinctrl-imx.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. /*
  2. * Core driver for the imx pin controller
  3. *
  4. * Copyright (C) 2012 Freescale Semiconductor, Inc.
  5. * Copyright (C) 2012 Linaro Ltd.
  6. *
  7. * Author: Dong Aisheng <dong.aisheng@linaro.org>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. */
  14. #include <linux/err.h>
  15. #include <linux/init.h>
  16. #include <linux/io.h>
  17. #include <linux/module.h>
  18. #include <linux/of.h>
  19. #include <linux/of_device.h>
  20. #include <linux/pinctrl/machine.h>
  21. #include <linux/pinctrl/pinconf.h>
  22. #include <linux/pinctrl/pinctrl.h>
  23. #include <linux/pinctrl/pinmux.h>
  24. #include <linux/slab.h>
  25. #include "core.h"
  26. #include "pinctrl-imx.h"
  27. #define IMX_PMX_DUMP(info, p, m, c, n) \
  28. { \
  29. int i, j; \
  30. printk(KERN_DEBUG "Format: Pin Mux Config\n"); \
  31. for (i = 0; i < n; i++) { \
  32. j = p[i]; \
  33. printk(KERN_DEBUG "%s %d 0x%lx\n", \
  34. info->pins[j].name, \
  35. m[i], c[i]); \
  36. } \
  37. }
  38. /* The bits in CONFIG cell defined in binding doc*/
  39. #define IMX_NO_PAD_CTL 0x80000000 /* no pin config need */
  40. #define IMX_PAD_SION 0x40000000 /* set SION */
  41. /**
  42. * @dev: a pointer back to containing device
  43. * @base: the offset to the controller in virtual memory
  44. */
  45. struct imx_pinctrl {
  46. struct device *dev;
  47. struct pinctrl_dev *pctl;
  48. void __iomem *base;
  49. const struct imx_pinctrl_soc_info *info;
  50. };
  51. static const inline struct imx_pin_group *imx_pinctrl_find_group_by_name(
  52. const struct imx_pinctrl_soc_info *info,
  53. const char *name)
  54. {
  55. const struct imx_pin_group *grp = NULL;
  56. int i;
  57. for (i = 0; i < info->ngroups; i++) {
  58. if (!strcmp(info->groups[i].name, name)) {
  59. grp = &info->groups[i];
  60. break;
  61. }
  62. }
  63. return grp;
  64. }
  65. static int imx_get_groups_count(struct pinctrl_dev *pctldev)
  66. {
  67. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  68. const struct imx_pinctrl_soc_info *info = ipctl->info;
  69. return info->ngroups;
  70. }
  71. static const char *imx_get_group_name(struct pinctrl_dev *pctldev,
  72. unsigned selector)
  73. {
  74. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  75. const struct imx_pinctrl_soc_info *info = ipctl->info;
  76. return info->groups[selector].name;
  77. }
  78. static int imx_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector,
  79. const unsigned **pins,
  80. unsigned *npins)
  81. {
  82. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  83. const struct imx_pinctrl_soc_info *info = ipctl->info;
  84. if (selector >= info->ngroups)
  85. return -EINVAL;
  86. *pins = info->groups[selector].pins;
  87. *npins = info->groups[selector].npins;
  88. return 0;
  89. }
  90. static void imx_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
  91. unsigned offset)
  92. {
  93. seq_printf(s, "%s", dev_name(pctldev->dev));
  94. }
  95. static int imx_dt_node_to_map(struct pinctrl_dev *pctldev,
  96. struct device_node *np,
  97. struct pinctrl_map **map, unsigned *num_maps)
  98. {
  99. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  100. const struct imx_pinctrl_soc_info *info = ipctl->info;
  101. const struct imx_pin_group *grp;
  102. struct pinctrl_map *new_map;
  103. struct device_node *parent;
  104. int map_num = 1;
  105. int i, j;
  106. /*
  107. * first find the group of this node and check if we need create
  108. * config maps for pins
  109. */
  110. grp = imx_pinctrl_find_group_by_name(info, np->name);
  111. if (!grp) {
  112. dev_err(info->dev, "unable to find group for node %s\n",
  113. np->name);
  114. return -EINVAL;
  115. }
  116. for (i = 0; i < grp->npins; i++) {
  117. if (!(grp->configs[i] & IMX_NO_PAD_CTL))
  118. map_num++;
  119. }
  120. new_map = kmalloc(sizeof(struct pinctrl_map) * map_num, GFP_KERNEL);
  121. if (!new_map)
  122. return -ENOMEM;
  123. *map = new_map;
  124. *num_maps = map_num;
  125. /* create mux map */
  126. parent = of_get_parent(np);
  127. if (!parent) {
  128. kfree(new_map);
  129. return -EINVAL;
  130. }
  131. new_map[0].type = PIN_MAP_TYPE_MUX_GROUP;
  132. new_map[0].data.mux.function = parent->name;
  133. new_map[0].data.mux.group = np->name;
  134. of_node_put(parent);
  135. /* create config map */
  136. new_map++;
  137. for (i = j = 0; i < grp->npins; i++) {
  138. if (!(grp->configs[i] & IMX_NO_PAD_CTL)) {
  139. new_map[j].type = PIN_MAP_TYPE_CONFIGS_PIN;
  140. new_map[j].data.configs.group_or_pin =
  141. pin_get_name(pctldev, grp->pins[i]);
  142. new_map[j].data.configs.configs = &grp->configs[i];
  143. new_map[j].data.configs.num_configs = 1;
  144. j++;
  145. }
  146. }
  147. dev_dbg(pctldev->dev, "maps: function %s group %s num %d\n",
  148. (*map)->data.mux.function, (*map)->data.mux.group, map_num);
  149. return 0;
  150. }
  151. static void imx_dt_free_map(struct pinctrl_dev *pctldev,
  152. struct pinctrl_map *map, unsigned num_maps)
  153. {
  154. kfree(map);
  155. }
  156. static const struct pinctrl_ops imx_pctrl_ops = {
  157. .get_groups_count = imx_get_groups_count,
  158. .get_group_name = imx_get_group_name,
  159. .get_group_pins = imx_get_group_pins,
  160. .pin_dbg_show = imx_pin_dbg_show,
  161. .dt_node_to_map = imx_dt_node_to_map,
  162. .dt_free_map = imx_dt_free_map,
  163. };
  164. static int imx_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
  165. unsigned group)
  166. {
  167. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  168. const struct imx_pinctrl_soc_info *info = ipctl->info;
  169. const struct imx_pin_reg *pin_reg;
  170. const unsigned *pins, *mux, *input_val;
  171. u16 *input_reg;
  172. unsigned int npins, pin_id;
  173. int i;
  174. /*
  175. * Configure the mux mode for each pin in the group for a specific
  176. * function.
  177. */
  178. pins = info->groups[group].pins;
  179. npins = info->groups[group].npins;
  180. mux = info->groups[group].mux_mode;
  181. input_val = info->groups[group].input_val;
  182. input_reg = info->groups[group].input_reg;
  183. WARN_ON(!pins || !npins || !mux || !input_val || !input_reg);
  184. dev_dbg(ipctl->dev, "enable function %s group %s\n",
  185. info->functions[selector].name, info->groups[group].name);
  186. for (i = 0; i < npins; i++) {
  187. pin_id = pins[i];
  188. pin_reg = &info->pin_regs[pin_id];
  189. if (!(info->flags & ZERO_OFFSET_VALID) && !pin_reg->mux_reg) {
  190. dev_err(ipctl->dev, "Pin(%s) does not support mux function\n",
  191. info->pins[pin_id].name);
  192. return -EINVAL;
  193. }
  194. if (info->flags & SHARE_MUX_CONF_REG) {
  195. u32 reg;
  196. reg = readl(ipctl->base + pin_reg->mux_reg);
  197. reg &= ~(0x7 << 20);
  198. reg |= (mux[i] << 20);
  199. writel(reg, ipctl->base + pin_reg->mux_reg);
  200. } else {
  201. writel(mux[i], ipctl->base + pin_reg->mux_reg);
  202. }
  203. dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%x\n",
  204. pin_reg->mux_reg, mux[i]);
  205. /*
  206. * If the select input value begins with 0xff, it's a quirky
  207. * select input and the value should be interpreted as below.
  208. * 31 23 15 7 0
  209. * | 0xff | shift | width | select |
  210. * It's used to work around the problem that the select
  211. * input for some pin is not implemented in the select
  212. * input register but in some general purpose register.
  213. * We encode the select input value, width and shift of
  214. * the bit field into input_val cell of pin function ID
  215. * in device tree, and then decode them here for setting
  216. * up the select input bits in general purpose register.
  217. */
  218. if (input_val[i] >> 24 == 0xff) {
  219. u32 val = input_val[i];
  220. u8 select = val & 0xff;
  221. u8 width = (val >> 8) & 0xff;
  222. u8 shift = (val >> 16) & 0xff;
  223. u32 mask = ((1 << width) - 1) << shift;
  224. /*
  225. * The input_reg[i] here is actually some IOMUXC general
  226. * purpose register, not regular select input register.
  227. */
  228. val = readl(ipctl->base + input_reg[i]);
  229. val &= ~mask;
  230. val |= select << shift;
  231. writel(val, ipctl->base + input_reg[i]);
  232. } else if (input_reg[i]) {
  233. /*
  234. * Regular select input register can never be at offset
  235. * 0, and we only print register value for regular case.
  236. */
  237. writel(input_val[i], ipctl->base + input_reg[i]);
  238. dev_dbg(ipctl->dev,
  239. "==>select_input: offset 0x%x val 0x%x\n",
  240. input_reg[i], input_val[i]);
  241. }
  242. }
  243. return 0;
  244. }
  245. static int imx_pmx_get_funcs_count(struct pinctrl_dev *pctldev)
  246. {
  247. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  248. const struct imx_pinctrl_soc_info *info = ipctl->info;
  249. return info->nfunctions;
  250. }
  251. static const char *imx_pmx_get_func_name(struct pinctrl_dev *pctldev,
  252. unsigned selector)
  253. {
  254. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  255. const struct imx_pinctrl_soc_info *info = ipctl->info;
  256. return info->functions[selector].name;
  257. }
  258. static int imx_pmx_get_groups(struct pinctrl_dev *pctldev, unsigned selector,
  259. const char * const **groups,
  260. unsigned * const num_groups)
  261. {
  262. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  263. const struct imx_pinctrl_soc_info *info = ipctl->info;
  264. *groups = info->functions[selector].groups;
  265. *num_groups = info->functions[selector].num_groups;
  266. return 0;
  267. }
  268. static const struct pinmux_ops imx_pmx_ops = {
  269. .get_functions_count = imx_pmx_get_funcs_count,
  270. .get_function_name = imx_pmx_get_func_name,
  271. .get_function_groups = imx_pmx_get_groups,
  272. .enable = imx_pmx_enable,
  273. };
  274. static int imx_pinconf_get(struct pinctrl_dev *pctldev,
  275. unsigned pin_id, unsigned long *config)
  276. {
  277. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  278. const struct imx_pinctrl_soc_info *info = ipctl->info;
  279. const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
  280. if (!(info->flags & ZERO_OFFSET_VALID) && !pin_reg->conf_reg) {
  281. dev_err(info->dev, "Pin(%s) does not support config function\n",
  282. info->pins[pin_id].name);
  283. return -EINVAL;
  284. }
  285. *config = readl(ipctl->base + pin_reg->conf_reg);
  286. if (info->flags & SHARE_MUX_CONF_REG)
  287. *config &= 0xffff;
  288. return 0;
  289. }
  290. static int imx_pinconf_set(struct pinctrl_dev *pctldev,
  291. unsigned pin_id, unsigned long config)
  292. {
  293. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  294. const struct imx_pinctrl_soc_info *info = ipctl->info;
  295. const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
  296. if (!(info->flags & ZERO_OFFSET_VALID) && !pin_reg->conf_reg) {
  297. dev_err(info->dev, "Pin(%s) does not support config function\n",
  298. info->pins[pin_id].name);
  299. return -EINVAL;
  300. }
  301. dev_dbg(ipctl->dev, "pinconf set pin %s\n",
  302. info->pins[pin_id].name);
  303. if (info->flags & SHARE_MUX_CONF_REG) {
  304. u32 reg;
  305. reg = readl(ipctl->base + pin_reg->conf_reg);
  306. reg &= ~0xffff;
  307. reg |= config;
  308. writel(reg, ipctl->base + pin_reg->conf_reg);
  309. } else {
  310. writel(config, ipctl->base + pin_reg->conf_reg);
  311. }
  312. dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%lx\n",
  313. pin_reg->conf_reg, config);
  314. return 0;
  315. }
  316. static void imx_pinconf_dbg_show(struct pinctrl_dev *pctldev,
  317. struct seq_file *s, unsigned pin_id)
  318. {
  319. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  320. const struct imx_pinctrl_soc_info *info = ipctl->info;
  321. const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
  322. unsigned long config;
  323. if (!pin_reg || !pin_reg->conf_reg) {
  324. seq_printf(s, "N/A");
  325. return;
  326. }
  327. config = readl(ipctl->base + pin_reg->conf_reg);
  328. seq_printf(s, "0x%lx", config);
  329. }
  330. static void imx_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
  331. struct seq_file *s, unsigned group)
  332. {
  333. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  334. const struct imx_pinctrl_soc_info *info = ipctl->info;
  335. struct imx_pin_group *grp;
  336. unsigned long config;
  337. const char *name;
  338. int i, ret;
  339. if (group > info->ngroups)
  340. return;
  341. seq_printf(s, "\n");
  342. grp = &info->groups[group];
  343. for (i = 0; i < grp->npins; i++) {
  344. name = pin_get_name(pctldev, grp->pins[i]);
  345. ret = imx_pinconf_get(pctldev, grp->pins[i], &config);
  346. if (ret)
  347. return;
  348. seq_printf(s, "%s: 0x%lx", name, config);
  349. }
  350. }
  351. static const struct pinconf_ops imx_pinconf_ops = {
  352. .pin_config_get = imx_pinconf_get,
  353. .pin_config_set = imx_pinconf_set,
  354. .pin_config_dbg_show = imx_pinconf_dbg_show,
  355. .pin_config_group_dbg_show = imx_pinconf_group_dbg_show,
  356. };
  357. static struct pinctrl_desc imx_pinctrl_desc = {
  358. .pctlops = &imx_pctrl_ops,
  359. .pmxops = &imx_pmx_ops,
  360. .confops = &imx_pinconf_ops,
  361. .owner = THIS_MODULE,
  362. };
  363. /*
  364. * Each pin represented in fsl,pins consists of 5 u32 PIN_FUNC_ID and
  365. * 1 u32 CONFIG, so 24 types in total for each pin.
  366. */
  367. #define FSL_PIN_SIZE 24
  368. #define SHARE_FSL_PIN_SIZE 20
  369. static int imx_pinctrl_parse_groups(struct device_node *np,
  370. struct imx_pin_group *grp,
  371. struct imx_pinctrl_soc_info *info,
  372. u32 index)
  373. {
  374. int size, pin_size;
  375. const __be32 *list;
  376. int i;
  377. u32 config;
  378. dev_dbg(info->dev, "group(%d): %s\n", index, np->name);
  379. if (info->flags & SHARE_MUX_CONF_REG)
  380. pin_size = SHARE_FSL_PIN_SIZE;
  381. else
  382. pin_size = FSL_PIN_SIZE;
  383. /* Initialise group */
  384. grp->name = np->name;
  385. /*
  386. * the binding format is fsl,pins = <PIN_FUNC_ID CONFIG ...>,
  387. * do sanity check and calculate pins number
  388. */
  389. list = of_get_property(np, "fsl,pins", &size);
  390. if (!list) {
  391. dev_err(info->dev, "no fsl,pins property in node %s\n", np->full_name);
  392. return -EINVAL;
  393. }
  394. /* we do not check return since it's safe node passed down */
  395. if (!size || size % pin_size) {
  396. dev_err(info->dev, "Invalid fsl,pins property in node %s\n", np->full_name);
  397. return -EINVAL;
  398. }
  399. grp->npins = size / pin_size;
  400. grp->pins = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned int),
  401. GFP_KERNEL);
  402. grp->mux_mode = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned int),
  403. GFP_KERNEL);
  404. grp->input_reg = devm_kzalloc(info->dev, grp->npins * sizeof(u16),
  405. GFP_KERNEL);
  406. grp->input_val = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned int),
  407. GFP_KERNEL);
  408. grp->configs = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned long),
  409. GFP_KERNEL);
  410. for (i = 0; i < grp->npins; i++) {
  411. u32 mux_reg = be32_to_cpu(*list++);
  412. u32 conf_reg;
  413. unsigned int pin_id;
  414. struct imx_pin_reg *pin_reg;
  415. if (info->flags & SHARE_MUX_CONF_REG)
  416. conf_reg = mux_reg;
  417. else
  418. conf_reg = be32_to_cpu(*list++);
  419. pin_id = mux_reg ? mux_reg / 4 : conf_reg / 4;
  420. pin_reg = &info->pin_regs[pin_id];
  421. grp->pins[i] = pin_id;
  422. pin_reg->mux_reg = mux_reg;
  423. pin_reg->conf_reg = conf_reg;
  424. grp->input_reg[i] = be32_to_cpu(*list++);
  425. grp->mux_mode[i] = be32_to_cpu(*list++);
  426. grp->input_val[i] = be32_to_cpu(*list++);
  427. /* SION bit is in mux register */
  428. config = be32_to_cpu(*list++);
  429. if (config & IMX_PAD_SION)
  430. grp->mux_mode[i] |= IOMUXC_CONFIG_SION;
  431. grp->configs[i] = config & ~IMX_PAD_SION;
  432. }
  433. #ifdef DEBUG
  434. IMX_PMX_DUMP(info, grp->pins, grp->mux_mode, grp->configs, grp->npins);
  435. #endif
  436. return 0;
  437. }
  438. static int imx_pinctrl_parse_functions(struct device_node *np,
  439. struct imx_pinctrl_soc_info *info,
  440. u32 index)
  441. {
  442. struct device_node *child;
  443. struct imx_pmx_func *func;
  444. struct imx_pin_group *grp;
  445. static u32 grp_index;
  446. u32 i = 0;
  447. dev_dbg(info->dev, "parse function(%d): %s\n", index, np->name);
  448. func = &info->functions[index];
  449. /* Initialise function */
  450. func->name = np->name;
  451. func->num_groups = of_get_child_count(np);
  452. if (func->num_groups <= 0) {
  453. dev_err(info->dev, "no groups defined in %s\n", np->full_name);
  454. return -EINVAL;
  455. }
  456. func->groups = devm_kzalloc(info->dev,
  457. func->num_groups * sizeof(char *), GFP_KERNEL);
  458. for_each_child_of_node(np, child) {
  459. func->groups[i] = child->name;
  460. grp = &info->groups[grp_index++];
  461. imx_pinctrl_parse_groups(child, grp, info, i++);
  462. }
  463. return 0;
  464. }
  465. static int imx_pinctrl_probe_dt(struct platform_device *pdev,
  466. struct imx_pinctrl_soc_info *info)
  467. {
  468. struct device_node *np = pdev->dev.of_node;
  469. struct device_node *child;
  470. int ret;
  471. u32 nfuncs = 0;
  472. u32 i = 0;
  473. if (!np)
  474. return -ENODEV;
  475. nfuncs = of_get_child_count(np);
  476. if (nfuncs <= 0) {
  477. dev_err(&pdev->dev, "no functions defined\n");
  478. return -EINVAL;
  479. }
  480. info->nfunctions = nfuncs;
  481. info->functions = devm_kzalloc(&pdev->dev, nfuncs * sizeof(struct imx_pmx_func),
  482. GFP_KERNEL);
  483. if (!info->functions)
  484. return -ENOMEM;
  485. info->ngroups = 0;
  486. for_each_child_of_node(np, child)
  487. info->ngroups += of_get_child_count(child);
  488. info->groups = devm_kzalloc(&pdev->dev, info->ngroups * sizeof(struct imx_pin_group),
  489. GFP_KERNEL);
  490. if (!info->groups)
  491. return -ENOMEM;
  492. for_each_child_of_node(np, child) {
  493. ret = imx_pinctrl_parse_functions(child, info, i++);
  494. if (ret) {
  495. dev_err(&pdev->dev, "failed to parse function\n");
  496. return ret;
  497. }
  498. }
  499. return 0;
  500. }
  501. int imx_pinctrl_probe(struct platform_device *pdev,
  502. struct imx_pinctrl_soc_info *info)
  503. {
  504. struct imx_pinctrl *ipctl;
  505. struct resource *res;
  506. int ret;
  507. if (!info || !info->pins || !info->npins) {
  508. dev_err(&pdev->dev, "wrong pinctrl info\n");
  509. return -EINVAL;
  510. }
  511. info->dev = &pdev->dev;
  512. /* Create state holders etc for this driver */
  513. ipctl = devm_kzalloc(&pdev->dev, sizeof(*ipctl), GFP_KERNEL);
  514. if (!ipctl)
  515. return -ENOMEM;
  516. info->pin_regs = devm_kzalloc(&pdev->dev, sizeof(*info->pin_regs) *
  517. info->npins, GFP_KERNEL);
  518. if (!info->pin_regs)
  519. return -ENOMEM;
  520. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  521. ipctl->base = devm_ioremap_resource(&pdev->dev, res);
  522. if (IS_ERR(ipctl->base))
  523. return PTR_ERR(ipctl->base);
  524. imx_pinctrl_desc.name = dev_name(&pdev->dev);
  525. imx_pinctrl_desc.pins = info->pins;
  526. imx_pinctrl_desc.npins = info->npins;
  527. ret = imx_pinctrl_probe_dt(pdev, info);
  528. if (ret) {
  529. dev_err(&pdev->dev, "fail to probe dt properties\n");
  530. return ret;
  531. }
  532. ipctl->info = info;
  533. ipctl->dev = info->dev;
  534. platform_set_drvdata(pdev, ipctl);
  535. ipctl->pctl = pinctrl_register(&imx_pinctrl_desc, &pdev->dev, ipctl);
  536. if (!ipctl->pctl) {
  537. dev_err(&pdev->dev, "could not register IMX pinctrl driver\n");
  538. return -EINVAL;
  539. }
  540. dev_info(&pdev->dev, "initialized IMX pinctrl driver\n");
  541. return 0;
  542. }
  543. int imx_pinctrl_remove(struct platform_device *pdev)
  544. {
  545. struct imx_pinctrl *ipctl = platform_get_drvdata(pdev);
  546. pinctrl_unregister(ipctl->pctl);
  547. return 0;
  548. }