pinctrl-mvebu.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752
  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 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 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 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, const char *name)
  409. {
  410. while (funcs->num_groups) {
  411. /* function already there */
  412. if (strcmp(funcs->name, name) == 0) {
  413. funcs->num_groups++;
  414. return -EEXIST;
  415. }
  416. funcs++;
  417. }
  418. funcs->name = name;
  419. funcs->num_groups = 1;
  420. return 0;
  421. }
  422. static int mvebu_pinctrl_build_functions(struct platform_device *pdev,
  423. struct mvebu_pinctrl *pctl)
  424. {
  425. struct mvebu_pinctrl_function *funcs;
  426. int num = 0;
  427. int n, s;
  428. /* we allocate functions for number of pins and hope
  429. * there are less unique functions than pins available */
  430. funcs = devm_kzalloc(&pdev->dev, pctl->desc.npins *
  431. sizeof(struct mvebu_pinctrl_function), GFP_KERNEL);
  432. if (!funcs)
  433. return -ENOMEM;
  434. for (n = 0; n < pctl->num_groups; n++) {
  435. struct mvebu_pinctrl_group *grp = &pctl->groups[n];
  436. for (s = 0; s < grp->num_settings; s++) {
  437. /* skip unsupported settings on this variant */
  438. if (pctl->variant &&
  439. !(pctl->variant & grp->settings[s].variant))
  440. continue;
  441. /* check for unique functions and count groups */
  442. if (_add_function(funcs, grp->settings[s].name))
  443. continue;
  444. num++;
  445. }
  446. }
  447. /* with the number of unique functions and it's groups known,
  448. reallocate functions and assign group names */
  449. funcs = krealloc(funcs, num * sizeof(struct mvebu_pinctrl_function),
  450. GFP_KERNEL);
  451. if (!funcs)
  452. return -ENOMEM;
  453. pctl->num_functions = num;
  454. pctl->functions = funcs;
  455. for (n = 0; n < pctl->num_groups; n++) {
  456. struct mvebu_pinctrl_group *grp = &pctl->groups[n];
  457. for (s = 0; s < grp->num_settings; s++) {
  458. struct mvebu_pinctrl_function *f;
  459. const char **groups;
  460. /* skip unsupported settings on this variant */
  461. if (pctl->variant &&
  462. !(pctl->variant & grp->settings[s].variant))
  463. continue;
  464. f = mvebu_pinctrl_find_function_by_name(pctl,
  465. grp->settings[s].name);
  466. /* allocate group name array if not done already */
  467. if (!f->groups) {
  468. f->groups = devm_kzalloc(&pdev->dev,
  469. f->num_groups * sizeof(char *),
  470. GFP_KERNEL);
  471. if (!f->groups)
  472. return -ENOMEM;
  473. }
  474. /* find next free group name and assign current name */
  475. groups = f->groups;
  476. while (*groups)
  477. groups++;
  478. *groups = grp->name;
  479. }
  480. }
  481. return 0;
  482. }
  483. int mvebu_pinctrl_probe(struct platform_device *pdev)
  484. {
  485. struct mvebu_pinctrl_soc_info *soc = dev_get_platdata(&pdev->dev);
  486. struct device_node *np = pdev->dev.of_node;
  487. struct mvebu_pinctrl *pctl;
  488. void __iomem *base;
  489. struct pinctrl_pin_desc *pdesc;
  490. unsigned gid, n, k;
  491. int ret;
  492. if (!soc || !soc->controls || !soc->modes) {
  493. dev_err(&pdev->dev, "wrong pinctrl soc info\n");
  494. return -EINVAL;
  495. }
  496. base = of_iomap(np, 0);
  497. if (!base) {
  498. dev_err(&pdev->dev, "unable to get base address\n");
  499. return -ENODEV;
  500. }
  501. pctl = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_pinctrl),
  502. GFP_KERNEL);
  503. if (!pctl) {
  504. dev_err(&pdev->dev, "unable to alloc driver\n");
  505. return -ENOMEM;
  506. }
  507. pctl->desc.name = dev_name(&pdev->dev);
  508. pctl->desc.owner = THIS_MODULE;
  509. pctl->desc.pctlops = &mvebu_pinctrl_ops;
  510. pctl->desc.pmxops = &mvebu_pinmux_ops;
  511. pctl->desc.confops = &mvebu_pinconf_ops;
  512. pctl->variant = soc->variant;
  513. pctl->base = base;
  514. pctl->dev = &pdev->dev;
  515. platform_set_drvdata(pdev, pctl);
  516. /* count controls and create names for mvebu generic
  517. register controls; also does sanity checks */
  518. pctl->num_groups = 0;
  519. pctl->desc.npins = 0;
  520. for (n = 0; n < soc->ncontrols; n++) {
  521. struct mvebu_mpp_ctrl *ctrl = &soc->controls[n];
  522. char *names;
  523. pctl->desc.npins += ctrl->npins;
  524. /* initial control pins */
  525. for (k = 0; k < ctrl->npins; k++)
  526. ctrl->pins[k] = ctrl->pid + k;
  527. /* special soc specific control */
  528. if (ctrl->mpp_get || ctrl->mpp_set) {
  529. if (!ctrl->name || !ctrl->mpp_set || !ctrl->mpp_set) {
  530. dev_err(&pdev->dev, "wrong soc control info\n");
  531. return -EINVAL;
  532. }
  533. pctl->num_groups += 1;
  534. continue;
  535. }
  536. /* generic mvebu register control */
  537. names = devm_kzalloc(&pdev->dev, ctrl->npins * 8, GFP_KERNEL);
  538. if (!names) {
  539. dev_err(&pdev->dev, "failed to alloc mpp names\n");
  540. return -ENOMEM;
  541. }
  542. for (k = 0; k < ctrl->npins; k++)
  543. sprintf(names + 8*k, "mpp%d", ctrl->pid+k);
  544. ctrl->name = names;
  545. pctl->num_groups += ctrl->npins;
  546. }
  547. pdesc = devm_kzalloc(&pdev->dev, pctl->desc.npins *
  548. sizeof(struct pinctrl_pin_desc), GFP_KERNEL);
  549. if (!pdesc) {
  550. dev_err(&pdev->dev, "failed to alloc pinctrl pins\n");
  551. return -ENOMEM;
  552. }
  553. for (n = 0; n < pctl->desc.npins; n++)
  554. pdesc[n].number = n;
  555. pctl->desc.pins = pdesc;
  556. pctl->groups = devm_kzalloc(&pdev->dev, pctl->num_groups *
  557. sizeof(struct mvebu_pinctrl_group), GFP_KERNEL);
  558. if (!pctl->groups) {
  559. dev_err(&pdev->dev, "failed to alloc pinctrl groups\n");
  560. return -ENOMEM;
  561. }
  562. /* assign mpp controls to groups */
  563. gid = 0;
  564. for (n = 0; n < soc->ncontrols; n++) {
  565. struct mvebu_mpp_ctrl *ctrl = &soc->controls[n];
  566. pctl->groups[gid].gid = gid;
  567. pctl->groups[gid].ctrl = ctrl;
  568. pctl->groups[gid].name = ctrl->name;
  569. pctl->groups[gid].pins = ctrl->pins;
  570. pctl->groups[gid].npins = ctrl->npins;
  571. /* generic mvebu register control maps to a number of groups */
  572. if (!ctrl->mpp_get && !ctrl->mpp_set) {
  573. pctl->groups[gid].npins = 1;
  574. for (k = 1; k < ctrl->npins; k++) {
  575. gid++;
  576. pctl->groups[gid].gid = gid;
  577. pctl->groups[gid].ctrl = ctrl;
  578. pctl->groups[gid].name = &ctrl->name[8*k];
  579. pctl->groups[gid].pins = &ctrl->pins[k];
  580. pctl->groups[gid].npins = 1;
  581. }
  582. }
  583. gid++;
  584. }
  585. /* assign mpp modes to groups */
  586. for (n = 0; n < soc->nmodes; n++) {
  587. struct mvebu_mpp_mode *mode = &soc->modes[n];
  588. struct mvebu_pinctrl_group *grp =
  589. mvebu_pinctrl_find_group_by_pid(pctl, mode->pid);
  590. unsigned num_settings;
  591. if (!grp) {
  592. dev_warn(&pdev->dev, "unknown pinctrl group %d\n",
  593. mode->pid);
  594. continue;
  595. }
  596. for (num_settings = 0; ;) {
  597. struct mvebu_mpp_ctrl_setting *set =
  598. &mode->settings[num_settings];
  599. if (!set->name)
  600. break;
  601. num_settings++;
  602. /* skip unsupported settings for this variant */
  603. if (pctl->variant && !(pctl->variant & set->variant))
  604. continue;
  605. /* find gpio/gpo/gpi settings */
  606. if (strcmp(set->name, "gpio") == 0)
  607. set->flags = MVEBU_SETTING_GPI |
  608. MVEBU_SETTING_GPO;
  609. else if (strcmp(set->name, "gpo") == 0)
  610. set->flags = MVEBU_SETTING_GPO;
  611. else if (strcmp(set->name, "gpi") == 0)
  612. set->flags = MVEBU_SETTING_GPI;
  613. }
  614. grp->settings = mode->settings;
  615. grp->num_settings = num_settings;
  616. }
  617. ret = mvebu_pinctrl_build_functions(pdev, pctl);
  618. if (ret) {
  619. dev_err(&pdev->dev, "unable to build functions\n");
  620. return ret;
  621. }
  622. pctl->pctldev = pinctrl_register(&pctl->desc, &pdev->dev, pctl);
  623. if (!pctl->pctldev) {
  624. dev_err(&pdev->dev, "unable to register pinctrl driver\n");
  625. return -EINVAL;
  626. }
  627. dev_info(&pdev->dev, "registered pinctrl driver\n");
  628. /* register gpio ranges */
  629. for (n = 0; n < soc->ngpioranges; n++)
  630. pinctrl_add_gpio_range(pctl->pctldev, &soc->gpioranges[n]);
  631. return 0;
  632. }
  633. int mvebu_pinctrl_remove(struct platform_device *pdev)
  634. {
  635. struct mvebu_pinctrl *pctl = platform_get_drvdata(pdev);
  636. pinctrl_unregister(pctl->pctldev);
  637. return 0;
  638. }