pinctrl-mvebu.c 19 KB

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