pinctrl-mvebu.c 18 KB

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