pinctrl-mvebu.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761
  1. /*
  2. * Marvell MVEBU pinctrl core driver
  3. *
  4. * Authors: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
  5. * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. */
  12. #include <linux/platform_device.h>
  13. #include <linux/module.h>
  14. #include <linux/slab.h>
  15. #include <linux/io.h>
  16. #include <linux/of.h>
  17. #include <linux/of_address.h>
  18. #include <linux/of_platform.h>
  19. #include <linux/err.h>
  20. #include <linux/gpio.h>
  21. #include <linux/pinctrl/machine.h>
  22. #include <linux/pinctrl/pinconf.h>
  23. #include <linux/pinctrl/pinctrl.h>
  24. #include <linux/pinctrl/pinmux.h>
  25. #include "pinctrl-mvebu.h"
  26. #define MPPS_PER_REG 8
  27. #define MPP_BITS 4
  28. #define MPP_MASK 0xf
  29. struct mvebu_pinctrl_function {
  30. const char *name;
  31. const char **groups;
  32. unsigned num_groups;
  33. };
  34. struct mvebu_pinctrl_group {
  35. const char *name;
  36. struct mvebu_mpp_ctrl *ctrl;
  37. struct mvebu_mpp_ctrl_setting *settings;
  38. unsigned num_settings;
  39. unsigned gid;
  40. unsigned *pins;
  41. unsigned npins;
  42. };
  43. struct mvebu_pinctrl {
  44. struct device *dev;
  45. struct pinctrl_dev *pctldev;
  46. struct pinctrl_desc desc;
  47. void __iomem *base;
  48. struct mvebu_pinctrl_group *groups;
  49. unsigned num_groups;
  50. struct mvebu_pinctrl_function *functions;
  51. unsigned num_functions;
  52. u8 variant;
  53. };
  54. static struct mvebu_pinctrl_group *mvebu_pinctrl_find_group_by_pid(
  55. struct mvebu_pinctrl *pctl, unsigned pid)
  56. {
  57. unsigned n;
  58. for (n = 0; n < pctl->num_groups; n++) {
  59. if (pid >= pctl->groups[n].pins[0] &&
  60. pid < pctl->groups[n].pins[0] +
  61. pctl->groups[n].npins)
  62. return &pctl->groups[n];
  63. }
  64. return NULL;
  65. }
  66. static struct mvebu_pinctrl_group *mvebu_pinctrl_find_group_by_name(
  67. struct mvebu_pinctrl *pctl, const char *name)
  68. {
  69. unsigned n;
  70. for (n = 0; n < pctl->num_groups; n++) {
  71. if (strcmp(name, pctl->groups[n].name) == 0)
  72. return &pctl->groups[n];
  73. }
  74. return NULL;
  75. }
  76. static struct mvebu_mpp_ctrl_setting *mvebu_pinctrl_find_setting_by_val(
  77. struct mvebu_pinctrl *pctl, struct mvebu_pinctrl_group *grp,
  78. unsigned long config)
  79. {
  80. unsigned n;
  81. for (n = 0; n < grp->num_settings; n++) {
  82. if (config == grp->settings[n].val) {
  83. if (!pctl->variant || (pctl->variant &
  84. grp->settings[n].variant))
  85. return &grp->settings[n];
  86. }
  87. }
  88. return NULL;
  89. }
  90. static struct mvebu_mpp_ctrl_setting *mvebu_pinctrl_find_setting_by_name(
  91. struct mvebu_pinctrl *pctl, struct mvebu_pinctrl_group *grp,
  92. const char *name)
  93. {
  94. unsigned n;
  95. for (n = 0; n < grp->num_settings; n++) {
  96. if (strcmp(name, grp->settings[n].name) == 0) {
  97. if (!pctl->variant || (pctl->variant &
  98. grp->settings[n].variant))
  99. return &grp->settings[n];
  100. }
  101. }
  102. return NULL;
  103. }
  104. static struct mvebu_mpp_ctrl_setting *mvebu_pinctrl_find_gpio_setting(
  105. struct mvebu_pinctrl *pctl, struct mvebu_pinctrl_group *grp)
  106. {
  107. unsigned n;
  108. for (n = 0; n < grp->num_settings; n++) {
  109. if (grp->settings[n].flags &
  110. (MVEBU_SETTING_GPO | MVEBU_SETTING_GPI)) {
  111. if (!pctl->variant || (pctl->variant &
  112. grp->settings[n].variant))
  113. return &grp->settings[n];
  114. }
  115. }
  116. return NULL;
  117. }
  118. static struct mvebu_pinctrl_function *mvebu_pinctrl_find_function_by_name(
  119. struct mvebu_pinctrl *pctl, const char *name)
  120. {
  121. unsigned n;
  122. for (n = 0; n < pctl->num_functions; n++) {
  123. if (strcmp(name, pctl->functions[n].name) == 0)
  124. return &pctl->functions[n];
  125. }
  126. return NULL;
  127. }
  128. /*
  129. * Common mpp pin configuration registers on MVEBU are
  130. * registers of eight 4-bit values for each mpp setting.
  131. * Register offset and bit mask are calculated accordingly below.
  132. */
  133. static int mvebu_common_mpp_get(struct mvebu_pinctrl *pctl,
  134. struct mvebu_pinctrl_group *grp,
  135. unsigned long *config)
  136. {
  137. unsigned pin = grp->gid;
  138. unsigned off = (pin / MPPS_PER_REG) * MPP_BITS;
  139. unsigned shift = (pin % MPPS_PER_REG) * MPP_BITS;
  140. *config = readl(pctl->base + off);
  141. *config >>= shift;
  142. *config &= MPP_MASK;
  143. return 0;
  144. }
  145. static int mvebu_common_mpp_set(struct mvebu_pinctrl *pctl,
  146. struct mvebu_pinctrl_group *grp,
  147. unsigned long config)
  148. {
  149. unsigned pin = grp->gid;
  150. unsigned off = (pin / MPPS_PER_REG) * MPP_BITS;
  151. unsigned shift = (pin % MPPS_PER_REG) * MPP_BITS;
  152. unsigned long reg;
  153. reg = readl(pctl->base + off);
  154. reg &= ~(MPP_MASK << shift);
  155. reg |= (config << shift);
  156. writel(reg, pctl->base + off);
  157. return 0;
  158. }
  159. static int mvebu_pinconf_group_get(struct pinctrl_dev *pctldev,
  160. unsigned gid, unsigned long *config)
  161. {
  162. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  163. struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
  164. if (!grp->ctrl)
  165. return -EINVAL;
  166. if (grp->ctrl->mpp_get)
  167. return grp->ctrl->mpp_get(grp->ctrl, config);
  168. return mvebu_common_mpp_get(pctl, grp, config);
  169. }
  170. static int mvebu_pinconf_group_set(struct pinctrl_dev *pctldev,
  171. unsigned gid, unsigned long config)
  172. {
  173. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  174. struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
  175. if (!grp->ctrl)
  176. return -EINVAL;
  177. if (grp->ctrl->mpp_set)
  178. return grp->ctrl->mpp_set(grp->ctrl, config);
  179. return mvebu_common_mpp_set(pctl, grp, config);
  180. }
  181. static void mvebu_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
  182. struct seq_file *s, unsigned gid)
  183. {
  184. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  185. struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
  186. struct mvebu_mpp_ctrl_setting *curr;
  187. unsigned long config;
  188. unsigned n;
  189. if (mvebu_pinconf_group_get(pctldev, gid, &config))
  190. return;
  191. curr = mvebu_pinctrl_find_setting_by_val(pctl, grp, config);
  192. if (curr) {
  193. seq_printf(s, "current: %s", curr->name);
  194. if (curr->subname)
  195. seq_printf(s, "(%s)", curr->subname);
  196. if (curr->flags & (MVEBU_SETTING_GPO | MVEBU_SETTING_GPI)) {
  197. seq_printf(s, "(");
  198. if (curr->flags & MVEBU_SETTING_GPI)
  199. seq_printf(s, "i");
  200. if (curr->flags & MVEBU_SETTING_GPO)
  201. seq_printf(s, "o");
  202. seq_printf(s, ")");
  203. }
  204. } else
  205. seq_printf(s, "current: UNKNOWN");
  206. if (grp->num_settings > 1) {
  207. seq_printf(s, ", available = [");
  208. for (n = 0; n < grp->num_settings; n++) {
  209. if (curr == &grp->settings[n])
  210. continue;
  211. /* skip unsupported settings for this variant */
  212. if (pctl->variant &&
  213. !(pctl->variant & grp->settings[n].variant))
  214. continue;
  215. seq_printf(s, " %s", grp->settings[n].name);
  216. if (grp->settings[n].subname)
  217. seq_printf(s, "(%s)", grp->settings[n].subname);
  218. if (grp->settings[n].flags &
  219. (MVEBU_SETTING_GPO | MVEBU_SETTING_GPI)) {
  220. seq_printf(s, "(");
  221. if (grp->settings[n].flags & MVEBU_SETTING_GPI)
  222. seq_printf(s, "i");
  223. if (grp->settings[n].flags & MVEBU_SETTING_GPO)
  224. seq_printf(s, "o");
  225. seq_printf(s, ")");
  226. }
  227. }
  228. seq_printf(s, " ]");
  229. }
  230. return;
  231. }
  232. static const struct pinconf_ops mvebu_pinconf_ops = {
  233. .pin_config_group_get = mvebu_pinconf_group_get,
  234. .pin_config_group_set = mvebu_pinconf_group_set,
  235. .pin_config_group_dbg_show = mvebu_pinconf_group_dbg_show,
  236. };
  237. static int mvebu_pinmux_get_funcs_count(struct pinctrl_dev *pctldev)
  238. {
  239. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  240. return pctl->num_functions;
  241. }
  242. static const char *mvebu_pinmux_get_func_name(struct pinctrl_dev *pctldev,
  243. unsigned fid)
  244. {
  245. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  246. return pctl->functions[fid].name;
  247. }
  248. static int mvebu_pinmux_get_groups(struct pinctrl_dev *pctldev, unsigned fid,
  249. const char * const **groups,
  250. unsigned * const num_groups)
  251. {
  252. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  253. *groups = pctl->functions[fid].groups;
  254. *num_groups = pctl->functions[fid].num_groups;
  255. return 0;
  256. }
  257. static int mvebu_pinmux_enable(struct pinctrl_dev *pctldev, unsigned fid,
  258. unsigned gid)
  259. {
  260. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  261. struct mvebu_pinctrl_function *func = &pctl->functions[fid];
  262. struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
  263. struct mvebu_mpp_ctrl_setting *setting;
  264. int ret;
  265. setting = mvebu_pinctrl_find_setting_by_name(pctl, grp,
  266. func->name);
  267. if (!setting) {
  268. dev_err(pctl->dev,
  269. "unable to find setting %s in group %s\n",
  270. func->name, func->groups[gid]);
  271. return -EINVAL;
  272. }
  273. ret = mvebu_pinconf_group_set(pctldev, grp->gid, setting->val);
  274. if (ret) {
  275. dev_err(pctl->dev, "cannot set group %s to %s\n",
  276. func->groups[gid], func->name);
  277. return ret;
  278. }
  279. return 0;
  280. }
  281. static int mvebu_pinmux_gpio_request_enable(struct pinctrl_dev *pctldev,
  282. struct pinctrl_gpio_range *range, unsigned offset)
  283. {
  284. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  285. struct mvebu_pinctrl_group *grp;
  286. struct mvebu_mpp_ctrl_setting *setting;
  287. grp = mvebu_pinctrl_find_group_by_pid(pctl, offset);
  288. if (!grp)
  289. return -EINVAL;
  290. if (grp->ctrl->mpp_gpio_req)
  291. return grp->ctrl->mpp_gpio_req(grp->ctrl, offset);
  292. setting = mvebu_pinctrl_find_gpio_setting(pctl, grp);
  293. if (!setting)
  294. return -ENOTSUPP;
  295. return mvebu_pinconf_group_set(pctldev, grp->gid, setting->val);
  296. }
  297. static int mvebu_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
  298. struct pinctrl_gpio_range *range, unsigned offset, bool input)
  299. {
  300. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  301. struct mvebu_pinctrl_group *grp;
  302. struct mvebu_mpp_ctrl_setting *setting;
  303. grp = mvebu_pinctrl_find_group_by_pid(pctl, offset);
  304. if (!grp)
  305. return -EINVAL;
  306. if (grp->ctrl->mpp_gpio_dir)
  307. return grp->ctrl->mpp_gpio_dir(grp->ctrl, offset, input);
  308. setting = mvebu_pinctrl_find_gpio_setting(pctl, grp);
  309. if (!setting)
  310. return -ENOTSUPP;
  311. if ((input && (setting->flags & MVEBU_SETTING_GPI)) ||
  312. (!input && (setting->flags & MVEBU_SETTING_GPO)))
  313. return 0;
  314. return -ENOTSUPP;
  315. }
  316. static const struct pinmux_ops mvebu_pinmux_ops = {
  317. .get_functions_count = mvebu_pinmux_get_funcs_count,
  318. .get_function_name = mvebu_pinmux_get_func_name,
  319. .get_function_groups = mvebu_pinmux_get_groups,
  320. .gpio_request_enable = mvebu_pinmux_gpio_request_enable,
  321. .gpio_set_direction = mvebu_pinmux_gpio_set_direction,
  322. .enable = mvebu_pinmux_enable,
  323. };
  324. static int mvebu_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
  325. {
  326. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  327. return pctl->num_groups;
  328. }
  329. static const char *mvebu_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
  330. unsigned gid)
  331. {
  332. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  333. return pctl->groups[gid].name;
  334. }
  335. static int mvebu_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
  336. unsigned gid, const unsigned **pins,
  337. unsigned *num_pins)
  338. {
  339. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  340. *pins = pctl->groups[gid].pins;
  341. *num_pins = pctl->groups[gid].npins;
  342. return 0;
  343. }
  344. static int mvebu_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
  345. struct device_node *np,
  346. struct pinctrl_map **map,
  347. unsigned *num_maps)
  348. {
  349. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  350. struct property *prop;
  351. const char *function;
  352. const char *group;
  353. int ret, nmaps, n;
  354. *map = NULL;
  355. *num_maps = 0;
  356. ret = of_property_read_string(np, "marvell,function", &function);
  357. if (ret) {
  358. dev_err(pctl->dev,
  359. "missing marvell,function in node %s\n", np->name);
  360. return 0;
  361. }
  362. nmaps = of_property_count_strings(np, "marvell,pins");
  363. if (nmaps < 0) {
  364. dev_err(pctl->dev,
  365. "missing marvell,pins in node %s\n", np->name);
  366. return 0;
  367. }
  368. *map = kmalloc(nmaps * sizeof(struct pinctrl_map), GFP_KERNEL);
  369. if (map == NULL) {
  370. dev_err(pctl->dev,
  371. "cannot allocate pinctrl_map memory for %s\n",
  372. np->name);
  373. return -ENOMEM;
  374. }
  375. n = 0;
  376. of_property_for_each_string(np, "marvell,pins", prop, group) {
  377. struct mvebu_pinctrl_group *grp =
  378. mvebu_pinctrl_find_group_by_name(pctl, group);
  379. if (!grp) {
  380. dev_err(pctl->dev, "unknown pin %s", group);
  381. continue;
  382. }
  383. if (!mvebu_pinctrl_find_setting_by_name(pctl, grp, function)) {
  384. dev_err(pctl->dev, "unsupported function %s on pin %s",
  385. function, group);
  386. continue;
  387. }
  388. (*map)[n].type = PIN_MAP_TYPE_MUX_GROUP;
  389. (*map)[n].data.mux.group = group;
  390. (*map)[n].data.mux.function = function;
  391. n++;
  392. }
  393. *num_maps = nmaps;
  394. return 0;
  395. }
  396. static void mvebu_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
  397. struct pinctrl_map *map, unsigned num_maps)
  398. {
  399. kfree(map);
  400. }
  401. static const struct pinctrl_ops mvebu_pinctrl_ops = {
  402. .get_groups_count = mvebu_pinctrl_get_groups_count,
  403. .get_group_name = mvebu_pinctrl_get_group_name,
  404. .get_group_pins = mvebu_pinctrl_get_group_pins,
  405. .dt_node_to_map = mvebu_pinctrl_dt_node_to_map,
  406. .dt_free_map = mvebu_pinctrl_dt_free_map,
  407. };
  408. static int _add_function(struct mvebu_pinctrl_function *funcs, int *funcsize,
  409. const char *name)
  410. {
  411. if (*funcsize <= 0)
  412. return -EOVERFLOW;
  413. while (funcs->num_groups) {
  414. /* function already there */
  415. if (strcmp(funcs->name, name) == 0) {
  416. funcs->num_groups++;
  417. return -EEXIST;
  418. }
  419. funcs++;
  420. }
  421. /* append new unique function */
  422. funcs->name = name;
  423. funcs->num_groups = 1;
  424. (*funcsize)--;
  425. return 0;
  426. }
  427. static int mvebu_pinctrl_build_functions(struct platform_device *pdev,
  428. struct mvebu_pinctrl *pctl)
  429. {
  430. struct mvebu_pinctrl_function *funcs;
  431. int num = 0, funcsize = pctl->desc.npins;
  432. int n, s;
  433. /* we allocate functions for number of pins and hope
  434. * there are fewer unique functions than pins available */
  435. funcs = devm_kzalloc(&pdev->dev, funcsize *
  436. sizeof(struct mvebu_pinctrl_function), GFP_KERNEL);
  437. if (!funcs)
  438. return -ENOMEM;
  439. for (n = 0; n < pctl->num_groups; n++) {
  440. struct mvebu_pinctrl_group *grp = &pctl->groups[n];
  441. for (s = 0; s < grp->num_settings; s++) {
  442. int ret;
  443. /* skip unsupported settings on this variant */
  444. if (pctl->variant &&
  445. !(pctl->variant & grp->settings[s].variant))
  446. continue;
  447. /* check for unique functions and count groups */
  448. ret = _add_function(funcs, &funcsize,
  449. grp->settings[s].name);
  450. if (ret == -EOVERFLOW)
  451. dev_err(&pdev->dev,
  452. "More functions than pins(%d)\n",
  453. pctl->desc.npins);
  454. if (ret < 0)
  455. continue;
  456. num++;
  457. }
  458. }
  459. pctl->num_functions = num;
  460. pctl->functions = funcs;
  461. for (n = 0; n < pctl->num_groups; n++) {
  462. struct mvebu_pinctrl_group *grp = &pctl->groups[n];
  463. for (s = 0; s < grp->num_settings; s++) {
  464. struct mvebu_pinctrl_function *f;
  465. const char **groups;
  466. /* skip unsupported settings on this variant */
  467. if (pctl->variant &&
  468. !(pctl->variant & grp->settings[s].variant))
  469. continue;
  470. f = mvebu_pinctrl_find_function_by_name(pctl,
  471. grp->settings[s].name);
  472. /* allocate group name array if not done already */
  473. if (!f->groups) {
  474. f->groups = devm_kzalloc(&pdev->dev,
  475. f->num_groups * sizeof(char *),
  476. GFP_KERNEL);
  477. if (!f->groups)
  478. return -ENOMEM;
  479. }
  480. /* find next free group name and assign current name */
  481. groups = f->groups;
  482. while (*groups)
  483. groups++;
  484. *groups = grp->name;
  485. }
  486. }
  487. return 0;
  488. }
  489. int mvebu_pinctrl_probe(struct platform_device *pdev)
  490. {
  491. struct mvebu_pinctrl_soc_info *soc = dev_get_platdata(&pdev->dev);
  492. struct device_node *np = pdev->dev.of_node;
  493. struct mvebu_pinctrl *pctl;
  494. void __iomem *base;
  495. struct pinctrl_pin_desc *pdesc;
  496. unsigned gid, n, k;
  497. int ret;
  498. if (!soc || !soc->controls || !soc->modes) {
  499. dev_err(&pdev->dev, "wrong pinctrl soc info\n");
  500. return -EINVAL;
  501. }
  502. base = of_iomap(np, 0);
  503. if (!base) {
  504. dev_err(&pdev->dev, "unable to get base address\n");
  505. return -ENODEV;
  506. }
  507. pctl = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_pinctrl),
  508. GFP_KERNEL);
  509. if (!pctl) {
  510. dev_err(&pdev->dev, "unable to alloc driver\n");
  511. return -ENOMEM;
  512. }
  513. pctl->desc.name = dev_name(&pdev->dev);
  514. pctl->desc.owner = THIS_MODULE;
  515. pctl->desc.pctlops = &mvebu_pinctrl_ops;
  516. pctl->desc.pmxops = &mvebu_pinmux_ops;
  517. pctl->desc.confops = &mvebu_pinconf_ops;
  518. pctl->variant = soc->variant;
  519. pctl->base = base;
  520. pctl->dev = &pdev->dev;
  521. platform_set_drvdata(pdev, pctl);
  522. /* count controls and create names for mvebu generic
  523. register controls; also does sanity checks */
  524. pctl->num_groups = 0;
  525. pctl->desc.npins = 0;
  526. for (n = 0; n < soc->ncontrols; n++) {
  527. struct mvebu_mpp_ctrl *ctrl = &soc->controls[n];
  528. char *names;
  529. pctl->desc.npins += ctrl->npins;
  530. /* initial control pins */
  531. for (k = 0; k < ctrl->npins; k++)
  532. ctrl->pins[k] = ctrl->pid + k;
  533. /* special soc specific control */
  534. if (ctrl->mpp_get || ctrl->mpp_set) {
  535. if (!ctrl->name || !ctrl->mpp_get || !ctrl->mpp_set) {
  536. dev_err(&pdev->dev, "wrong soc control info\n");
  537. return -EINVAL;
  538. }
  539. pctl->num_groups += 1;
  540. continue;
  541. }
  542. /* generic mvebu register control */
  543. names = devm_kzalloc(&pdev->dev, ctrl->npins * 8, GFP_KERNEL);
  544. if (!names) {
  545. dev_err(&pdev->dev, "failed to alloc mpp names\n");
  546. return -ENOMEM;
  547. }
  548. for (k = 0; k < ctrl->npins; k++)
  549. sprintf(names + 8*k, "mpp%d", ctrl->pid+k);
  550. ctrl->name = names;
  551. pctl->num_groups += ctrl->npins;
  552. }
  553. pdesc = devm_kzalloc(&pdev->dev, pctl->desc.npins *
  554. sizeof(struct pinctrl_pin_desc), GFP_KERNEL);
  555. if (!pdesc) {
  556. dev_err(&pdev->dev, "failed to alloc pinctrl pins\n");
  557. return -ENOMEM;
  558. }
  559. for (n = 0; n < pctl->desc.npins; n++)
  560. pdesc[n].number = n;
  561. pctl->desc.pins = pdesc;
  562. pctl->groups = devm_kzalloc(&pdev->dev, pctl->num_groups *
  563. sizeof(struct mvebu_pinctrl_group), GFP_KERNEL);
  564. if (!pctl->groups) {
  565. dev_err(&pdev->dev, "failed to alloc pinctrl groups\n");
  566. return -ENOMEM;
  567. }
  568. /* assign mpp controls to groups */
  569. gid = 0;
  570. for (n = 0; n < soc->ncontrols; n++) {
  571. struct mvebu_mpp_ctrl *ctrl = &soc->controls[n];
  572. pctl->groups[gid].gid = gid;
  573. pctl->groups[gid].ctrl = ctrl;
  574. pctl->groups[gid].name = ctrl->name;
  575. pctl->groups[gid].pins = ctrl->pins;
  576. pctl->groups[gid].npins = ctrl->npins;
  577. /* generic mvebu register control maps to a number of groups */
  578. if (!ctrl->mpp_get && !ctrl->mpp_set) {
  579. pctl->groups[gid].npins = 1;
  580. for (k = 1; k < ctrl->npins; k++) {
  581. gid++;
  582. pctl->groups[gid].gid = gid;
  583. pctl->groups[gid].ctrl = ctrl;
  584. pctl->groups[gid].name = &ctrl->name[8*k];
  585. pctl->groups[gid].pins = &ctrl->pins[k];
  586. pctl->groups[gid].npins = 1;
  587. }
  588. }
  589. gid++;
  590. }
  591. /* assign mpp modes to groups */
  592. for (n = 0; n < soc->nmodes; n++) {
  593. struct mvebu_mpp_mode *mode = &soc->modes[n];
  594. struct mvebu_pinctrl_group *grp =
  595. mvebu_pinctrl_find_group_by_pid(pctl, mode->pid);
  596. unsigned num_settings;
  597. if (!grp) {
  598. dev_warn(&pdev->dev, "unknown pinctrl group %d\n",
  599. mode->pid);
  600. continue;
  601. }
  602. for (num_settings = 0; ;) {
  603. struct mvebu_mpp_ctrl_setting *set =
  604. &mode->settings[num_settings];
  605. if (!set->name)
  606. break;
  607. num_settings++;
  608. /* skip unsupported settings for this variant */
  609. if (pctl->variant && !(pctl->variant & set->variant))
  610. continue;
  611. /* find gpio/gpo/gpi settings */
  612. if (strcmp(set->name, "gpio") == 0)
  613. set->flags = MVEBU_SETTING_GPI |
  614. MVEBU_SETTING_GPO;
  615. else if (strcmp(set->name, "gpo") == 0)
  616. set->flags = MVEBU_SETTING_GPO;
  617. else if (strcmp(set->name, "gpi") == 0)
  618. set->flags = MVEBU_SETTING_GPI;
  619. }
  620. grp->settings = mode->settings;
  621. grp->num_settings = num_settings;
  622. }
  623. ret = mvebu_pinctrl_build_functions(pdev, pctl);
  624. if (ret) {
  625. dev_err(&pdev->dev, "unable to build functions\n");
  626. return ret;
  627. }
  628. pctl->pctldev = pinctrl_register(&pctl->desc, &pdev->dev, pctl);
  629. if (!pctl->pctldev) {
  630. dev_err(&pdev->dev, "unable to register pinctrl driver\n");
  631. return -EINVAL;
  632. }
  633. dev_info(&pdev->dev, "registered pinctrl driver\n");
  634. /* register gpio ranges */
  635. for (n = 0; n < soc->ngpioranges; n++)
  636. pinctrl_add_gpio_range(pctl->pctldev, &soc->gpioranges[n]);
  637. return 0;
  638. }
  639. int mvebu_pinctrl_remove(struct platform_device *pdev)
  640. {
  641. struct mvebu_pinctrl *pctl = platform_get_drvdata(pdev);
  642. pinctrl_unregister(pctl->pctldev);
  643. return 0;
  644. }