pinctrl-scmi.c 15 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. struct pinctrl_pin_desc *pins;
  37. unsigned int nr_pins;
  38. };
  39. static int pinctrl_scmi_get_groups_count(struct pinctrl_dev *pctldev)
  40. {
  41. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  42. return pinctrl_ops->count_get(pmx->ph, GROUP_TYPE);
  43. }
  44. static const char *pinctrl_scmi_get_group_name(struct pinctrl_dev *pctldev,
  45. unsigned int selector)
  46. {
  47. int ret;
  48. const char *name;
  49. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  50. ret = pinctrl_ops->name_get(pmx->ph, selector, GROUP_TYPE, &name);
  51. if (ret) {
  52. dev_err(pmx->dev, "get name failed with err %d", ret);
  53. return NULL;
  54. }
  55. return name;
  56. }
  57. static int pinctrl_scmi_get_group_pins(struct pinctrl_dev *pctldev,
  58. unsigned int selector,
  59. const unsigned int **pins,
  60. unsigned int *num_pins)
  61. {
  62. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  63. return pinctrl_ops->group_pins_get(pmx->ph, selector, pins, num_pins);
  64. }
  65. static const struct pinctrl_ops pinctrl_scmi_pinctrl_ops = {
  66. .get_groups_count = pinctrl_scmi_get_groups_count,
  67. .get_group_name = pinctrl_scmi_get_group_name,
  68. .get_group_pins = pinctrl_scmi_get_group_pins,
  69. #ifdef CONFIG_OF
  70. .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
  71. .dt_free_map = pinconf_generic_dt_free_map,
  72. #endif
  73. };
  74. static int pinctrl_scmi_get_functions_count(struct pinctrl_dev *pctldev)
  75. {
  76. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  77. return pinctrl_ops->count_get(pmx->ph, FUNCTION_TYPE);
  78. }
  79. static const char *pinctrl_scmi_get_function_name(struct pinctrl_dev *pctldev,
  80. unsigned int selector)
  81. {
  82. int ret;
  83. const char *name;
  84. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  85. ret = pinctrl_ops->name_get(pmx->ph, selector, FUNCTION_TYPE, &name);
  86. if (ret) {
  87. dev_err(pmx->dev, "get name failed with err %d", ret);
  88. return NULL;
  89. }
  90. return name;
  91. }
  92. static int pinctrl_scmi_get_function_groups(struct pinctrl_dev *pctldev,
  93. unsigned int selector,
  94. const char * const **p_groups,
  95. unsigned int * const p_num_groups)
  96. {
  97. struct pinfunction *func;
  98. const unsigned int *group_ids;
  99. unsigned int num_groups;
  100. const char **groups;
  101. int ret, i;
  102. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  103. if (!p_groups || !p_num_groups)
  104. return -EINVAL;
  105. if (selector >= pmx->nr_functions)
  106. return -EINVAL;
  107. func = &pmx->functions[selector];
  108. if (func->ngroups)
  109. goto done;
  110. ret = pinctrl_ops->function_groups_get(pmx->ph, selector, &num_groups,
  111. &group_ids);
  112. if (ret) {
  113. dev_err(pmx->dev, "Unable to get function groups, err %d", ret);
  114. return ret;
  115. }
  116. if (!num_groups)
  117. return -EINVAL;
  118. groups = kcalloc(num_groups, sizeof(*groups), GFP_KERNEL);
  119. if (!groups)
  120. return -ENOMEM;
  121. for (i = 0; i < num_groups; i++) {
  122. groups[i] = pinctrl_scmi_get_group_name(pctldev, group_ids[i]);
  123. if (!groups[i]) {
  124. ret = -EINVAL;
  125. goto err_free;
  126. }
  127. }
  128. func->ngroups = num_groups;
  129. func->groups = groups;
  130. done:
  131. *p_groups = func->groups;
  132. *p_num_groups = func->ngroups;
  133. return 0;
  134. err_free:
  135. kfree(groups);
  136. return ret;
  137. }
  138. static int pinctrl_scmi_func_set_mux(struct pinctrl_dev *pctldev,
  139. unsigned int selector, unsigned int group)
  140. {
  141. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  142. return pinctrl_ops->mux_set(pmx->ph, selector, group);
  143. }
  144. static int pinctrl_scmi_request(struct pinctrl_dev *pctldev,
  145. unsigned int offset)
  146. {
  147. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  148. return pinctrl_ops->pin_request(pmx->ph, offset);
  149. }
  150. static int pinctrl_scmi_free(struct pinctrl_dev *pctldev, unsigned int offset)
  151. {
  152. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  153. return pinctrl_ops->pin_free(pmx->ph, offset);
  154. }
  155. static const struct pinmux_ops pinctrl_scmi_pinmux_ops = {
  156. .request = pinctrl_scmi_request,
  157. .free = pinctrl_scmi_free,
  158. .get_functions_count = pinctrl_scmi_get_functions_count,
  159. .get_function_name = pinctrl_scmi_get_function_name,
  160. .get_function_groups = pinctrl_scmi_get_function_groups,
  161. .set_mux = pinctrl_scmi_func_set_mux,
  162. };
  163. static int pinctrl_scmi_map_pinconf_type(enum pin_config_param param,
  164. enum scmi_pinctrl_conf_type *type)
  165. {
  166. u32 arg = param;
  167. switch (arg) {
  168. case PIN_CONFIG_BIAS_BUS_HOLD:
  169. *type = SCMI_PIN_BIAS_BUS_HOLD;
  170. break;
  171. case PIN_CONFIG_BIAS_DISABLE:
  172. *type = SCMI_PIN_BIAS_DISABLE;
  173. break;
  174. case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
  175. *type = SCMI_PIN_BIAS_HIGH_IMPEDANCE;
  176. break;
  177. case PIN_CONFIG_BIAS_PULL_DOWN:
  178. *type = SCMI_PIN_BIAS_PULL_DOWN;
  179. break;
  180. case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
  181. *type = SCMI_PIN_BIAS_PULL_DEFAULT;
  182. break;
  183. case PIN_CONFIG_BIAS_PULL_UP:
  184. *type = SCMI_PIN_BIAS_PULL_UP;
  185. break;
  186. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  187. *type = SCMI_PIN_DRIVE_OPEN_DRAIN;
  188. break;
  189. case PIN_CONFIG_DRIVE_OPEN_SOURCE:
  190. *type = SCMI_PIN_DRIVE_OPEN_SOURCE;
  191. break;
  192. case PIN_CONFIG_DRIVE_PUSH_PULL:
  193. *type = SCMI_PIN_DRIVE_PUSH_PULL;
  194. break;
  195. case PIN_CONFIG_DRIVE_STRENGTH:
  196. *type = SCMI_PIN_DRIVE_STRENGTH;
  197. break;
  198. case PIN_CONFIG_DRIVE_STRENGTH_UA:
  199. *type = SCMI_PIN_DRIVE_STRENGTH;
  200. break;
  201. case PIN_CONFIG_INPUT_DEBOUNCE:
  202. *type = SCMI_PIN_INPUT_DEBOUNCE;
  203. break;
  204. case PIN_CONFIG_INPUT_ENABLE:
  205. *type = SCMI_PIN_INPUT_MODE;
  206. break;
  207. case PIN_CONFIG_INPUT_SCHMITT:
  208. *type = SCMI_PIN_INPUT_SCHMITT;
  209. break;
  210. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  211. *type = SCMI_PIN_INPUT_MODE;
  212. break;
  213. case PIN_CONFIG_MODE_LOW_POWER:
  214. *type = SCMI_PIN_LOW_POWER_MODE;
  215. break;
  216. case PIN_CONFIG_OUTPUT:
  217. *type = SCMI_PIN_OUTPUT_VALUE;
  218. break;
  219. case PIN_CONFIG_OUTPUT_ENABLE:
  220. *type = SCMI_PIN_OUTPUT_MODE;
  221. break;
  222. case PIN_CONFIG_OUTPUT_IMPEDANCE_OHMS:
  223. *type = SCMI_PIN_OUTPUT_VALUE;
  224. break;
  225. case PIN_CONFIG_POWER_SOURCE:
  226. *type = SCMI_PIN_POWER_SOURCE;
  227. break;
  228. case PIN_CONFIG_SLEW_RATE:
  229. *type = SCMI_PIN_SLEW_RATE;
  230. break;
  231. case SCMI_PIN_OEM_START ... SCMI_PIN_OEM_END:
  232. *type = arg;
  233. break;
  234. default:
  235. return -EINVAL;
  236. }
  237. return 0;
  238. }
  239. static int pinctrl_scmi_pinconf_get(struct pinctrl_dev *pctldev,
  240. unsigned int pin, unsigned long *config)
  241. {
  242. int ret;
  243. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  244. enum pin_config_param config_type;
  245. enum scmi_pinctrl_conf_type type;
  246. u32 config_value;
  247. if (!config)
  248. return -EINVAL;
  249. config_type = pinconf_to_config_param(*config);
  250. ret = pinctrl_scmi_map_pinconf_type(config_type, &type);
  251. if (ret)
  252. return ret;
  253. ret = pinctrl_ops->settings_get_one(pmx->ph, pin, PIN_TYPE, type,
  254. &config_value);
  255. /* Convert SCMI error code to PINCTRL expected error code */
  256. if (ret == -EOPNOTSUPP)
  257. return -ENOTSUPP;
  258. if (ret)
  259. return ret;
  260. *config = pinconf_to_config_packed(config_type, config_value);
  261. return 0;
  262. }
  263. static int
  264. pinctrl_scmi_alloc_configs(struct pinctrl_dev *pctldev, u32 num_configs,
  265. u32 **p_config_value,
  266. enum scmi_pinctrl_conf_type **p_config_type)
  267. {
  268. if (num_configs <= SCMI_NUM_CONFIGS)
  269. return 0;
  270. *p_config_value = kcalloc(num_configs, sizeof(**p_config_value), GFP_KERNEL);
  271. if (!*p_config_value)
  272. return -ENOMEM;
  273. *p_config_type = kcalloc(num_configs, sizeof(**p_config_type), GFP_KERNEL);
  274. if (!*p_config_type) {
  275. kfree(*p_config_value);
  276. return -ENOMEM;
  277. }
  278. return 0;
  279. }
  280. static void
  281. pinctrl_scmi_free_configs(struct pinctrl_dev *pctldev, u32 num_configs,
  282. u32 **p_config_value,
  283. enum scmi_pinctrl_conf_type **p_config_type)
  284. {
  285. if (num_configs <= SCMI_NUM_CONFIGS)
  286. return;
  287. kfree(*p_config_value);
  288. kfree(*p_config_type);
  289. }
  290. static int pinctrl_scmi_pinconf_set(struct pinctrl_dev *pctldev,
  291. unsigned int pin,
  292. unsigned long *configs,
  293. unsigned int num_configs)
  294. {
  295. int i, ret;
  296. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  297. enum scmi_pinctrl_conf_type config_type[SCMI_NUM_CONFIGS];
  298. u32 config_value[SCMI_NUM_CONFIGS];
  299. enum scmi_pinctrl_conf_type *p_config_type = config_type;
  300. u32 *p_config_value = config_value;
  301. enum pin_config_param param;
  302. if (!configs || !num_configs)
  303. return -EINVAL;
  304. ret = pinctrl_scmi_alloc_configs(pctldev, num_configs, &p_config_type,
  305. &p_config_value);
  306. if (ret)
  307. return ret;
  308. for (i = 0; i < num_configs; i++) {
  309. param = pinconf_to_config_param(configs[i]);
  310. ret = pinctrl_scmi_map_pinconf_type(param, &p_config_type[i]);
  311. if (ret) {
  312. dev_err(pmx->dev, "Error map pinconf_type %d\n", ret);
  313. goto free_config;
  314. }
  315. p_config_value[i] = pinconf_to_config_argument(configs[i]);
  316. }
  317. ret = pinctrl_ops->settings_conf(pmx->ph, pin, PIN_TYPE, num_configs,
  318. p_config_type, p_config_value);
  319. if (ret)
  320. dev_err(pmx->dev, "Error parsing config %d\n", ret);
  321. free_config:
  322. pinctrl_scmi_free_configs(pctldev, num_configs, &p_config_type,
  323. &p_config_value);
  324. return ret;
  325. }
  326. static int pinctrl_scmi_pinconf_group_set(struct pinctrl_dev *pctldev,
  327. unsigned int group,
  328. unsigned long *configs,
  329. unsigned int num_configs)
  330. {
  331. int i, ret;
  332. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  333. enum scmi_pinctrl_conf_type config_type[SCMI_NUM_CONFIGS];
  334. u32 config_value[SCMI_NUM_CONFIGS];
  335. enum scmi_pinctrl_conf_type *p_config_type = config_type;
  336. u32 *p_config_value = config_value;
  337. enum pin_config_param param;
  338. if (!configs || !num_configs)
  339. return -EINVAL;
  340. ret = pinctrl_scmi_alloc_configs(pctldev, num_configs, &p_config_type,
  341. &p_config_value);
  342. if (ret)
  343. return ret;
  344. for (i = 0; i < num_configs; i++) {
  345. param = pinconf_to_config_param(configs[i]);
  346. ret = pinctrl_scmi_map_pinconf_type(param, &p_config_type[i]);
  347. if (ret) {
  348. dev_err(pmx->dev, "Error map pinconf_type %d\n", ret);
  349. goto free_config;
  350. }
  351. p_config_value[i] = pinconf_to_config_argument(configs[i]);
  352. }
  353. ret = pinctrl_ops->settings_conf(pmx->ph, group, GROUP_TYPE,
  354. num_configs, p_config_type,
  355. p_config_value);
  356. if (ret)
  357. dev_err(pmx->dev, "Error parsing config %d", ret);
  358. free_config:
  359. pinctrl_scmi_free_configs(pctldev, num_configs, &p_config_type,
  360. &p_config_value);
  361. return ret;
  362. };
  363. static int pinctrl_scmi_pinconf_group_get(struct pinctrl_dev *pctldev,
  364. unsigned int group,
  365. unsigned long *config)
  366. {
  367. int ret;
  368. struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
  369. enum pin_config_param config_type;
  370. enum scmi_pinctrl_conf_type type;
  371. u32 config_value;
  372. if (!config)
  373. return -EINVAL;
  374. config_type = pinconf_to_config_param(*config);
  375. ret = pinctrl_scmi_map_pinconf_type(config_type, &type);
  376. if (ret) {
  377. dev_err(pmx->dev, "Error map pinconf_type %d\n", ret);
  378. return ret;
  379. }
  380. ret = pinctrl_ops->settings_get_one(pmx->ph, group, GROUP_TYPE, type,
  381. &config_value);
  382. /* Convert SCMI error code to PINCTRL expected error code */
  383. if (ret == -EOPNOTSUPP)
  384. return -ENOTSUPP;
  385. if (ret)
  386. return ret;
  387. *config = pinconf_to_config_packed(config_type, config_value);
  388. return 0;
  389. }
  390. static const struct pinconf_ops pinctrl_scmi_pinconf_ops = {
  391. .is_generic = true,
  392. .pin_config_get = pinctrl_scmi_pinconf_get,
  393. .pin_config_set = pinctrl_scmi_pinconf_set,
  394. .pin_config_group_set = pinctrl_scmi_pinconf_group_set,
  395. .pin_config_group_get = pinctrl_scmi_pinconf_group_get,
  396. .pin_config_config_dbg_show = pinconf_generic_dump_config,
  397. };
  398. static int pinctrl_scmi_get_pins(struct scmi_pinctrl *pmx,
  399. struct pinctrl_desc *desc)
  400. {
  401. struct pinctrl_pin_desc *pins;
  402. unsigned int npins;
  403. int ret, i;
  404. npins = pinctrl_ops->count_get(pmx->ph, PIN_TYPE);
  405. /*
  406. * npins will never be zero, the scmi pinctrl driver has bailed out
  407. * if npins is zero.
  408. */
  409. pins = devm_kmalloc_array(pmx->dev, npins, sizeof(*pins), GFP_KERNEL);
  410. if (!pins)
  411. return -ENOMEM;
  412. for (i = 0; i < npins; i++) {
  413. pins[i].number = i;
  414. /*
  415. * The memory for name is handled by the scmi firmware driver,
  416. * no need free here
  417. */
  418. ret = pinctrl_ops->name_get(pmx->ph, i, PIN_TYPE, &pins[i].name);
  419. if (ret)
  420. return dev_err_probe(pmx->dev, ret,
  421. "Can't get name for pin %d", i);
  422. }
  423. desc->npins = npins;
  424. desc->pins = pins;
  425. dev_dbg(pmx->dev, "got pins %u", npins);
  426. return 0;
  427. }
  428. static const char * const scmi_pinctrl_blocklist[] = {
  429. "fsl,imx95",
  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");