Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2/*
3 * Copyright (c) 2024 Amlogic, Inc. All rights reserved.
4 * Author: Xianwei Zhao <xianwei.zhao@amlogic.com>
5 */
6
7#include <linux/err.h>
8#include <linux/gpio/driver.h>
9#include <linux/init.h>
10#include <linux/io.h>
11#include <linux/module.h>
12#include <linux/of.h>
13#include <linux/of_address.h>
14#include <linux/platform_device.h>
15#include <linux/regmap.h>
16#include <linux/seq_file.h>
17#include <linux/slab.h>
18#include <linux/string_helpers.h>
19
20#include <linux/pinctrl/consumer.h>
21#include <linux/pinctrl/pinconf.h>
22#include <linux/pinctrl/pinctrl.h>
23#include <linux/pinctrl/pinmux.h>
24#include <dt-bindings/pinctrl/amlogic,pinctrl.h>
25
26#include "../core.h"
27#include "../pinconf.h"
28
29#define gpio_chip_to_bank(chip) \
30 container_of(chip, struct aml_gpio_bank, gpio_chip)
31
32#define AML_REG_PULLEN 0
33#define AML_REG_PULL 1
34#define AML_REG_DIR 2
35#define AML_REG_OUT 3
36#define AML_REG_IN 4
37#define AML_REG_DS 5
38#define AML_NUM_REG 6
39
40enum aml_pinconf_drv {
41 PINCONF_DRV_500UA,
42 PINCONF_DRV_2500UA,
43 PINCONF_DRV_3000UA,
44 PINCONF_DRV_4000UA,
45};
46
47struct aml_pio_control {
48 u32 gpio_offset;
49 u32 reg_offset[AML_NUM_REG];
50 u32 bit_offset[AML_NUM_REG];
51};
52
53struct aml_reg_bit {
54 u32 bank_id;
55 u32 reg_offs[AML_NUM_REG];
56 u32 bit_offs[AML_NUM_REG];
57};
58
59struct aml_pctl_data {
60 unsigned int number;
61 struct aml_reg_bit rb_offs[];
62};
63
64struct aml_pmx_func {
65 const char *name;
66 const char **groups;
67 unsigned int ngroups;
68};
69
70struct aml_pctl_group {
71 const char *name;
72 unsigned int npins;
73 unsigned int *pins;
74 unsigned int *func;
75};
76
77struct aml_gpio_bank {
78 struct gpio_chip gpio_chip;
79 struct aml_pio_control pc;
80 u32 bank_id;
81 unsigned int pin_base;
82 struct regmap *reg_mux;
83 struct regmap *reg_gpio;
84 struct regmap *reg_ds;
85};
86
87struct aml_pinctrl {
88 struct device *dev;
89 struct pinctrl_dev *pctl;
90 struct aml_gpio_bank *banks;
91 int nbanks;
92 struct aml_pmx_func *functions;
93 int nfunctions;
94 struct aml_pctl_group *groups;
95 int ngroups;
96
97 const struct aml_pctl_data *data;
98};
99
100static const unsigned int aml_bit_strides[AML_NUM_REG] = {
101 1, 1, 1, 1, 1, 2
102};
103
104static const unsigned int aml_def_regoffs[AML_NUM_REG] = {
105 3, 4, 2, 1, 0, 7
106};
107
108static const char *aml_bank_name[31] = {
109"GPIOA", "GPIOB", "GPIOC", "GPIOD", "GPIOE", "GPIOF", "GPIOG",
110"GPIOH", "GPIOI", "GPIOJ", "GPIOK", "GPIOL", "GPIOM", "GPION",
111"GPIOO", "GPIOP", "GPIOQ", "GPIOR", "GPIOS", "GPIOT", "GPIOU",
112"GPIOV", "GPIOW", "GPIOX", "GPIOY", "GPIOZ", "GPIODV", "GPIOAO",
113"GPIOCC", "TEST_N", "ANALOG"
114};
115
116static int aml_pmx_calc_reg_and_offset(struct pinctrl_gpio_range *range,
117 unsigned int pin, unsigned int *reg,
118 unsigned int *offset)
119{
120 unsigned int shift;
121
122 shift = (pin - range->pin_base) << 2;
123 *reg = (shift / 32) * 4;
124 *offset = shift % 32;
125
126 return 0;
127}
128
129static int aml_pctl_set_function(struct aml_pinctrl *info,
130 struct pinctrl_gpio_range *range,
131 int pin_id, int func)
132{
133 struct aml_gpio_bank *bank = gpio_chip_to_bank(range->gc);
134 int reg;
135 int offset;
136
137 if (!bank->reg_mux)
138 return 0;
139
140 aml_pmx_calc_reg_and_offset(range, pin_id, ®, &offset);
141 return regmap_update_bits(bank->reg_mux, reg,
142 0xf << offset, (func & 0xf) << offset);
143}
144
145static int aml_pmx_get_funcs_count(struct pinctrl_dev *pctldev)
146{
147 struct aml_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
148
149 return info->nfunctions;
150}
151
152static const char *aml_pmx_get_fname(struct pinctrl_dev *pctldev,
153 unsigned int selector)
154{
155 struct aml_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
156
157 return info->functions[selector].name;
158}
159
160static int aml_pmx_get_groups(struct pinctrl_dev *pctldev,
161 unsigned int selector,
162 const char * const **grps,
163 unsigned * const ngrps)
164{
165 struct aml_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
166
167 *grps = info->functions[selector].groups;
168 *ngrps = info->functions[selector].ngroups;
169
170 return 0;
171}
172
173static int aml_pmx_set_mux(struct pinctrl_dev *pctldev, unsigned int fselector,
174 unsigned int group_id)
175{
176 struct aml_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
177 struct aml_pctl_group *group = &info->groups[group_id];
178 struct pinctrl_gpio_range *range;
179 int i;
180
181 for (i = 0; i < group->npins; i++) {
182 range = pinctrl_find_gpio_range_from_pin(pctldev, group->pins[i]);
183 aml_pctl_set_function(info, range, group->pins[i], group->func[i]);
184 }
185
186 return 0;
187}
188
189static int aml_pmx_request_gpio(struct pinctrl_dev *pctldev,
190 struct pinctrl_gpio_range *range,
191 unsigned int pin)
192{
193 struct aml_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
194
195 return aml_pctl_set_function(info, range, pin, 0);
196}
197
198static const struct pinmux_ops aml_pmx_ops = {
199 .set_mux = aml_pmx_set_mux,
200 .get_functions_count = aml_pmx_get_funcs_count,
201 .get_function_name = aml_pmx_get_fname,
202 .get_function_groups = aml_pmx_get_groups,
203 .gpio_request_enable = aml_pmx_request_gpio,
204};
205
206static int aml_calc_reg_and_bit(struct pinctrl_gpio_range *range,
207 unsigned int pin,
208 unsigned int reg_type,
209 unsigned int *reg, unsigned int *bit)
210{
211 struct aml_gpio_bank *bank = gpio_chip_to_bank(range->gc);
212
213 *bit = (pin - range->pin_base) * aml_bit_strides[reg_type]
214 + bank->pc.bit_offset[reg_type];
215 *reg = (bank->pc.reg_offset[reg_type] + (*bit / 32)) * 4;
216 *bit &= 0x1f;
217
218 return 0;
219}
220
221static int aml_pinconf_get_pull(struct aml_pinctrl *info, unsigned int pin)
222{
223 struct pinctrl_gpio_range *range =
224 pinctrl_find_gpio_range_from_pin(info->pctl, pin);
225 struct aml_gpio_bank *bank = gpio_chip_to_bank(range->gc);
226 unsigned int reg, bit, val;
227 int ret, conf;
228
229 aml_calc_reg_and_bit(range, pin, AML_REG_PULLEN, ®, &bit);
230
231 ret = regmap_read(bank->reg_gpio, reg, &val);
232 if (ret)
233 return ret;
234
235 if (!(val & BIT(bit))) {
236 conf = PIN_CONFIG_BIAS_DISABLE;
237 } else {
238 aml_calc_reg_and_bit(range, pin, AML_REG_PULL, ®, &bit);
239
240 ret = regmap_read(bank->reg_gpio, reg, &val);
241 if (ret)
242 return ret;
243
244 if (val & BIT(bit))
245 conf = PIN_CONFIG_BIAS_PULL_UP;
246 else
247 conf = PIN_CONFIG_BIAS_PULL_DOWN;
248 }
249
250 return conf;
251}
252
253static int aml_pinconf_get_drive_strength(struct aml_pinctrl *info,
254 unsigned int pin,
255 u16 *drive_strength_ua)
256{
257 struct pinctrl_gpio_range *range =
258 pinctrl_find_gpio_range_from_pin(info->pctl, pin);
259 struct aml_gpio_bank *bank = gpio_chip_to_bank(range->gc);
260 unsigned int reg, bit;
261 unsigned int val;
262 int ret;
263
264 if (!bank->reg_ds)
265 return -EOPNOTSUPP;
266
267 aml_calc_reg_and_bit(range, pin, AML_REG_DS, ®, &bit);
268 ret = regmap_read(bank->reg_ds, reg, &val);
269 if (ret)
270 return ret;
271
272 switch ((val >> bit) & 0x3) {
273 case PINCONF_DRV_500UA:
274 *drive_strength_ua = 500;
275 break;
276 case PINCONF_DRV_2500UA:
277 *drive_strength_ua = 2500;
278 break;
279 case PINCONF_DRV_3000UA:
280 *drive_strength_ua = 3000;
281 break;
282 case PINCONF_DRV_4000UA:
283 *drive_strength_ua = 4000;
284 break;
285 default:
286 return -EINVAL;
287 }
288
289 return 0;
290}
291
292static int aml_pinconf_get_gpio_bit(struct aml_pinctrl *info,
293 unsigned int pin,
294 unsigned int reg_type)
295{
296 struct pinctrl_gpio_range *range =
297 pinctrl_find_gpio_range_from_pin(info->pctl, pin);
298 struct aml_gpio_bank *bank = gpio_chip_to_bank(range->gc);
299 unsigned int reg, bit, val;
300 int ret;
301
302 aml_calc_reg_and_bit(range, pin, reg_type, ®, &bit);
303 ret = regmap_read(bank->reg_gpio, reg, &val);
304 if (ret)
305 return ret;
306
307 return BIT(bit) & val ? 1 : 0;
308}
309
310static int aml_pinconf_get_output(struct aml_pinctrl *info,
311 unsigned int pin)
312{
313 int ret = aml_pinconf_get_gpio_bit(info, pin, AML_REG_DIR);
314
315 if (ret < 0)
316 return ret;
317
318 return !ret;
319}
320
321static int aml_pinconf_get_drive(struct aml_pinctrl *info,
322 unsigned int pin)
323{
324 return aml_pinconf_get_gpio_bit(info, pin, AML_REG_OUT);
325}
326
327static int aml_pinconf_get(struct pinctrl_dev *pcdev, unsigned int pin,
328 unsigned long *config)
329{
330 struct aml_pinctrl *info = pinctrl_dev_get_drvdata(pcdev);
331 enum pin_config_param param = pinconf_to_config_param(*config);
332 u16 arg;
333 int ret;
334
335 switch (param) {
336 case PIN_CONFIG_BIAS_DISABLE:
337 case PIN_CONFIG_BIAS_PULL_DOWN:
338 case PIN_CONFIG_BIAS_PULL_UP:
339 if (aml_pinconf_get_pull(info, pin) == param)
340 arg = 1;
341 else
342 return -EINVAL;
343 break;
344 case PIN_CONFIG_DRIVE_STRENGTH_UA:
345 ret = aml_pinconf_get_drive_strength(info, pin, &arg);
346 if (ret)
347 return ret;
348 break;
349 case PIN_CONFIG_OUTPUT_ENABLE:
350 ret = aml_pinconf_get_output(info, pin);
351 if (ret <= 0)
352 return -EINVAL;
353 arg = 1;
354 break;
355 case PIN_CONFIG_OUTPUT:
356 ret = aml_pinconf_get_output(info, pin);
357 if (ret <= 0)
358 return -EINVAL;
359
360 ret = aml_pinconf_get_drive(info, pin);
361 if (ret < 0)
362 return -EINVAL;
363
364 arg = ret;
365 break;
366
367 default:
368 return -ENOTSUPP;
369 }
370
371 *config = pinconf_to_config_packed(param, arg);
372 dev_dbg(info->dev, "pinconf for pin %u is %lu\n", pin, *config);
373
374 return 0;
375}
376
377static int aml_pinconf_disable_bias(struct aml_pinctrl *info,
378 unsigned int pin)
379{
380 struct pinctrl_gpio_range *range =
381 pinctrl_find_gpio_range_from_pin(info->pctl, pin);
382 struct aml_gpio_bank *bank = gpio_chip_to_bank(range->gc);
383 unsigned int reg, bit = 0;
384
385 aml_calc_reg_and_bit(range, pin, AML_REG_PULLEN, ®, &bit);
386
387 return regmap_update_bits(bank->reg_gpio, reg, BIT(bit), 0);
388}
389
390static int aml_pinconf_enable_bias(struct aml_pinctrl *info, unsigned int pin,
391 bool pull_up)
392{
393 struct pinctrl_gpio_range *range =
394 pinctrl_find_gpio_range_from_pin(info->pctl, pin);
395 struct aml_gpio_bank *bank = gpio_chip_to_bank(range->gc);
396 unsigned int reg, bit, val = 0;
397 int ret;
398
399 aml_calc_reg_and_bit(range, pin, AML_REG_PULL, ®, &bit);
400 if (pull_up)
401 val = BIT(bit);
402
403 ret = regmap_update_bits(bank->reg_gpio, reg, BIT(bit), val);
404 if (ret)
405 return ret;
406
407 aml_calc_reg_and_bit(range, pin, AML_REG_PULLEN, ®, &bit);
408 return regmap_update_bits(bank->reg_gpio, reg, BIT(bit), BIT(bit));
409}
410
411static int aml_pinconf_set_drive_strength(struct aml_pinctrl *info,
412 unsigned int pin,
413 u16 drive_strength_ua)
414{
415 struct pinctrl_gpio_range *range =
416 pinctrl_find_gpio_range_from_pin(info->pctl, pin);
417 struct aml_gpio_bank *bank = gpio_chip_to_bank(range->gc);
418 unsigned int reg, bit, ds_val;
419
420 if (!bank->reg_ds) {
421 dev_err(info->dev, "drive-strength not supported\n");
422 return -EOPNOTSUPP;
423 }
424
425 aml_calc_reg_and_bit(range, pin, AML_REG_DS, ®, &bit);
426
427 if (drive_strength_ua <= 500) {
428 ds_val = PINCONF_DRV_500UA;
429 } else if (drive_strength_ua <= 2500) {
430 ds_val = PINCONF_DRV_2500UA;
431 } else if (drive_strength_ua <= 3000) {
432 ds_val = PINCONF_DRV_3000UA;
433 } else if (drive_strength_ua <= 4000) {
434 ds_val = PINCONF_DRV_4000UA;
435 } else {
436 dev_warn_once(info->dev,
437 "pin %u: invalid drive-strength : %d , default to 4mA\n",
438 pin, drive_strength_ua);
439 ds_val = PINCONF_DRV_4000UA;
440 }
441
442 return regmap_update_bits(bank->reg_ds, reg, 0x3 << bit, ds_val << bit);
443}
444
445static int aml_pinconf_set_gpio_bit(struct aml_pinctrl *info,
446 unsigned int pin,
447 unsigned int reg_type,
448 bool arg)
449{
450 struct pinctrl_gpio_range *range =
451 pinctrl_find_gpio_range_from_pin(info->pctl, pin);
452 struct aml_gpio_bank *bank = gpio_chip_to_bank(range->gc);
453 unsigned int reg, bit;
454
455 aml_calc_reg_and_bit(range, pin, reg_type, ®, &bit);
456 return regmap_update_bits(bank->reg_gpio, reg, BIT(bit),
457 arg ? BIT(bit) : 0);
458}
459
460static int aml_pinconf_set_output(struct aml_pinctrl *info,
461 unsigned int pin,
462 bool out)
463{
464 return aml_pinconf_set_gpio_bit(info, pin, AML_REG_DIR, !out);
465}
466
467static int aml_pinconf_set_drive(struct aml_pinctrl *info,
468 unsigned int pin,
469 bool high)
470{
471 return aml_pinconf_set_gpio_bit(info, pin, AML_REG_OUT, high);
472}
473
474static int aml_pinconf_set_output_drive(struct aml_pinctrl *info,
475 unsigned int pin,
476 bool high)
477{
478 int ret;
479
480 ret = aml_pinconf_set_output(info, pin, true);
481 if (ret)
482 return ret;
483
484 return aml_pinconf_set_drive(info, pin, high);
485}
486
487static int aml_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin,
488 unsigned long *configs, unsigned int num_configs)
489{
490 struct aml_pinctrl *info = pinctrl_dev_get_drvdata(pcdev);
491 enum pin_config_param param;
492 unsigned int arg = 0;
493 int i, ret;
494
495 for (i = 0; i < num_configs; i++) {
496 param = pinconf_to_config_param(configs[i]);
497
498 switch (param) {
499 case PIN_CONFIG_DRIVE_STRENGTH_UA:
500 case PIN_CONFIG_OUTPUT_ENABLE:
501 case PIN_CONFIG_OUTPUT:
502 arg = pinconf_to_config_argument(configs[i]);
503 break;
504
505 default:
506 break;
507 }
508
509 switch (param) {
510 case PIN_CONFIG_BIAS_DISABLE:
511 ret = aml_pinconf_disable_bias(info, pin);
512 break;
513 case PIN_CONFIG_BIAS_PULL_UP:
514 ret = aml_pinconf_enable_bias(info, pin, true);
515 break;
516 case PIN_CONFIG_BIAS_PULL_DOWN:
517 ret = aml_pinconf_enable_bias(info, pin, false);
518 break;
519 case PIN_CONFIG_DRIVE_STRENGTH_UA:
520 ret = aml_pinconf_set_drive_strength(info, pin, arg);
521 break;
522 case PIN_CONFIG_OUTPUT_ENABLE:
523 ret = aml_pinconf_set_output(info, pin, arg);
524 break;
525 case PIN_CONFIG_OUTPUT:
526 ret = aml_pinconf_set_output_drive(info, pin, arg);
527 break;
528 default:
529 ret = -ENOTSUPP;
530 }
531
532 if (ret)
533 return ret;
534 }
535
536 return 0;
537}
538
539static int aml_pinconf_group_set(struct pinctrl_dev *pcdev,
540 unsigned int num_group,
541 unsigned long *configs,
542 unsigned int num_configs)
543{
544 struct aml_pinctrl *info = pinctrl_dev_get_drvdata(pcdev);
545 int i;
546
547 for (i = 0; i < info->groups[num_group].npins; i++) {
548 aml_pinconf_set(pcdev, info->groups[num_group].pins[i], configs,
549 num_configs);
550 }
551
552 return 0;
553}
554
555static int aml_pinconf_group_get(struct pinctrl_dev *pcdev,
556 unsigned int group, unsigned long *config)
557{
558 return -EOPNOTSUPP;
559}
560
561static const struct pinconf_ops aml_pinconf_ops = {
562 .pin_config_get = aml_pinconf_get,
563 .pin_config_set = aml_pinconf_set,
564 .pin_config_group_get = aml_pinconf_group_get,
565 .pin_config_group_set = aml_pinconf_group_set,
566 .is_generic = true,
567};
568
569static int aml_get_groups_count(struct pinctrl_dev *pctldev)
570{
571 struct aml_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
572
573 return info->ngroups;
574}
575
576static const char *aml_get_group_name(struct pinctrl_dev *pctldev,
577 unsigned int selector)
578{
579 struct aml_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
580
581 return info->groups[selector].name;
582}
583
584static int aml_get_group_pins(struct pinctrl_dev *pctldev,
585 unsigned int selector, const unsigned int **pins,
586 unsigned int *npins)
587{
588 struct aml_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
589
590 if (selector >= info->ngroups)
591 return -EINVAL;
592
593 *pins = info->groups[selector].pins;
594 *npins = info->groups[selector].npins;
595
596 return 0;
597}
598
599static inline const struct aml_pctl_group *
600 aml_pctl_find_group_by_name(const struct aml_pinctrl *info,
601 const char *name)
602{
603 int i;
604
605 for (i = 0; i < info->ngroups; i++) {
606 if (!strcmp(info->groups[i].name, name))
607 return &info->groups[i];
608 }
609
610 return NULL;
611}
612
613static void aml_pin_dbg_show(struct pinctrl_dev *pcdev, struct seq_file *s,
614 unsigned int offset)
615{
616 seq_printf(s, " %s", dev_name(pcdev->dev));
617}
618
619static const struct pinctrl_ops aml_pctrl_ops = {
620 .get_groups_count = aml_get_groups_count,
621 .get_group_name = aml_get_group_name,
622 .get_group_pins = aml_get_group_pins,
623 .dt_node_to_map = pinconf_generic_dt_node_to_map_pinmux,
624 .dt_free_map = pinconf_generic_dt_free_map,
625 .pin_dbg_show = aml_pin_dbg_show,
626};
627
628static int aml_pctl_parse_functions(struct device_node *np,
629 struct aml_pinctrl *info, u32 index,
630 int *grp_index)
631{
632 struct device *dev = info->dev;
633 struct aml_pmx_func *func;
634 struct aml_pctl_group *grp;
635 int ret, i;
636
637 func = &info->functions[index];
638 func->name = np->name;
639 func->ngroups = of_get_child_count(np);
640 if (func->ngroups == 0)
641 return dev_err_probe(dev, -EINVAL, "No groups defined\n");
642
643 func->groups = devm_kcalloc(dev, func->ngroups, sizeof(*func->groups), GFP_KERNEL);
644 if (!func->groups)
645 return -ENOMEM;
646
647 i = 0;
648 for_each_child_of_node_scoped(np, child) {
649 func->groups[i++] = child->name;
650 grp = &info->groups[*grp_index];
651 grp->name = child->name;
652 *grp_index += 1;
653 ret = pinconf_generic_parse_dt_pinmux(child, dev, &grp->pins,
654 &grp->func, &grp->npins);
655 if (ret) {
656 dev_err(dev, "function :%s, groups:%s fail\n", func->name, child->name);
657 return ret;
658 }
659 }
660 dev_dbg(dev, "Function[%d\t name:%s,\tgroups:%d]\n", index, func->name, func->ngroups);
661
662 return 0;
663}
664
665static u32 aml_bank_pins(struct device_node *np)
666{
667 struct of_phandle_args of_args;
668
669 if (of_parse_phandle_with_fixed_args(np, "gpio-ranges", 3,
670 0, &of_args))
671 return 0;
672 else
673 return of_args.args[2];
674}
675
676static int aml_bank_number(struct device_node *np)
677{
678 struct of_phandle_args of_args;
679
680 if (of_parse_phandle_with_fixed_args(np, "gpio-ranges", 3,
681 0, &of_args))
682 return -EINVAL;
683 else
684 return of_args.args[1] >> 8;
685}
686
687static unsigned int aml_count_pins(struct device_node *np)
688{
689 struct device_node *child;
690 unsigned int pins = 0;
691
692 for_each_child_of_node(np, child) {
693 if (of_property_read_bool(child, "gpio-controller"))
694 pins += aml_bank_pins(child);
695 }
696
697 return pins;
698}
699
700/*
701 * A pinctrl device contains two types of nodes. The one named GPIO
702 * bank which includes gpio-controller property. The other one named
703 * function which includes one or more pin groups. The pin group
704 * include pinmux property(global index in pinctrl dev, and mux vlaue
705 * in mux reg) and pin configuration properties.
706 */
707static void aml_pctl_dt_child_count(struct aml_pinctrl *info,
708 struct device_node *np)
709{
710 struct device_node *child;
711
712 for_each_child_of_node(np, child) {
713 if (of_property_read_bool(child, "gpio-controller")) {
714 info->nbanks++;
715 } else {
716 info->nfunctions++;
717 info->ngroups += of_get_child_count(child);
718 }
719 }
720}
721
722static struct regmap *aml_map_resource(struct device *dev, unsigned int id,
723 struct device_node *node, char *name)
724{
725 struct resource res;
726 void __iomem *base;
727 int i;
728
729 struct regmap_config aml_regmap_config = {
730 .reg_bits = 32,
731 .val_bits = 32,
732 .reg_stride = 4,
733 };
734
735 i = of_property_match_string(node, "reg-names", name);
736 if (i < 0)
737 return NULL;
738 if (of_address_to_resource(node, i, &res))
739 return NULL;
740 base = devm_ioremap_resource(dev, &res);
741 if (IS_ERR(base))
742 return ERR_CAST(base);
743
744 aml_regmap_config.max_register = resource_size(&res) - 4;
745 aml_regmap_config.name = devm_kasprintf(dev, GFP_KERNEL,
746 "%s-%s", aml_bank_name[id], name);
747 if (!aml_regmap_config.name)
748 return ERR_PTR(-ENOMEM);
749
750 return devm_regmap_init_mmio(dev, base, &aml_regmap_config);
751}
752
753static inline int aml_gpio_calc_reg_and_bit(struct aml_gpio_bank *bank,
754 unsigned int reg_type,
755 unsigned int gpio,
756 unsigned int *reg,
757 unsigned int *bit)
758{
759 *bit = gpio * aml_bit_strides[reg_type] + bank->pc.bit_offset[reg_type];
760 *reg = (bank->pc.reg_offset[reg_type] + (*bit / 32)) * 4;
761 *bit &= 0x1f;
762
763 return 0;
764}
765
766static int aml_gpio_get_direction(struct gpio_chip *chip, unsigned int gpio)
767{
768 struct aml_gpio_bank *bank = gpiochip_get_data(chip);
769 unsigned int bit, reg, val;
770 int ret;
771
772 aml_gpio_calc_reg_and_bit(bank, AML_REG_DIR, gpio, ®, &bit);
773
774 ret = regmap_read(bank->reg_gpio, reg, &val);
775 if (ret)
776 return ret;
777
778 return BIT(bit) & val ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
779}
780
781static int aml_gpio_direction_input(struct gpio_chip *chip, unsigned int gpio)
782{
783 struct aml_gpio_bank *bank = gpiochip_get_data(chip);
784 unsigned int bit, reg;
785
786 aml_gpio_calc_reg_and_bit(bank, AML_REG_DIR, gpio, ®, &bit);
787
788 return regmap_update_bits(bank->reg_gpio, reg, BIT(bit), BIT(bit));
789}
790
791static int aml_gpio_direction_output(struct gpio_chip *chip, unsigned int gpio,
792 int value)
793{
794 struct aml_gpio_bank *bank = gpiochip_get_data(chip);
795 unsigned int bit, reg;
796 int ret;
797
798 aml_gpio_calc_reg_and_bit(bank, AML_REG_DIR, gpio, ®, &bit);
799 ret = regmap_update_bits(bank->reg_gpio, reg, BIT(bit), 0);
800 if (ret < 0)
801 return ret;
802
803 aml_gpio_calc_reg_and_bit(bank, AML_REG_OUT, gpio, ®, &bit);
804
805 return regmap_update_bits(bank->reg_gpio, reg, BIT(bit),
806 value ? BIT(bit) : 0);
807}
808
809static void aml_gpio_set(struct gpio_chip *chip, unsigned int gpio, int value)
810{
811 struct aml_gpio_bank *bank = gpiochip_get_data(chip);
812 unsigned int bit, reg;
813
814 aml_gpio_calc_reg_and_bit(bank, AML_REG_OUT, gpio, ®, &bit);
815
816 regmap_update_bits(bank->reg_gpio, reg, BIT(bit),
817 value ? BIT(bit) : 0);
818}
819
820static int aml_gpio_get(struct gpio_chip *chip, unsigned int gpio)
821{
822 struct aml_gpio_bank *bank = gpiochip_get_data(chip);
823 unsigned int reg, bit, val;
824
825 aml_gpio_calc_reg_and_bit(bank, AML_REG_IN, gpio, ®, &bit);
826 regmap_read(bank->reg_gpio, reg, &val);
827
828 return !!(val & BIT(bit));
829}
830
831static const struct gpio_chip aml_gpio_template = {
832 .request = gpiochip_generic_request,
833 .free = gpiochip_generic_free,
834 .set_config = gpiochip_generic_config,
835 .set = aml_gpio_set,
836 .get = aml_gpio_get,
837 .direction_input = aml_gpio_direction_input,
838 .direction_output = aml_gpio_direction_output,
839 .get_direction = aml_gpio_get_direction,
840 .can_sleep = false,
841};
842
843static void init_bank_register_bit(struct aml_pinctrl *info,
844 struct aml_gpio_bank *bank)
845{
846 const struct aml_pctl_data *data = info->data;
847 const struct aml_reg_bit *aml_rb;
848 bool def_offs = true;
849 int i;
850
851 if (data) {
852 for (i = 0; i < data->number; i++) {
853 aml_rb = &data->rb_offs[i];
854 if (bank->bank_id == aml_rb->bank_id) {
855 def_offs = false;
856 break;
857 }
858 }
859 }
860
861 if (def_offs) {
862 for (i = 0; i < AML_NUM_REG; i++) {
863 bank->pc.reg_offset[i] = aml_def_regoffs[i];
864 bank->pc.bit_offset[i] = 0;
865 }
866 } else {
867 for (i = 0; i < AML_NUM_REG; i++) {
868 bank->pc.reg_offset[i] = aml_rb->reg_offs[i];
869 bank->pc.bit_offset[i] = aml_rb->bit_offs[i];
870 }
871 }
872}
873
874static int aml_gpiolib_register_bank(struct aml_pinctrl *info,
875 int bank_nr, struct device_node *np)
876{
877 struct aml_gpio_bank *bank = &info->banks[bank_nr];
878 struct device *dev = info->dev;
879 int ret = 0;
880
881 ret = aml_bank_number(np);
882 if (ret < 0) {
883 dev_err(dev, "get num=%d bank identity fail\n", bank_nr);
884 return -EINVAL;
885 }
886 bank->bank_id = ret;
887
888 bank->reg_mux = aml_map_resource(dev, bank->bank_id, np, "mux");
889 if (IS_ERR_OR_NULL(bank->reg_mux)) {
890 if (bank->bank_id == AMLOGIC_GPIO_TEST_N ||
891 bank->bank_id == AMLOGIC_GPIO_ANALOG)
892 bank->reg_mux = NULL;
893 else
894 return dev_err_probe(dev, bank->reg_mux ? PTR_ERR(bank->reg_mux) : -ENOENT,
895 "mux registers not found\n");
896 }
897
898 bank->reg_gpio = aml_map_resource(dev, bank->bank_id, np, "gpio");
899 if (IS_ERR_OR_NULL(bank->reg_gpio))
900 return dev_err_probe(dev, bank->reg_gpio ? PTR_ERR(bank->reg_gpio) : -ENOENT,
901 "gpio registers not found\n");
902
903 bank->reg_ds = aml_map_resource(dev, bank->bank_id, np, "ds");
904 if (IS_ERR_OR_NULL(bank->reg_ds)) {
905 dev_dbg(info->dev, "ds registers not found - skipping\n");
906 bank->reg_ds = bank->reg_gpio;
907 }
908
909 bank->gpio_chip = aml_gpio_template;
910 bank->gpio_chip.base = -1;
911 bank->gpio_chip.ngpio = aml_bank_pins(np);
912 bank->gpio_chip.fwnode = of_fwnode_handle(np);
913 bank->gpio_chip.parent = dev;
914
915 init_bank_register_bit(info, bank);
916 bank->gpio_chip.label = aml_bank_name[bank->bank_id];
917
918 bank->pin_base = bank->bank_id << 8;
919
920 return 0;
921}
922
923static int aml_pctl_probe_dt(struct platform_device *pdev,
924 struct pinctrl_desc *pctl_desc,
925 struct aml_pinctrl *info)
926{
927 struct device *dev = &pdev->dev;
928 struct pinctrl_pin_desc *pdesc;
929 struct device_node *np = dev->of_node;
930 int grp_index = 0;
931 int i = 0, j = 0, k = 0, bank;
932 int ret = 0;
933
934 aml_pctl_dt_child_count(info, np);
935 if (!info->nbanks)
936 return dev_err_probe(dev, -EINVAL, "you need at least one gpio bank\n");
937
938 dev_dbg(dev, "nbanks = %d\n", info->nbanks);
939 dev_dbg(dev, "nfunctions = %d\n", info->nfunctions);
940 dev_dbg(dev, "ngroups = %d\n", info->ngroups);
941
942 info->functions = devm_kcalloc(dev, info->nfunctions, sizeof(*info->functions), GFP_KERNEL);
943
944 info->groups = devm_kcalloc(dev, info->ngroups, sizeof(*info->groups), GFP_KERNEL);
945
946 info->banks = devm_kcalloc(dev, info->nbanks, sizeof(*info->banks), GFP_KERNEL);
947
948 if (!info->functions || !info->groups || !info->banks)
949 return -ENOMEM;
950
951 info->data = (struct aml_pctl_data *)of_device_get_match_data(dev);
952
953 pctl_desc->npins = aml_count_pins(np);
954
955 pdesc = devm_kcalloc(dev, pctl_desc->npins, sizeof(*pdesc), GFP_KERNEL);
956 if (!pdesc)
957 return -ENOMEM;
958
959 pctl_desc->pins = pdesc;
960
961 bank = 0;
962 for_each_child_of_node_scoped(np, child) {
963 if (of_property_read_bool(child, "gpio-controller")) {
964 const char *bank_name = NULL;
965 char **pin_names;
966
967 ret = aml_gpiolib_register_bank(info, bank, child);
968 if (ret)
969 return ret;
970
971 k = info->banks[bank].pin_base;
972 bank_name = info->banks[bank].gpio_chip.label;
973
974 pin_names = devm_kasprintf_strarray(dev, bank_name,
975 info->banks[bank].gpio_chip.ngpio);
976 if (IS_ERR(pin_names))
977 return PTR_ERR(pin_names);
978
979 for (j = 0; j < info->banks[bank].gpio_chip.ngpio; j++, k++) {
980 pdesc->number = k;
981 pdesc->name = pin_names[j];
982 pdesc++;
983 }
984 bank++;
985 } else {
986 ret = aml_pctl_parse_functions(child, info,
987 i++, &grp_index);
988 if (ret)
989 return ret;
990 }
991 }
992
993 return 0;
994}
995
996static int aml_pctl_probe(struct platform_device *pdev)
997{
998 struct device *dev = &pdev->dev;
999 struct aml_pinctrl *info;
1000 struct pinctrl_desc *pctl_desc;
1001 int ret, i;
1002
1003 pctl_desc = devm_kzalloc(dev, sizeof(*pctl_desc), GFP_KERNEL);
1004 if (!pctl_desc)
1005 return -ENOMEM;
1006
1007 info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
1008 if (!info)
1009 return -ENOMEM;
1010
1011 info->dev = dev;
1012 platform_set_drvdata(pdev, info);
1013 ret = aml_pctl_probe_dt(pdev, pctl_desc, info);
1014 if (ret)
1015 return ret;
1016
1017 pctl_desc->owner = THIS_MODULE;
1018 pctl_desc->pctlops = &aml_pctrl_ops;
1019 pctl_desc->pmxops = &aml_pmx_ops;
1020 pctl_desc->confops = &aml_pinconf_ops;
1021 pctl_desc->name = dev_name(dev);
1022
1023 info->pctl = devm_pinctrl_register(dev, pctl_desc, info);
1024 if (IS_ERR(info->pctl))
1025 return dev_err_probe(dev, PTR_ERR(info->pctl), "Failed pinctrl registration\n");
1026
1027 for (i = 0; i < info->nbanks; i++) {
1028 ret = gpiochip_add_data(&info->banks[i].gpio_chip, &info->banks[i]);
1029 if (ret)
1030 return dev_err_probe(dev, ret, "Failed to add gpiochip(%d)!\n", i);
1031 }
1032
1033 return 0;
1034}
1035
1036static const struct of_device_id aml_pctl_of_match[] = {
1037 { .compatible = "amlogic,pinctrl-a4", },
1038 { /* sentinel */ }
1039};
1040MODULE_DEVICE_TABLE(of, aml_pctl_dt_match);
1041
1042static struct platform_driver aml_pctl_driver = {
1043 .driver = {
1044 .name = "amlogic-pinctrl",
1045 .of_match_table = aml_pctl_of_match,
1046 },
1047 .probe = aml_pctl_probe,
1048};
1049module_platform_driver(aml_pctl_driver);
1050
1051MODULE_AUTHOR("Xianwei Zhao <xianwei.zhao@amlogic.com>");
1052MODULE_DESCRIPTION("Pin controller and GPIO driver for Amlogic SoC");
1053MODULE_LICENSE("Dual BSD/GPL");