pinctrl-scmi.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * System Control and Power Interface (SCMI) Protocol based pinctrl driver
  4. *
  5. * Copyright (C) 2024 EPAM
  6. * Copyright 2024 NXP
  7. */
  8. #include <linux/device.h>
  9. #include <linux/err.h>
  10. #include <linux/errno.h>
  11. #include <linux/module.h>
  12. #include <linux/mod_devicetable.h>
  13. #include <linux/of.h>
  14. #include <linux/scmi_protocol.h>
  15. #include <linux/slab.h>
  16. #include <linux/types.h>
  17. #include <linux/pinctrl/machine.h>
  18. #include <linux/pinctrl/pinconf.h>
  19. #include <linux/pinctrl/pinconf-generic.h>
  20. #include <linux/pinctrl/pinctrl.h>
  21. #include <linux/pinctrl/pinmux.h>
  22. #include "pinctrl-utils.h"
  23. #include "core.h"
  24. #include "pinconf.h"
  25. #define DRV_NAME "scmi-pinctrl"
  26. /* Define num configs, if not large than 4 use stack, else use kcalloc() */
  27. #define SCMI_NUM_CONFIGS 4
  28. static const struct scmi_pinctrl_proto_ops *pinctrl_ops;
  29. struct scmi_pinctrl {
  30. struct device *dev;
  31. struct scmi_protocol_handle *ph;
  32. struct pinctrl_dev *pctldev;
  33. struct pinctrl_desc pctl_desc;
  34. struct pinfunction *functions;
  35. unsigned int nr_functions;
  36. };
  37. static int pinctrl_scmi_get_groups_count(struct pinctrl_dev *pctldev)
  38. {
  39. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  40. return pinctrl_ops->count_get(pmx->ph, GROUP_TYPE);
  41. }
  42. static const char *pinctrl_scmi_get_group_name(struct pinctrl_dev *pctldev,
  43. unsigned int selector)
  44. {
  45. int ret;
  46. const char *name;
  47. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  48. ret = pinctrl_ops->name_get(pmx->ph, selector, GROUP_TYPE, &name);
  49. if (ret) {
  50. dev_err(pmx->dev, "get name failed with err %d", ret);
  51. return NULL;
  52. }
  53. return name;
  54. }
  55. static int pinctrl_scmi_get_group_pins(struct pinctrl_dev *pctldev,
  56. unsigned int selector,
  57. const unsigned int **pins,
  58. unsigned int *num_pins)
  59. {
  60. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  61. return pinctrl_ops->group_pins_get(pmx->ph, selector, pins, num_pins);
  62. }
  63. static const struct pinctrl_ops pinctrl_scmi_pinctrl_ops = {
  64. .get_groups_count = pinctrl_scmi_get_groups_count,
  65. .get_group_name = pinctrl_scmi_get_group_name,
  66. .get_group_pins = pinctrl_scmi_get_group_pins,
  67. #ifdef CONFIG_OF
  68. .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
  69. .dt_free_map = pinconf_generic_dt_free_map,
  70. #endif
  71. };
  72. static int pinctrl_scmi_get_functions_count(struct pinctrl_dev *pctldev)
  73. {
  74. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  75. return pinctrl_ops->count_get(pmx->ph, FUNCTION_TYPE);
  76. }
  77. static const char *pinctrl_scmi_get_function_name(struct pinctrl_dev *pctldev,
  78. unsigned int selector)
  79. {
  80. int ret;
  81. const char *name;
  82. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  83. ret = pinctrl_ops->name_get(pmx->ph, selector, FUNCTION_TYPE, &name);
  84. if (ret) {
  85. dev_err(pmx->dev, "get name failed with err %d", ret);
  86. return NULL;
  87. }
  88. return name;
  89. }
  90. static int pinctrl_scmi_get_function_groups(struct pinctrl_dev *pctldev,
  91. unsigned int selector,
  92. const char * const **p_groups,
  93. unsigned int * const p_num_groups)
  94. {
  95. struct pinfunction *func;
  96. const unsigned int *group_ids;
  97. unsigned int num_groups;
  98. const char **groups;
  99. int ret, i;
  100. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  101. if (!p_groups || !p_num_groups)
  102. return -EINVAL;
  103. if (selector >= pmx->nr_functions)
  104. return -EINVAL;
  105. func = &pmx->functions[selector];
  106. if (func->ngroups)
  107. goto done;
  108. ret = pinctrl_ops->function_groups_get(pmx->ph, selector, &num_groups,
  109. &group_ids);
  110. if (ret) {
  111. dev_err(pmx->dev, "Unable to get function groups, err %d", ret);
  112. return ret;
  113. }
  114. if (!num_groups)
  115. return -EINVAL;
  116. groups = kcalloc(num_groups, sizeof(*groups), GFP_KERNEL);
  117. if (!groups)
  118. return -ENOMEM;
  119. for (i = 0; i < num_groups; i++) {
  120. groups[i] = pinctrl_scmi_get_group_name(pctldev, group_ids[i]);
  121. if (!groups[i]) {
  122. ret = -EINVAL;
  123. goto err_free;
  124. }
  125. }
  126. func->ngroups = num_groups;
  127. func->groups = groups;
  128. done:
  129. *p_groups = func->groups;
  130. *p_num_groups = func->ngroups;
  131. return 0;
  132. err_free:
  133. kfree(groups);
  134. return ret;
  135. }
  136. static int pinctrl_scmi_func_set_mux(struct pinctrl_dev *pctldev,
  137. unsigned int selector, unsigned int group)
  138. {
  139. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  140. return pinctrl_ops->mux_set(pmx->ph, selector, group);
  141. }
  142. static int pinctrl_scmi_request(struct pinctrl_dev *pctldev,
  143. unsigned int offset)
  144. {
  145. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  146. return pinctrl_ops->pin_request(pmx->ph, offset);
  147. }
  148. static int pinctrl_scmi_free(struct pinctrl_dev *pctldev, unsigned int offset)
  149. {
  150. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  151. return pinctrl_ops->pin_free(pmx->ph, offset);
  152. }
  153. static const struct pinmux_ops pinctrl_scmi_pinmux_ops = {
  154. .request = pinctrl_scmi_request,
  155. .free = pinctrl_scmi_free,
  156. .get_functions_count = pinctrl_scmi_get_functions_count,
  157. .get_function_name = pinctrl_scmi_get_function_name,
  158. .get_function_groups = pinctrl_scmi_get_function_groups,
  159. .set_mux = pinctrl_scmi_func_set_mux,
  160. };
  161. static int pinctrl_scmi_map_pinconf_type(enum pin_config_param param,
  162. enum scmi_pinctrl_conf_type *type)
  163. {
  164. u32 arg = param;
  165. switch (arg) {
  166. case PIN_CONFIG_BIAS_BUS_HOLD:
  167. *type = SCMI_PIN_BIAS_BUS_HOLD;
  168. break;
  169. case PIN_CONFIG_BIAS_DISABLE:
  170. *type = SCMI_PIN_BIAS_DISABLE;
  171. break;
  172. case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
  173. *type = SCMI_PIN_BIAS_HIGH_IMPEDANCE;
  174. break;
  175. case PIN_CONFIG_BIAS_PULL_DOWN:
  176. *type = SCMI_PIN_BIAS_PULL_DOWN;
  177. break;
  178. case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
  179. *type = SCMI_PIN_BIAS_PULL_DEFAULT;
  180. break;
  181. case PIN_CONFIG_BIAS_PULL_UP:
  182. *type = SCMI_PIN_BIAS_PULL_UP;
  183. break;
  184. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  185. *type = SCMI_PIN_DRIVE_OPEN_DRAIN;
  186. break;
  187. case PIN_CONFIG_DRIVE_OPEN_SOURCE:
  188. *type = SCMI_PIN_DRIVE_OPEN_SOURCE;
  189. break;
  190. case PIN_CONFIG_DRIVE_PUSH_PULL:
  191. *type = SCMI_PIN_DRIVE_PUSH_PULL;
  192. break;
  193. case PIN_CONFIG_DRIVE_STRENGTH:
  194. *type = SCMI_PIN_DRIVE_STRENGTH;
  195. break;
  196. case PIN_CONFIG_DRIVE_STRENGTH_UA:
  197. *type = SCMI_PIN_DRIVE_STRENGTH;
  198. break;
  199. case PIN_CONFIG_INPUT_DEBOUNCE:
  200. *type = SCMI_PIN_INPUT_DEBOUNCE;
  201. break;
  202. case PIN_CONFIG_INPUT_ENABLE:
  203. *type = SCMI_PIN_INPUT_MODE;
  204. break;
  205. case PIN_CONFIG_INPUT_SCHMITT:
  206. *type = SCMI_PIN_INPUT_SCHMITT;
  207. break;
  208. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  209. *type = SCMI_PIN_INPUT_MODE;
  210. break;
  211. case PIN_CONFIG_MODE_LOW_POWER:
  212. *type = SCMI_PIN_LOW_POWER_MODE;
  213. break;
  214. case PIN_CONFIG_LEVEL:
  215. *type = SCMI_PIN_OUTPUT_VALUE;
  216. break;
  217. case PIN_CONFIG_OUTPUT_ENABLE:
  218. *type = SCMI_PIN_OUTPUT_MODE;
  219. break;
  220. case PIN_CONFIG_OUTPUT_IMPEDANCE_OHMS:
  221. *type = SCMI_PIN_OUTPUT_VALUE;
  222. break;
  223. case PIN_CONFIG_POWER_SOURCE:
  224. *type = SCMI_PIN_POWER_SOURCE;
  225. break;
  226. case PIN_CONFIG_SLEW_RATE:
  227. *type = SCMI_PIN_SLEW_RATE;
  228. break;
  229. case SCMI_PIN_OEM_START ... SCMI_PIN_OEM_END:
  230. *type = arg;
  231. break;
  232. default:
  233. return -EINVAL;
  234. }
  235. return 0;
  236. }
  237. static int pinctrl_scmi_pinconf_get(struct pinctrl_dev *pctldev,
  238. unsigned int pin, unsigned long *config)
  239. {
  240. int ret;
  241. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  242. enum pin_config_param config_type;
  243. enum scmi_pinctrl_conf_type type;
  244. u32 config_value;
  245. if (!config)
  246. return -EINVAL;
  247. config_type = pinconf_to_config_param(*config);
  248. ret = pinctrl_scmi_map_pinconf_type(config_type, &type);
  249. if (ret)
  250. return ret;
  251. ret = pinctrl_ops->settings_get_one(pmx->ph, pin, PIN_TYPE, type,
  252. &config_value);
  253. /* Convert SCMI error code to PINCTRL expected error code */
  254. if (ret == -EOPNOTSUPP)
  255. return -ENOTSUPP;
  256. if (ret)
  257. return ret;
  258. *config = pinconf_to_config_packed(config_type, config_value);
  259. return 0;
  260. }
  261. static int
  262. pinctrl_scmi_alloc_configs(struct pinctrl_dev *pctldev, u32 num_configs,
  263. u32 **p_config_value,
  264. enum scmi_pinctrl_conf_type **p_config_type)
  265. {
  266. if (num_configs <= SCMI_NUM_CONFIGS)
  267. return 0;
  268. *p_config_value = kcalloc(num_configs, sizeof(**p_config_value), GFP_KERNEL);
  269. if (!*p_config_value)
  270. return -ENOMEM;
  271. *p_config_type = kzalloc_objs(**p_config_type, num_configs);
  272. if (!*p_config_type) {
  273. kfree(*p_config_value);
  274. return -ENOMEM;
  275. }
  276. return 0;
  277. }
  278. static void
  279. pinctrl_scmi_free_configs(struct pinctrl_dev *pctldev, u32 num_configs,
  280. u32 **p_config_value,
  281. enum scmi_pinctrl_conf_type **p_config_type)
  282. {
  283. if (num_configs <= SCMI_NUM_CONFIGS)
  284. return;
  285. kfree(*p_config_value);
  286. kfree(*p_config_type);
  287. }
  288. static int pinctrl_scmi_pinconf_set(struct pinctrl_dev *pctldev,
  289. unsigned int pin,
  290. unsigned long *configs,
  291. unsigned int num_configs)
  292. {
  293. int i, ret;
  294. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  295. enum scmi_pinctrl_conf_type config_type[SCMI_NUM_CONFIGS];
  296. u32 config_value[SCMI_NUM_CONFIGS];
  297. enum scmi_pinctrl_conf_type *p_config_type = config_type;
  298. u32 *p_config_value = config_value;
  299. enum pin_config_param param;
  300. if (!configs || !num_configs)
  301. return -EINVAL;
  302. ret = pinctrl_scmi_alloc_configs(pctldev, num_configs, &p_config_type,
  303. &p_config_value);
  304. if (ret)
  305. return ret;
  306. for (i = 0; i < num_configs; i++) {
  307. param = pinconf_to_config_param(configs[i]);
  308. ret = pinctrl_scmi_map_pinconf_type(param, &p_config_type[i]);
  309. if (ret) {
  310. dev_err(pmx->dev, "Error map pinconf_type %d\n", ret);
  311. goto free_config;
  312. }
  313. p_config_value[i] = pinconf_to_config_argument(configs[i]);
  314. }
  315. ret = pinctrl_ops->settings_conf(pmx->ph, pin, PIN_TYPE, num_configs,
  316. p_config_type, p_config_value);
  317. if (ret)
  318. dev_err(pmx->dev, "Error parsing config %d\n", ret);
  319. free_config:
  320. pinctrl_scmi_free_configs(pctldev, num_configs, &p_config_type,
  321. &p_config_value);
  322. return ret;
  323. }
  324. static int pinctrl_scmi_pinconf_group_set(struct pinctrl_dev *pctldev,
  325. unsigned int group,
  326. unsigned long *configs,
  327. unsigned int num_configs)
  328. {
  329. int i, ret;
  330. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  331. enum scmi_pinctrl_conf_type config_type[SCMI_NUM_CONFIGS];
  332. u32 config_value[SCMI_NUM_CONFIGS];
  333. enum scmi_pinctrl_conf_type *p_config_type = config_type;
  334. u32 *p_config_value = config_value;
  335. enum pin_config_param param;
  336. if (!configs || !num_configs)
  337. return -EINVAL;
  338. ret = pinctrl_scmi_alloc_configs(pctldev, num_configs, &p_config_type,
  339. &p_config_value);
  340. if (ret)
  341. return ret;
  342. for (i = 0; i < num_configs; i++) {
  343. param = pinconf_to_config_param(configs[i]);
  344. ret = pinctrl_scmi_map_pinconf_type(param, &p_config_type[i]);
  345. if (ret) {
  346. dev_err(pmx->dev, "Error map pinconf_type %d\n", ret);
  347. goto free_config;
  348. }
  349. p_config_value[i] = pinconf_to_config_argument(configs[i]);
  350. }
  351. ret = pinctrl_ops->settings_conf(pmx->ph, group, GROUP_TYPE,
  352. num_configs, p_config_type,
  353. p_config_value);
  354. if (ret)
  355. dev_err(pmx->dev, "Error parsing config %d", ret);
  356. free_config:
  357. pinctrl_scmi_free_configs(pctldev, num_configs, &p_config_type,
  358. &p_config_value);
  359. return ret;
  360. };
  361. static int pinctrl_scmi_pinconf_group_get(struct pinctrl_dev *pctldev,
  362. unsigned int group,
  363. unsigned long *config)
  364. {
  365. int ret;
  366. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  367. enum pin_config_param config_type;
  368. enum scmi_pinctrl_conf_type type;
  369. u32 config_value;
  370. if (!config)
  371. return -EINVAL;
  372. config_type = pinconf_to_config_param(*config);
  373. ret = pinctrl_scmi_map_pinconf_type(config_type, &type);
  374. if (ret) {
  375. dev_err(pmx->dev, "Error map pinconf_type %d\n", ret);
  376. return ret;
  377. }
  378. ret = pinctrl_ops->settings_get_one(pmx->ph, group, GROUP_TYPE, type,
  379. &config_value);
  380. /* Convert SCMI error code to PINCTRL expected error code */
  381. if (ret == -EOPNOTSUPP)
  382. return -ENOTSUPP;
  383. if (ret)
  384. return ret;
  385. *config = pinconf_to_config_packed(config_type, config_value);
  386. return 0;
  387. }
  388. static const struct pinconf_ops pinctrl_scmi_pinconf_ops = {
  389. .is_generic = true,
  390. .pin_config_get = pinctrl_scmi_pinconf_get,
  391. .pin_config_set = pinctrl_scmi_pinconf_set,
  392. .pin_config_group_set = pinctrl_scmi_pinconf_group_set,
  393. .pin_config_group_get = pinctrl_scmi_pinconf_group_get,
  394. .pin_config_config_dbg_show = pinconf_generic_dump_config,
  395. };
  396. static int pinctrl_scmi_get_pins(struct scmi_pinctrl *pmx,
  397. struct pinctrl_desc *desc)
  398. {
  399. struct pinctrl_pin_desc *pins;
  400. unsigned int npins;
  401. int ret, i;
  402. npins = pinctrl_ops->count_get(pmx->ph, PIN_TYPE);
  403. /*
  404. * npins will never be zero, the scmi pinctrl driver has bailed out
  405. * if npins is zero.
  406. */
  407. pins = devm_kmalloc_array(pmx->dev, npins, sizeof(*pins), GFP_KERNEL);
  408. if (!pins)
  409. return -ENOMEM;
  410. for (i = 0; i < npins; i++) {
  411. pins[i].number = i;
  412. /*
  413. * The memory for name is handled by the scmi firmware driver,
  414. * no need free here
  415. */
  416. ret = pinctrl_ops->name_get(pmx->ph, i, PIN_TYPE, &pins[i].name);
  417. if (ret)
  418. return dev_err_probe(pmx->dev, ret,
  419. "Can't get name for pin %d", i);
  420. }
  421. desc->npins = npins;
  422. desc->pins = pins;
  423. dev_dbg(pmx->dev, "got pins %u", npins);
  424. return 0;
  425. }
  426. static const char * const scmi_pinctrl_blocklist[] = {
  427. "fsl,imx94",
  428. "fsl,imx95",
  429. "fsl,imx952",
  430. NULL
  431. };
  432. static int scmi_pinctrl_probe(struct scmi_device *sdev)
  433. {
  434. int ret;
  435. struct device *dev = &sdev->dev;
  436. struct scmi_pinctrl *pmx;
  437. const struct scmi_handle *handle;
  438. struct scmi_protocol_handle *ph;
  439. if (!sdev->handle)
  440. return -EINVAL;
  441. if (of_machine_compatible_match(scmi_pinctrl_blocklist))
  442. return -ENODEV;
  443. handle = sdev->handle;
  444. pinctrl_ops = handle->devm_protocol_get(sdev, SCMI_PROTOCOL_PINCTRL, &ph);
  445. if (IS_ERR(pinctrl_ops))
  446. return PTR_ERR(pinctrl_ops);
  447. pmx = devm_kzalloc(dev, sizeof(*pmx), GFP_KERNEL);
  448. if (!pmx)
  449. return -ENOMEM;
  450. pmx->ph = ph;
  451. pmx->dev = dev;
  452. pmx->pctl_desc.name = DRV_NAME;
  453. pmx->pctl_desc.owner = THIS_MODULE;
  454. pmx->pctl_desc.pctlops = &pinctrl_scmi_pinctrl_ops;
  455. pmx->pctl_desc.pmxops = &pinctrl_scmi_pinmux_ops;
  456. pmx->pctl_desc.confops = &pinctrl_scmi_pinconf_ops;
  457. ret = pinctrl_scmi_get_pins(pmx, &pmx->pctl_desc);
  458. if (ret)
  459. return ret;
  460. ret = devm_pinctrl_register_and_init(dev, &pmx->pctl_desc, pmx,
  461. &pmx->pctldev);
  462. if (ret)
  463. return dev_err_probe(dev, ret, "Failed to register pinctrl\n");
  464. pmx->nr_functions = pinctrl_scmi_get_functions_count(pmx->pctldev);
  465. pmx->functions = devm_kcalloc(dev, pmx->nr_functions,
  466. sizeof(*pmx->functions), GFP_KERNEL);
  467. if (!pmx->functions)
  468. return -ENOMEM;
  469. return pinctrl_enable(pmx->pctldev);
  470. }
  471. static const struct scmi_device_id scmi_id_table[] = {
  472. { SCMI_PROTOCOL_PINCTRL, "pinctrl" },
  473. { }
  474. };
  475. MODULE_DEVICE_TABLE(scmi, scmi_id_table);
  476. static struct scmi_driver scmi_pinctrl_driver = {
  477. .name = DRV_NAME,
  478. .probe = scmi_pinctrl_probe,
  479. .id_table = scmi_id_table,
  480. };
  481. module_scmi_driver(scmi_pinctrl_driver);
  482. MODULE_AUTHOR("Oleksii Moisieiev <oleksii_moisieiev@epam.com>");
  483. MODULE_AUTHOR("Peng Fan <peng.fan@nxp.com>");
  484. MODULE_DESCRIPTION("ARM SCMI pin controller driver");
  485. MODULE_LICENSE("GPL");