Lines Matching +full:axp209 +full:- +full:adc

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2016 Maxime Ripard <maxime.ripard@free-electrons.com>
6 * Copyright (C) 2017 Quentin Schulz <quentin.schulz@free-electrons.com>
23 #include <linux/pinctrl/pinconf-generic.h>
54 /* Stores the pins supporting ADC function. Bit offset is pin number. */
124 return -EINVAL; in axp20x_gpio_get_reg()
133 /* AXP209 has GPIO3 status sharing the settings register */ in axp20x_gpio_get()
135 ret = regmap_read(pctl->regmap, AXP20X_GPIO3_CTRL, &val); in axp20x_gpio_get()
141 ret = regmap_read(pctl->regmap, AXP20X_GPIO20_SS, &val); in axp20x_gpio_get()
145 return !!(val & BIT(offset + pctl->desc->gpio_status_offset)); in axp20x_gpio_get()
155 /* AXP209 GPIO3 settings have a different layout */ in axp20x_gpio_get_direction()
157 ret = regmap_read(pctl->regmap, AXP20X_GPIO3_CTRL, &val); in axp20x_gpio_get_direction()
170 ret = regmap_read(pctl->regmap, reg, &val); in axp20x_gpio_get_direction()
195 return chip->set_rv(chip, offset, value); in axp20x_gpio_output()
204 /* AXP209 has GPIO3 status sharing the settings register */ in axp20x_gpio_set()
206 return regmap_update_bits(pctl->regmap, AXP20X_GPIO3_CTRL, in axp20x_gpio_set()
216 return regmap_update_bits(pctl->regmap, reg, AXP20X_GPIO_FUNCTIONS, in axp20x_gpio_set()
227 /* AXP209 GPIO3 settings have a different layout */ in axp20x_pmx_set()
229 return regmap_update_bits(pctl->regmap, AXP20X_GPIO3_CTRL, in axp20x_pmx_set()
238 return regmap_update_bits(pctl->regmap, reg, AXP20X_GPIO_FUNCTIONS, in axp20x_pmx_set()
246 return ARRAY_SIZE(pctl->funcs); in axp20x_pmx_func_cnt()
254 return pctl->funcs[selector].name; in axp20x_pmx_func_name()
264 *groups = pctl->funcs[selector].groups; in axp20x_pmx_func_groups()
265 *num_groups = pctl->funcs[selector].ngroups; in axp20x_pmx_func_groups()
279 pctl->funcs[function].muxval); in axp20x_pmx_set_mux()
282 mask = pctl->desc->ldo_mask; in axp20x_pmx_set_mux()
284 mask = pctl->desc->adc_mask; in axp20x_pmx_set_mux()
287 return -EINVAL; in axp20x_pmx_set_mux()
298 return axp20x_pmx_set(pctldev, group, pctl->funcs[function].muxval); in axp20x_pmx_set_mux()
309 pctl->funcs[AXP20X_FUNC_GPIO_IN].muxval); in axp20x_pmx_gpio_set_direction()
312 pctl->funcs[AXP20X_FUNC_GPIO_OUT].muxval); in axp20x_pmx_gpio_set_direction()
328 return pctl->desc->npins; in axp20x_groups_cnt()
336 *pins = (unsigned int *)&pctl->desc->pins[selector]; in axp20x_group_pins()
347 return pctl->desc->pins[selector].name; in axp20x_group_name()
368 func->ngroups = ngroups; in axp20x_funcs_groups_from_mask()
369 if (func->ngroups > 0) { in axp20x_funcs_groups_from_mask()
370 func->groups = devm_kcalloc(dev, in axp20x_funcs_groups_from_mask()
373 if (!func->groups) in axp20x_funcs_groups_from_mask()
374 return -ENOMEM; in axp20x_funcs_groups_from_mask()
375 group = func->groups; in axp20x_funcs_groups_from_mask()
388 int i, ret, pin, npins = pctl->desc->npins; in axp20x_build_funcs_groups()
390 pctl->funcs[AXP20X_FUNC_GPIO_OUT].name = "gpio_out"; in axp20x_build_funcs_groups()
391 pctl->funcs[AXP20X_FUNC_GPIO_OUT].muxval = AXP20X_MUX_GPIO_OUT; in axp20x_build_funcs_groups()
392 pctl->funcs[AXP20X_FUNC_GPIO_IN].name = "gpio_in"; in axp20x_build_funcs_groups()
393 pctl->funcs[AXP20X_FUNC_GPIO_IN].muxval = AXP20X_MUX_GPIO_IN; in axp20x_build_funcs_groups()
394 pctl->funcs[AXP20X_FUNC_LDO].name = "ldo"; in axp20x_build_funcs_groups()
399 pctl->funcs[AXP20X_FUNC_ADC].name = "adc"; in axp20x_build_funcs_groups()
400 pctl->funcs[AXP20X_FUNC_ADC].muxval = pctl->desc->adc_mux; in axp20x_build_funcs_groups()
404 pctl->funcs[i].ngroups = npins; in axp20x_build_funcs_groups()
405 pctl->funcs[i].groups = devm_kcalloc(&pdev->dev, in axp20x_build_funcs_groups()
408 if (!pctl->funcs[i].groups) in axp20x_build_funcs_groups()
409 return -ENOMEM; in axp20x_build_funcs_groups()
411 pctl->funcs[i].groups[pin] = pctl->desc->pins[pin].name; in axp20x_build_funcs_groups()
414 ret = axp20x_funcs_groups_from_mask(&pdev->dev, pctl->desc->ldo_mask, in axp20x_build_funcs_groups()
415 npins, &pctl->funcs[AXP20X_FUNC_LDO], in axp20x_build_funcs_groups()
416 pctl->desc->pins); in axp20x_build_funcs_groups()
420 ret = axp20x_funcs_groups_from_mask(&pdev->dev, pctl->desc->adc_mask, in axp20x_build_funcs_groups()
421 npins, &pctl->funcs[AXP20X_FUNC_ADC], in axp20x_build_funcs_groups()
422 pctl->desc->pins); in axp20x_build_funcs_groups()
430 { .compatible = "x-powers,axp209-gpio", .data = &axp20x_data, },
431 { .compatible = "x-powers,axp221-gpio", .data = &axp22x_data, },
432 { .compatible = "x-powers,axp813-gpio", .data = &axp813_data, },
439 struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent); in axp20x_pctl_probe()
441 struct device *dev = &pdev->dev; in axp20x_pctl_probe()
445 if (!of_device_is_available(pdev->dev.of_node)) in axp20x_pctl_probe()
446 return -ENODEV; in axp20x_pctl_probe()
449 dev_err(&pdev->dev, "Parent drvdata not set\n"); in axp20x_pctl_probe()
450 return -EINVAL; in axp20x_pctl_probe()
453 pctl = devm_kzalloc(&pdev->dev, sizeof(*pctl), GFP_KERNEL); in axp20x_pctl_probe()
455 return -ENOMEM; in axp20x_pctl_probe()
457 pctl->chip.base = -1; in axp20x_pctl_probe()
458 pctl->chip.can_sleep = true; in axp20x_pctl_probe()
459 pctl->chip.request = gpiochip_generic_request; in axp20x_pctl_probe()
460 pctl->chip.free = gpiochip_generic_free; in axp20x_pctl_probe()
461 pctl->chip.parent = &pdev->dev; in axp20x_pctl_probe()
462 pctl->chip.label = dev_name(&pdev->dev); in axp20x_pctl_probe()
463 pctl->chip.owner = THIS_MODULE; in axp20x_pctl_probe()
464 pctl->chip.get = axp20x_gpio_get; in axp20x_pctl_probe()
465 pctl->chip.get_direction = axp20x_gpio_get_direction; in axp20x_pctl_probe()
466 pctl->chip.set_rv = axp20x_gpio_set; in axp20x_pctl_probe()
467 pctl->chip.direction_input = pinctrl_gpio_direction_input; in axp20x_pctl_probe()
468 pctl->chip.direction_output = axp20x_gpio_output; in axp20x_pctl_probe()
470 pctl->desc = of_device_get_match_data(dev); in axp20x_pctl_probe()
472 pctl->chip.ngpio = pctl->desc->npins; in axp20x_pctl_probe()
474 pctl->regmap = axp20x->regmap; in axp20x_pctl_probe()
475 pctl->dev = &pdev->dev; in axp20x_pctl_probe()
481 dev_err(&pdev->dev, "failed to build groups\n"); in axp20x_pctl_probe()
485 pctrl_desc = devm_kzalloc(&pdev->dev, sizeof(*pctrl_desc), GFP_KERNEL); in axp20x_pctl_probe()
487 return -ENOMEM; in axp20x_pctl_probe()
489 pctrl_desc->name = dev_name(&pdev->dev); in axp20x_pctl_probe()
490 pctrl_desc->owner = THIS_MODULE; in axp20x_pctl_probe()
491 pctrl_desc->pins = pctl->desc->pins; in axp20x_pctl_probe()
492 pctrl_desc->npins = pctl->desc->npins; in axp20x_pctl_probe()
493 pctrl_desc->pctlops = &axp20x_pctrl_ops; in axp20x_pctl_probe()
494 pctrl_desc->pmxops = &axp20x_pmx_ops; in axp20x_pctl_probe()
496 pctl->pctl_dev = devm_pinctrl_register(&pdev->dev, pctrl_desc, pctl); in axp20x_pctl_probe()
497 if (IS_ERR(pctl->pctl_dev)) { in axp20x_pctl_probe()
498 dev_err(&pdev->dev, "couldn't register pinctrl driver\n"); in axp20x_pctl_probe()
499 return PTR_ERR(pctl->pctl_dev); in axp20x_pctl_probe()
502 ret = devm_gpiochip_add_data(&pdev->dev, &pctl->chip, pctl); in axp20x_pctl_probe()
504 dev_err(&pdev->dev, "Failed to register GPIO chip\n"); in axp20x_pctl_probe()
508 ret = gpiochip_add_pin_range(&pctl->chip, dev_name(&pdev->dev), in axp20x_pctl_probe()
509 pctl->desc->pins->number, in axp20x_pctl_probe()
510 pctl->desc->pins->number, in axp20x_pctl_probe()
511 pctl->desc->npins); in axp20x_pctl_probe()
513 dev_err(&pdev->dev, "failed to add pin range\n"); in axp20x_pctl_probe()
517 dev_info(&pdev->dev, "AXP209 pinctrl and GPIO driver loaded\n"); in axp20x_pctl_probe()
525 .name = "axp20x-gpio",
532 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
533 MODULE_AUTHOR("Quentin Schulz <quentin.schulz@free-electrons.com>");