pinctrl-zynqmp.c 25 KB

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