Lines Matching +full:- +full:grp
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (C) 2017 Spreadtrum - http://www.spreadtrum.com
20 #include <linux/pinctrl/pinconf-generic.h>
28 #include "../pinctrl-utils.h"
29 #include "pinctrl-sprd.h"
164 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; in sprd_pinctrl_get_id_by_name()
167 for (i = 0; i < info->npins; i++) { in sprd_pinctrl_get_id_by_name()
168 if (!strcmp(info->pins[i].name, name)) in sprd_pinctrl_get_id_by_name()
169 return info->pins[i].number; in sprd_pinctrl_get_id_by_name()
172 return -ENODEV; in sprd_pinctrl_get_id_by_name()
178 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; in sprd_pinctrl_get_pin_by_id()
182 for (i = 0; i < info->npins; i++) { in sprd_pinctrl_get_pin_by_id()
183 if (info->pins[i].number == id) { in sprd_pinctrl_get_pin_by_id()
184 pin = &info->pins[i]; in sprd_pinctrl_get_pin_by_id()
196 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; in sprd_pinctrl_find_group_by_name()
197 const struct sprd_pin_group *grp = NULL; in sprd_pinctrl_find_group_by_name() local
200 for (i = 0; i < info->ngroups; i++) { in sprd_pinctrl_find_group_by_name()
201 if (!strcmp(info->groups[i].name, name)) { in sprd_pinctrl_find_group_by_name()
202 grp = &info->groups[i]; in sprd_pinctrl_find_group_by_name()
207 return grp; in sprd_pinctrl_find_group_by_name()
213 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pctrl_group_count()
215 return info->ngroups; in sprd_pctrl_group_count()
222 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pctrl_group_name()
224 return info->groups[selector].name; in sprd_pctrl_group_name()
233 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pctrl_group_pins()
235 if (selector >= info->ngroups) in sprd_pctrl_group_pins()
236 return -EINVAL; in sprd_pctrl_group_pins()
238 *pins = info->groups[selector].pins; in sprd_pctrl_group_pins()
239 *npins = info->groups[selector].npins; in sprd_pctrl_group_pins()
250 const struct sprd_pin_group *grp; in sprd_dt_node_to_map() local
259 grp = sprd_pinctrl_find_group_by_name(pctl, np->name); in sprd_dt_node_to_map()
260 if (!grp) { in sprd_dt_node_to_map()
261 dev_err(pctl->dev, "unable to find group for node %s\n", in sprd_dt_node_to_map()
263 return -EINVAL; in sprd_dt_node_to_map()
277 if (ret != -EINVAL) in sprd_dt_node_to_map()
278 dev_err(pctl->dev, in sprd_dt_node_to_map()
287 dev_err(pctl->dev, "%s: could not parse node property\n", in sprd_dt_node_to_map()
308 grp->name, function); in sprd_dt_node_to_map()
318 pin_id = grp->pins[0]; in sprd_dt_node_to_map()
321 group_or_pin = grp->name; in sprd_dt_node_to_map()
338 seq_printf(s, "%s", dev_name(pctldev->dev)); in sprd_pctrl_dbg_show()
378 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pmx_get_function_groups()
380 *groups = info->grp_names; in sprd_pmx_get_function_groups()
381 *num_groups = info->ngroups; in sprd_pmx_get_function_groups()
391 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pmx_set_mux()
392 struct sprd_pin_group *grp = &info->groups[group_selector]; in sprd_pmx_set_mux() local
393 unsigned int i, grp_pins = grp->npins; in sprd_pmx_set_mux()
397 if (group_selector >= info->ngroups) in sprd_pmx_set_mux()
398 return -EINVAL; in sprd_pmx_set_mux()
418 unsigned int pin_id = grp->pins[i]; in sprd_pmx_set_mux()
421 if (!pin || pin->type != COMMON_PIN) in sprd_pmx_set_mux()
424 reg = readl((void __iomem *)pin->reg); in sprd_pmx_set_mux()
427 writel(reg, (void __iomem *)pin->reg); in sprd_pmx_set_mux()
449 return -EINVAL; in sprd_pinconf_get()
451 if (pin->type == GLOBAL_CTRL_PIN) { in sprd_pinconf_get()
452 reg = (readl((void __iomem *)pin->reg) >> in sprd_pinconf_get()
453 pin->bit_offset) & PINCTRL_BIT_MASK(pin->bit_width); in sprd_pinconf_get()
455 reg = readl((void __iomem *)pin->reg); in sprd_pinconf_get()
458 if (pin->type == GLOBAL_CTRL_PIN && in sprd_pinconf_get()
461 } else if (pin->type == COMMON_PIN || pin->type == MISC_PIN) { in sprd_pinconf_get()
474 return -EINVAL; in sprd_pinconf_get()
500 return -EINVAL; in sprd_pinconf_get()
508 return -ENOTSUPP; in sprd_pinconf_get()
511 return -ENOTSUPP; in sprd_pinconf_get()
602 return -EINVAL; in sprd_pinconf_set()
615 if (pin->type == GLOBAL_CTRL_PIN && in sprd_pinconf_set()
618 } else if (pin->type == COMMON_PIN || pin->type == MISC_PIN) { in sprd_pinconf_set()
665 return -EINVAL; in sprd_pinconf_set()
719 return -ENOTSUPP; in sprd_pinconf_set()
722 return -ENOTSUPP; in sprd_pinconf_set()
725 if (pin->type == GLOBAL_CTRL_PIN) { in sprd_pinconf_set()
726 reg = readl((void __iomem *)pin->reg); in sprd_pinconf_set()
727 reg &= ~(PINCTRL_BIT_MASK(pin->bit_width) in sprd_pinconf_set()
728 << pin->bit_offset); in sprd_pinconf_set()
729 reg |= (val & PINCTRL_BIT_MASK(pin->bit_width)) in sprd_pinconf_set()
730 << pin->bit_offset; in sprd_pinconf_set()
731 writel(reg, (void __iomem *)pin->reg); in sprd_pinconf_set()
733 reg = readl((void __iomem *)pin->reg); in sprd_pinconf_set()
736 writel(reg, (void __iomem *)pin->reg); in sprd_pinconf_set()
747 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pinconf_group_get()
748 struct sprd_pin_group *grp; in sprd_pinconf_group_get() local
751 if (selector >= info->ngroups) in sprd_pinconf_group_get()
752 return -EINVAL; in sprd_pinconf_group_get()
754 grp = &info->groups[selector]; in sprd_pinconf_group_get()
755 pin_id = grp->pins[0]; in sprd_pinconf_group_get()
766 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pinconf_group_set()
767 struct sprd_pin_group *grp; in sprd_pinconf_group_set() local
770 if (selector >= info->ngroups) in sprd_pinconf_group_set()
771 return -EINVAL; in sprd_pinconf_group_set()
773 grp = &info->groups[selector]; in sprd_pinconf_group_set()
775 for (i = 0; i < grp->npins; i++) { in sprd_pinconf_group_set()
776 unsigned int pin_id = grp->pins[i]; in sprd_pinconf_group_set()
794 return -EINVAL; in sprd_pinconf_get_config()
796 if (pin->type == GLOBAL_CTRL_PIN) { in sprd_pinconf_get_config()
797 *config = (readl((void __iomem *)pin->reg) >> in sprd_pinconf_get_config()
798 pin->bit_offset) & PINCTRL_BIT_MASK(pin->bit_width); in sprd_pinconf_get_config()
800 *config = readl((void __iomem *)pin->reg); in sprd_pinconf_get_config()
824 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pinconf_group_dbg_show()
825 struct sprd_pin_group *grp; in sprd_pinconf_group_dbg_show() local
830 if (selector >= info->ngroups) in sprd_pinconf_group_dbg_show()
833 grp = &info->groups[selector]; in sprd_pinconf_group_dbg_show()
836 for (i = 0; i < grp->npins; i++, config++) { in sprd_pinconf_group_dbg_show()
837 unsigned int pin_id = grp->pins[i]; in sprd_pinconf_group_dbg_show()
860 {"sprd,sleep-mode", SPRD_PIN_CONFIG_SLEEP_MODE, 0},
884 struct sprd_pin_group *grp) in sprd_pinctrl_parse_groups() argument
894 grp->name = np->name; in sprd_pinctrl_parse_groups()
895 grp->npins = ret; in sprd_pinctrl_parse_groups()
896 grp->pins = devm_kcalloc(sprd_pctl->dev, in sprd_pinctrl_parse_groups()
897 grp->npins, sizeof(unsigned int), in sprd_pinctrl_parse_groups()
899 if (!grp->pins) in sprd_pinctrl_parse_groups()
900 return -ENOMEM; in sprd_pinctrl_parse_groups()
905 grp->pins[i++] = ret; in sprd_pinctrl_parse_groups()
908 for (i = 0; i < grp->npins; i++) { in sprd_pinctrl_parse_groups()
909 dev_dbg(sprd_pctl->dev, in sprd_pinctrl_parse_groups()
911 grp->name, grp->npins, grp->pins[i]); in sprd_pinctrl_parse_groups()
935 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; in sprd_pinctrl_parse_dt()
936 struct device_node *np = sprd_pctl->dev->of_node; in sprd_pinctrl_parse_dt()
937 struct sprd_pin_group *grp; in sprd_pinctrl_parse_dt() local
942 return -ENODEV; in sprd_pinctrl_parse_dt()
944 info->ngroups = sprd_pinctrl_get_groups(np); in sprd_pinctrl_parse_dt()
945 if (!info->ngroups) in sprd_pinctrl_parse_dt()
948 info->groups = devm_kcalloc(sprd_pctl->dev, in sprd_pinctrl_parse_dt()
949 info->ngroups, in sprd_pinctrl_parse_dt()
952 if (!info->groups) in sprd_pinctrl_parse_dt()
953 return -ENOMEM; in sprd_pinctrl_parse_dt()
955 info->grp_names = devm_kcalloc(sprd_pctl->dev, in sprd_pinctrl_parse_dt()
956 info->ngroups, sizeof(char *), in sprd_pinctrl_parse_dt()
958 if (!info->grp_names) in sprd_pinctrl_parse_dt()
959 return -ENOMEM; in sprd_pinctrl_parse_dt()
961 temp = info->grp_names; in sprd_pinctrl_parse_dt()
962 grp = info->groups; in sprd_pinctrl_parse_dt()
965 ret = sprd_pinctrl_parse_groups(child, sprd_pctl, grp); in sprd_pinctrl_parse_dt()
969 *temp++ = grp->name; in sprd_pinctrl_parse_dt()
970 grp++; in sprd_pinctrl_parse_dt()
975 sprd_pctl, grp); in sprd_pinctrl_parse_dt()
979 *temp++ = grp->name; in sprd_pinctrl_parse_dt()
980 grp++; in sprd_pinctrl_parse_dt()
992 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; in sprd_pinctrl_add_pins()
997 info->npins = pins_cnt; in sprd_pinctrl_add_pins()
998 info->pins = devm_kcalloc(sprd_pctl->dev, in sprd_pinctrl_add_pins()
999 info->npins, sizeof(struct sprd_pin), in sprd_pinctrl_add_pins()
1001 if (!info->pins) in sprd_pinctrl_add_pins()
1002 return -ENOMEM; in sprd_pinctrl_add_pins()
1004 for (i = 0, pin = info->pins; i < info->npins; i++, pin++) { in sprd_pinctrl_add_pins()
1007 pin->name = sprd_soc_pin_info[i].name; in sprd_pinctrl_add_pins()
1008 pin->type = sprd_soc_pin_info[i].type; in sprd_pinctrl_add_pins()
1009 pin->number = sprd_soc_pin_info[i].num; in sprd_pinctrl_add_pins()
1011 if (pin->type == GLOBAL_CTRL_PIN) { in sprd_pinctrl_add_pins()
1012 pin->reg = (unsigned long)sprd_pctl->base + in sprd_pinctrl_add_pins()
1014 pin->bit_offset = sprd_soc_pin_info[i].bit_offset; in sprd_pinctrl_add_pins()
1015 pin->bit_width = sprd_soc_pin_info[i].bit_width; in sprd_pinctrl_add_pins()
1017 } else if (pin->type == COMMON_PIN) { in sprd_pinctrl_add_pins()
1018 pin->reg = (unsigned long)sprd_pctl->base + in sprd_pinctrl_add_pins()
1020 (i - ctrl_pin); in sprd_pinctrl_add_pins()
1022 } else if (pin->type == MISC_PIN) { in sprd_pinctrl_add_pins()
1023 pin->reg = (unsigned long)sprd_pctl->base + in sprd_pinctrl_add_pins()
1025 (i - ctrl_pin - com_pin); in sprd_pinctrl_add_pins()
1029 for (i = 0, pin = info->pins; i < info->npins; pin++, i++) { in sprd_pinctrl_add_pins()
1030 dev_dbg(sprd_pctl->dev, "pin name[%s-%d], type = %d, " in sprd_pinctrl_add_pins()
1032 pin->name, pin->number, pin->type, in sprd_pinctrl_add_pins()
1033 pin->bit_offset, pin->bit_width, pin->reg); in sprd_pinctrl_add_pins()
1048 sprd_pctl = devm_kzalloc(&pdev->dev, sizeof(struct sprd_pinctrl), in sprd_pinctrl_core_probe()
1051 return -ENOMEM; in sprd_pinctrl_core_probe()
1053 sprd_pctl->base = devm_platform_ioremap_resource(pdev, 0); in sprd_pinctrl_core_probe()
1054 if (IS_ERR(sprd_pctl->base)) in sprd_pinctrl_core_probe()
1055 return PTR_ERR(sprd_pctl->base); in sprd_pinctrl_core_probe()
1057 pinctrl_info = devm_kzalloc(&pdev->dev, in sprd_pinctrl_core_probe()
1061 return -ENOMEM; in sprd_pinctrl_core_probe()
1063 sprd_pctl->info = pinctrl_info; in sprd_pinctrl_core_probe()
1064 sprd_pctl->dev = &pdev->dev; in sprd_pinctrl_core_probe()
1069 dev_err(&pdev->dev, "fail to add pins information\n"); in sprd_pinctrl_core_probe()
1075 dev_err(&pdev->dev, "fail to parse dt properties\n"); in sprd_pinctrl_core_probe()
1079 pin_desc = devm_kcalloc(&pdev->dev, in sprd_pinctrl_core_probe()
1080 pinctrl_info->npins, in sprd_pinctrl_core_probe()
1084 return -ENOMEM; in sprd_pinctrl_core_probe()
1086 for (i = 0; i < pinctrl_info->npins; i++) { in sprd_pinctrl_core_probe()
1087 pin_desc[i].number = pinctrl_info->pins[i].number; in sprd_pinctrl_core_probe()
1088 pin_desc[i].name = pinctrl_info->pins[i].name; in sprd_pinctrl_core_probe()
1093 sprd_pinctrl_desc.name = dev_name(&pdev->dev); in sprd_pinctrl_core_probe()
1094 sprd_pinctrl_desc.npins = pinctrl_info->npins; in sprd_pinctrl_core_probe()
1096 sprd_pctl->pctl = pinctrl_register(&sprd_pinctrl_desc, in sprd_pinctrl_core_probe()
1097 &pdev->dev, (void *)sprd_pctl); in sprd_pinctrl_core_probe()
1098 if (IS_ERR(sprd_pctl->pctl)) { in sprd_pinctrl_core_probe()
1099 dev_err(&pdev->dev, "could not register pinctrl driver\n"); in sprd_pinctrl_core_probe()
1100 return PTR_ERR(sprd_pctl->pctl); in sprd_pinctrl_core_probe()
1111 pinctrl_unregister(sprd_pctl->pctl); in sprd_pinctrl_remove()
1120 pinctl = devm_pinctrl_get(&pdev->dev); in sprd_pinctrl_shutdown()