pinctrl-zynqmp.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * ZynqMP pin controller
  4. *
  5. * Copyright (C) 2020, 2021 Xilinx, Inc.
  6. *
  7. * Sai Krishna Potthuri <lakshmi.sai.krishna.potthuri@xilinx.com>
  8. * Rajan Vaja <rajan.vaja@xilinx.com>
  9. */
  10. #include <dt-bindings/pinctrl/pinctrl-zynqmp.h>
  11. #include <linux/bitmap.h>
  12. #include <linux/init.h>
  13. #include <linux/module.h>
  14. #include <linux/of_address.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/firmware/xlnx-zynqmp.h>
  17. #include <linux/pinctrl/pinconf-generic.h>
  18. #include <linux/pinctrl/pinconf.h>
  19. #include <linux/pinctrl/pinctrl.h>
  20. #include <linux/pinctrl/pinmux.h>
  21. #include "core.h"
  22. #include "pinctrl-utils.h"
  23. #define ZYNQMP_PIN_PREFIX "MIO"
  24. #define PINCTRL_GET_FUNC_NAME_RESP_LEN 16
  25. #define MAX_FUNC_NAME_LEN 16
  26. #define MAX_GROUP_PIN 50
  27. #define MAX_PIN_GROUPS 50
  28. #define END_OF_FUNCTIONS "END_OF_FUNCTIONS"
  29. #define NUM_GROUPS_PER_RESP 6
  30. #define PINCTRL_GET_FUNC_GROUPS_RESP_LEN 12
  31. #define PINCTRL_GET_PIN_GROUPS_RESP_LEN 12
  32. #define NA_GROUP 0xFFFF
  33. #define RESERVED_GROUP 0xFFFE
  34. #define DRIVE_STRENGTH_2MA 2
  35. #define DRIVE_STRENGTH_4MA 4
  36. #define DRIVE_STRENGTH_8MA 8
  37. #define DRIVE_STRENGTH_12MA 12
  38. /**
  39. * struct zynqmp_pmux_function - a pinmux function
  40. * @name: Name of the pin mux function
  41. * @groups: List of pin groups for this function
  42. * @ngroups: Number of entries in @groups
  43. *
  44. * This structure holds information about pin control function
  45. * and function group names supporting that function.
  46. */
  47. struct zynqmp_pmux_function {
  48. char name[MAX_FUNC_NAME_LEN];
  49. const char * const *groups;
  50. unsigned int ngroups;
  51. };
  52. /**
  53. * struct zynqmp_pinctrl - driver data
  54. * @pctrl: Pin control device
  55. * @groups: Pin groups
  56. * @ngroups: Number of @groups
  57. * @funcs: Pin mux functions
  58. * @nfuncs: Number of @funcs
  59. *
  60. * This struct is stored as driver data and used to retrieve
  61. * information regarding pin control functions, groups and
  62. * group pins.
  63. */
  64. struct zynqmp_pinctrl {
  65. struct pinctrl_dev *pctrl;
  66. const struct zynqmp_pctrl_group *groups;
  67. unsigned int ngroups;
  68. const struct zynqmp_pmux_function *funcs;
  69. unsigned int nfuncs;
  70. };
  71. /**
  72. * struct zynqmp_pctrl_group - Pin control group info
  73. * @name: Group name
  74. * @pins: Group pin numbers
  75. * @npins: Number of pins in the group
  76. */
  77. struct zynqmp_pctrl_group {
  78. const char *name;
  79. unsigned int pins[MAX_GROUP_PIN];
  80. unsigned int npins;
  81. };
  82. static struct pinctrl_desc zynqmp_desc;
  83. static int zynqmp_pctrl_get_groups_count(struct pinctrl_dev *pctldev)
  84. {
  85. struct zynqmp_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  86. return pctrl->ngroups + zynqmp_desc.npins;
  87. }
  88. static const char *zynqmp_pctrl_get_group_name(struct pinctrl_dev *pctldev,
  89. unsigned int selector)
  90. {
  91. struct zynqmp_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  92. if (selector < pctrl->ngroups)
  93. return pctrl->groups[selector].name;
  94. return zynqmp_desc.pins[selector - pctrl->ngroups].name;
  95. }
  96. static int zynqmp_pctrl_get_group_pins(struct pinctrl_dev *pctldev,
  97. unsigned int selector,
  98. const unsigned int **pins,
  99. unsigned int *npins)
  100. {
  101. struct zynqmp_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  102. if (selector < pctrl->ngroups) {
  103. *pins = pctrl->groups[selector].pins;
  104. *npins = pctrl->groups[selector].npins;
  105. } else {
  106. *pins = &zynqmp_desc.pins[selector - pctrl->ngroups].number;
  107. *npins = 1;
  108. }
  109. return 0;
  110. }
  111. static const struct pinctrl_ops zynqmp_pctrl_ops = {
  112. .get_groups_count = zynqmp_pctrl_get_groups_count,
  113. .get_group_name = zynqmp_pctrl_get_group_name,
  114. .get_group_pins = zynqmp_pctrl_get_group_pins,
  115. .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
  116. .dt_free_map = pinctrl_utils_free_map,
  117. };
  118. static int zynqmp_pinmux_request_pin(struct pinctrl_dev *pctldev,
  119. unsigned int pin)
  120. {
  121. int ret;
  122. ret = zynqmp_pm_pinctrl_request(pin);
  123. if (ret) {
  124. dev_err(pctldev->dev, "request failed for pin %u\n", pin);
  125. return ret;
  126. }
  127. return 0;
  128. }
  129. static int zynqmp_pmux_get_functions_count(struct pinctrl_dev *pctldev)
  130. {
  131. struct zynqmp_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  132. return pctrl->nfuncs;
  133. }
  134. static const char *zynqmp_pmux_get_function_name(struct pinctrl_dev *pctldev,
  135. unsigned int selector)
  136. {
  137. struct zynqmp_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  138. return pctrl->funcs[selector].name;
  139. }
  140. /**
  141. * zynqmp_pmux_get_function_groups() - Get groups for the function
  142. * @pctldev: Pincontrol device pointer.
  143. * @selector: Function ID
  144. * @groups: Group names.
  145. * @num_groups: Number of function groups.
  146. *
  147. * Get function's group count and group names.
  148. *
  149. * Return: 0
  150. */
  151. static int zynqmp_pmux_get_function_groups(struct pinctrl_dev *pctldev,
  152. unsigned int selector,
  153. const char * const **groups,
  154. unsigned * const num_groups)
  155. {
  156. struct zynqmp_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  157. *groups = pctrl->funcs[selector].groups;
  158. *num_groups = pctrl->funcs[selector].ngroups;
  159. return 0;
  160. }
  161. /**
  162. * zynqmp_pinmux_set_mux() - Set requested function for the group
  163. * @pctldev: Pincontrol device pointer.
  164. * @function: Function ID.
  165. * @group: Group ID.
  166. *
  167. * Loop through all pins of the group and call firmware API
  168. * to set requested function for all pins in the group.
  169. *
  170. * Return: 0 on success else error code.
  171. */
  172. static int zynqmp_pinmux_set_mux(struct pinctrl_dev *pctldev,
  173. unsigned int function,
  174. unsigned int group)
  175. {
  176. const unsigned int *pins;
  177. unsigned int npins;
  178. int ret, i;
  179. zynqmp_pctrl_get_group_pins(pctldev, group, &pins, &npins);
  180. for (i = 0; i < npins; i++) {
  181. ret = zynqmp_pm_pinctrl_set_function(pins[i], function);
  182. if (ret) {
  183. dev_err(pctldev->dev, "set mux failed for pin %u\n",
  184. pins[i]);
  185. return ret;
  186. }
  187. }
  188. return 0;
  189. }
  190. static int zynqmp_pinmux_release_pin(struct pinctrl_dev *pctldev,
  191. unsigned int pin)
  192. {
  193. int ret;
  194. ret = zynqmp_pm_pinctrl_release(pin);
  195. if (ret) {
  196. dev_err(pctldev->dev, "free pin failed for pin %u\n",
  197. pin);
  198. return ret;
  199. }
  200. return 0;
  201. }
  202. static const struct pinmux_ops zynqmp_pinmux_ops = {
  203. .request = zynqmp_pinmux_request_pin,
  204. .get_functions_count = zynqmp_pmux_get_functions_count,
  205. .get_function_name = zynqmp_pmux_get_function_name,
  206. .get_function_groups = zynqmp_pmux_get_function_groups,
  207. .set_mux = zynqmp_pinmux_set_mux,
  208. .free = zynqmp_pinmux_release_pin,
  209. };
  210. /**
  211. * zynqmp_pinconf_cfg_get() - get config value for the pin
  212. * @pctldev: Pin control device pointer.
  213. * @pin: Pin number.
  214. * @config: Value of config param.
  215. *
  216. * Get value of the requested configuration parameter for the
  217. * given pin.
  218. *
  219. * Return: 0 on success else error code.
  220. */
  221. static int zynqmp_pinconf_cfg_get(struct pinctrl_dev *pctldev,
  222. unsigned int pin,
  223. unsigned long *config)
  224. {
  225. unsigned int arg, param = pinconf_to_config_param(*config);
  226. int ret;
  227. switch (param) {
  228. case PIN_CONFIG_SLEW_RATE:
  229. param = PM_PINCTRL_CONFIG_SLEW_RATE;
  230. ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg);
  231. break;
  232. case PIN_CONFIG_BIAS_PULL_UP:
  233. param = PM_PINCTRL_CONFIG_PULL_CTRL;
  234. ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg);
  235. if (arg != PM_PINCTRL_BIAS_PULL_UP)
  236. return -EINVAL;
  237. arg = 1;
  238. break;
  239. case PIN_CONFIG_BIAS_PULL_DOWN:
  240. param = PM_PINCTRL_CONFIG_PULL_CTRL;
  241. ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg);
  242. if (arg != PM_PINCTRL_BIAS_PULL_DOWN)
  243. return -EINVAL;
  244. arg = 1;
  245. break;
  246. case PIN_CONFIG_BIAS_DISABLE:
  247. param = PM_PINCTRL_CONFIG_BIAS_STATUS;
  248. ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg);
  249. if (arg != PM_PINCTRL_BIAS_DISABLE)
  250. return -EINVAL;
  251. arg = 1;
  252. break;
  253. case PIN_CONFIG_POWER_SOURCE:
  254. param = PM_PINCTRL_CONFIG_VOLTAGE_STATUS;
  255. ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg);
  256. break;
  257. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  258. param = PM_PINCTRL_CONFIG_SCHMITT_CMOS;
  259. ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg);
  260. break;
  261. case PIN_CONFIG_DRIVE_STRENGTH:
  262. param = PM_PINCTRL_CONFIG_DRIVE_STRENGTH;
  263. ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg);
  264. switch (arg) {
  265. case PM_PINCTRL_DRIVE_STRENGTH_2MA:
  266. arg = DRIVE_STRENGTH_2MA;
  267. break;
  268. case PM_PINCTRL_DRIVE_STRENGTH_4MA:
  269. arg = DRIVE_STRENGTH_4MA;
  270. break;
  271. case PM_PINCTRL_DRIVE_STRENGTH_8MA:
  272. arg = DRIVE_STRENGTH_8MA;
  273. break;
  274. case PM_PINCTRL_DRIVE_STRENGTH_12MA:
  275. arg = DRIVE_STRENGTH_12MA;
  276. break;
  277. default:
  278. /* Invalid drive strength */
  279. dev_warn(pctldev->dev,
  280. "Invalid drive strength for pin %d\n",
  281. pin);
  282. return -EINVAL;
  283. }
  284. break;
  285. default:
  286. ret = -ENOTSUPP;
  287. break;
  288. }
  289. if (ret)
  290. return ret;
  291. param = pinconf_to_config_param(*config);
  292. *config = pinconf_to_config_packed(param, arg);
  293. return 0;
  294. }
  295. /**
  296. * zynqmp_pinconf_cfg_set() - Set requested config for the pin
  297. * @pctldev: Pincontrol device pointer.
  298. * @pin: Pin number.
  299. * @configs: Configuration to set.
  300. * @num_configs: Number of configurations.
  301. *
  302. * Loop through all configurations and call firmware API
  303. * to set requested configurations for the pin.
  304. *
  305. * Return: 0 on success else error code.
  306. */
  307. static int zynqmp_pinconf_cfg_set(struct pinctrl_dev *pctldev,
  308. unsigned int pin, unsigned long *configs,
  309. unsigned int num_configs)
  310. {
  311. int i, ret;
  312. for (i = 0; i < num_configs; i++) {
  313. unsigned int param = pinconf_to_config_param(configs[i]);
  314. unsigned int arg = pinconf_to_config_argument(configs[i]);
  315. unsigned int value;
  316. switch (param) {
  317. case PIN_CONFIG_SLEW_RATE:
  318. param = PM_PINCTRL_CONFIG_SLEW_RATE;
  319. ret = zynqmp_pm_pinctrl_set_config(pin, param, arg);
  320. break;
  321. case PIN_CONFIG_BIAS_PULL_UP:
  322. param = PM_PINCTRL_CONFIG_PULL_CTRL;
  323. arg = PM_PINCTRL_BIAS_PULL_UP;
  324. ret = zynqmp_pm_pinctrl_set_config(pin, param, arg);
  325. break;
  326. case PIN_CONFIG_BIAS_PULL_DOWN:
  327. param = PM_PINCTRL_CONFIG_PULL_CTRL;
  328. arg = PM_PINCTRL_BIAS_PULL_DOWN;
  329. ret = zynqmp_pm_pinctrl_set_config(pin, param, arg);
  330. break;
  331. case PIN_CONFIG_BIAS_DISABLE:
  332. param = PM_PINCTRL_CONFIG_BIAS_STATUS;
  333. arg = PM_PINCTRL_BIAS_DISABLE;
  334. ret = zynqmp_pm_pinctrl_set_config(pin, param, arg);
  335. break;
  336. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  337. param = PM_PINCTRL_CONFIG_SCHMITT_CMOS;
  338. ret = zynqmp_pm_pinctrl_set_config(pin, param, arg);
  339. break;
  340. case PIN_CONFIG_DRIVE_STRENGTH:
  341. switch (arg) {
  342. case DRIVE_STRENGTH_2MA:
  343. value = PM_PINCTRL_DRIVE_STRENGTH_2MA;
  344. break;
  345. case DRIVE_STRENGTH_4MA:
  346. value = PM_PINCTRL_DRIVE_STRENGTH_4MA;
  347. break;
  348. case DRIVE_STRENGTH_8MA:
  349. value = PM_PINCTRL_DRIVE_STRENGTH_8MA;
  350. break;
  351. case DRIVE_STRENGTH_12MA:
  352. value = PM_PINCTRL_DRIVE_STRENGTH_12MA;
  353. break;
  354. default:
  355. /* Invalid drive strength */
  356. dev_warn(pctldev->dev,
  357. "Invalid drive strength for pin %d\n",
  358. pin);
  359. return -EINVAL;
  360. }
  361. param = PM_PINCTRL_CONFIG_DRIVE_STRENGTH;
  362. ret = zynqmp_pm_pinctrl_set_config(pin, param, value);
  363. break;
  364. case PIN_CONFIG_POWER_SOURCE:
  365. param = PM_PINCTRL_CONFIG_VOLTAGE_STATUS;
  366. ret = zynqmp_pm_pinctrl_get_config(pin, param, &value);
  367. if (arg != value)
  368. dev_warn(pctldev->dev,
  369. "Invalid IO Standard requested for pin %d\n",
  370. pin);
  371. break;
  372. case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
  373. param = PM_PINCTRL_CONFIG_TRI_STATE;
  374. arg = PM_PINCTRL_TRI_STATE_ENABLE;
  375. ret = zynqmp_pm_pinctrl_set_config(pin, param, arg);
  376. break;
  377. case PIN_CONFIG_MODE_LOW_POWER:
  378. /*
  379. * These cases are mentioned in dts but configurable
  380. * registers are unknown. So falling through to ignore
  381. * boot time warnings as of now.
  382. */
  383. ret = 0;
  384. break;
  385. case PIN_CONFIG_OUTPUT_ENABLE:
  386. param = PM_PINCTRL_CONFIG_TRI_STATE;
  387. arg = PM_PINCTRL_TRI_STATE_DISABLE;
  388. ret = zynqmp_pm_pinctrl_set_config(pin, param, arg);
  389. break;
  390. default:
  391. dev_warn(pctldev->dev,
  392. "unsupported configuration parameter '%u'\n",
  393. param);
  394. ret = -ENOTSUPP;
  395. break;
  396. }
  397. param = pinconf_to_config_param(configs[i]);
  398. arg = pinconf_to_config_argument(configs[i]);
  399. if (ret)
  400. dev_warn(pctldev->dev,
  401. "failed to set: pin %u param %u value %u\n",
  402. pin, param, arg);
  403. }
  404. return 0;
  405. }
  406. /**
  407. * zynqmp_pinconf_group_set() - Set requested config for the group
  408. * @pctldev: Pincontrol device pointer.
  409. * @selector: Group ID.
  410. * @configs: Configuration to set.
  411. * @num_configs: Number of configurations.
  412. *
  413. * Call function to set configs for each pin in the group.
  414. *
  415. * Return: 0 on success else error code.
  416. */
  417. static int zynqmp_pinconf_group_set(struct pinctrl_dev *pctldev,
  418. unsigned int selector,
  419. unsigned long *configs,
  420. unsigned int num_configs)
  421. {
  422. const unsigned int *pins;
  423. unsigned int npins;
  424. int i, ret;
  425. zynqmp_pctrl_get_group_pins(pctldev, selector, &pins, &npins);
  426. for (i = 0; i < npins; i++) {
  427. ret = zynqmp_pinconf_cfg_set(pctldev, pins[i], configs,
  428. num_configs);
  429. if (ret)
  430. return ret;
  431. }
  432. return 0;
  433. }
  434. static const struct pinconf_ops zynqmp_pinconf_ops = {
  435. .is_generic = true,
  436. .pin_config_get = zynqmp_pinconf_cfg_get,
  437. .pin_config_set = zynqmp_pinconf_cfg_set,
  438. .pin_config_group_set = zynqmp_pinconf_group_set,
  439. };
  440. static struct pinctrl_desc zynqmp_desc = {
  441. .name = "zynqmp_pinctrl",
  442. .owner = THIS_MODULE,
  443. .pctlops = &zynqmp_pctrl_ops,
  444. .pmxops = &zynqmp_pinmux_ops,
  445. .confops = &zynqmp_pinconf_ops,
  446. };
  447. static int zynqmp_pinctrl_get_function_groups(u32 fid, u32 index, u16 *groups)
  448. {
  449. struct zynqmp_pm_query_data qdata = {0};
  450. u32 payload[PAYLOAD_ARG_CNT];
  451. int ret;
  452. qdata.qid = PM_QID_PINCTRL_GET_FUNCTION_GROUPS;
  453. qdata.arg1 = fid;
  454. qdata.arg2 = index;
  455. ret = zynqmp_pm_query_data(qdata, payload);
  456. if (ret)
  457. return ret;
  458. memcpy(groups, &payload[1], PINCTRL_GET_FUNC_GROUPS_RESP_LEN);
  459. return 0;
  460. }
  461. static int zynqmp_pinctrl_get_func_num_groups(u32 fid, unsigned int *ngroups)
  462. {
  463. struct zynqmp_pm_query_data qdata = {0};
  464. u32 payload[PAYLOAD_ARG_CNT];
  465. int ret;
  466. qdata.qid = PM_QID_PINCTRL_GET_NUM_FUNCTION_GROUPS;
  467. qdata.arg1 = fid;
  468. ret = zynqmp_pm_query_data(qdata, payload);
  469. if (ret)
  470. return ret;
  471. *ngroups = payload[1];
  472. return 0;
  473. }
  474. /**
  475. * zynqmp_pinctrl_prepare_func_groups() - prepare function and groups data
  476. * @dev: Device pointer.
  477. * @fid: Function ID.
  478. * @func: Function data.
  479. * @groups: Groups data.
  480. *
  481. * Query firmware to get group IDs for each function. Firmware returns
  482. * group IDs. Based on the group index for the function, group names in
  483. * the function are stored. For example, the first group in "eth0" function
  484. * is named as "eth0_0" and the second group as "eth0_1" and so on.
  485. *
  486. * Based on the group ID received from the firmware, function stores name of
  487. * the group for that group ID. For example, if "eth0" first group ID
  488. * is x, groups[x] name will be stored as "eth0_0".
  489. *
  490. * Once done for each function, each function would have its group names
  491. * and each group would also have their names.
  492. *
  493. * Return: 0 on success else error code.
  494. */
  495. static int zynqmp_pinctrl_prepare_func_groups(struct device *dev, u32 fid,
  496. struct zynqmp_pmux_function *func,
  497. struct zynqmp_pctrl_group *groups)
  498. {
  499. u16 resp[NUM_GROUPS_PER_RESP] = {0};
  500. const char **fgroups;
  501. int ret, index, i, pin;
  502. unsigned int npins;
  503. unsigned long *used_pins __free(bitmap) =
  504. bitmap_zalloc(zynqmp_desc.npins, GFP_KERNEL);
  505. if (!used_pins)
  506. return -ENOMEM;
  507. for (index = 0; index < func->ngroups; index += NUM_GROUPS_PER_RESP) {
  508. ret = zynqmp_pinctrl_get_function_groups(fid, index, resp);
  509. if (ret)
  510. return ret;
  511. for (i = 0; i < NUM_GROUPS_PER_RESP; i++) {
  512. if (resp[i] == NA_GROUP)
  513. goto done;
  514. if (resp[i] == RESERVED_GROUP)
  515. continue;
  516. groups[resp[i]].name = devm_kasprintf(dev, GFP_KERNEL,
  517. "%s_%d_grp",
  518. func->name,
  519. index + i);
  520. if (!groups[resp[i]].name)
  521. return -ENOMEM;
  522. for (pin = 0; pin < groups[resp[i]].npins; pin++)
  523. __set_bit(groups[resp[i]].pins[pin], used_pins);
  524. }
  525. }
  526. done:
  527. npins = bitmap_weight(used_pins, zynqmp_desc.npins);
  528. fgroups = devm_kcalloc(dev, size_add(func->ngroups, npins),
  529. sizeof(*fgroups), GFP_KERNEL);
  530. if (!fgroups)
  531. return -ENOMEM;
  532. for (i = 0; i < func->ngroups; i++) {
  533. fgroups[i] = devm_kasprintf(dev, GFP_KERNEL, "%s_%d_grp",
  534. func->name, i);
  535. if (!fgroups[i])
  536. return -ENOMEM;
  537. }
  538. pin = 0;
  539. for_each_set_bit(pin, used_pins, zynqmp_desc.npins)
  540. fgroups[i++] = zynqmp_desc.pins[pin].name;
  541. func->groups = fgroups;
  542. func->ngroups += npins;
  543. return 0;
  544. }
  545. static void zynqmp_pinctrl_get_function_name(u32 fid, char *name)
  546. {
  547. struct zynqmp_pm_query_data qdata = {0};
  548. u32 payload[PAYLOAD_ARG_CNT];
  549. qdata.qid = PM_QID_PINCTRL_GET_FUNCTION_NAME;
  550. qdata.arg1 = fid;
  551. /*
  552. * Name of the function is maximum 16 bytes and cannot
  553. * accommodate the return value in SMC buffers, hence ignoring
  554. * the return value for this specific qid.
  555. */
  556. zynqmp_pm_query_data(qdata, payload);
  557. memcpy(name, payload, PINCTRL_GET_FUNC_NAME_RESP_LEN);
  558. }
  559. static int zynqmp_pinctrl_get_num_functions(unsigned int *nfuncs)
  560. {
  561. struct zynqmp_pm_query_data qdata = {0};
  562. u32 payload[PAYLOAD_ARG_CNT];
  563. int ret;
  564. qdata.qid = PM_QID_PINCTRL_GET_NUM_FUNCTIONS;
  565. ret = zynqmp_pm_query_data(qdata, payload);
  566. if (ret)
  567. return ret;
  568. *nfuncs = payload[1];
  569. return 0;
  570. }
  571. static int zynqmp_pinctrl_get_pin_groups(u32 pin, u32 index, u16 *groups)
  572. {
  573. struct zynqmp_pm_query_data qdata = {0};
  574. u32 payload[PAYLOAD_ARG_CNT];
  575. int ret;
  576. qdata.qid = PM_QID_PINCTRL_GET_PIN_GROUPS;
  577. qdata.arg1 = pin;
  578. qdata.arg2 = index;
  579. ret = zynqmp_pm_query_data(qdata, payload);
  580. if (ret)
  581. return ret;
  582. memcpy(groups, &payload[1], PINCTRL_GET_PIN_GROUPS_RESP_LEN);
  583. return 0;
  584. }
  585. static void zynqmp_pinctrl_group_add_pin(struct zynqmp_pctrl_group *group,
  586. unsigned int pin)
  587. {
  588. group->pins[group->npins++] = pin;
  589. }
  590. /**
  591. * zynqmp_pinctrl_create_pin_groups() - assign pins to respective groups
  592. * @dev: Device pointer.
  593. * @groups: Groups data.
  594. * @pin: Pin number.
  595. *
  596. * Query firmware to get groups available for the given pin.
  597. * Based on the firmware response(group IDs for the pin), add
  598. * pin number to the respective group's pin array.
  599. *
  600. * Once all pins are queries, each group would have its number
  601. * of pins and pin numbers data.
  602. *
  603. * Return: 0 on success else error code.
  604. */
  605. static int zynqmp_pinctrl_create_pin_groups(struct device *dev,
  606. struct zynqmp_pctrl_group *groups,
  607. unsigned int pin)
  608. {
  609. u16 resp[NUM_GROUPS_PER_RESP] = {0};
  610. int ret, i, index = 0;
  611. do {
  612. ret = zynqmp_pinctrl_get_pin_groups(pin, index, resp);
  613. if (ret)
  614. return ret;
  615. for (i = 0; i < NUM_GROUPS_PER_RESP; i++) {
  616. if (resp[i] == NA_GROUP)
  617. return ret;
  618. if (resp[i] == RESERVED_GROUP)
  619. continue;
  620. zynqmp_pinctrl_group_add_pin(&groups[resp[i]], pin);
  621. }
  622. index += NUM_GROUPS_PER_RESP;
  623. } while (index <= MAX_PIN_GROUPS);
  624. return 0;
  625. }
  626. /**
  627. * zynqmp_pinctrl_prepare_group_pins() - prepare each group's pin data
  628. * @dev: Device pointer.
  629. * @groups: Groups data.
  630. * @ngroups: Number of groups.
  631. *
  632. * Prepare pin number and number of pins data for each pins.
  633. *
  634. * Return: 0 on success else error code.
  635. */
  636. static int zynqmp_pinctrl_prepare_group_pins(struct device *dev,
  637. struct zynqmp_pctrl_group *groups,
  638. unsigned int ngroups)
  639. {
  640. unsigned int pin;
  641. int ret;
  642. for (pin = 0; pin < zynqmp_desc.npins; pin++) {
  643. ret = zynqmp_pinctrl_create_pin_groups(dev, groups, zynqmp_desc.pins[pin].number);
  644. if (ret)
  645. return ret;
  646. }
  647. return 0;
  648. }
  649. /**
  650. * zynqmp_pinctrl_prepare_function_info() - prepare function info
  651. * @dev: Device pointer.
  652. * @pctrl: Pin control driver data.
  653. *
  654. * Query firmware for functions, groups and pin information and
  655. * prepare pin control driver data.
  656. *
  657. * Query number of functions and number of function groups (number
  658. * of groups in the given function) to allocate required memory buffers
  659. * for functions and groups. Once buffers are allocated to store
  660. * functions and groups data, query and store required information
  661. * (number of groups and group names for each function, number of
  662. * pins and pin numbers for each group).
  663. *
  664. * Return: 0 on success else error code.
  665. */
  666. static int zynqmp_pinctrl_prepare_function_info(struct device *dev,
  667. struct zynqmp_pinctrl *pctrl)
  668. {
  669. struct zynqmp_pmux_function *funcs;
  670. struct zynqmp_pctrl_group *groups;
  671. int ret, i;
  672. ret = zynqmp_pinctrl_get_num_functions(&pctrl->nfuncs);
  673. if (ret)
  674. return ret;
  675. funcs = devm_kcalloc(dev, pctrl->nfuncs, sizeof(*funcs), GFP_KERNEL);
  676. if (!funcs)
  677. return -ENOMEM;
  678. for (i = 0; i < pctrl->nfuncs; i++) {
  679. zynqmp_pinctrl_get_function_name(i, funcs[i].name);
  680. ret = zynqmp_pinctrl_get_func_num_groups(i, &funcs[i].ngroups);
  681. if (ret)
  682. return ret;
  683. pctrl->ngroups += funcs[i].ngroups;
  684. }
  685. groups = devm_kcalloc(dev, pctrl->ngroups, sizeof(*groups), GFP_KERNEL);
  686. if (!groups)
  687. return -ENOMEM;
  688. ret = zynqmp_pinctrl_prepare_group_pins(dev, groups, pctrl->ngroups);
  689. if (ret)
  690. return ret;
  691. for (i = 0; i < pctrl->nfuncs; i++) {
  692. ret = zynqmp_pinctrl_prepare_func_groups(dev, i, &funcs[i],
  693. groups);
  694. if (ret)
  695. return ret;
  696. }
  697. pctrl->funcs = funcs;
  698. pctrl->groups = groups;
  699. return 0;
  700. }
  701. static int zynqmp_pinctrl_get_num_pins(unsigned int *npins)
  702. {
  703. struct zynqmp_pm_query_data qdata = {0};
  704. u32 payload[PAYLOAD_ARG_CNT];
  705. int ret;
  706. qdata.qid = PM_QID_PINCTRL_GET_NUM_PINS;
  707. ret = zynqmp_pm_query_data(qdata, payload);
  708. if (ret)
  709. return ret;
  710. *npins = payload[1];
  711. return 0;
  712. }
  713. /**
  714. * zynqmp_pinctrl_prepare_pin_desc() - prepare pin description info
  715. * @dev: Device pointer.
  716. * @zynqmp_pins: Pin information.
  717. * @npins: Number of pins.
  718. *
  719. * Query number of pins information from firmware and prepare pin
  720. * description containing pin number and pin name.
  721. *
  722. * Return: 0 on success else error code.
  723. */
  724. static int zynqmp_pinctrl_prepare_pin_desc(struct device *dev,
  725. const struct pinctrl_pin_desc
  726. **zynqmp_pins,
  727. unsigned int *npins)
  728. {
  729. struct pinctrl_pin_desc *pins, *pin;
  730. int ret;
  731. int i;
  732. ret = zynqmp_pinctrl_get_num_pins(npins);
  733. if (ret)
  734. return ret;
  735. pins = devm_kcalloc(dev, *npins, sizeof(*pins), GFP_KERNEL);
  736. if (!pins)
  737. return -ENOMEM;
  738. for (i = 0; i < *npins; i++) {
  739. pin = &pins[i];
  740. pin->number = i;
  741. pin->name = devm_kasprintf(dev, GFP_KERNEL, "%s%d",
  742. ZYNQMP_PIN_PREFIX, i);
  743. if (!pin->name)
  744. return -ENOMEM;
  745. }
  746. *zynqmp_pins = pins;
  747. return 0;
  748. }
  749. static int zynqmp_pinctrl_probe(struct platform_device *pdev)
  750. {
  751. struct zynqmp_pinctrl *pctrl;
  752. int ret;
  753. pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
  754. if (!pctrl)
  755. return -ENOMEM;
  756. ret = zynqmp_pinctrl_prepare_pin_desc(&pdev->dev,
  757. &zynqmp_desc.pins,
  758. &zynqmp_desc.npins);
  759. if (ret) {
  760. dev_err(&pdev->dev, "pin desc prepare fail with %d\n", ret);
  761. return ret;
  762. }
  763. ret = zynqmp_pinctrl_prepare_function_info(&pdev->dev, pctrl);
  764. if (ret) {
  765. dev_err(&pdev->dev, "function info prepare fail with %d\n", ret);
  766. return ret;
  767. }
  768. pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &zynqmp_desc, pctrl);
  769. if (IS_ERR(pctrl->pctrl))
  770. return PTR_ERR(pctrl->pctrl);
  771. platform_set_drvdata(pdev, pctrl);
  772. return ret;
  773. }
  774. static const struct of_device_id zynqmp_pinctrl_of_match[] = {
  775. { .compatible = "xlnx,zynqmp-pinctrl" },
  776. { }
  777. };
  778. MODULE_DEVICE_TABLE(of, zynqmp_pinctrl_of_match);
  779. static struct platform_driver zynqmp_pinctrl_driver = {
  780. .driver = {
  781. .name = "zynqmp-pinctrl",
  782. .of_match_table = zynqmp_pinctrl_of_match,
  783. },
  784. .probe = zynqmp_pinctrl_probe,
  785. };
  786. module_platform_driver(zynqmp_pinctrl_driver);
  787. MODULE_AUTHOR("Sai Krishna Potthuri <lakshmi.sai.krishna.potthuri@xilinx.com>");
  788. MODULE_DESCRIPTION("ZynqMP Pin Controller Driver");
  789. MODULE_LICENSE("GPL v2");