Lines Matching refs:pc

71 static int meson_get_bank(struct meson_pinctrl *pc, unsigned int pin,  in meson_get_bank()  argument
76 for (i = 0; i < pc->data->num_banks; i++) { in meson_get_bank()
77 if (pin >= pc->data->banks[i].first && in meson_get_bank()
78 pin <= pc->data->banks[i].last) { in meson_get_bank()
79 *bank = &pc->data->banks[i]; in meson_get_bank()
108 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_get_groups_count() local
110 return pc->data->num_groups; in meson_get_groups_count()
116 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_get_group_name() local
118 return pc->data->groups[selector].name; in meson_get_group_name()
124 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_get_group_pins() local
126 *pins = pc->data->groups[selector].pins; in meson_get_group_pins()
127 *num_pins = pc->data->groups[selector].num_pins; in meson_get_group_pins()
149 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pmx_get_funcs_count() local
151 return pc->data->num_funcs; in meson_pmx_get_funcs_count()
157 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pmx_get_func_name() local
159 return pc->data->funcs[selector].name; in meson_pmx_get_func_name()
166 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pmx_get_groups() local
168 *groups = pc->data->funcs[selector].groups; in meson_pmx_get_groups()
169 *num_groups = pc->data->funcs[selector].num_groups; in meson_pmx_get_groups()
177 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pinconf_set() local
183 ret = meson_get_bank(pc, pin, &bank); in meson_pinconf_set()
192 dev_dbg(pc->dev, "pin %u: disable bias\n", pin); in meson_pinconf_set()
195 ret = regmap_update_bits(pc->reg_pull, reg, in meson_pinconf_set()
201 dev_dbg(pc->dev, "pin %u: enable pull-up\n", pin); in meson_pinconf_set()
205 ret = regmap_update_bits(pc->reg_pullen, reg, in meson_pinconf_set()
211 ret = regmap_update_bits(pc->reg_pull, reg, in meson_pinconf_set()
217 dev_dbg(pc->dev, "pin %u: enable pull-down\n", pin); in meson_pinconf_set()
221 ret = regmap_update_bits(pc->reg_pullen, reg, in meson_pinconf_set()
227 ret = regmap_update_bits(pc->reg_pull, reg, in meson_pinconf_set()
240 static int meson_pinconf_get_pull(struct meson_pinctrl *pc, unsigned int pin) in meson_pinconf_get_pull() argument
246 ret = meson_get_bank(pc, pin, &bank); in meson_pinconf_get_pull()
252 ret = regmap_read(pc->reg_pullen, reg, &val); in meson_pinconf_get_pull()
261 ret = regmap_read(pc->reg_pull, reg, &val); in meson_pinconf_get_pull()
277 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pinconf_get() local
285 if (meson_pinconf_get_pull(pc, pin) == param) in meson_pinconf_get()
295 dev_dbg(pc->dev, "pinconf for pin %u is %lu\n", pin, *config); in meson_pinconf_get()
304 struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); in meson_pinconf_group_set() local
305 struct meson_pmx_group *group = &pc->data->groups[num_group]; in meson_pinconf_group_set()
308 dev_dbg(pc->dev, "set pinconf for group %s\n", group->name); in meson_pinconf_group_set()
334 struct meson_pinctrl *pc = gpiochip_get_data(chip); in meson_gpio_direction_input() local
339 ret = meson_get_bank(pc, gpio, &bank); in meson_gpio_direction_input()
345 return regmap_update_bits(pc->reg_gpio, reg, BIT(bit), BIT(bit)); in meson_gpio_direction_input()
351 struct meson_pinctrl *pc = gpiochip_get_data(chip); in meson_gpio_direction_output() local
356 ret = meson_get_bank(pc, gpio, &bank); in meson_gpio_direction_output()
361 ret = regmap_update_bits(pc->reg_gpio, reg, BIT(bit), 0); in meson_gpio_direction_output()
366 return regmap_update_bits(pc->reg_gpio, reg, BIT(bit), in meson_gpio_direction_output()
372 struct meson_pinctrl *pc = gpiochip_get_data(chip); in meson_gpio_set() local
377 ret = meson_get_bank(pc, gpio, &bank); in meson_gpio_set()
382 regmap_update_bits(pc->reg_gpio, reg, BIT(bit), in meson_gpio_set()
388 struct meson_pinctrl *pc = gpiochip_get_data(chip); in meson_gpio_get() local
393 ret = meson_get_bank(pc, gpio, &bank); in meson_gpio_get()
398 regmap_read(pc->reg_gpio, reg, &val); in meson_gpio_get()
403 static int meson_gpiolib_register(struct meson_pinctrl *pc) in meson_gpiolib_register() argument
407 pc->chip.label = pc->data->name; in meson_gpiolib_register()
408 pc->chip.parent = pc->dev; in meson_gpiolib_register()
409 pc->chip.request = gpiochip_generic_request; in meson_gpiolib_register()
410 pc->chip.free = gpiochip_generic_free; in meson_gpiolib_register()
411 pc->chip.direction_input = meson_gpio_direction_input; in meson_gpiolib_register()
412 pc->chip.direction_output = meson_gpio_direction_output; in meson_gpiolib_register()
413 pc->chip.get = meson_gpio_get; in meson_gpiolib_register()
414 pc->chip.set = meson_gpio_set; in meson_gpiolib_register()
415 pc->chip.base = -1; in meson_gpiolib_register()
416 pc->chip.ngpio = pc->data->num_pins; in meson_gpiolib_register()
417 pc->chip.can_sleep = false; in meson_gpiolib_register()
418 pc->chip.of_node = pc->of_node; in meson_gpiolib_register()
419 pc->chip.of_gpio_n_cells = 2; in meson_gpiolib_register()
421 ret = gpiochip_add_data(&pc->chip, pc); in meson_gpiolib_register()
423 dev_err(pc->dev, "can't add gpio chip %s\n", in meson_gpiolib_register()
424 pc->data->name); in meson_gpiolib_register()
437 static struct regmap *meson_map_resource(struct meson_pinctrl *pc, in meson_map_resource() argument
448 base = devm_ioremap_resource(pc->dev, &res); in meson_map_resource()
453 meson_regmap_config.name = devm_kasprintf(pc->dev, GFP_KERNEL, in meson_map_resource()
459 return devm_regmap_init_mmio(pc->dev, base, &meson_regmap_config); in meson_map_resource()
462 static int meson_pinctrl_parse_dt(struct meson_pinctrl *pc, in meson_pinctrl_parse_dt() argument
471 dev_err(pc->dev, "multiple gpio nodes\n"); in meson_pinctrl_parse_dt()
478 dev_err(pc->dev, "no gpio node found\n"); in meson_pinctrl_parse_dt()
482 pc->of_node = gpio_np; in meson_pinctrl_parse_dt()
484 pc->reg_mux = meson_map_resource(pc, gpio_np, "mux"); in meson_pinctrl_parse_dt()
485 if (IS_ERR(pc->reg_mux)) { in meson_pinctrl_parse_dt()
486 dev_err(pc->dev, "mux registers not found\n"); in meson_pinctrl_parse_dt()
487 return PTR_ERR(pc->reg_mux); in meson_pinctrl_parse_dt()
490 pc->reg_pull = meson_map_resource(pc, gpio_np, "pull"); in meson_pinctrl_parse_dt()
491 if (IS_ERR(pc->reg_pull)) { in meson_pinctrl_parse_dt()
492 dev_err(pc->dev, "pull registers not found\n"); in meson_pinctrl_parse_dt()
493 return PTR_ERR(pc->reg_pull); in meson_pinctrl_parse_dt()
496 pc->reg_pullen = meson_map_resource(pc, gpio_np, "pull-enable"); in meson_pinctrl_parse_dt()
498 if (IS_ERR(pc->reg_pullen)) in meson_pinctrl_parse_dt()
499 pc->reg_pullen = pc->reg_pull; in meson_pinctrl_parse_dt()
501 pc->reg_gpio = meson_map_resource(pc, gpio_np, "gpio"); in meson_pinctrl_parse_dt()
502 if (IS_ERR(pc->reg_gpio)) { in meson_pinctrl_parse_dt()
503 dev_err(pc->dev, "gpio registers not found\n"); in meson_pinctrl_parse_dt()
504 return PTR_ERR(pc->reg_gpio); in meson_pinctrl_parse_dt()
513 struct meson_pinctrl *pc; in meson_pinctrl_probe() local
516 pc = devm_kzalloc(dev, sizeof(struct meson_pinctrl), GFP_KERNEL); in meson_pinctrl_probe()
517 if (!pc) in meson_pinctrl_probe()
520 pc->dev = dev; in meson_pinctrl_probe()
521 pc->data = (struct meson_pinctrl_data *) of_device_get_match_data(dev); in meson_pinctrl_probe()
523 ret = meson_pinctrl_parse_dt(pc, dev->of_node); in meson_pinctrl_probe()
527 pc->desc.name = "pinctrl-meson"; in meson_pinctrl_probe()
528 pc->desc.owner = THIS_MODULE; in meson_pinctrl_probe()
529 pc->desc.pctlops = &meson_pctrl_ops; in meson_pinctrl_probe()
530 pc->desc.pmxops = pc->data->pmx_ops; in meson_pinctrl_probe()
531 pc->desc.confops = &meson_pinconf_ops; in meson_pinctrl_probe()
532 pc->desc.pins = pc->data->pins; in meson_pinctrl_probe()
533 pc->desc.npins = pc->data->num_pins; in meson_pinctrl_probe()
535 pc->pcdev = devm_pinctrl_register(pc->dev, &pc->desc, pc); in meson_pinctrl_probe()
536 if (IS_ERR(pc->pcdev)) { in meson_pinctrl_probe()
537 dev_err(pc->dev, "can't register pinctrl device"); in meson_pinctrl_probe()
538 return PTR_ERR(pc->pcdev); in meson_pinctrl_probe()
541 return meson_gpiolib_register(pc); in meson_pinctrl_probe()