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 
40 enum aml_pinconf_drv {
41 	PINCONF_DRV_500UA,
42 	PINCONF_DRV_2500UA,
43 	PINCONF_DRV_3000UA,
44 	PINCONF_DRV_4000UA,
45 };
46 
47 struct aml_pio_control {
48 	u32 gpio_offset;
49 	u32 reg_offset[AML_NUM_REG];
50 	u32 bit_offset[AML_NUM_REG];
51 };
52 
53 struct aml_reg_bit {
54 	u32 bank_id;
55 	u32 reg_offs[AML_NUM_REG];
56 	u32 bit_offs[AML_NUM_REG];
57 };
58 
59 struct aml_pctl_data {
60 	unsigned int number;
61 	struct aml_reg_bit rb_offs[];
62 };
63 
64 struct aml_pmx_func {
65 	const char	*name;
66 	const char	**groups;
67 	unsigned int	ngroups;
68 };
69 
70 struct aml_pctl_group {
71 	const char		*name;
72 	unsigned int		npins;
73 	unsigned int		*pins;
74 	unsigned int		*func;
75 };
76 
77 struct 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 
87 struct 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 
100 static const unsigned int aml_bit_strides[AML_NUM_REG] = {
101 	1, 1, 1, 1, 1, 2
102 };
103 
104 static const unsigned int aml_def_regoffs[AML_NUM_REG] = {
105 	3, 4, 2, 1, 0, 7
106 };
107 
108 static 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 
aml_pmx_calc_reg_and_offset(struct pinctrl_gpio_range * range,unsigned int pin,unsigned int * reg,unsigned int * offset)116 static 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 
aml_pctl_set_function(struct aml_pinctrl * info,struct pinctrl_gpio_range * range,int pin_id,int func)129 static 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, &reg, &offset);
141 	return regmap_update_bits(bank->reg_mux, reg,
142 			0xf << offset, (func & 0xf) << offset);
143 }
144 
aml_pmx_get_funcs_count(struct pinctrl_dev * pctldev)145 static 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 
aml_pmx_get_fname(struct pinctrl_dev * pctldev,unsigned int selector)152 static 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 
aml_pmx_get_groups(struct pinctrl_dev * pctldev,unsigned int selector,const char * const ** grps,unsigned * const ngrps)160 static 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 
aml_pmx_set_mux(struct pinctrl_dev * pctldev,unsigned int fselector,unsigned int group_id)173 static 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 
aml_pmx_request_gpio(struct pinctrl_dev * pctldev,struct pinctrl_gpio_range * range,unsigned int pin)189 static 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 
198 static 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 
aml_calc_reg_and_bit(struct pinctrl_gpio_range * range,unsigned int pin,unsigned int reg_type,unsigned int * reg,unsigned int * bit)206 static 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 
aml_pinconf_get_pull(struct aml_pinctrl * info,unsigned int pin)221 static 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, &reg, &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, &reg, &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 
aml_pinconf_get_drive_strength(struct aml_pinctrl * info,unsigned int pin,u16 * drive_strength_ua)253 static 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, &reg, &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 
aml_pinconf_get_gpio_bit(struct aml_pinctrl * info,unsigned int pin,unsigned int reg_type)292 static 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, &reg, &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 
aml_pinconf_get_output(struct aml_pinctrl * info,unsigned int pin)310 static 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 
aml_pinconf_get_drive(struct aml_pinctrl * info,unsigned int pin)321 static 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 
aml_pinconf_get(struct pinctrl_dev * pcdev,unsigned int pin,unsigned long * config)327 static 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 
aml_pinconf_disable_bias(struct aml_pinctrl * info,unsigned int pin)377 static 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, &reg, &bit);
386 
387 	return regmap_update_bits(bank->reg_gpio, reg, BIT(bit), 0);
388 }
389 
aml_pinconf_enable_bias(struct aml_pinctrl * info,unsigned int pin,bool pull_up)390 static 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, &reg, &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, &reg, &bit);
408 	return regmap_update_bits(bank->reg_gpio, reg, BIT(bit), BIT(bit));
409 }
410 
aml_pinconf_set_drive_strength(struct aml_pinctrl * info,unsigned int pin,u16 drive_strength_ua)411 static 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, &reg, &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 
aml_pinconf_set_gpio_bit(struct aml_pinctrl * info,unsigned int pin,unsigned int reg_type,bool arg)445 static 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, &reg, &bit);
456 	return regmap_update_bits(bank->reg_gpio, reg, BIT(bit),
457 				  arg ? BIT(bit) : 0);
458 }
459 
aml_pinconf_set_output(struct aml_pinctrl * info,unsigned int pin,bool out)460 static 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 
aml_pinconf_set_drive(struct aml_pinctrl * info,unsigned int pin,bool high)467 static 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 
aml_pinconf_set_output_drive(struct aml_pinctrl * info,unsigned int pin,bool high)474 static 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 
aml_pinconf_set(struct pinctrl_dev * pcdev,unsigned int pin,unsigned long * configs,unsigned int num_configs)487 static 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 
aml_pinconf_group_set(struct pinctrl_dev * pcdev,unsigned int num_group,unsigned long * configs,unsigned int num_configs)539 static 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 
aml_pinconf_group_get(struct pinctrl_dev * pcdev,unsigned int group,unsigned long * config)555 static int aml_pinconf_group_get(struct pinctrl_dev *pcdev,
556 				 unsigned int group, unsigned long *config)
557 {
558 	return -EOPNOTSUPP;
559 }
560 
561 static 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 
aml_get_groups_count(struct pinctrl_dev * pctldev)569 static 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 
aml_get_group_name(struct pinctrl_dev * pctldev,unsigned int selector)576 static 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 
aml_get_group_pins(struct pinctrl_dev * pctldev,unsigned int selector,const unsigned int ** pins,unsigned int * npins)584 static 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 
599 static inline const struct aml_pctl_group *
aml_pctl_find_group_by_name(const struct aml_pinctrl * info,const char * name)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 
aml_pin_dbg_show(struct pinctrl_dev * pcdev,struct seq_file * s,unsigned int offset)613 static 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 
619 static 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 
aml_pctl_parse_functions(struct device_node * np,struct aml_pinctrl * info,u32 index,int * grp_index)628 static 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 
aml_bank_pins(struct device_node * np)665 static 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 
aml_bank_number(struct device_node * np)676 static 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 
aml_count_pins(struct device_node * np)687 static 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  */
aml_pctl_dt_child_count(struct aml_pinctrl * info,struct device_node * np)707 static 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 
aml_map_resource(struct device * dev,unsigned int id,struct device_node * node,char * name)722 static 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 
aml_gpio_calc_reg_and_bit(struct aml_gpio_bank * bank,unsigned int reg_type,unsigned int gpio,unsigned int * reg,unsigned int * bit)753 static 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 
aml_gpio_get_direction(struct gpio_chip * chip,unsigned int gpio)766 static 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, &reg, &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 
aml_gpio_direction_input(struct gpio_chip * chip,unsigned int gpio)781 static 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, &reg, &bit);
787 
788 	return regmap_update_bits(bank->reg_gpio, reg, BIT(bit), BIT(bit));
789 }
790 
aml_gpio_direction_output(struct gpio_chip * chip,unsigned int gpio,int value)791 static 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, &reg, &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, &reg, &bit);
804 
805 	return regmap_update_bits(bank->reg_gpio, reg, BIT(bit),
806 				  value ? BIT(bit) : 0);
807 }
808 
aml_gpio_set(struct gpio_chip * chip,unsigned int gpio,int value)809 static 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, &reg, &bit);
815 
816 	regmap_update_bits(bank->reg_gpio, reg, BIT(bit),
817 			   value ? BIT(bit) : 0);
818 }
819 
aml_gpio_get(struct gpio_chip * chip,unsigned int gpio)820 static 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, &reg, &bit);
826 	regmap_read(bank->reg_gpio, reg, &val);
827 
828 	return !!(val & BIT(bit));
829 }
830 
831 static 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 
init_bank_register_bit(struct aml_pinctrl * info,struct aml_gpio_bank * bank)843 static 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 
aml_gpiolib_register_bank(struct aml_pinctrl * info,int bank_nr,struct device_node * np)874 static 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 
aml_pctl_probe_dt(struct platform_device * pdev,struct pinctrl_desc * pctl_desc,struct aml_pinctrl * info)923 static 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 
aml_pctl_probe(struct platform_device * pdev)996 static 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 
1036 static const struct of_device_id aml_pctl_of_match[] = {
1037 	{ .compatible = "amlogic,pinctrl-a4", },
1038 	{ /* sentinel */ }
1039 };
1040 MODULE_DEVICE_TABLE(of, aml_pctl_dt_match);
1041 
1042 static 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 };
1049 module_platform_driver(aml_pctl_driver);
1050 
1051 MODULE_AUTHOR("Xianwei Zhao <xianwei.zhao@amlogic.com>");
1052 MODULE_DESCRIPTION("Pin controller and GPIO driver for Amlogic SoC");
1053 MODULE_LICENSE("Dual BSD/GPL");
1054