pinctrl-mvebu.c 21 KB

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