• Home
  • Raw
  • Download

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
18 #include <linux/pinctrl/pinconf-generic.h>
26 #include "../pinctrl-utils.h"
27 #include "pinctrl-sprd.h"
97 * struct sprd_pin: represent one pin's description
98 * @name: pin name
99 * @number: pin number
100 * @type: pin type, can be GLOBAL_CTRL_PIN/COMMON_PIN/MISC_PIN
101 * @reg: pin register address
102 * @bit_offset: bit offset in pin register
103 * @bit_width: bit width in pin register
117 * @npins: pin numbers of this group
131 * @npins: pin numbers of the whole SoC
143 * struct sprd_pinctrl: represent the pin controller device
162 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; in sprd_pinctrl_get_id_by_name()
165 for (i = 0; i < info->npins; i++) { in sprd_pinctrl_get_id_by_name()
166 if (!strcmp(info->pins[i].name, name)) in sprd_pinctrl_get_id_by_name()
167 return info->pins[i].number; in sprd_pinctrl_get_id_by_name()
170 return -ENODEV; in sprd_pinctrl_get_id_by_name()
176 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; in sprd_pinctrl_get_pin_by_id()
177 struct sprd_pin *pin = NULL; in sprd_pinctrl_get_pin_by_id() local
180 for (i = 0; i < info->npins; i++) { in sprd_pinctrl_get_pin_by_id()
181 if (info->pins[i].number == id) { in sprd_pinctrl_get_pin_by_id()
182 pin = &info->pins[i]; in sprd_pinctrl_get_pin_by_id()
187 return pin; in sprd_pinctrl_get_pin_by_id()
194 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; in sprd_pinctrl_find_group_by_name()
198 for (i = 0; i < info->ngroups; i++) { in sprd_pinctrl_find_group_by_name()
199 if (!strcmp(info->groups[i].name, name)) { in sprd_pinctrl_find_group_by_name()
200 grp = &info->groups[i]; in sprd_pinctrl_find_group_by_name()
211 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pctrl_group_count()
213 return info->ngroups; in sprd_pctrl_group_count()
220 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pctrl_group_name()
222 return info->groups[selector].name; in sprd_pctrl_group_name()
231 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pctrl_group_pins()
233 if (selector >= info->ngroups) in sprd_pctrl_group_pins()
234 return -EINVAL; in sprd_pctrl_group_pins()
236 *pins = info->groups[selector].pins; in sprd_pctrl_group_pins()
237 *npins = info->groups[selector].npins; in sprd_pctrl_group_pins()
257 grp = sprd_pinctrl_find_group_by_name(pctl, np->name); in sprd_dt_node_to_map()
259 dev_err(pctl->dev, "unable to find group for node %s\n", in sprd_dt_node_to_map()
261 return -EINVAL; in sprd_dt_node_to_map()
275 if (ret != -EINVAL) in sprd_dt_node_to_map()
276 dev_err(pctl->dev, in sprd_dt_node_to_map()
285 dev_err(pctl->dev, "%s: could not parse node property\n", in sprd_dt_node_to_map()
306 grp->name, function); in sprd_dt_node_to_map()
316 pin_id = grp->pins[0]; in sprd_dt_node_to_map()
319 group_or_pin = grp->name; in sprd_dt_node_to_map()
336 seq_printf(s, "%s", dev_name(pctldev->dev)); in sprd_pctrl_dbg_show()
376 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pmx_get_function_groups()
378 *groups = info->grp_names; in sprd_pmx_get_function_groups()
379 *num_groups = info->ngroups; in sprd_pmx_get_function_groups()
389 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pmx_set_mux()
390 struct sprd_pin_group *grp = &info->groups[group_selector]; in sprd_pmx_set_mux()
391 unsigned int i, grp_pins = grp->npins; in sprd_pmx_set_mux()
393 unsigned int val = 0; in sprd_pmx_set_mux() local
395 if (group_selector >= info->ngroups) in sprd_pmx_set_mux()
396 return -EINVAL; in sprd_pmx_set_mux()
400 val &= PIN_FUNC_SEL_1; in sprd_pmx_set_mux()
403 val |= PIN_FUNC_SEL_2; in sprd_pmx_set_mux()
406 val |= PIN_FUNC_SEL_3; in sprd_pmx_set_mux()
409 val |= PIN_FUNC_SEL_4; in sprd_pmx_set_mux()
416 unsigned int pin_id = grp->pins[i]; in sprd_pmx_set_mux()
417 struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); in sprd_pmx_set_mux() local
419 if (!pin || pin->type != COMMON_PIN) in sprd_pmx_set_mux()
422 reg = readl((void __iomem *)pin->reg); in sprd_pmx_set_mux()
424 reg |= val; in sprd_pmx_set_mux()
425 writel(reg, (void __iomem *)pin->reg); in sprd_pmx_set_mux()
442 struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); in sprd_pinconf_get() local
446 if (!pin) in sprd_pinconf_get()
447 return -EINVAL; in sprd_pinconf_get()
449 if (pin->type == GLOBAL_CTRL_PIN) { in sprd_pinconf_get()
450 reg = (readl((void __iomem *)pin->reg) >> in sprd_pinconf_get()
451 pin->bit_offset) & PINCTRL_BIT_MASK(pin->bit_width); in sprd_pinconf_get()
453 reg = readl((void __iomem *)pin->reg); in sprd_pinconf_get()
456 if (pin->type == GLOBAL_CTRL_PIN && in sprd_pinconf_get()
459 } else if (pin->type == COMMON_PIN || pin->type == MISC_PIN) { in sprd_pinconf_get()
472 return -EINVAL; in sprd_pinconf_get()
498 return -EINVAL; in sprd_pinconf_get()
506 return -ENOTSUPP; in sprd_pinconf_get()
509 return -ENOTSUPP; in sprd_pinconf_get()
518 unsigned int val = 0; in sprd_pinconf_drive() local
524 val |= BIT(19); in sprd_pinconf_drive()
527 val |= BIT(20); in sprd_pinconf_drive()
530 val |= BIT(19) | BIT(20); in sprd_pinconf_drive()
533 val |= BIT(21); in sprd_pinconf_drive()
536 val |= BIT(21) | BIT(19); in sprd_pinconf_drive()
539 val |= BIT(21) | BIT(20); in sprd_pinconf_drive()
542 val |= BIT(19) | BIT(20) | BIT(21); in sprd_pinconf_drive()
545 val |= BIT(22); in sprd_pinconf_drive()
548 val |= BIT(22) | BIT(19); in sprd_pinconf_drive()
551 val |= BIT(22) | BIT(20); in sprd_pinconf_drive()
554 val |= BIT(22) | BIT(20) | BIT(19); in sprd_pinconf_drive()
557 val |= BIT(22) | BIT(21); in sprd_pinconf_drive()
560 val |= BIT(22) | BIT(21) | BIT(19); in sprd_pinconf_drive()
563 val |= BIT(22) | BIT(21) | BIT(20); in sprd_pinconf_drive()
566 val |= BIT(22) | BIT(21) | BIT(20) | BIT(19); in sprd_pinconf_drive()
572 return val; in sprd_pinconf_drive()
594 struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); in sprd_pinconf_set() local
599 if (!pin) in sprd_pinconf_set()
600 return -EINVAL; in sprd_pinconf_set()
605 unsigned int param, arg, shift, mask, val; in sprd_pinconf_set() local
610 val = 0; in sprd_pinconf_set()
613 if (pin->type == GLOBAL_CTRL_PIN && in sprd_pinconf_set()
615 val = arg; in sprd_pinconf_set()
616 } else if (pin->type == COMMON_PIN || pin->type == MISC_PIN) { in sprd_pinconf_set()
620 val |= AP_SLEEP_MODE; in sprd_pinconf_set()
622 val |= PUBCP_SLEEP_MODE; in sprd_pinconf_set()
624 val |= TGLDSP_SLEEP_MODE; in sprd_pinconf_set()
626 val |= AGDSP_SLEEP_MODE; in sprd_pinconf_set()
628 val |= CM4_SLEEP_MODE; in sprd_pinconf_set()
636 val |= SLEEP_INPUT; in sprd_pinconf_set()
638 val &= ~SLEEP_INPUT; in sprd_pinconf_set()
647 val |= SLEEP_OUTPUT; in sprd_pinconf_set()
649 val &= ~SLEEP_OUTPUT; in sprd_pinconf_set()
657 val = shift = 0; in sprd_pinconf_set()
663 return -EINVAL; in sprd_pinconf_set()
665 val = sprd_pinconf_drive(arg); in sprd_pinconf_set()
671 val |= SLEEP_PULL_DOWN; in sprd_pinconf_set()
675 val |= PULL_DOWN; in sprd_pinconf_set()
682 val |= INPUT_SCHMITT; in sprd_pinconf_set()
684 val &= ~INPUT_SCHMITT; in sprd_pinconf_set()
691 val |= SLEEP_PULL_UP; in sprd_pinconf_set()
696 val |= PULL_UP_20K; in sprd_pinconf_set()
698 val |= PULL_UP_4_7K; in sprd_pinconf_set()
706 val = shift = 0; in sprd_pinconf_set()
709 val = shift = 0; in sprd_pinconf_set()
717 return -ENOTSUPP; in sprd_pinconf_set()
720 return -ENOTSUPP; in sprd_pinconf_set()
723 if (pin->type == GLOBAL_CTRL_PIN) { in sprd_pinconf_set()
724 reg = readl((void __iomem *)pin->reg); in sprd_pinconf_set()
725 reg &= ~(PINCTRL_BIT_MASK(pin->bit_width) in sprd_pinconf_set()
726 << pin->bit_offset); in sprd_pinconf_set()
727 reg |= (val & PINCTRL_BIT_MASK(pin->bit_width)) in sprd_pinconf_set()
728 << pin->bit_offset; in sprd_pinconf_set()
729 writel(reg, (void __iomem *)pin->reg); in sprd_pinconf_set()
731 reg = readl((void __iomem *)pin->reg); in sprd_pinconf_set()
733 reg |= val; in sprd_pinconf_set()
734 writel(reg, (void __iomem *)pin->reg); in sprd_pinconf_set()
745 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pinconf_group_get()
749 if (selector >= info->ngroups) in sprd_pinconf_group_get()
750 return -EINVAL; in sprd_pinconf_group_get()
752 grp = &info->groups[selector]; in sprd_pinconf_group_get()
753 pin_id = grp->pins[0]; in sprd_pinconf_group_get()
764 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pinconf_group_set()
768 if (selector >= info->ngroups) in sprd_pinconf_group_set()
769 return -EINVAL; in sprd_pinconf_group_set()
771 grp = &info->groups[selector]; in sprd_pinconf_group_set()
773 for (i = 0; i < grp->npins; i++) { in sprd_pinconf_group_set()
774 unsigned int pin_id = grp->pins[i]; in sprd_pinconf_group_set()
789 struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); in sprd_pinconf_get_config() local
791 if (!pin) in sprd_pinconf_get_config()
792 return -EINVAL; in sprd_pinconf_get_config()
794 if (pin->type == GLOBAL_CTRL_PIN) { in sprd_pinconf_get_config()
795 *config = (readl((void __iomem *)pin->reg) >> in sprd_pinconf_get_config()
796 pin->bit_offset) & PINCTRL_BIT_MASK(pin->bit_width); in sprd_pinconf_get_config()
798 *config = readl((void __iomem *)pin->reg); in sprd_pinconf_get_config()
822 struct sprd_pinctrl_soc_info *info = pctl->info; in sprd_pinconf_group_dbg_show()
828 if (selector >= info->ngroups) in sprd_pinconf_group_dbg_show()
831 grp = &info->groups[selector]; in sprd_pinconf_group_dbg_show()
834 for (i = 0; i < grp->npins; i++, config++) { in sprd_pinconf_group_dbg_show()
835 unsigned int pin_id = grp->pins[i]; in sprd_pinconf_group_dbg_show()
858 {"sprd,sleep-mode", SPRD_PIN_CONFIG_SLEEP_MODE, 0},
892 grp->name = np->name; in sprd_pinctrl_parse_groups()
893 grp->npins = ret; in sprd_pinctrl_parse_groups()
894 grp->pins = devm_kcalloc(sprd_pctl->dev, in sprd_pinctrl_parse_groups()
895 grp->npins, sizeof(unsigned int), in sprd_pinctrl_parse_groups()
897 if (!grp->pins) in sprd_pinctrl_parse_groups()
898 return -ENOMEM; in sprd_pinctrl_parse_groups()
903 grp->pins[i++] = ret; in sprd_pinctrl_parse_groups()
906 for (i = 0; i < grp->npins; i++) { in sprd_pinctrl_parse_groups()
907 dev_dbg(sprd_pctl->dev, in sprd_pinctrl_parse_groups()
909 grp->name, grp->npins, grp->pins[i]); in sprd_pinctrl_parse_groups()
933 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; in sprd_pinctrl_parse_dt()
934 struct device_node *np = sprd_pctl->dev->of_node; in sprd_pinctrl_parse_dt()
941 return -ENODEV; in sprd_pinctrl_parse_dt()
943 info->ngroups = sprd_pinctrl_get_groups(np); in sprd_pinctrl_parse_dt()
944 if (!info->ngroups) in sprd_pinctrl_parse_dt()
947 info->groups = devm_kcalloc(sprd_pctl->dev, in sprd_pinctrl_parse_dt()
948 info->ngroups, in sprd_pinctrl_parse_dt()
951 if (!info->groups) in sprd_pinctrl_parse_dt()
952 return -ENOMEM; in sprd_pinctrl_parse_dt()
954 info->grp_names = devm_kcalloc(sprd_pctl->dev, in sprd_pinctrl_parse_dt()
955 info->ngroups, sizeof(char *), in sprd_pinctrl_parse_dt()
957 if (!info->grp_names) in sprd_pinctrl_parse_dt()
958 return -ENOMEM; in sprd_pinctrl_parse_dt()
960 temp = info->grp_names; in sprd_pinctrl_parse_dt()
961 grp = info->groups; in sprd_pinctrl_parse_dt()
970 *temp++ = grp->name; in sprd_pinctrl_parse_dt()
983 *temp++ = grp->name; in sprd_pinctrl_parse_dt()
996 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; in sprd_pinctrl_add_pins()
998 struct sprd_pin *pin; in sprd_pinctrl_add_pins() local
1001 info->npins = pins_cnt; in sprd_pinctrl_add_pins()
1002 info->pins = devm_kcalloc(sprd_pctl->dev, in sprd_pinctrl_add_pins()
1003 info->npins, sizeof(struct sprd_pin), in sprd_pinctrl_add_pins()
1005 if (!info->pins) in sprd_pinctrl_add_pins()
1006 return -ENOMEM; in sprd_pinctrl_add_pins()
1008 for (i = 0, pin = info->pins; i < info->npins; i++, pin++) { in sprd_pinctrl_add_pins()
1011 pin->name = sprd_soc_pin_info[i].name; in sprd_pinctrl_add_pins()
1012 pin->type = sprd_soc_pin_info[i].type; in sprd_pinctrl_add_pins()
1013 pin->number = sprd_soc_pin_info[i].num; in sprd_pinctrl_add_pins()
1015 if (pin->type == GLOBAL_CTRL_PIN) { in sprd_pinctrl_add_pins()
1016 pin->reg = (unsigned long)sprd_pctl->base + in sprd_pinctrl_add_pins()
1018 pin->bit_offset = sprd_soc_pin_info[i].bit_offset; in sprd_pinctrl_add_pins()
1019 pin->bit_width = sprd_soc_pin_info[i].bit_width; in sprd_pinctrl_add_pins()
1021 } else if (pin->type == COMMON_PIN) { in sprd_pinctrl_add_pins()
1022 pin->reg = (unsigned long)sprd_pctl->base + in sprd_pinctrl_add_pins()
1024 (i - ctrl_pin); in sprd_pinctrl_add_pins()
1026 } else if (pin->type == MISC_PIN) { in sprd_pinctrl_add_pins()
1027 pin->reg = (unsigned long)sprd_pctl->base + in sprd_pinctrl_add_pins()
1029 (i - ctrl_pin - com_pin); in sprd_pinctrl_add_pins()
1033 for (i = 0, pin = info->pins; i < info->npins; pin++, i++) { in sprd_pinctrl_add_pins()
1034 dev_dbg(sprd_pctl->dev, "pin name[%s-%d], type = %d, " in sprd_pinctrl_add_pins()
1036 pin->name, pin->number, pin->type, in sprd_pinctrl_add_pins()
1037 pin->bit_offset, pin->bit_width, pin->reg); in sprd_pinctrl_add_pins()
1052 sprd_pctl = devm_kzalloc(&pdev->dev, sizeof(struct sprd_pinctrl), in sprd_pinctrl_core_probe()
1055 return -ENOMEM; in sprd_pinctrl_core_probe()
1057 sprd_pctl->base = devm_platform_ioremap_resource(pdev, 0); in sprd_pinctrl_core_probe()
1058 if (IS_ERR(sprd_pctl->base)) in sprd_pinctrl_core_probe()
1059 return PTR_ERR(sprd_pctl->base); in sprd_pinctrl_core_probe()
1061 pinctrl_info = devm_kzalloc(&pdev->dev, in sprd_pinctrl_core_probe()
1065 return -ENOMEM; in sprd_pinctrl_core_probe()
1067 sprd_pctl->info = pinctrl_info; in sprd_pinctrl_core_probe()
1068 sprd_pctl->dev = &pdev->dev; in sprd_pinctrl_core_probe()
1073 dev_err(&pdev->dev, "fail to add pins information\n"); in sprd_pinctrl_core_probe()
1079 dev_err(&pdev->dev, "fail to parse dt properties\n"); in sprd_pinctrl_core_probe()
1083 pin_desc = devm_kcalloc(&pdev->dev, in sprd_pinctrl_core_probe()
1084 pinctrl_info->npins, in sprd_pinctrl_core_probe()
1088 return -ENOMEM; in sprd_pinctrl_core_probe()
1090 for (i = 0; i < pinctrl_info->npins; i++) { in sprd_pinctrl_core_probe()
1091 pin_desc[i].number = pinctrl_info->pins[i].number; in sprd_pinctrl_core_probe()
1092 pin_desc[i].name = pinctrl_info->pins[i].name; in sprd_pinctrl_core_probe()
1097 sprd_pinctrl_desc.name = dev_name(&pdev->dev); in sprd_pinctrl_core_probe()
1098 sprd_pinctrl_desc.npins = pinctrl_info->npins; in sprd_pinctrl_core_probe()
1100 sprd_pctl->pctl = pinctrl_register(&sprd_pinctrl_desc, in sprd_pinctrl_core_probe()
1101 &pdev->dev, (void *)sprd_pctl); in sprd_pinctrl_core_probe()
1102 if (IS_ERR(sprd_pctl->pctl)) { in sprd_pinctrl_core_probe()
1103 dev_err(&pdev->dev, "could not register pinctrl driver\n"); in sprd_pinctrl_core_probe()
1104 return PTR_ERR(sprd_pctl->pctl); in sprd_pinctrl_core_probe()
1115 pinctrl_unregister(sprd_pctl->pctl); in sprd_pinctrl_remove()
1125 pinctl = devm_pinctrl_get(&pdev->dev); in sprd_pinctrl_shutdown()
1135 MODULE_DESCRIPTION("SPREADTRUM Pin Controller Driver");