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