Lines Matching +full:k230 +full:- +full:pinctrl

1 // SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
12 #include <linux/pinctrl/pinctrl.h>
13 #include <linux/pinctrl/pinmux.h>
14 #include <linux/pinctrl/pinconf.h>
15 #include <linux/pinctrl/pinconf-generic.h>
79 .name = "canaan,pinctrl",
90 return info->ngroups; in k230_get_groups_count()
98 return info->groups[selector].name; in k230_get_group_name()
108 if (selector >= info->ngroups) in k230_get_group_pins()
109 return -EINVAL; in k230_get_group_pins()
111 *pins = info->groups[selector].pins; in k230_get_group_pins()
112 *num_pins = info->groups[selector].num_pins; in k230_get_group_pins()
122 for (i = 0; i < info->nfunctions; i++) { in k230_name_to_funtion()
123 if (!strcmp(info->functions[i].name, name)) in k230_name_to_funtion()
124 return &info->functions[i]; in k230_name_to_funtion()
168 regmap_read(info->regmap_base, offset * 4, &val); in k230_pinctrl_pin_dbg_show()
177 seq_printf(s, "%s - strength %d - %s - %s - slewrate %s - schmitt %s - %s", in k230_pinctrl_pin_dbg_show()
178 grp ? grp->name : "unknown", in k230_pinctrl_pin_dbg_show()
193 struct device *dev = info->pctl_dev->dev; in k230_dt_node_to_map()
200 func = k230_name_to_funtion(info, np_config->name); in k230_dt_node_to_map()
202 dev_err(dev, "function %s not found\n", np_config->name); in k230_dt_node_to_map()
203 return -EINVAL; in k230_dt_node_to_map()
207 for (i = 0; i < func->ngroups; ++i) { in k230_dt_node_to_map()
208 grp_id = func->group_idx[i]; in k230_dt_node_to_map()
210 map_num += info->groups[grp_id].num_pins + 1; in k230_dt_node_to_map()
215 return -ENOMEM; in k230_dt_node_to_map()
220 for (i = 0; i < func->ngroups; ++i) { in k230_dt_node_to_map()
221 grp_id = func->group_idx[i]; in k230_dt_node_to_map()
222 grp = &info->groups[grp_id]; in k230_dt_node_to_map()
224 new_map[idx].data.mux.group = grp->name; in k230_dt_node_to_map()
225 new_map[idx].data.mux.function = np_config->name; in k230_dt_node_to_map()
228 for (j = 0; j < grp->num_pins; ++j) { in k230_dt_node_to_map()
231 pin_get_name(pctldev, grp->pins[j]); in k230_dt_node_to_map()
233 grp->data[j].configs; in k230_dt_node_to_map()
235 grp->data[j].nconfigs; in k230_dt_node_to_map()
265 regmap_read(info->regmap_base, pin * 4, &val); in k230_pinconf_get()
296 return -EINVAL; in k230_pinconf_get()
310 regmap_read(info->regmap_base, pin * 4, &val); in k230_pinconf_set_param()
328 return -EINVAL; in k230_pinconf_set_param()
333 return -EINVAL; in k230_pinconf_set_param()
338 return -EINVAL; in k230_pinconf_set_param()
343 return -EINVAL; in k230_pinconf_set_param()
359 return -EINVAL; in k230_pinconf_set_param()
362 regmap_write(info->regmap_base, pin * 4, val); in k230_pinconf_set_param()
371 struct device *dev = info->pctl_dev->dev; in k230_pinconf_set()
378 return -EINVAL; in k230_pinconf_set()
398 regmap_read(info->regmap_base, pin * 4, &val); in k230_pconf_dbg_show()
414 return info->nfunctions; in k230_get_functions_count()
422 return info->functions[selector].name; in k230_get_fname()
430 *groups = info->functions[selector].groups; in k230_get_groups()
431 *num_groups = info->functions[selector].ngroups; in k230_get_groups()
440 const struct k230_pin_conf *data = info->groups[group].data; in k230_set_mux()
441 struct k230_pin_group *grp = &info->groups[group]; in k230_set_mux()
442 const unsigned int *pins = grp->pins; in k230_set_mux()
447 regmap = info->regmap_base; in k230_set_mux()
449 for (cnt = 0; cnt < grp->num_pins; cnt++) { in k230_set_mux()
473 struct device *dev = info->pctl_dev->dev; in k230_pinctrl_parse_groups()
477 grp->name = np->name; in k230_pinctrl_parse_groups()
482 grp->num_pins = size; in k230_pinctrl_parse_groups()
483 grp->pins = devm_kcalloc(dev, grp->num_pins, sizeof(*grp->pins), in k230_pinctrl_parse_groups()
485 grp->data = devm_kcalloc(dev, grp->num_pins, sizeof(*grp->data), in k230_pinctrl_parse_groups()
487 if (!grp->pins || !grp->data) in k230_pinctrl_parse_groups()
488 return -ENOMEM; in k230_pinctrl_parse_groups()
493 grp->pins[i] = (mux_data >> 8); in k230_pinctrl_parse_groups()
494 grp->data[i].func = (mux_data & 0xff); in k230_pinctrl_parse_groups()
497 &grp->data[i].configs, in k230_pinctrl_parse_groups()
498 &grp->data[i].nconfigs); in k230_pinctrl_parse_groups()
510 struct device *dev = info->pctl_dev->dev; in k230_pinctrl_parse_functions()
516 func = &info->functions[index]; in k230_pinctrl_parse_functions()
518 func->name = np->name; in k230_pinctrl_parse_functions()
519 func->ngroups = of_get_child_count(np); in k230_pinctrl_parse_functions()
520 if (func->ngroups <= 0) in k230_pinctrl_parse_functions()
523 func->groups = devm_kcalloc(dev, func->ngroups, in k230_pinctrl_parse_functions()
524 sizeof(*func->groups), GFP_KERNEL); in k230_pinctrl_parse_functions()
525 func->group_idx = devm_kcalloc(dev, func->ngroups, in k230_pinctrl_parse_functions()
526 sizeof(*func->group_idx), GFP_KERNEL); in k230_pinctrl_parse_functions()
527 if (!func->groups || !func->group_idx) in k230_pinctrl_parse_functions()
528 return -ENOMEM; in k230_pinctrl_parse_functions()
533 func->groups[i] = child->name; in k230_pinctrl_parse_functions()
534 func->group_idx[i] = idx; in k230_pinctrl_parse_functions()
535 grp = &info->groups[idx]; in k230_pinctrl_parse_functions()
549 info->nfunctions++; in k230_pinctrl_child_count()
550 info->ngroups += of_get_child_count(child); in k230_pinctrl_child_count()
557 struct device *dev = &pdev->dev; in k230_pinctrl_parse_dt()
558 struct device_node *np = dev->of_node; in k230_pinctrl_parse_dt()
564 info->functions = devm_kcalloc(dev, info->nfunctions, in k230_pinctrl_parse_dt()
565 sizeof(*info->functions), GFP_KERNEL); in k230_pinctrl_parse_dt()
566 info->groups = devm_kcalloc(dev, info->ngroups, in k230_pinctrl_parse_dt()
567 sizeof(*info->groups), GFP_KERNEL); in k230_pinctrl_parse_dt()
568 if (!info->functions || !info->groups) in k230_pinctrl_parse_dt()
569 return -ENOMEM; in k230_pinctrl_parse_dt()
586 struct device *dev = &pdev->dev; in k230_pinctrl_probe()
592 return -ENOMEM; in k230_pinctrl_probe()
594 pctl = &info->pctl; in k230_pinctrl_probe()
596 pctl->name = "k230-pinctrl"; in k230_pinctrl_probe()
597 pctl->owner = THIS_MODULE; in k230_pinctrl_probe()
598 pctl->pins = k230_pins; in k230_pinctrl_probe()
599 pctl->npins = ARRAY_SIZE(k230_pins); in k230_pinctrl_probe()
600 pctl->pctlops = &k230_pctrl_ops; in k230_pinctrl_probe()
601 pctl->pmxops = &k230_pmxops; in k230_pinctrl_probe()
602 pctl->confops = &k230_pinconf_ops; in k230_pinctrl_probe()
604 info->base = devm_platform_ioremap_resource(pdev, 0); in k230_pinctrl_probe()
605 if (IS_ERR(info->base)) in k230_pinctrl_probe()
606 return PTR_ERR(info->base); in k230_pinctrl_probe()
608 info->regmap_base = devm_regmap_init_mmio(dev, info->base, in k230_pinctrl_probe()
610 if (IS_ERR(info->regmap_base)) in k230_pinctrl_probe()
611 return dev_err_probe(dev, PTR_ERR(info->regmap_base), in k230_pinctrl_probe()
614 info->pctl_dev = devm_pinctrl_register(dev, pctl, info); in k230_pinctrl_probe()
615 if (IS_ERR(info->pctl_dev)) in k230_pinctrl_probe()
616 return dev_err_probe(dev, PTR_ERR(info->pctl_dev), in k230_pinctrl_probe()
625 { .compatible = "canaan,k230-pinctrl", },
633 .name = "k230-pinctrl",
641 MODULE_DESCRIPTION("Canaan K230 pinctrl driver");