Lines Matching +full:pin +full:- +full:val

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Spreadtrum pin controller driver
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"
99 * struct sprd_pin: represent one pin's description
100 * @name: pin name
101 * @number: pin number
102 * @type: pin type, can be GLOBAL_CTRL_PIN/COMMON_PIN/MISC_PIN
103 * @reg: pin register address
104 * @bit_offset: bit offset in pin register
105 * @bit_width: bit width in pin register
119 * @npins: pin numbers of this group
133 * @npins: pin numbers of the whole SoC
145 * struct sprd_pinctrl: represent the pin controller device
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()
179 struct sprd_pin *pin = NULL; in sprd_pinctrl_get_pin_by_id() local
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()
189 return pin; in sprd_pinctrl_get_pin_by_id()
196 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; in sprd_pinctrl_find_group_by_name()
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()
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()
259 grp = sprd_pinctrl_find_group_by_name(pctl, np->name); 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()
393 unsigned int i, grp_pins = grp->npins; in sprd_pmx_set_mux()
395 unsigned int val = 0; in sprd_pmx_set_mux() local
397 if (group_selector >= info->ngroups) in sprd_pmx_set_mux()
398 return -EINVAL; in sprd_pmx_set_mux()
402 val &= PIN_FUNC_SEL_1; in sprd_pmx_set_mux()
405 val |= PIN_FUNC_SEL_2; in sprd_pmx_set_mux()
408 val |= PIN_FUNC_SEL_3; in sprd_pmx_set_mux()
411 val |= PIN_FUNC_SEL_4; in sprd_pmx_set_mux()
418 unsigned int pin_id = grp->pins[i]; in sprd_pmx_set_mux()
419 struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); in sprd_pmx_set_mux() local
421 if (!pin || pin->type != COMMON_PIN) in sprd_pmx_set_mux()
424 reg = readl((void __iomem *)pin->reg); in sprd_pmx_set_mux()
426 reg |= val; in sprd_pmx_set_mux()
427 writel(reg, (void __iomem *)pin->reg); in sprd_pmx_set_mux()
444 struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); in sprd_pinconf_get() local
448 if (!pin) in sprd_pinconf_get()
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()
520 unsigned int val = 0; in sprd_pinconf_drive() local
526 val |= BIT(19); in sprd_pinconf_drive()
529 val |= BIT(20); in sprd_pinconf_drive()
532 val |= BIT(19) | BIT(20); in sprd_pinconf_drive()
535 val |= BIT(21); in sprd_pinconf_drive()
538 val |= BIT(21) | BIT(19); in sprd_pinconf_drive()
541 val |= BIT(21) | BIT(20); in sprd_pinconf_drive()
544 val |= BIT(19) | BIT(20) | BIT(21); in sprd_pinconf_drive()
547 val |= BIT(22); in sprd_pinconf_drive()
550 val |= BIT(22) | BIT(19); in sprd_pinconf_drive()
553 val |= BIT(22) | BIT(20); in sprd_pinconf_drive()
556 val |= BIT(22) | BIT(20) | BIT(19); in sprd_pinconf_drive()
559 val |= BIT(22) | BIT(21); in sprd_pinconf_drive()
562 val |= BIT(22) | BIT(21) | BIT(19); in sprd_pinconf_drive()
565 val |= BIT(22) | BIT(21) | BIT(20); in sprd_pinconf_drive()
568 val |= BIT(22) | BIT(21) | BIT(20) | BIT(19); in sprd_pinconf_drive()
574 return val; in sprd_pinconf_drive()
596 struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); in sprd_pinconf_set() local
601 if (!pin) in sprd_pinconf_set()
602 return -EINVAL; in sprd_pinconf_set()
607 unsigned int param, arg, shift, mask, val; in sprd_pinconf_set() local
612 val = 0; in sprd_pinconf_set()
615 if (pin->type == GLOBAL_CTRL_PIN && in sprd_pinconf_set()
617 val = arg; in sprd_pinconf_set()
618 } else if (pin->type == COMMON_PIN || pin->type == MISC_PIN) { in sprd_pinconf_set()
622 val |= AP_SLEEP_MODE; in sprd_pinconf_set()
624 val |= PUBCP_SLEEP_MODE; in sprd_pinconf_set()
626 val |= TGLDSP_SLEEP_MODE; in sprd_pinconf_set()
628 val |= AGDSP_SLEEP_MODE; in sprd_pinconf_set()
630 val |= CM4_SLEEP_MODE; in sprd_pinconf_set()
638 val |= SLEEP_INPUT; in sprd_pinconf_set()
640 val &= ~SLEEP_INPUT; in sprd_pinconf_set()
649 val |= SLEEP_OUTPUT; in sprd_pinconf_set()
651 val &= ~SLEEP_OUTPUT; in sprd_pinconf_set()
659 val = shift = 0; in sprd_pinconf_set()
665 return -EINVAL; in sprd_pinconf_set()
667 val = sprd_pinconf_drive(arg); in sprd_pinconf_set()
673 val |= SLEEP_PULL_DOWN; in sprd_pinconf_set()
677 val |= PULL_DOWN; in sprd_pinconf_set()
684 val |= INPUT_SCHMITT; in sprd_pinconf_set()
686 val &= ~INPUT_SCHMITT; in sprd_pinconf_set()
693 val |= SLEEP_PULL_UP; in sprd_pinconf_set()
698 val |= PULL_UP_20K; in sprd_pinconf_set()
700 val |= PULL_UP_4_7K; in sprd_pinconf_set()
708 val = shift = 0; in sprd_pinconf_set()
711 val = shift = 0; 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()
735 reg |= val; 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()
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()
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()
791 struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); in sprd_pinconf_get_config() local
793 if (!pin) in sprd_pinconf_get_config()
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()
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},
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()
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()
969 *temp++ = grp->name; in sprd_pinctrl_parse_dt()
979 *temp++ = grp->name; in sprd_pinctrl_parse_dt()
992 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; in sprd_pinctrl_add_pins()
994 struct sprd_pin *pin; in sprd_pinctrl_add_pins() local
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()
1130 MODULE_DESCRIPTION("SPREADTRUM Pin Controller Driver");