1d22bf40fSChen-Yu Tsai /* 2d22bf40fSChen-Yu Tsai * Allwinner A23 SoCs special pins pinctrl driver. 3d22bf40fSChen-Yu Tsai * 4d22bf40fSChen-Yu Tsai * Copyright (C) 2014 Chen-Yu Tsai 5d22bf40fSChen-Yu Tsai * Chen-Yu Tsai <wens@csie.org> 6d22bf40fSChen-Yu Tsai * 7d22bf40fSChen-Yu Tsai * Copyright (C) 2014 Boris Brezillon 8d22bf40fSChen-Yu Tsai * Boris Brezillon <boris.brezillon@free-electrons.com> 9d22bf40fSChen-Yu Tsai * 10d22bf40fSChen-Yu Tsai * Copyright (C) 2014 Maxime Ripard 11d22bf40fSChen-Yu Tsai * Maxime Ripard <maxime.ripard@free-electrons.com> 12d22bf40fSChen-Yu Tsai * 13d22bf40fSChen-Yu Tsai * This file is licensed under the terms of the GNU General Public 14d22bf40fSChen-Yu Tsai * License version 2. This program is licensed "as is" without any 15d22bf40fSChen-Yu Tsai * warranty of any kind, whether express or implied. 16d22bf40fSChen-Yu Tsai */ 17d22bf40fSChen-Yu Tsai 180c8c6ba0SPaul Gortmaker #include <linux/init.h> 19d22bf40fSChen-Yu Tsai #include <linux/platform_device.h> 20d22bf40fSChen-Yu Tsai #include <linux/of.h> 21d22bf40fSChen-Yu Tsai #include <linux/of_device.h> 22d22bf40fSChen-Yu Tsai #include <linux/pinctrl/pinctrl.h> 23d22bf40fSChen-Yu Tsai #include <linux/reset.h> 24d22bf40fSChen-Yu Tsai 25d22bf40fSChen-Yu Tsai #include "pinctrl-sunxi.h" 26d22bf40fSChen-Yu Tsai 27d22bf40fSChen-Yu Tsai static const struct sunxi_desc_pin sun8i_a23_r_pins[] = { 28d22bf40fSChen-Yu Tsai SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 0), 29d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x0, "gpio_in"), 30d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x1, "gpio_out"), 31d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x2, "s_rsb"), /* SCK */ 32059b0798SIcenowy Zheng SUNXI_FUNCTION(0x3, "s_i2c"), /* SCK */ 33d22bf40fSChen-Yu Tsai SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 0)), /* PL_EINT0 */ 34d22bf40fSChen-Yu Tsai SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 1), 35d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x0, "gpio_in"), 36d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x1, "gpio_out"), 37d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x2, "s_rsb"), /* SDA */ 38059b0798SIcenowy Zheng SUNXI_FUNCTION(0x3, "s_i2c"), /* SDA */ 39d22bf40fSChen-Yu Tsai SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 1)), /* PL_EINT1 */ 40d22bf40fSChen-Yu Tsai SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 2), 41d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x0, "gpio_in"), 42d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x1, "gpio_out"), 43d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x2, "s_uart"), /* TX */ 44d22bf40fSChen-Yu Tsai SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 2)), /* PL_EINT2 */ 45d22bf40fSChen-Yu Tsai SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 3), 46d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x0, "gpio_in"), 47d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x1, "gpio_out"), 48d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x2, "s_uart"), /* RX */ 49d22bf40fSChen-Yu Tsai SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 3)), /* PL_EINT3 */ 50d22bf40fSChen-Yu Tsai SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 4), 51d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x0, "gpio_in"), 52d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x1, "gpio_out"), 53d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x3, "s_jtag"), /* MS */ 54d22bf40fSChen-Yu Tsai SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 4)), /* PL_EINT4 */ 55d22bf40fSChen-Yu Tsai SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 5), 56d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x0, "gpio_in"), 57d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x1, "gpio_out"), 58d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x3, "s_jtag"), /* CK */ 59d22bf40fSChen-Yu Tsai SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 5)), /* PL_EINT5 */ 60d22bf40fSChen-Yu Tsai SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 6), 61d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x0, "gpio_in"), 62d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x1, "gpio_out"), 63d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x3, "s_jtag"), /* DO */ 64d22bf40fSChen-Yu Tsai SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 6)), /* PL_EINT6 */ 65d22bf40fSChen-Yu Tsai SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 7), 66d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x0, "gpio_in"), 67d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x1, "gpio_out"), 68d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x3, "s_jtag"), /* DI */ 69d22bf40fSChen-Yu Tsai SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 7)), /* PL_EINT7 */ 70d22bf40fSChen-Yu Tsai SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 8), 71d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x0, "gpio_in"), 72d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x1, "gpio_out"), 73d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x2, "s_twi"), /* SCK */ 74d22bf40fSChen-Yu Tsai SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 8)), /* PL_EINT8 */ 75d22bf40fSChen-Yu Tsai SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 9), 76d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x0, "gpio_in"), 77d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x1, "gpio_out"), 78d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x2, "s_twi"), /* SDA */ 79d22bf40fSChen-Yu Tsai SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 9)), /* PL_EINT9 */ 80d22bf40fSChen-Yu Tsai SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 10), 81d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x0, "gpio_in"), 82d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x1, "gpio_out"), 83d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x2, "s_pwm"), 84d22bf40fSChen-Yu Tsai SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 10)), /* PL_EINT10 */ 85d22bf40fSChen-Yu Tsai SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 11), 86d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x0, "gpio_in"), 87d22bf40fSChen-Yu Tsai SUNXI_FUNCTION(0x1, "gpio_out"), 88d22bf40fSChen-Yu Tsai SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 11)), /* PL_EINT11 */ 89d22bf40fSChen-Yu Tsai }; 90d22bf40fSChen-Yu Tsai 91d22bf40fSChen-Yu Tsai static const struct sunxi_pinctrl_desc sun8i_a23_r_pinctrl_data = { 92d22bf40fSChen-Yu Tsai .pins = sun8i_a23_r_pins, 93d22bf40fSChen-Yu Tsai .npins = ARRAY_SIZE(sun8i_a23_r_pins), 94d22bf40fSChen-Yu Tsai .pin_base = PL_BASE, 95d22bf40fSChen-Yu Tsai .irq_banks = 1, 96cd70387fSMaxime Ripard .disable_strict_mode = true, 97d22bf40fSChen-Yu Tsai }; 98d22bf40fSChen-Yu Tsai 99d22bf40fSChen-Yu Tsai static int sun8i_a23_r_pinctrl_probe(struct platform_device *pdev) 100d22bf40fSChen-Yu Tsai { 101d22bf40fSChen-Yu Tsai struct reset_control *rstc; 102d22bf40fSChen-Yu Tsai int ret; 103d22bf40fSChen-Yu Tsai 1042fdf5f85SPhilipp Zabel rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL); 105d22bf40fSChen-Yu Tsai if (IS_ERR(rstc)) { 106*39eb3cc8SCorentin Labbe ret = PTR_ERR(rstc); 107*39eb3cc8SCorentin Labbe if (ret == -EPROBE_DEFER) 108*39eb3cc8SCorentin Labbe return ret; 109*39eb3cc8SCorentin Labbe dev_err(&pdev->dev, "Reset controller missing err=%d\n", ret); 110*39eb3cc8SCorentin Labbe return ret; 111d22bf40fSChen-Yu Tsai } 112d22bf40fSChen-Yu Tsai 113d22bf40fSChen-Yu Tsai ret = reset_control_deassert(rstc); 114d22bf40fSChen-Yu Tsai if (ret) 115d22bf40fSChen-Yu Tsai return ret; 116d22bf40fSChen-Yu Tsai 117d22bf40fSChen-Yu Tsai ret = sunxi_pinctrl_init(pdev, 118d22bf40fSChen-Yu Tsai &sun8i_a23_r_pinctrl_data); 119d22bf40fSChen-Yu Tsai 120d22bf40fSChen-Yu Tsai if (ret) 121d22bf40fSChen-Yu Tsai reset_control_assert(rstc); 122d22bf40fSChen-Yu Tsai 123d22bf40fSChen-Yu Tsai return ret; 124d22bf40fSChen-Yu Tsai } 125d22bf40fSChen-Yu Tsai 126baa9946eSFabian Frederick static const struct of_device_id sun8i_a23_r_pinctrl_match[] = { 127d22bf40fSChen-Yu Tsai { .compatible = "allwinner,sun8i-a23-r-pinctrl", }, 128d22bf40fSChen-Yu Tsai {} 129d22bf40fSChen-Yu Tsai }; 130d22bf40fSChen-Yu Tsai 131d22bf40fSChen-Yu Tsai static struct platform_driver sun8i_a23_r_pinctrl_driver = { 132d22bf40fSChen-Yu Tsai .probe = sun8i_a23_r_pinctrl_probe, 133d22bf40fSChen-Yu Tsai .driver = { 134d22bf40fSChen-Yu Tsai .name = "sun8i-a23-r-pinctrl", 135d22bf40fSChen-Yu Tsai .of_match_table = sun8i_a23_r_pinctrl_match, 136d22bf40fSChen-Yu Tsai }, 137d22bf40fSChen-Yu Tsai }; 1380c8c6ba0SPaul Gortmaker builtin_platform_driver(sun8i_a23_r_pinctrl_driver); 139