static int meson_pinctrl_parse_dt(struct meson_pinctrl *pc, struct device_node *node) { struct device_node *np, *gpio_np = NULL; for_each_child_of_node(node, np) { if (!of_find_property(np, "gpio-controller", NULL)) continue; if (gpio_np) { dev_err(pc->dev, "multiple gpio nodes\n"); return -EINVAL; } gpio_np = np; } if (!gpio_np) { dev_err(pc->dev, "no gpio node found\n"); return -EINVAL; } pc->of_node = gpio_np; pc->reg_mux = meson_map_resource(pc, gpio_np, "mux"); if (IS_ERR(pc->reg_mux)) { dev_err(pc->dev, "mux registers not found\n"); return PTR_ERR(pc->reg_mux); } pc->reg_pull = meson_map_resource(pc, gpio_np, "pull"); if (IS_ERR(pc->reg_pull)) { dev_err(pc->dev, "pull registers not found\n"); return PTR_ERR(pc->reg_pull); } pc->reg_pullen = meson_map_resource(pc, gpio_np, "pull-enable"); /* Use pull region if pull-enable one is not present */ if (IS_ERR(pc->reg_pullen)) pc->reg_pullen = pc->reg_pull; pc->reg_gpio = meson_map_resource(pc, gpio_np, "gpio"); if (IS_ERR(pc->reg_gpio)) { dev_err(pc->dev, "gpio registers not found\n"); return PTR_ERR(pc->reg_gpio); } return 0; }
static int meson_pinctrl_parse_dt(struct amlogic_pmx *pc, struct device_node *node) { struct device_node *np; struct meson_domain *domain; int i = 0, num_domains = 0; for_each_child_of_node(node, np) { if (!of_find_property(np, "gpio-controller", NULL)) continue; num_domains++; } if (num_domains != pc->soc->num_domains) { dev_err(pc->dev, "wrong number of subnodes\n"); return -EINVAL; } pc->domains = devm_kzalloc(pc->dev, num_domains * sizeof(struct meson_domain), GFP_KERNEL); if (!pc->domains) return -ENOMEM; for_each_child_of_node(node, np) { if (!of_find_property(np, "gpio-controller", NULL)) continue; domain = &pc->domains[i]; domain->data = meson_get_domain_data(pc, np); if (!domain->data) { dev_err(pc->dev, "domain data not found for node %s\n", np->name); return -ENODEV; } domain->of_node = np; domain->reg_mux = meson_map_resource(pc, np, "mux"); if (IS_ERR(domain->reg_mux)) { dev_err(pc->dev, "mux registers not found\n"); return PTR_ERR(domain->reg_mux); } domain->reg_pull = meson_map_resource(pc, np, "pull"); if (IS_ERR(domain->reg_pull)) { dev_err(pc->dev, "pull registers not found\n"); return PTR_ERR(domain->reg_pull); } domain->reg_pullen = meson_map_resource(pc, np, "pull-enable"); /* Use pull region if pull-enable one is not present */ if (IS_ERR(domain->reg_pullen)) domain->reg_pullen = domain->reg_pull; domain->reg_gpio = meson_map_resource(pc, np, "gpio"); if (IS_ERR(domain->reg_gpio)) { dev_err(pc->dev, "gpio registers not found\n"); return PTR_ERR(domain->reg_gpio); } i++; } return 0; }