pinctrl-mvebu.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775
  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 *configs,
  172. unsigned num_configs)
  173. {
  174. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  175. struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
  176. int i, ret;
  177. if (!grp->ctrl)
  178. return -EINVAL;
  179. for (i = 0; i < num_configs; i++) {
  180. if (grp->ctrl->mpp_set)
  181. ret = grp->ctrl->mpp_set(grp->ctrl, configs[i]);
  182. else
  183. ret = mvebu_common_mpp_set(pctl, grp, configs[i]);
  184. if (ret)
  185. return ret;
  186. } /* for each config */
  187. return 0;
  188. }
  189. static void mvebu_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
  190. struct seq_file *s, unsigned gid)
  191. {
  192. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  193. struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
  194. struct mvebu_mpp_ctrl_setting *curr;
  195. unsigned long config;
  196. unsigned n;
  197. if (mvebu_pinconf_group_get(pctldev, gid, &config))
  198. return;
  199. curr = mvebu_pinctrl_find_setting_by_val(pctl, grp, config);
  200. if (curr) {
  201. seq_printf(s, "current: %s", curr->name);
  202. if (curr->subname)
  203. seq_printf(s, "(%s)", curr->subname);
  204. if (curr->flags & (MVEBU_SETTING_GPO | MVEBU_SETTING_GPI)) {
  205. seq_printf(s, "(");
  206. if (curr->flags & MVEBU_SETTING_GPI)
  207. seq_printf(s, "i");
  208. if (curr->flags & MVEBU_SETTING_GPO)
  209. seq_printf(s, "o");
  210. seq_printf(s, ")");
  211. }
  212. } else
  213. seq_printf(s, "current: UNKNOWN");
  214. if (grp->num_settings > 1) {
  215. seq_printf(s, ", available = [");
  216. for (n = 0; n < grp->num_settings; n++) {
  217. if (curr == &grp->settings[n])
  218. continue;
  219. /* skip unsupported settings for this variant */
  220. if (pctl->variant &&
  221. !(pctl->variant & grp->settings[n].variant))
  222. continue;
  223. seq_printf(s, " %s", grp->settings[n].name);
  224. if (grp->settings[n].subname)
  225. seq_printf(s, "(%s)", grp->settings[n].subname);
  226. if (grp->settings[n].flags &
  227. (MVEBU_SETTING_GPO | MVEBU_SETTING_GPI)) {
  228. seq_printf(s, "(");
  229. if (grp->settings[n].flags & MVEBU_SETTING_GPI)
  230. seq_printf(s, "i");
  231. if (grp->settings[n].flags & MVEBU_SETTING_GPO)
  232. seq_printf(s, "o");
  233. seq_printf(s, ")");
  234. }
  235. }
  236. seq_printf(s, " ]");
  237. }
  238. return;
  239. }
  240. static const struct pinconf_ops mvebu_pinconf_ops = {
  241. .pin_config_group_get = mvebu_pinconf_group_get,
  242. .pin_config_group_set = mvebu_pinconf_group_set,
  243. .pin_config_group_dbg_show = mvebu_pinconf_group_dbg_show,
  244. };
  245. static int mvebu_pinmux_get_funcs_count(struct pinctrl_dev *pctldev)
  246. {
  247. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  248. return pctl->num_functions;
  249. }
  250. static const char *mvebu_pinmux_get_func_name(struct pinctrl_dev *pctldev,
  251. unsigned fid)
  252. {
  253. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  254. return pctl->functions[fid].name;
  255. }
  256. static int mvebu_pinmux_get_groups(struct pinctrl_dev *pctldev, unsigned fid,
  257. const char * const **groups,
  258. unsigned * const num_groups)
  259. {
  260. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  261. *groups = pctl->functions[fid].groups;
  262. *num_groups = pctl->functions[fid].num_groups;
  263. return 0;
  264. }
  265. static int mvebu_pinmux_enable(struct pinctrl_dev *pctldev, unsigned fid,
  266. unsigned gid)
  267. {
  268. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  269. struct mvebu_pinctrl_function *func = &pctl->functions[fid];
  270. struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
  271. struct mvebu_mpp_ctrl_setting *setting;
  272. int ret;
  273. unsigned long config;
  274. setting = mvebu_pinctrl_find_setting_by_name(pctl, grp,
  275. func->name);
  276. if (!setting) {
  277. dev_err(pctl->dev,
  278. "unable to find setting %s in group %s\n",
  279. func->name, func->groups[gid]);
  280. return -EINVAL;
  281. }
  282. config = setting->val;
  283. ret = mvebu_pinconf_group_set(pctldev, grp->gid, &config, 1);
  284. if (ret) {
  285. dev_err(pctl->dev, "cannot set group %s to %s\n",
  286. func->groups[gid], func->name);
  287. return ret;
  288. }
  289. return 0;
  290. }
  291. static int mvebu_pinmux_gpio_request_enable(struct pinctrl_dev *pctldev,
  292. struct pinctrl_gpio_range *range, unsigned offset)
  293. {
  294. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  295. struct mvebu_pinctrl_group *grp;
  296. struct mvebu_mpp_ctrl_setting *setting;
  297. unsigned long config;
  298. grp = mvebu_pinctrl_find_group_by_pid(pctl, offset);
  299. if (!grp)
  300. return -EINVAL;
  301. if (grp->ctrl->mpp_gpio_req)
  302. return grp->ctrl->mpp_gpio_req(grp->ctrl, offset);
  303. setting = mvebu_pinctrl_find_gpio_setting(pctl, grp);
  304. if (!setting)
  305. return -ENOTSUPP;
  306. config = setting->val;
  307. return mvebu_pinconf_group_set(pctldev, grp->gid, &config, 1);
  308. }
  309. static int mvebu_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
  310. struct pinctrl_gpio_range *range, unsigned offset, bool input)
  311. {
  312. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  313. struct mvebu_pinctrl_group *grp;
  314. struct mvebu_mpp_ctrl_setting *setting;
  315. grp = mvebu_pinctrl_find_group_by_pid(pctl, offset);
  316. if (!grp)
  317. return -EINVAL;
  318. if (grp->ctrl->mpp_gpio_dir)
  319. return grp->ctrl->mpp_gpio_dir(grp->ctrl, offset, input);
  320. setting = mvebu_pinctrl_find_gpio_setting(pctl, grp);
  321. if (!setting)
  322. return -ENOTSUPP;
  323. if ((input && (setting->flags & MVEBU_SETTING_GPI)) ||
  324. (!input && (setting->flags & MVEBU_SETTING_GPO)))
  325. return 0;
  326. return -ENOTSUPP;
  327. }
  328. static const struct pinmux_ops mvebu_pinmux_ops = {
  329. .get_functions_count = mvebu_pinmux_get_funcs_count,
  330. .get_function_name = mvebu_pinmux_get_func_name,
  331. .get_function_groups = mvebu_pinmux_get_groups,
  332. .gpio_request_enable = mvebu_pinmux_gpio_request_enable,
  333. .gpio_set_direction = mvebu_pinmux_gpio_set_direction,
  334. .enable = mvebu_pinmux_enable,
  335. };
  336. static int mvebu_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
  337. {
  338. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  339. return pctl->num_groups;
  340. }
  341. static const char *mvebu_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
  342. unsigned gid)
  343. {
  344. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  345. return pctl->groups[gid].name;
  346. }
  347. static int mvebu_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
  348. unsigned gid, const unsigned **pins,
  349. unsigned *num_pins)
  350. {
  351. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  352. *pins = pctl->groups[gid].pins;
  353. *num_pins = pctl->groups[gid].npins;
  354. return 0;
  355. }
  356. static int mvebu_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
  357. struct device_node *np,
  358. struct pinctrl_map **map,
  359. unsigned *num_maps)
  360. {
  361. struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
  362. struct property *prop;
  363. const char *function;
  364. const char *group;
  365. int ret, nmaps, n;
  366. *map = NULL;
  367. *num_maps = 0;
  368. ret = of_property_read_string(np, "marvell,function", &function);
  369. if (ret) {
  370. dev_err(pctl->dev,
  371. "missing marvell,function in node %s\n", np->name);
  372. return 0;
  373. }
  374. nmaps = of_property_count_strings(np, "marvell,pins");
  375. if (nmaps < 0) {
  376. dev_err(pctl->dev,
  377. "missing marvell,pins in node %s\n", np->name);
  378. return 0;
  379. }
  380. *map = kmalloc(nmaps * sizeof(struct pinctrl_map), GFP_KERNEL);
  381. if (map == NULL) {
  382. dev_err(pctl->dev,
  383. "cannot allocate pinctrl_map memory for %s\n",
  384. np->name);
  385. return -ENOMEM;
  386. }
  387. n = 0;
  388. of_property_for_each_string(np, "marvell,pins", prop, group) {
  389. struct mvebu_pinctrl_group *grp =
  390. mvebu_pinctrl_find_group_by_name(pctl, group);
  391. if (!grp) {
  392. dev_err(pctl->dev, "unknown pin %s", group);
  393. continue;
  394. }
  395. if (!mvebu_pinctrl_find_setting_by_name(pctl, grp, function)) {
  396. dev_err(pctl->dev, "unsupported function %s on pin %s",
  397. function, group);
  398. continue;
  399. }
  400. (*map)[n].type = PIN_MAP_TYPE_MUX_GROUP;
  401. (*map)[n].data.mux.group = group;
  402. (*map)[n].data.mux.function = function;
  403. n++;
  404. }
  405. *num_maps = nmaps;
  406. return 0;
  407. }
  408. static void mvebu_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
  409. struct pinctrl_map *map, unsigned num_maps)
  410. {
  411. kfree(map);
  412. }
  413. static const struct pinctrl_ops mvebu_pinctrl_ops = {
  414. .get_groups_count = mvebu_pinctrl_get_groups_count,
  415. .get_group_name = mvebu_pinctrl_get_group_name,
  416. .get_group_pins = mvebu_pinctrl_get_group_pins,
  417. .dt_node_to_map = mvebu_pinctrl_dt_node_to_map,
  418. .dt_free_map = mvebu_pinctrl_dt_free_map,
  419. };
  420. static int _add_function(struct mvebu_pinctrl_function *funcs, int *funcsize,
  421. const char *name)
  422. {
  423. if (*funcsize <= 0)
  424. return -EOVERFLOW;
  425. while (funcs->num_groups) {
  426. /* function already there */
  427. if (strcmp(funcs->name, name) == 0) {
  428. funcs->num_groups++;
  429. return -EEXIST;
  430. }
  431. funcs++;
  432. }
  433. /* append new unique function */
  434. funcs->name = name;
  435. funcs->num_groups = 1;
  436. (*funcsize)--;
  437. return 0;
  438. }
  439. static int mvebu_pinctrl_build_functions(struct platform_device *pdev,
  440. struct mvebu_pinctrl *pctl)
  441. {
  442. struct mvebu_pinctrl_function *funcs;
  443. int num = 0, funcsize = pctl->desc.npins;
  444. int n, s;
  445. /* we allocate functions for number of pins and hope
  446. * there are fewer unique functions than pins available */
  447. funcs = devm_kzalloc(&pdev->dev, funcsize *
  448. sizeof(struct mvebu_pinctrl_function), GFP_KERNEL);
  449. if (!funcs)
  450. return -ENOMEM;
  451. for (n = 0; n < pctl->num_groups; n++) {
  452. struct mvebu_pinctrl_group *grp = &pctl->groups[n];
  453. for (s = 0; s < grp->num_settings; s++) {
  454. int ret;
  455. /* skip unsupported settings on this variant */
  456. if (pctl->variant &&
  457. !(pctl->variant & grp->settings[s].variant))
  458. continue;
  459. /* check for unique functions and count groups */
  460. ret = _add_function(funcs, &funcsize,
  461. grp->settings[s].name);
  462. if (ret == -EOVERFLOW)
  463. dev_err(&pdev->dev,
  464. "More functions than pins(%d)\n",
  465. pctl->desc.npins);
  466. if (ret < 0)
  467. continue;
  468. num++;
  469. }
  470. }
  471. pctl->num_functions = num;
  472. pctl->functions = funcs;
  473. for (n = 0; n < pctl->num_groups; n++) {
  474. struct mvebu_pinctrl_group *grp = &pctl->groups[n];
  475. for (s = 0; s < grp->num_settings; s++) {
  476. struct mvebu_pinctrl_function *f;
  477. const char **groups;
  478. /* skip unsupported settings on this variant */
  479. if (pctl->variant &&
  480. !(pctl->variant & grp->settings[s].variant))
  481. continue;
  482. f = mvebu_pinctrl_find_function_by_name(pctl,
  483. grp->settings[s].name);
  484. /* allocate group name array if not done already */
  485. if (!f->groups) {
  486. f->groups = devm_kzalloc(&pdev->dev,
  487. f->num_groups * sizeof(char *),
  488. GFP_KERNEL);
  489. if (!f->groups)
  490. return -ENOMEM;
  491. }
  492. /* find next free group name and assign current name */
  493. groups = f->groups;
  494. while (*groups)
  495. groups++;
  496. *groups = grp->name;
  497. }
  498. }
  499. return 0;
  500. }
  501. int mvebu_pinctrl_probe(struct platform_device *pdev)
  502. {
  503. struct mvebu_pinctrl_soc_info *soc = dev_get_platdata(&pdev->dev);
  504. struct device_node *np = pdev->dev.of_node;
  505. struct mvebu_pinctrl *pctl;
  506. void __iomem *base;
  507. struct pinctrl_pin_desc *pdesc;
  508. unsigned gid, n, k;
  509. int ret;
  510. if (!soc || !soc->controls || !soc->modes) {
  511. dev_err(&pdev->dev, "wrong pinctrl soc info\n");
  512. return -EINVAL;
  513. }
  514. base = of_iomap(np, 0);
  515. if (!base) {
  516. dev_err(&pdev->dev, "unable to get base address\n");
  517. return -ENODEV;
  518. }
  519. pctl = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_pinctrl),
  520. GFP_KERNEL);
  521. if (!pctl) {
  522. dev_err(&pdev->dev, "unable to alloc driver\n");
  523. return -ENOMEM;
  524. }
  525. pctl->desc.name = dev_name(&pdev->dev);
  526. pctl->desc.owner = THIS_MODULE;
  527. pctl->desc.pctlops = &mvebu_pinctrl_ops;
  528. pctl->desc.pmxops = &mvebu_pinmux_ops;
  529. pctl->desc.confops = &mvebu_pinconf_ops;
  530. pctl->variant = soc->variant;
  531. pctl->base = base;
  532. pctl->dev = &pdev->dev;
  533. platform_set_drvdata(pdev, pctl);
  534. /* count controls and create names for mvebu generic
  535. register controls; also does sanity checks */
  536. pctl->num_groups = 0;
  537. pctl->desc.npins = 0;
  538. for (n = 0; n < soc->ncontrols; n++) {
  539. struct mvebu_mpp_ctrl *ctrl = &soc->controls[n];
  540. char *names;
  541. pctl->desc.npins += ctrl->npins;
  542. /* initial control pins */
  543. for (k = 0; k < ctrl->npins; k++)
  544. ctrl->pins[k] = ctrl->pid + k;
  545. /* special soc specific control */
  546. if (ctrl->mpp_get || ctrl->mpp_set) {
  547. if (!ctrl->name || !ctrl->mpp_get || !ctrl->mpp_set) {
  548. dev_err(&pdev->dev, "wrong soc control info\n");
  549. return -EINVAL;
  550. }
  551. pctl->num_groups += 1;
  552. continue;
  553. }
  554. /* generic mvebu register control */
  555. names = devm_kzalloc(&pdev->dev, ctrl->npins * 8, GFP_KERNEL);
  556. if (!names) {
  557. dev_err(&pdev->dev, "failed to alloc mpp names\n");
  558. return -ENOMEM;
  559. }
  560. for (k = 0; k < ctrl->npins; k++)
  561. sprintf(names + 8*k, "mpp%d", ctrl->pid+k);
  562. ctrl->name = names;
  563. pctl->num_groups += ctrl->npins;
  564. }
  565. pdesc = devm_kzalloc(&pdev->dev, pctl->desc.npins *
  566. sizeof(struct pinctrl_pin_desc), GFP_KERNEL);
  567. if (!pdesc) {
  568. dev_err(&pdev->dev, "failed to alloc pinctrl pins\n");
  569. return -ENOMEM;
  570. }
  571. for (n = 0; n < pctl->desc.npins; n++)
  572. pdesc[n].number = n;
  573. pctl->desc.pins = pdesc;
  574. pctl->groups = devm_kzalloc(&pdev->dev, pctl->num_groups *
  575. sizeof(struct mvebu_pinctrl_group), GFP_KERNEL);
  576. if (!pctl->groups) {
  577. dev_err(&pdev->dev, "failed to alloc pinctrl groups\n");
  578. return -ENOMEM;
  579. }
  580. /* assign mpp controls to groups */
  581. gid = 0;
  582. for (n = 0; n < soc->ncontrols; n++) {
  583. struct mvebu_mpp_ctrl *ctrl = &soc->controls[n];
  584. pctl->groups[gid].gid = gid;
  585. pctl->groups[gid].ctrl = ctrl;
  586. pctl->groups[gid].name = ctrl->name;
  587. pctl->groups[gid].pins = ctrl->pins;
  588. pctl->groups[gid].npins = ctrl->npins;
  589. /* generic mvebu register control maps to a number of groups */
  590. if (!ctrl->mpp_get && !ctrl->mpp_set) {
  591. pctl->groups[gid].npins = 1;
  592. for (k = 1; k < ctrl->npins; k++) {
  593. gid++;
  594. pctl->groups[gid].gid = gid;
  595. pctl->groups[gid].ctrl = ctrl;
  596. pctl->groups[gid].name = &ctrl->name[8*k];
  597. pctl->groups[gid].pins = &ctrl->pins[k];
  598. pctl->groups[gid].npins = 1;
  599. }
  600. }
  601. gid++;
  602. }
  603. /* assign mpp modes to groups */
  604. for (n = 0; n < soc->nmodes; n++) {
  605. struct mvebu_mpp_mode *mode = &soc->modes[n];
  606. struct mvebu_pinctrl_group *grp =
  607. mvebu_pinctrl_find_group_by_pid(pctl, mode->pid);
  608. unsigned num_settings;
  609. if (!grp) {
  610. dev_warn(&pdev->dev, "unknown pinctrl group %d\n",
  611. mode->pid);
  612. continue;
  613. }
  614. for (num_settings = 0; ;) {
  615. struct mvebu_mpp_ctrl_setting *set =
  616. &mode->settings[num_settings];
  617. if (!set->name)
  618. break;
  619. num_settings++;
  620. /* skip unsupported settings for this variant */
  621. if (pctl->variant && !(pctl->variant & set->variant))
  622. continue;
  623. /* find gpio/gpo/gpi settings */
  624. if (strcmp(set->name, "gpio") == 0)
  625. set->flags = MVEBU_SETTING_GPI |
  626. MVEBU_SETTING_GPO;
  627. else if (strcmp(set->name, "gpo") == 0)
  628. set->flags = MVEBU_SETTING_GPO;
  629. else if (strcmp(set->name, "gpi") == 0)
  630. set->flags = MVEBU_SETTING_GPI;
  631. }
  632. grp->settings = mode->settings;
  633. grp->num_settings = num_settings;
  634. }
  635. ret = mvebu_pinctrl_build_functions(pdev, pctl);
  636. if (ret) {
  637. dev_err(&pdev->dev, "unable to build functions\n");
  638. return ret;
  639. }
  640. pctl->pctldev = pinctrl_register(&pctl->desc, &pdev->dev, pctl);
  641. if (!pctl->pctldev) {
  642. dev_err(&pdev->dev, "unable to register pinctrl driver\n");
  643. return -EINVAL;
  644. }
  645. dev_info(&pdev->dev, "registered pinctrl driver\n");
  646. /* register gpio ranges */
  647. for (n = 0; n < soc->ngpioranges; n++)
  648. pinctrl_add_gpio_range(pctl->pctldev, &soc->gpioranges[n]);
  649. return 0;
  650. }
  651. int mvebu_pinctrl_remove(struct platform_device *pdev)
  652. {
  653. struct mvebu_pinctrl *pctl = platform_get_drvdata(pdev);
  654. pinctrl_unregister(pctl->pctldev);
  655. return 0;
  656. }