pinctrl-mvebu.c 21 KB

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