diff options
| author | Icenowy Zheng <icenowy@aosc.io> | 2018-05-04 02:38:43 +0800 | 
|---|---|---|
| committer | Linus Walleij <linus.walleij@linaro.org> | 2018-05-16 14:19:13 +0200 | 
| commit | ba5554dc184ee03bdadfdef8a4b8a97eddbf55dc (patch) | |
| tree | 196e1cb9f5029855450cba672d26da4daf2e7230 /drivers/pinctrl/sunxi | |
| parent | 59837002c775df7f57f1d494582a7d9c340de890 (diff) | |
| download | linux-ba5554dc184ee03bdadfdef8a4b8a97eddbf55dc.tar.bz2 | |
pinctrl: sunxi: add support for H6 R_PIO pin controller
Allwinner H6 SoC has a R_PIO pin controller like other Allwinner SoCs,
which controls the PL and PM pin banks.
Add support for it.
Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
Acked-by: Maxime Ripard <maxime.ripard@bootlin.com>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/sunxi')
| -rw-r--r-- | drivers/pinctrl/sunxi/Kconfig | 4 | ||||
| -rw-r--r-- | drivers/pinctrl/sunxi/Makefile | 1 | ||||
| -rw-r--r-- | drivers/pinctrl/sunxi/pinctrl-sun50i-h6-r.c | 128 | 
3 files changed, 133 insertions, 0 deletions
| diff --git a/drivers/pinctrl/sunxi/Kconfig b/drivers/pinctrl/sunxi/Kconfig index 5de1f63b07bb..95282cda6cee 100644 --- a/drivers/pinctrl/sunxi/Kconfig +++ b/drivers/pinctrl/sunxi/Kconfig @@ -81,4 +81,8 @@ config PINCTRL_SUN50I_H6  	def_bool ARM64 && ARCH_SUNXI  	select PINCTRL_SUNXI +config PINCTRL_SUN50I_H6_R +	def_bool ARM64 && ARCH_SUNXI +	select PINCTRL_SUNXI +  endif diff --git a/drivers/pinctrl/sunxi/Makefile b/drivers/pinctrl/sunxi/Makefile index 3c4aec6611e9..adb8443aa55c 100644 --- a/drivers/pinctrl/sunxi/Makefile +++ b/drivers/pinctrl/sunxi/Makefile @@ -19,5 +19,6 @@ obj-$(CONFIG_PINCTRL_SUN8I_H3_R)	+= pinctrl-sun8i-h3-r.o  obj-$(CONFIG_PINCTRL_SUN8I_V3S)		+= pinctrl-sun8i-v3s.o  obj-$(CONFIG_PINCTRL_SUN50I_H5)		+= pinctrl-sun50i-h5.o  obj-$(CONFIG_PINCTRL_SUN50I_H6)		+= pinctrl-sun50i-h6.o +obj-$(CONFIG_PINCTRL_SUN50I_H6_R)	+= pinctrl-sun50i-h6-r.o  obj-$(CONFIG_PINCTRL_SUN9I_A80)		+= pinctrl-sun9i-a80.o  obj-$(CONFIG_PINCTRL_SUN9I_A80_R)	+= pinctrl-sun9i-a80-r.o diff --git a/drivers/pinctrl/sunxi/pinctrl-sun50i-h6-r.c b/drivers/pinctrl/sunxi/pinctrl-sun50i-h6-r.c new file mode 100644 index 000000000000..4557e18d5989 --- /dev/null +++ b/drivers/pinctrl/sunxi/pinctrl-sun50i-h6-r.c @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Allwinner H6 R_PIO pin controller driver + * + * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io> + * + * Based on pinctrl-sun6i-a31-r.c, which is: + *   Copyright (C) 2014 Boris Brezillon + *   Boris Brezillon <boris.brezillon@free-electrons.com> + *   Copyright (C) 2014 Maxime Ripard + *   Maxime Ripard <maxime.ripard@free-electrons.com> + */ + +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> +#include <linux/reset.h> + +#include "pinctrl-sunxi.h" + +static const struct sunxi_desc_pin sun50i_h6_r_pins[] = { +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "s_i2c"),		/* SCK */ +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 0)),	/* PL_EINT0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "s_i2c"),		/* SDA */ +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 1)),	/* PL_EINT1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_uart"),	/* TX */ +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 2)),	/* PL_EINT2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_uart"),	/* RX */ +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 3)),	/* PL_EINT3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_jtag"),	/* MS */ +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 4)),	/* PL_EINT4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_jtag"),	/* CK */ +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 5)),	/* PL_EINT5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_jtag"),	/* DO */ +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 6)),	/* PL_EINT6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_jtag"),	/* DI */ +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 7)),	/* PL_EINT7 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_pwm"), +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 8)),	/* PL_EINT8 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_cir_rx"), +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 9)),	/* PL_EINT9 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_w1"), +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 10)),	/* PL_EINT10 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 0)),	/* PM_EINT0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 1)),	/* PM_EINT1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 2),	/* PM_EINT2 */ +		  SUNXI_FUNCTION(0x3, "1wire")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 3)),	/* PM_EINT3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 4)),	/* PM_EINT4 */ +}; + +static const struct sunxi_pinctrl_desc sun50i_h6_r_pinctrl_data = { +	.pins = sun50i_h6_r_pins, +	.npins = ARRAY_SIZE(sun50i_h6_r_pins), +	.pin_base = PL_BASE, +	.irq_banks = 2, +}; + +static int sun50i_h6_r_pinctrl_probe(struct platform_device *pdev) +{ +	return sunxi_pinctrl_init(pdev, +				  &sun50i_h6_r_pinctrl_data); +} + +static const struct of_device_id sun50i_h6_r_pinctrl_match[] = { +	{ .compatible = "allwinner,sun50i-h6-r-pinctrl", }, +	{} +}; + +static struct platform_driver sun50i_h6_r_pinctrl_driver = { +	.probe	= sun50i_h6_r_pinctrl_probe, +	.driver	= { +		.name		= "sun50i-h6-r-pinctrl", +		.of_match_table	= sun50i_h6_r_pinctrl_match, +	}, +}; +builtin_platform_driver(sun50i_h6_r_pinctrl_driver); |