Lines Matching refs:pc
102 static int meson_get_domain_and_bank(struct meson_pinctrl *pc, unsigned int pin, in meson_get_domain_and_bank() argument
109 for (i = 0; i < pc->data->num_domains; i++) { in meson_get_domain_and_bank()
110 d = &pc->domains[i]; in meson_get_domain_and_bank()
142 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_get_groups_count() local
144 return pc->data->num_groups; in meson_get_groups_count()
150 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_get_group_name() local
152 return pc->data->groups[selector].name; in meson_get_group_name()
158 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_get_group_pins() local
160 *pins = pc->data->groups[selector].pins; in meson_get_group_pins()
161 *num_pins = pc->data->groups[selector].num_pins; in meson_get_group_pins()
192 static void meson_pmx_disable_other_groups(struct meson_pinctrl *pc, in meson_pmx_disable_other_groups() argument
199 for (i = 0; i < pc->data->num_groups; i++) { in meson_pmx_disable_other_groups()
200 group = &pc->data->groups[i]; in meson_pmx_disable_other_groups()
207 domain = &pc->domains[group->domain]; in meson_pmx_disable_other_groups()
219 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pmx_set_mux() local
220 struct meson_pmx_func *func = &pc->data->funcs[func_num]; in meson_pmx_set_mux()
221 struct meson_pmx_group *group = &pc->data->groups[group_num]; in meson_pmx_set_mux()
222 struct meson_domain *domain = &pc->domains[group->domain]; in meson_pmx_set_mux()
225 dev_dbg(pc->dev, "enable function %s, group %s\n", func->name, in meson_pmx_set_mux()
233 meson_pmx_disable_other_groups(pc, group->pins[i], group_num); in meson_pmx_set_mux()
247 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pmx_request_gpio() local
249 meson_pmx_disable_other_groups(pc, range->pin_base + offset, -1); in meson_pmx_request_gpio()
256 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pmx_get_funcs_count() local
258 return pc->data->num_funcs; in meson_pmx_get_funcs_count()
264 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pmx_get_func_name() local
266 return pc->data->funcs[selector].name; in meson_pmx_get_func_name()
273 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pmx_get_groups() local
275 *groups = pc->data->funcs[selector].groups; in meson_pmx_get_groups()
276 *num_groups = pc->data->funcs[selector].num_groups; in meson_pmx_get_groups()
292 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pinconf_set() local
300 ret = meson_get_domain_and_bank(pc, pin, &domain, &bank); in meson_pinconf_set()
310 dev_dbg(pc->dev, "pin %u: disable bias\n", pin); in meson_pinconf_set()
319 dev_dbg(pc->dev, "pin %u: enable pull-up\n", pin); in meson_pinconf_set()
335 dev_dbg(pc->dev, "pin %u: enable pull-down\n", pin); in meson_pinconf_set()
358 static int meson_pinconf_get_pull(struct meson_pinctrl *pc, unsigned int pin) in meson_pinconf_get_pull() argument
365 ret = meson_get_domain_and_bank(pc, pin, &domain, &bank); in meson_pinconf_get_pull()
396 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pinconf_get() local
404 if (meson_pinconf_get_pull(pc, pin) == param) in meson_pinconf_get()
414 dev_dbg(pc->dev, "pinconf for pin %u is %lu\n", pin, *config); in meson_pinconf_get()
423 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pinconf_group_set() local
424 struct meson_pmx_group *group = &pc->data->groups[num_group]; in meson_pinconf_group_set()
427 dev_dbg(pc->dev, "set pinconf for group %s\n", group->name); in meson_pinconf_group_set()
556 static int meson_gpiolib_register(struct meson_pinctrl *pc) in meson_gpiolib_register() argument
561 for (i = 0; i < pc->data->num_domains; i++) { in meson_gpiolib_register()
562 domain = &pc->domains[i]; in meson_gpiolib_register()
565 domain->chip.dev = pc->dev; in meson_gpiolib_register()
580 dev_err(pc->dev, "can't add gpio chip %s\n", in meson_gpiolib_register()
585 ret = gpiochip_add_pin_range(&domain->chip, dev_name(pc->dev), in meson_gpiolib_register()
589 dev_err(pc->dev, "can't add pin range\n"); in meson_gpiolib_register()
597 gpiochip_remove(&pc->domains[i].chip); in meson_gpiolib_register()
602 static struct meson_domain_data *meson_get_domain_data(struct meson_pinctrl *pc, in meson_get_domain_data() argument
607 for (i = 0; i < pc->data->num_domains; i++) { in meson_get_domain_data()
608 if (!strcmp(np->name, pc->data->domain_data[i].name)) in meson_get_domain_data()
609 return &pc->data->domain_data[i]; in meson_get_domain_data()
621 static struct regmap *meson_map_resource(struct meson_pinctrl *pc, in meson_map_resource() argument
632 base = devm_ioremap_resource(pc->dev, &res); in meson_map_resource()
637 meson_regmap_config.name = devm_kasprintf(pc->dev, GFP_KERNEL, in meson_map_resource()
643 return devm_regmap_init_mmio(pc->dev, base, &meson_regmap_config); in meson_map_resource()
646 static int meson_pinctrl_parse_dt(struct meson_pinctrl *pc, in meson_pinctrl_parse_dt() argument
659 if (num_domains != pc->data->num_domains) { in meson_pinctrl_parse_dt()
660 dev_err(pc->dev, "wrong number of subnodes\n"); in meson_pinctrl_parse_dt()
664 pc->domains = devm_kzalloc(pc->dev, num_domains * in meson_pinctrl_parse_dt()
666 if (!pc->domains) in meson_pinctrl_parse_dt()
673 domain = &pc->domains[i]; in meson_pinctrl_parse_dt()
675 domain->data = meson_get_domain_data(pc, np); in meson_pinctrl_parse_dt()
677 dev_err(pc->dev, "domain data not found for node %s\n", in meson_pinctrl_parse_dt()
684 domain->reg_mux = meson_map_resource(pc, np, "mux"); in meson_pinctrl_parse_dt()
686 dev_err(pc->dev, "mux registers not found\n"); in meson_pinctrl_parse_dt()
690 domain->reg_pull = meson_map_resource(pc, np, "pull"); in meson_pinctrl_parse_dt()
692 dev_err(pc->dev, "pull registers not found\n"); in meson_pinctrl_parse_dt()
696 domain->reg_pullen = meson_map_resource(pc, np, "pull-enable"); in meson_pinctrl_parse_dt()
701 domain->reg_gpio = meson_map_resource(pc, np, "gpio"); in meson_pinctrl_parse_dt()
703 dev_err(pc->dev, "gpio registers not found\n"); in meson_pinctrl_parse_dt()
717 struct meson_pinctrl *pc; in meson_pinctrl_probe() local
720 pc = devm_kzalloc(dev, sizeof(struct meson_pinctrl), GFP_KERNEL); in meson_pinctrl_probe()
721 if (!pc) in meson_pinctrl_probe()
724 pc->dev = dev; in meson_pinctrl_probe()
726 pc->data = (struct meson_pinctrl_data *)match->data; in meson_pinctrl_probe()
728 ret = meson_pinctrl_parse_dt(pc, pdev->dev.of_node); in meson_pinctrl_probe()
732 pc->desc.name = "pinctrl-meson"; in meson_pinctrl_probe()
733 pc->desc.owner = THIS_MODULE; in meson_pinctrl_probe()
734 pc->desc.pctlops = &meson_pctrl_ops; in meson_pinctrl_probe()
735 pc->desc.pmxops = &meson_pmx_ops; in meson_pinctrl_probe()
736 pc->desc.confops = &meson_pinconf_ops; in meson_pinctrl_probe()
737 pc->desc.pins = pc->data->pins; in meson_pinctrl_probe()
738 pc->desc.npins = pc->data->num_pins; in meson_pinctrl_probe()
740 pc->pcdev = pinctrl_register(&pc->desc, pc->dev, pc); in meson_pinctrl_probe()
741 if (IS_ERR(pc->pcdev)) { in meson_pinctrl_probe()
742 dev_err(pc->dev, "can't register pinctrl device"); in meson_pinctrl_probe()
743 return PTR_ERR(pc->pcdev); in meson_pinctrl_probe()
746 ret = meson_gpiolib_register(pc); in meson_pinctrl_probe()
748 pinctrl_unregister(pc->pcdev); in meson_pinctrl_probe()