Lines Matching +full:pctrl +full:- +full:syscon

1 // SPDX-License-Identifier: GPL-2.0
7 * Antoine Ténart <antoine.tenart@free-electrons.com>
11 #include <linux/mfd/syscon.h>
23 #include "../pinctrl-utils.h"
37 struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); in berlin_pinctrl_get_group_count() local
39 return pctrl->desc->ngroups; in berlin_pinctrl_get_group_count()
45 struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); in berlin_pinctrl_get_group_name() local
47 return pctrl->desc->groups[group].name; in berlin_pinctrl_get_group_name()
55 struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); in berlin_pinctrl_dt_node_to_map() local
66 dev_err(pctrl->dev, in berlin_pinctrl_dt_node_to_map()
68 return -EINVAL; in berlin_pinctrl_dt_node_to_map()
73 dev_err(pctrl->dev, in berlin_pinctrl_dt_node_to_map()
75 return -EINVAL; in berlin_pinctrl_dt_node_to_map()
81 dev_err(pctrl->dev, "can't reserve map: %d\n", ret); in berlin_pinctrl_dt_node_to_map()
90 dev_err(pctrl->dev, "can't add map: %d\n", ret); in berlin_pinctrl_dt_node_to_map()
107 struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); in berlin_pinmux_get_functions_count() local
109 return pctrl->nfunctions; in berlin_pinmux_get_functions_count()
115 struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); in berlin_pinmux_get_function_name() local
117 return pctrl->functions[function].name; in berlin_pinmux_get_function_name()
125 struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); in berlin_pinmux_get_function_groups() local
127 *groups = pctrl->functions[function].groups; in berlin_pinmux_get_function_groups()
128 *ngroups = pctrl->functions[function].ngroups; in berlin_pinmux_get_function_groups()
134 berlin_pinctrl_find_function_by_name(struct berlin_pinctrl *pctrl, in berlin_pinctrl_find_function_by_name() argument
138 struct berlin_desc_function *function = group->functions; in berlin_pinctrl_find_function_by_name()
140 while (function->name) { in berlin_pinctrl_find_function_by_name()
141 if (!strcmp(function->name, fname)) in berlin_pinctrl_find_function_by_name()
154 struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); in berlin_pinmux_set() local
155 const struct berlin_desc_group *group_desc = pctrl->desc->groups + group; in berlin_pinmux_set()
156 struct pinfunction *func = pctrl->functions + function; in berlin_pinmux_set()
158 berlin_pinctrl_find_function_by_name(pctrl, group_desc, in berlin_pinmux_set()
159 func->name); in berlin_pinmux_set()
163 return -EINVAL; in berlin_pinmux_set()
165 mask = GENMASK(group_desc->lsb + group_desc->bit_width - 1, in berlin_pinmux_set()
166 group_desc->lsb); in berlin_pinmux_set()
167 val = function_desc->muxval << group_desc->lsb; in berlin_pinmux_set()
168 regmap_update_bits(pctrl->regmap, group_desc->offset, mask, val); in berlin_pinmux_set()
180 static int berlin_pinctrl_add_function(struct berlin_pinctrl *pctrl, in berlin_pinctrl_add_function() argument
183 struct pinfunction *function = pctrl->functions; in berlin_pinctrl_add_function()
185 while (function->name) { in berlin_pinctrl_add_function()
186 if (!strcmp(function->name, name)) { in berlin_pinctrl_add_function()
187 function->ngroups++; in berlin_pinctrl_add_function()
188 return -EEXIST; in berlin_pinctrl_add_function()
193 function->name = name; in berlin_pinctrl_add_function()
194 function->ngroups = 1; in berlin_pinctrl_add_function()
196 pctrl->nfunctions++; in berlin_pinctrl_add_function()
203 struct berlin_pinctrl *pctrl = platform_get_drvdata(pdev); in berlin_pinctrl_build_state() local
209 pctrl->nfunctions = 0; in berlin_pinctrl_build_state()
211 for (i = 0; i < pctrl->desc->ngroups; i++) { in berlin_pinctrl_build_state()
212 desc_group = pctrl->desc->groups + i; in berlin_pinctrl_build_state()
214 max_functions += 1 << (desc_group->bit_width + 1); in berlin_pinctrl_build_state()
218 pctrl->functions = kcalloc(max_functions, sizeof(*pctrl->functions), GFP_KERNEL); in berlin_pinctrl_build_state()
219 if (!pctrl->functions) in berlin_pinctrl_build_state()
220 return -ENOMEM; in berlin_pinctrl_build_state()
223 for (i = 0; i < pctrl->desc->ngroups; i++) { in berlin_pinctrl_build_state()
224 desc_group = pctrl->desc->groups + i; in berlin_pinctrl_build_state()
225 desc_function = desc_group->functions; in berlin_pinctrl_build_state()
227 while (desc_function->name) { in berlin_pinctrl_build_state()
228 berlin_pinctrl_add_function(pctrl, desc_function->name); in berlin_pinctrl_build_state()
233 new_functions = krealloc(pctrl->functions, in berlin_pinctrl_build_state()
234 pctrl->nfunctions * sizeof(*pctrl->functions), in berlin_pinctrl_build_state()
237 kfree(pctrl->functions); in berlin_pinctrl_build_state()
238 return -ENOMEM; in berlin_pinctrl_build_state()
241 pctrl->functions = new_functions; in berlin_pinctrl_build_state()
243 for (i = 0; i < pctrl->desc->ngroups; i++) { in berlin_pinctrl_build_state()
244 desc_group = pctrl->desc->groups + i; in berlin_pinctrl_build_state()
245 desc_function = desc_group->functions; in berlin_pinctrl_build_state()
247 while (desc_function->name) { in berlin_pinctrl_build_state()
248 struct pinfunction *function = pctrl->functions; in berlin_pinctrl_build_state()
252 while (function->name) { in berlin_pinctrl_build_state()
253 if (!strcmp(desc_function->name, function->name)) { in berlin_pinctrl_build_state()
261 kfree(pctrl->functions); in berlin_pinctrl_build_state()
262 return -EINVAL; in berlin_pinctrl_build_state()
265 if (!function->groups) { in berlin_pinctrl_build_state()
266 function->groups = in berlin_pinctrl_build_state()
267 devm_kcalloc(&pdev->dev, in berlin_pinctrl_build_state()
268 function->ngroups, in berlin_pinctrl_build_state()
269 sizeof(*function->groups), in berlin_pinctrl_build_state()
271 if (!function->groups) { in berlin_pinctrl_build_state()
272 kfree(pctrl->functions); in berlin_pinctrl_build_state()
273 return -ENOMEM; in berlin_pinctrl_build_state()
277 groups = (const char **)function->groups; in berlin_pinctrl_build_state()
281 *groups = desc_group->name; in berlin_pinctrl_build_state()
291 .name = "berlin-pinctrl",
301 struct device *dev = &pdev->dev; in berlin_pinctrl_probe_regmap()
302 struct berlin_pinctrl *pctrl; in berlin_pinctrl_probe_regmap() local
305 pctrl = devm_kzalloc(dev, sizeof(*pctrl), GFP_KERNEL); in berlin_pinctrl_probe_regmap()
306 if (!pctrl) in berlin_pinctrl_probe_regmap()
307 return -ENOMEM; in berlin_pinctrl_probe_regmap()
309 platform_set_drvdata(pdev, pctrl); in berlin_pinctrl_probe_regmap()
311 pctrl->regmap = regmap; in berlin_pinctrl_probe_regmap()
312 pctrl->dev = &pdev->dev; in berlin_pinctrl_probe_regmap()
313 pctrl->desc = desc; in berlin_pinctrl_probe_regmap()
321 pctrl->pctrl_dev = devm_pinctrl_register(dev, &berlin_pctrl_desc, in berlin_pinctrl_probe_regmap()
322 pctrl); in berlin_pinctrl_probe_regmap()
323 if (IS_ERR(pctrl->pctrl_dev)) { in berlin_pinctrl_probe_regmap()
325 return PTR_ERR(pctrl->pctrl_dev); in berlin_pinctrl_probe_regmap()
334 struct device *dev = &pdev->dev; in berlin_pinctrl_probe()
335 struct device_node *parent_np = of_get_parent(dev->of_node); in berlin_pinctrl_probe()