Lines Matching +full:data +full:- +full:pins

1 // SPDX-License-Identifier: GPL-2.0-only
18 #include <linux/pinctrl/pinconf-generic.h>
24 #include "pinctrl-wmt.h"
26 static inline void wmt_setbits(struct wmt_pinctrl_data *data, u32 reg, in wmt_setbits() argument
31 val = readl_relaxed(data->base + reg); in wmt_setbits()
33 writel_relaxed(val, data->base + reg); in wmt_setbits()
36 static inline void wmt_clearbits(struct wmt_pinctrl_data *data, u32 reg, in wmt_clearbits() argument
41 val = readl_relaxed(data->base + reg); in wmt_clearbits()
43 writel_relaxed(val, data->base + reg); in wmt_clearbits()
75 struct wmt_pinctrl_data *data = pinctrl_dev_get_drvdata(pctldev); in wmt_pmx_get_function_groups() local
78 *groups = data->groups; in wmt_pmx_get_function_groups()
79 *num_groups = data->ngroups; in wmt_pmx_get_function_groups()
84 static int wmt_set_pinmux(struct wmt_pinctrl_data *data, unsigned func, in wmt_set_pinmux() argument
89 u32 reg_en = data->banks[bank].reg_en; in wmt_set_pinmux()
90 u32 reg_dir = data->banks[bank].reg_dir; in wmt_set_pinmux()
93 dev_err(data->dev, "pin:%d no direction register defined\n", in wmt_set_pinmux()
95 return -EINVAL; in wmt_set_pinmux()
105 wmt_setbits(data, reg_en, BIT(bit)); in wmt_set_pinmux()
106 wmt_clearbits(data, reg_dir, BIT(bit)); in wmt_set_pinmux()
110 wmt_setbits(data, reg_en, BIT(bit)); in wmt_set_pinmux()
111 wmt_setbits(data, reg_dir, BIT(bit)); in wmt_set_pinmux()
115 dev_err(data->dev, "pin:%d no alt function available\n", in wmt_set_pinmux()
117 return -EINVAL; in wmt_set_pinmux()
119 wmt_clearbits(data, reg_en, BIT(bit)); in wmt_set_pinmux()
129 struct wmt_pinctrl_data *data = pinctrl_dev_get_drvdata(pctldev); in wmt_pmx_set_mux() local
130 u32 pinnum = data->pins[group_selector].number; in wmt_pmx_set_mux()
132 return wmt_set_pinmux(data, func_selector, pinnum); in wmt_pmx_set_mux()
139 struct wmt_pinctrl_data *data = pinctrl_dev_get_drvdata(pctldev); in wmt_pmx_gpio_disable_free() local
142 wmt_set_pinmux(data, WMT_FSEL_GPIO_IN, offset); in wmt_pmx_gpio_disable_free()
150 struct wmt_pinctrl_data *data = pinctrl_dev_get_drvdata(pctldev); in wmt_pmx_gpio_set_direction() local
152 wmt_set_pinmux(data, (input ? WMT_FSEL_GPIO_IN : WMT_FSEL_GPIO_OUT), in wmt_pmx_gpio_set_direction()
169 struct wmt_pinctrl_data *data = pinctrl_dev_get_drvdata(pctldev); in wmt_get_groups_count() local
171 return data->ngroups; in wmt_get_groups_count()
177 struct wmt_pinctrl_data *data = pinctrl_dev_get_drvdata(pctldev); in wmt_get_group_name() local
179 return data->groups[selector]; in wmt_get_group_name()
184 const unsigned **pins, in wmt_get_group_pins() argument
187 struct wmt_pinctrl_data *data = pinctrl_dev_get_drvdata(pctldev); in wmt_get_group_pins() local
189 *pins = &data->pins[selector].number; in wmt_get_group_pins()
195 static int wmt_pctl_find_group_by_pin(struct wmt_pinctrl_data *data, u32 pin) in wmt_pctl_find_group_by_pin() argument
199 for (i = 0; i < data->npins; i++) { in wmt_pctl_find_group_by_pin()
200 if (data->pins[i].number == pin) in wmt_pctl_find_group_by_pin()
204 return -EINVAL; in wmt_pctl_find_group_by_pin()
207 static int wmt_pctl_dt_node_to_map_func(struct wmt_pinctrl_data *data, in wmt_pctl_dt_node_to_map_func() argument
216 dev_err(data->dev, "invalid wm,function %d\n", fnum); in wmt_pctl_dt_node_to_map_func()
217 return -EINVAL; in wmt_pctl_dt_node_to_map_func()
220 group = wmt_pctl_find_group_by_pin(data, pin); in wmt_pctl_dt_node_to_map_func()
222 dev_err(data->dev, "unable to match pin %d to group\n", pin); in wmt_pctl_dt_node_to_map_func()
226 map->type = PIN_MAP_TYPE_MUX_GROUP; in wmt_pctl_dt_node_to_map_func()
227 map->data.mux.group = data->groups[group]; in wmt_pctl_dt_node_to_map_func()
228 map->data.mux.function = wmt_functions[fnum]; in wmt_pctl_dt_node_to_map_func()
234 static int wmt_pctl_dt_node_to_map_pull(struct wmt_pinctrl_data *data, in wmt_pctl_dt_node_to_map_pull() argument
244 dev_err(data->dev, "invalid wm,pull %d\n", pull); in wmt_pctl_dt_node_to_map_pull()
245 return -EINVAL; in wmt_pctl_dt_node_to_map_pull()
248 group = wmt_pctl_find_group_by_pin(data, pin); in wmt_pctl_dt_node_to_map_pull()
250 dev_err(data->dev, "unable to match pin %d to group\n", pin); in wmt_pctl_dt_node_to_map_pull()
256 return -ENOMEM; in wmt_pctl_dt_node_to_map_pull()
270 dev_err(data->dev, "invalid pull state %d - disabling\n", pull); in wmt_pctl_dt_node_to_map_pull()
273 map->type = PIN_MAP_TYPE_CONFIGS_PIN; in wmt_pctl_dt_node_to_map_pull()
274 map->data.configs.group_or_pin = data->groups[group]; in wmt_pctl_dt_node_to_map_pull()
275 map->data.configs.configs = configs; in wmt_pctl_dt_node_to_map_pull()
276 map->data.configs.num_configs = 1; in wmt_pctl_dt_node_to_map_pull()
290 kfree(maps[i].data.configs.configs); in wmt_pctl_dt_free_map()
301 struct property *pins, *funcs, *pulls; in wmt_pctl_dt_node_to_map() local
305 struct wmt_pinctrl_data *data = pinctrl_dev_get_drvdata(pctldev); in wmt_pctl_dt_node_to_map() local
307 pins = of_find_property(np, "wm,pins", NULL); in wmt_pctl_dt_node_to_map()
308 if (!pins) { in wmt_pctl_dt_node_to_map()
309 dev_err(data->dev, "missing wmt,pins property\n"); in wmt_pctl_dt_node_to_map()
310 return -EINVAL; in wmt_pctl_dt_node_to_map()
317 dev_err(data->dev, "neither wm,function nor wm,pull specified\n"); in wmt_pctl_dt_node_to_map()
318 return -EINVAL; in wmt_pctl_dt_node_to_map()
325 num_pins = pins->length / sizeof(u32); in wmt_pctl_dt_node_to_map()
326 num_funcs = funcs ? (funcs->length / sizeof(u32)) : 0; in wmt_pctl_dt_node_to_map()
327 num_pulls = pulls ? (pulls->length / sizeof(u32)) : 0; in wmt_pctl_dt_node_to_map()
330 dev_err(data->dev, "wm,function must have 1 or %d entries\n", in wmt_pctl_dt_node_to_map()
332 return -EINVAL; in wmt_pctl_dt_node_to_map()
336 dev_err(data->dev, "wm,pull must have 1 or %d entries\n", in wmt_pctl_dt_node_to_map()
338 return -EINVAL; in wmt_pctl_dt_node_to_map()
350 return -ENOMEM; in wmt_pctl_dt_node_to_map()
353 err = of_property_read_u32_index(np, "wm,pins", i, &pin); in wmt_pctl_dt_node_to_map()
357 if (pin >= (data->nbanks * 32)) { in wmt_pctl_dt_node_to_map()
358 dev_err(data->dev, "invalid wm,pins value\n"); in wmt_pctl_dt_node_to_map()
359 err = -EINVAL; in wmt_pctl_dt_node_to_map()
369 err = wmt_pctl_dt_node_to_map_func(data, np, pin, func, in wmt_pctl_dt_node_to_map()
381 err = wmt_pctl_dt_node_to_map_pull(data, np, pin, pull, in wmt_pctl_dt_node_to_map()
396 * and configs are only allocated for .type = PIN_MAP_TYPE_CONFIGS_PIN - there in wmt_pctl_dt_node_to_map()
415 return -ENOTSUPP; in wmt_pinconf_get()
421 struct wmt_pinctrl_data *data = pinctrl_dev_get_drvdata(pctldev); in wmt_pinconf_set() local
426 u32 reg_pull_en = data->banks[bank].reg_pull_en; in wmt_pinconf_set()
427 u32 reg_pull_cfg = data->banks[bank].reg_pull_cfg; in wmt_pinconf_set()
431 dev_err(data->dev, "bias functions not supported on pin %d\n", in wmt_pinconf_set()
433 return -EINVAL; in wmt_pinconf_set()
448 wmt_clearbits(data, reg_pull_en, BIT(bit)); in wmt_pinconf_set()
451 wmt_clearbits(data, reg_pull_cfg, BIT(bit)); in wmt_pinconf_set()
452 wmt_setbits(data, reg_pull_en, BIT(bit)); in wmt_pinconf_set()
455 wmt_setbits(data, reg_pull_cfg, BIT(bit)); in wmt_pinconf_set()
456 wmt_setbits(data, reg_pull_en, BIT(bit)); in wmt_pinconf_set()
459 dev_err(data->dev, "unknown pinconf param\n"); in wmt_pinconf_set()
460 return -EINVAL; in wmt_pinconf_set()
474 .name = "pinctrl-wmt",
482 struct wmt_pinctrl_data *data = gpiochip_get_data(chip); in wmt_gpio_get_direction() local
485 u32 reg_dir = data->banks[bank].reg_dir; in wmt_gpio_get_direction()
488 val = readl_relaxed(data->base + reg_dir); in wmt_gpio_get_direction()
497 struct wmt_pinctrl_data *data = gpiochip_get_data(chip); in wmt_gpio_get_value() local
500 u32 reg_data_in = data->banks[bank].reg_data_in; in wmt_gpio_get_value()
503 dev_err(data->dev, "no data in register defined\n"); in wmt_gpio_get_value()
504 return -EINVAL; in wmt_gpio_get_value()
507 return !!(readl_relaxed(data->base + reg_data_in) & BIT(bit)); in wmt_gpio_get_value()
513 struct wmt_pinctrl_data *data = gpiochip_get_data(chip); in wmt_gpio_set_value() local
516 u32 reg_data_out = data->banks[bank].reg_data_out; in wmt_gpio_set_value()
519 dev_err(data->dev, "no data out register defined\n"); in wmt_gpio_set_value()
524 wmt_setbits(data, reg_data_out, BIT(bit)); in wmt_gpio_set_value()
526 wmt_clearbits(data, reg_data_out, BIT(bit)); in wmt_gpio_set_value()
537 .label = "gpio-wmt",
550 struct wmt_pinctrl_data *data) in wmt_pinctrl_probe() argument
554 data->base = devm_platform_ioremap_resource(pdev, 0); in wmt_pinctrl_probe()
555 if (IS_ERR(data->base)) in wmt_pinctrl_probe()
556 return PTR_ERR(data->base); in wmt_pinctrl_probe()
558 wmt_desc.pins = data->pins; in wmt_pinctrl_probe()
559 wmt_desc.npins = data->npins; in wmt_pinctrl_probe()
561 data->gpio_chip = wmt_gpio_chip; in wmt_pinctrl_probe()
562 data->gpio_chip.parent = &pdev->dev; in wmt_pinctrl_probe()
563 data->gpio_chip.ngpio = data->nbanks * 32; in wmt_pinctrl_probe()
565 platform_set_drvdata(pdev, data); in wmt_pinctrl_probe()
567 data->dev = &pdev->dev; in wmt_pinctrl_probe()
569 data->pctl_dev = devm_pinctrl_register(&pdev->dev, &wmt_desc, data); in wmt_pinctrl_probe()
570 if (IS_ERR(data->pctl_dev)) { in wmt_pinctrl_probe()
571 dev_err(&pdev->dev, "Failed to register pinctrl\n"); in wmt_pinctrl_probe()
572 return PTR_ERR(data->pctl_dev); in wmt_pinctrl_probe()
575 err = gpiochip_add_data(&data->gpio_chip, data); in wmt_pinctrl_probe()
577 dev_err(&pdev->dev, "could not add GPIO chip\n"); in wmt_pinctrl_probe()
581 err = gpiochip_add_pin_range(&data->gpio_chip, dev_name(data->dev), in wmt_pinctrl_probe()
582 0, 0, data->nbanks * 32); in wmt_pinctrl_probe()
586 dev_info(&pdev->dev, "Pin controller initialized\n"); in wmt_pinctrl_probe()
591 gpiochip_remove(&data->gpio_chip); in wmt_pinctrl_probe()