From fbd675c668e1e6be4e5a8a8107902282e668a3a0 Mon Sep 17 00:00:00 2001 From: INAGAKI Hiroshi Date: Thu, 24 Jun 2021 20:32:31 +0900 Subject: realtek: drop rtl838x gpio driver from 5.10 To backport the upstreamed driver (gpio-realtek-otto) from 5.13, drop the old driver from realtek target. And, modify 301-gpio-add-rtl838x-driver.patch to remove rtl838x GPIO support and rename it only for rtl8231 GPIO support. Signed-off-by: INAGAKI Hiroshi --- target/linux/realtek/config-5.10 | 1 - .../realtek/files-5.10/drivers/gpio/gpio-rtl838x.c | 425 --------------------- .../patches-5.10/301-gpio-add-rtl8231-driver.patch | 25 ++ .../patches-5.10/301-gpio-add-rtl838x-driver.patch | 32 -- 4 files changed, 25 insertions(+), 458 deletions(-) delete mode 100644 target/linux/realtek/files-5.10/drivers/gpio/gpio-rtl838x.c create mode 100644 target/linux/realtek/patches-5.10/301-gpio-add-rtl8231-driver.patch delete mode 100644 target/linux/realtek/patches-5.10/301-gpio-add-rtl838x-driver.patch diff --git a/target/linux/realtek/config-5.10 b/target/linux/realtek/config-5.10 index 3c953f3f56..b9ed86b426 100644 --- a/target/linux/realtek/config-5.10 +++ b/target/linux/realtek/config-5.10 @@ -73,7 +73,6 @@ CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GPIOLIB=y CONFIG_GPIO_RTL8231=y -CONFIG_GPIO_RTL838X=y CONFIG_REALTEK_SOC_PHY=y CONFIG_GRO_CELLS=y CONFIG_HANDLE_DOMAIN_IRQ=y diff --git a/target/linux/realtek/files-5.10/drivers/gpio/gpio-rtl838x.c b/target/linux/realtek/files-5.10/drivers/gpio/gpio-rtl838x.c deleted file mode 100644 index 8207e4bb73..0000000000 --- a/target/linux/realtek/files-5.10/drivers/gpio/gpio-rtl838x.c +++ /dev/null @@ -1,425 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only - -#include -#include -#include -#include -#include - -/* RTL8231 registers for LED control */ -#define RTL8231_LED_FUNC0 0x0000 -#define RTL8231_GPIO_PIN_SEL(gpio) ((0x0002) + ((gpio) >> 4)) -#define RTL8231_GPIO_DIR(gpio) ((0x0005) + ((gpio) >> 4)) -#define RTL8231_GPIO_DATA(gpio) ((0x001C) + ((gpio) >> 4)) - -struct rtl838x_gpios { - struct gpio_chip gc; - u32 id; - struct device *dev; - int irq; - int num_leds; - int min_led; - int leds_per_port; - u32 led_mode; - int led_glb_ctrl; - int led_sw_ctrl; - int (*led_sw_p_ctrl)(int port); - int (*led_sw_p_en_ctrl)(int port); - int (*ext_gpio_dir)(int i); - int (*ext_gpio_data)(int i); -}; - -inline int rtl838x_ext_gpio_dir(int i) -{ - return RTL838X_EXT_GPIO_DIR + ((i >>5) << 2); -} - -inline int rtl839x_ext_gpio_dir(int i) -{ - return RTL839X_EXT_GPIO_DIR + ((i >>5) << 2); -} - -inline int rtl838x_ext_gpio_data(int i) -{ - return RTL838X_EXT_GPIO_DATA + ((i >>5) << 2); -} - -inline int rtl839x_ext_gpio_data(int i) -{ - return RTL839X_EXT_GPIO_DATA + ((i >>5) << 2); -} - -inline int rtl838x_led_sw_p_ctrl(int p) -{ - return RTL838X_LED_SW_P_CTRL + (p << 2); -} - -inline int rtl839x_led_sw_p_ctrl(int p) -{ - return RTL839X_LED_SW_P_CTRL + (p << 2); -} - -inline int rtl838x_led_sw_p_en_ctrl(int p) -{ - return RTL838X_LED_SW_P_EN_CTRL + ((p / 10) << 2); -} - -inline int rtl839x_led_sw_p_en_ctrl(int p) -{ - return RTL839X_LED_SW_P_EN_CTRL + ((p / 10) << 2); -} - -extern struct mutex smi_lock; -extern struct rtl83xx_soc_info soc_info; - - -void rtl838x_gpio_set(struct gpio_chip *gc, unsigned int offset, int value) -{ - int bit; - struct rtl838x_gpios *gpios = gpiochip_get_data(gc); - - pr_debug("rtl838x_set: %d, value: %d\n", offset, value); - /* Internal GPIO of the RTL8380 */ - if (offset < 32) { - if (value) - rtl83xx_w32_mask(0, BIT(offset), RTL838X_GPIO_PABC_DATA); - else - rtl83xx_w32_mask(BIT(offset), 0, RTL838X_GPIO_PABC_DATA); - } - - /* LED driver for PWR and SYS */ - if (offset >= 32 && offset < 64) { - bit = offset - 32; - if (value) - sw_w32_mask(0, BIT(bit), gpios->led_glb_ctrl); - else - sw_w32_mask(BIT(bit), 0, gpios->led_glb_ctrl); - return; - } - - bit = (offset - 64) % 32; - /* First Port-LED */ - if (offset >= 64 && offset < 96 - && offset >= (64 + gpios->min_led) - && offset < (64 + gpios->min_led + gpios->num_leds)) { - if (value) - sw_w32_mask(7, 5, gpios->led_sw_p_ctrl(bit)); - else - sw_w32_mask(7, 0, gpios->led_sw_p_ctrl(bit)); - } - if (offset >= 96 && offset < 128 - && offset >= (96 + gpios->min_led) - && offset < (96 + gpios->min_led + gpios->num_leds)) { - if (value) - sw_w32_mask(7 << 3, 5 << 3, gpios->led_sw_p_ctrl(bit)); - else - sw_w32_mask(7 << 3, 0, gpios->led_sw_p_ctrl(bit)); - } - if (offset >= 128 && offset < 160 - && offset >= (128 + gpios->min_led) - && offset < (128 + gpios->min_led + gpios->num_leds)) { - if (value) - sw_w32_mask(7 << 6, 5 << 6, gpios->led_sw_p_ctrl(bit)); - else - sw_w32_mask(7 << 6, 0, gpios->led_sw_p_ctrl(bit)); - } - __asm__ volatile ("sync"); -} - -static int rtl838x_direction_input(struct gpio_chip *gc, unsigned int offset) -{ - pr_debug("%s: %d\n", __func__, offset); - - if (offset < 32) { - rtl83xx_w32_mask(BIT(offset), 0, RTL838X_GPIO_PABC_DIR); - return 0; - } - - /* Internal LED driver does not support input */ - return -ENOTSUPP; -} - -static int rtl838x_direction_output(struct gpio_chip *gc, unsigned int offset, int value) -{ - pr_debug("%s: %d\n", __func__, offset); - if (offset < 32) - rtl83xx_w32_mask(0, BIT(offset), RTL838X_GPIO_PABC_DIR); - rtl838x_gpio_set(gc, offset, value); - - /* LED for PWR and SYS driver is direction output by default */ - return 0; -} - -static int rtl838x_get_direction(struct gpio_chip *gc, unsigned int offset) -{ - u32 v = 0; - - pr_debug("%s: %d\n", __func__, offset); - if (offset < 32) { - v = rtl83xx_r32(RTL838X_GPIO_PABC_DIR); - if (v & BIT(offset)) - return 0; - return 1; - } - - /* LED driver for PWR and SYS is direction output by default */ - if (offset >= 32 && offset < 64) - return 0; - - return 0; -} - -static int rtl838x_gpio_get(struct gpio_chip *gc, unsigned int offset) -{ - u32 v; - struct rtl838x_gpios *gpios = gpiochip_get_data(gc); - - pr_debug("%s: %d\n", __func__, offset); - - /* Internal GPIO of the RTL8380 */ - if (offset < 32) { - v = rtl83xx_r32(RTL838X_GPIO_PABC_DATA); - if (v & BIT(offset)) - return 1; - return 0; - } - - /* LED driver for PWR and SYS */ - if (offset >= 32 && offset < 64) { - v = sw_r32(gpios->led_glb_ctrl); - if (v & BIT(offset-32)) - return 1; - return 0; - } - -/* BUG: - bit = (offset - 64) % 32; - if (offset >= 64 && offset < 96) { - if (sw_r32(RTL838X_LED1_SW_P_EN_CTRL) & BIT(bit)) - return 1; - return 0; - } - if (offset >= 96 && offset < 128) { - if (sw_r32(RTL838X_LED1_SW_P_EN_CTRL) & BIT(bit)) - return 1; - return 0; - } - if (offset >= 128 && offset < 160) { - if (sw_r32(RTL838X_LED1_SW_P_EN_CTRL) & BIT(bit)) - return 1; - return 0; - } - */ - return 0; -} - -void rtl8380_led_test(struct rtl838x_gpios *gpios, u32 mask) -{ - int i; - u32 led_gbl = sw_r32(gpios->led_glb_ctrl); - u32 mode_sel, led_p_en; - - if (soc_info.family == RTL8380_FAMILY_ID) { - mode_sel = sw_r32(RTL838X_LED_MODE_SEL); - led_p_en = sw_r32(RTL838X_LED_P_EN_CTRL); - } - - /* 2 Leds for ports 0-23 and 24-27, 3 would be 0x7 */ - sw_w32_mask(0x3f, 0x3 | (0x3 << 3), gpios->led_glb_ctrl); - - if(soc_info.family == RTL8380_FAMILY_ID) { - /* Enable all leds */ - sw_w32(0xFFFFFFF, RTL838X_LED_P_EN_CTRL); - } - /* Enable software control of all leds */ - sw_w32(0xFFFFFFF, gpios->led_sw_ctrl); - sw_w32(0xFFFFFFF, gpios->led_sw_p_en_ctrl(0)); - sw_w32(0xFFFFFFF, gpios->led_sw_p_en_ctrl(10)); - sw_w32(0x0000000, gpios->led_sw_p_en_ctrl(20)); - - for (i = 0; i < 28; i++) { - if (mask & BIT(i)) - sw_w32(5 | (5 << 3) | (5 << 6), gpios->led_sw_p_ctrl(i)); - } - msleep(3000); - - if (soc_info.family == RTL8380_FAMILY_ID) - sw_w32(led_p_en, RTL838X_LED_P_EN_CTRL); - /* Disable software control of all leds */ - sw_w32(0x0000000, gpios->led_sw_ctrl); - sw_w32(0x0000000, gpios->led_sw_p_en_ctrl(0)); - sw_w32(0x0000000, gpios->led_sw_p_en_ctrl(10)); - sw_w32(0x0000000, gpios->led_sw_p_en_ctrl(20)); - - sw_w32(led_gbl, gpios->led_glb_ctrl); - if (soc_info.family == RTL8380_FAMILY_ID) - sw_w32(mode_sel, RTL838X_LED_MODE_SEL); -} - -void take_port_leds(struct rtl838x_gpios *gpios) -{ - int leds_per_port = gpios->leds_per_port; - int mode = gpios->led_mode; - - pr_info("%s, %d, %x\n", __func__, leds_per_port, mode); - pr_debug("Bootloader settings: %x %x %x\n", - sw_r32(gpios->led_sw_p_en_ctrl(0)), - sw_r32(gpios->led_sw_p_en_ctrl(10)), - sw_r32(gpios->led_sw_p_en_ctrl(20)) - ); - - if (soc_info.family == RTL8380_FAMILY_ID) { - pr_debug("led glb: %x, sel %x\n", - sw_r32(gpios->led_glb_ctrl), sw_r32(RTL838X_LED_MODE_SEL)); - pr_debug("RTL838X_LED_P_EN_CTRL: %x", sw_r32(RTL838X_LED_P_EN_CTRL)); - pr_debug("RTL838X_LED_MODE_CTRL: %x", sw_r32(RTL838X_LED_MODE_CTRL)); - sw_w32_mask(3, 0, RTL838X_LED_MODE_SEL); - sw_w32(mode, RTL838X_LED_MODE_CTRL); - } - - /* Enable software control of all leds */ - sw_w32(0xFFFFFFF, gpios->led_sw_ctrl); - if (soc_info.family == RTL8380_FAMILY_ID) - sw_w32(0xFFFFFFF, RTL838X_LED_P_EN_CTRL); - - sw_w32(0x0000000, gpios->led_sw_p_en_ctrl(0)); - sw_w32(0x0000000, gpios->led_sw_p_en_ctrl(10)); - sw_w32(0x0000000, gpios->led_sw_p_en_ctrl(20)); - - sw_w32_mask(0x3f, 0, gpios->led_glb_ctrl); - switch (leds_per_port) { - case 3: - sw_w32_mask(0, 0x7 | (0x7 << 3), gpios->led_glb_ctrl); - sw_w32(0xFFFFFFF, gpios->led_sw_p_en_ctrl(20)); - /* FALLTHRU */ - case 2: - sw_w32_mask(0, 0x3 | (0x3 << 3), gpios->led_glb_ctrl); - sw_w32(0xFFFFFFF, gpios->led_sw_p_en_ctrl(10)); - /* FALLTHRU */ - case 1: - sw_w32_mask(0, 0x1 | (0x1 << 3), gpios->led_glb_ctrl); - sw_w32(0xFFFFFFF, gpios->led_sw_p_en_ctrl(0)); - break; - default: - pr_err("No LEDS configured for software control\n"); - } -} - -static const struct of_device_id rtl838x_gpio_of_match[] = { - { .compatible = "realtek,rtl838x-gpio" }, - {}, -}; - -MODULE_DEVICE_TABLE(of, rtl838x_gpio_of_match); - -static int rtl838x_gpio_probe(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct device_node *np = dev->of_node; - struct rtl838x_gpios *gpios; - int err; - - pr_info("Probing RTL838X GPIOs\n"); - - if (!np) { - dev_err(&pdev->dev, "No DT found\n"); - return -EINVAL; - } - - gpios = devm_kzalloc(dev, sizeof(*gpios), GFP_KERNEL); - if (!gpios) - return -ENOMEM; - - gpios->id = soc_info.id; - - switch (gpios->id) { - case 0x8332: - pr_debug("Found RTL8332M GPIO\n"); - break; - case 0x8380: - pr_debug("Found RTL8380M GPIO\n"); - break; - case 0x8381: - pr_debug("Found RTL8381M GPIO\n"); - break; - case 0x8382: - pr_debug("Found RTL8382M GPIO\n"); - break; - case 0x8391: - pr_debug("Found RTL8391 GPIO\n"); - break; - case 0x8393: - pr_debug("Found RTL8393 GPIO\n"); - break; - default: - pr_err("Unknown GPIO chip id (%04x)\n", gpios->id); - return -ENODEV; - } - - if (soc_info.family == RTL8380_FAMILY_ID) { - gpios->led_glb_ctrl = RTL838X_LED_GLB_CTRL; - gpios->led_sw_ctrl = RTL838X_LED_SW_CTRL; - gpios->led_sw_p_ctrl = rtl838x_led_sw_p_ctrl; - gpios->led_sw_p_en_ctrl = rtl838x_led_sw_p_en_ctrl; - gpios->ext_gpio_dir = rtl838x_ext_gpio_dir; - gpios->ext_gpio_data = rtl838x_ext_gpio_data; - } - - if (soc_info.family == RTL8390_FAMILY_ID) { - gpios->led_glb_ctrl = RTL839X_LED_GLB_CTRL; - gpios->led_sw_ctrl = RTL839X_LED_SW_CTRL; - gpios->led_sw_p_ctrl = rtl839x_led_sw_p_ctrl; - gpios->led_sw_p_en_ctrl = rtl839x_led_sw_p_en_ctrl; - gpios->ext_gpio_dir = rtl839x_ext_gpio_dir; - gpios->ext_gpio_data = rtl839x_ext_gpio_data; - } - - gpios->dev = dev; - gpios->gc.base = 0; - /* 0-31: internal - * 32-63, LED control register - * 64-95: PORT-LED 0 - * 96-127: PORT-LED 1 - * 128-159: PORT-LED 2 - */ - gpios->gc.ngpio = 160; - gpios->gc.label = "rtl838x"; - gpios->gc.parent = dev; - gpios->gc.owner = THIS_MODULE; - gpios->gc.can_sleep = true; - gpios->irq = 31; - - gpios->gc.direction_input = rtl838x_direction_input; - gpios->gc.direction_output = rtl838x_direction_output; - gpios->gc.set = rtl838x_gpio_set; - gpios->gc.get = rtl838x_gpio_get; - gpios->gc.get_direction = rtl838x_get_direction; - - if (of_property_read_bool(np, "take-port-leds")) { - if (of_property_read_u32(np, "leds-per-port", &gpios->leds_per_port)) - gpios->leds_per_port = 2; - if (of_property_read_u32(np, "led-mode", &gpios->led_mode)) - gpios->led_mode = (0x1ea << 15) | 0x1ea; - if (of_property_read_u32(np, "num-leds", &gpios->num_leds)) - gpios->num_leds = 32; - if (of_property_read_u32(np, "min-led", &gpios->min_led)) - gpios->min_led = 0; - take_port_leds(gpios); - } - - err = devm_gpiochip_add_data(dev, &gpios->gc, gpios); - return err; -} - -static struct platform_driver rtl838x_gpio_driver = { - .driver = { - .name = "rtl838x-gpio", - .of_match_table = rtl838x_gpio_of_match, - }, - .probe = rtl838x_gpio_probe, -}; - -module_platform_driver(rtl838x_gpio_driver); - -MODULE_DESCRIPTION("Realtek RTL838X GPIO API support"); -MODULE_LICENSE("GPL v2"); diff --git a/target/linux/realtek/patches-5.10/301-gpio-add-rtl8231-driver.patch b/target/linux/realtek/patches-5.10/301-gpio-add-rtl8231-driver.patch new file mode 100644 index 0000000000..8a3d4810a6 --- /dev/null +++ b/target/linux/realtek/patches-5.10/301-gpio-add-rtl8231-driver.patch @@ -0,0 +1,25 @@ +--- a/drivers/gpio/Kconfig ++++ b/drivers/gpio/Kconfig +@@ -441,6 +441,12 @@ config GPIO_REG + A 32-bit single register GPIO fixed in/out implementation. This + can be used to represent any register as a set of GPIO signals. + ++config GPIO_RTL8231 ++ tristate "RTL8231 GPIO" ++ depends on RTL838X ++ help ++ Say yes here to support Realtek RTL8231 GPIO expansion chips. ++ + config GPIO_SAMA5D2_PIOBU + tristate "SAMA5D2 PIOBU GPIO support" + depends on MFD_SYSCON +--- a/drivers/gpio/Makefile ++++ b/drivers/gpio/Makefile +@@ -117,6 +117,7 @@ obj-$(CONFIG_GPIO_RC5T583) += gpio-rc5t + obj-$(CONFIG_GPIO_RCAR) += gpio-rcar.o + obj-$(CONFIG_GPIO_RDC321X) += gpio-rdc321x.o + obj-$(CONFIG_GPIO_REG) += gpio-reg.o ++obj-$(CONFIG_GPIO_RTL8231) += gpio-rtl8231.o + obj-$(CONFIG_ARCH_SA1100) += gpio-sa1100.o + obj-$(CONFIG_GPIO_SAMA5D2_PIOBU) += gpio-sama5d2-piobu.o + obj-$(CONFIG_GPIO_SCH311X) += gpio-sch311x.o diff --git a/target/linux/realtek/patches-5.10/301-gpio-add-rtl838x-driver.patch b/target/linux/realtek/patches-5.10/301-gpio-add-rtl838x-driver.patch deleted file mode 100644 index 4f5901d87f..0000000000 --- a/target/linux/realtek/patches-5.10/301-gpio-add-rtl838x-driver.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- a/drivers/gpio/Kconfig -+++ b/drivers/gpio/Kconfig -@@ -441,6 +441,18 @@ config GPIO_REG - A 32-bit single register GPIO fixed in/out implementation. This - can be used to represent any register as a set of GPIO signals. - -+config GPIO_RTL8231 -+ tristate "RTL8231 GPIO" -+ depends on GPIO_RTL838X -+ help -+ Say yes here to support Realtek RTL8231 GPIO expansion chips. -+ -+config GPIO_RTL838X -+ tristate "RTL838X GPIO" -+ depends on RTL838X -+ help -+ Say yes here to support RTL838X GPIO devices. -+ - config GPIO_SAMA5D2_PIOBU - tristate "SAMA5D2 PIOBU GPIO support" - depends on MFD_SYSCON ---- a/drivers/gpio/Makefile -+++ b/drivers/gpio/Makefile -@@ -117,6 +117,8 @@ obj-$(CONFIG_GPIO_RC5T583) += gpio-rc5t - obj-$(CONFIG_GPIO_RCAR) += gpio-rcar.o - obj-$(CONFIG_GPIO_RDC321X) += gpio-rdc321x.o - obj-$(CONFIG_GPIO_REG) += gpio-reg.o -+obj-$(CONFIG_GPIO_RTL8231) += gpio-rtl8231.o -+obj-$(CONFIG_GPIO_RTL838X) += gpio-rtl838x.o - obj-$(CONFIG_ARCH_SA1100) += gpio-sa1100.o - obj-$(CONFIG_GPIO_SAMA5D2_PIOBU) += gpio-sama5d2-piobu.o - obj-$(CONFIG_GPIO_SCH311X) += gpio-sch311x.o -- cgit v1.2.3