From: Shiji Yang Date: Fri, 12 Dec 2025 13:39:40 +0000 (+0800) Subject: kernel: rtl836x: convert to gpiod API X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=f36e9e9888d44e662da1045778e855129ce4dec0;p=openwrt%2Fopenwrt.git kernel: rtl836x: convert to gpiod API This is the recommended way for the OF based platform. Tested-on TP-Link TL-WR2543N with RTL8367 switch: ``` root@OpenWrt:~# dmesg |grep -i rtl [ 7.941126] rtl8367 rtl8367: cannot find mdio node phandle [ 7.947562] rtl8367 rtl8367: RTL8367R ver. 0 chip found [ 9.056830] rtl8367 rtl8367: cpu_port:9, assigned to extif0 root@OpenWrt:~# cat /sys/kernel/debug/gpio gpiochip0: GPIOs 512-529, parent: platform/18040000.gpio, 18040000.gpio: gpio-512 ( |lime:status ) out lo ACTIVE LOW gpio-513 ( |rtl836x-sda ) in hi gpio-518 ( |rtl836x-sck ) in lo gpio-520 ( |lime:usb ) out hi ACTIVE LOW gpio-523 ( |reset ) in hi IRQ ACTIVE LOW gpio-524 ( |wps ) in hi IRQ ACTIVE LOW ``` Signed-off-by: Shiji Yang Link: https://github.com/openwrt/openwrt/pull/21143 Signed-off-by: Hauke Mehrtens --- diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c index f4879a827b..aa8ef0bba2 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c @@ -12,11 +12,10 @@ #include #include #include -#include +#include #include #include #include -#include #include #include #include @@ -39,86 +38,86 @@ static inline void rtl8366_smi_clk_delay(struct rtl8366_smi *smi) static void rtl8366_smi_start(struct rtl8366_smi *smi) { - unsigned int sda = smi->gpio_sda; - unsigned int sck = smi->gpio_sck; + struct gpio_desc *sda = smi->gpio_sda; + struct gpio_desc *sck = smi->gpio_sck; /* * Set GPIO pins to output mode, with initial state: * SCK = 0, SDA = 1 */ - gpio_direction_output(sck, 0); - gpio_direction_output(sda, 1); + gpiod_direction_output_raw(sck, 0); + gpiod_direction_output_raw(sda, 1); rtl8366_smi_clk_delay(smi); /* CLK 1: 0 -> 1, 1 -> 0 */ - gpio_set_value(sck, 1); + gpiod_set_raw_value(sck, 1); rtl8366_smi_clk_delay(smi); - gpio_set_value(sck, 0); + gpiod_set_raw_value(sck, 0); rtl8366_smi_clk_delay(smi); /* CLK 2: */ - gpio_set_value(sck, 1); + gpiod_set_raw_value(sck, 1); rtl8366_smi_clk_delay(smi); - gpio_set_value(sda, 0); + gpiod_set_raw_value(sda, 0); rtl8366_smi_clk_delay(smi); - gpio_set_value(sck, 0); + gpiod_set_raw_value(sck, 0); rtl8366_smi_clk_delay(smi); - gpio_set_value(sda, 1); + gpiod_set_raw_value(sda, 1); } static void rtl8366_smi_stop(struct rtl8366_smi *smi) { - unsigned int sda = smi->gpio_sda; - unsigned int sck = smi->gpio_sck; + struct gpio_desc *sda = smi->gpio_sda; + struct gpio_desc *sck = smi->gpio_sck; rtl8366_smi_clk_delay(smi); - gpio_set_value(sda, 0); - gpio_set_value(sck, 1); + gpiod_set_raw_value(sda, 0); + gpiod_set_raw_value(sck, 1); rtl8366_smi_clk_delay(smi); - gpio_set_value(sda, 1); + gpiod_set_raw_value(sda, 1); rtl8366_smi_clk_delay(smi); - gpio_set_value(sck, 1); + gpiod_set_raw_value(sck, 1); rtl8366_smi_clk_delay(smi); - gpio_set_value(sck, 0); + gpiod_set_raw_value(sck, 0); rtl8366_smi_clk_delay(smi); - gpio_set_value(sck, 1); + gpiod_set_raw_value(sck, 1); /* add a click */ rtl8366_smi_clk_delay(smi); - gpio_set_value(sck, 0); + gpiod_set_raw_value(sck, 0); rtl8366_smi_clk_delay(smi); - gpio_set_value(sck, 1); + gpiod_set_raw_value(sck, 1); /* set GPIO pins to input mode */ - gpio_direction_input(sda); - gpio_direction_input(sck); + gpiod_direction_input(sda); + gpiod_direction_input(sck); } static void rtl8366_smi_write_bits(struct rtl8366_smi *smi, u32 data, u32 len) { - unsigned int sda = smi->gpio_sda; - unsigned int sck = smi->gpio_sck; + struct gpio_desc *sda = smi->gpio_sda; + struct gpio_desc *sck = smi->gpio_sck; for (; len > 0; len--) { rtl8366_smi_clk_delay(smi); /* prepare data */ - gpio_set_value(sda, !!(data & ( 1 << (len - 1)))); + gpiod_set_raw_value(sda, !!(data & (1 << (len - 1)))); rtl8366_smi_clk_delay(smi); /* clocking */ - gpio_set_value(sck, 1); + gpiod_set_raw_value(sck, 1); rtl8366_smi_clk_delay(smi); - gpio_set_value(sck, 0); + gpiod_set_raw_value(sck, 0); } } static void rtl8366_smi_read_bits(struct rtl8366_smi *smi, u32 len, u32 *data) { - unsigned int sda = smi->gpio_sda; - unsigned int sck = smi->gpio_sck; + struct gpio_desc *sda = smi->gpio_sda; + struct gpio_desc *sck = smi->gpio_sck; - gpio_direction_input(sda); + gpiod_direction_input(sda); for (*data = 0; len > 0; len--) { u32 u; @@ -126,15 +125,15 @@ static void rtl8366_smi_read_bits(struct rtl8366_smi *smi, u32 len, u32 *data) rtl8366_smi_clk_delay(smi); /* clocking */ - gpio_set_value(sck, 1); + gpiod_set_raw_value(sck, 1); rtl8366_smi_clk_delay(smi); - u = !!gpio_get_value(sda); - gpio_set_value(sck, 0); + u = !!gpiod_get_raw_value(sda); + gpiod_set_raw_value(sck, 0); *data |= (u << (len - 1)); } - gpio_direction_output(sda, 0); + gpiod_direction_output_raw(sda, 0); } static int rtl8366_smi_wait_for_ack(struct rtl8366_smi *smi) @@ -1360,24 +1359,6 @@ EXPORT_SYMBOL_GPL(rtl8366_smi_alloc); static int __rtl8366_smi_init(struct rtl8366_smi *smi, const char *name) { - int err; - - if (!smi->ext_mbus) { - err = gpio_request(smi->gpio_sda, name); - if (err) { - printk(KERN_ERR "rtl8366_smi: gpio_request failed for %u, err=%d\n", - smi->gpio_sda, err); - goto err_out; - } - - err = gpio_request(smi->gpio_sck, name); - if (err) { - printk(KERN_ERR "rtl8366_smi: gpio_request failed for %u, err=%d\n", - smi->gpio_sck, err); - goto err_free_sda; - } - } - spin_lock_init(&smi->lock); /* start the switch */ @@ -1387,22 +1368,12 @@ static int __rtl8366_smi_init(struct rtl8366_smi *smi, const char *name) } return 0; - - err_free_sda: - gpio_free(smi->gpio_sda); - err_out: - return err; } static void __rtl8366_smi_cleanup(struct rtl8366_smi *smi) { if (smi->hw_reset) smi->hw_reset(smi, true); - - if (!smi->ext_mbus) { - gpio_free(smi->gpio_sck); - gpio_free(smi->gpio_sda); - } } int rtl8366_smi_init(struct rtl8366_smi *smi) @@ -1416,10 +1387,7 @@ int rtl8366_smi_init(struct rtl8366_smi *smi) if (err) goto err_out; - if (!smi->ext_mbus) - dev_info(smi->parent, "using GPIO pins %u (SDA) and %u (SCK)\n", - smi->gpio_sda, smi->gpio_sck); - else + if (smi->ext_mbus) dev_info(smi->parent, "using MDIO bus '%s'\n", smi->ext_mbus->name); err = smi->ops->detect(smi); @@ -1482,8 +1450,7 @@ static void rtl8366_smi_reset(struct rtl8366_smi *smi, bool active) static int rtl8366_smi_probe_of(struct platform_device *pdev, struct rtl8366_smi *smi) { - int sck = of_get_named_gpio(pdev->dev.of_node, "gpio-sck", 0); - int sda = of_get_named_gpio(pdev->dev.of_node, "gpio-sda", 0); + struct gpio_desc *sck, *sda; struct device_node *np = pdev->dev.of_node; struct device_node *mdio_node; @@ -1506,10 +1473,17 @@ static int rtl8366_smi_probe_of(struct platform_device *pdev, struct rtl8366_smi return 0; try_gpio: - if (!gpio_is_valid(sck) || !gpio_is_valid(sda)) { - dev_err(&pdev->dev, "gpios missing in devictree\n"); - return -EINVAL; - } + sck = devm_gpiod_get(&pdev->dev, "sck", GPIOD_IN); + if (IS_ERR(sck)) + return dev_err_probe(&pdev->dev, PTR_ERR(sck), + "failed to request sck-gpio\n"); + gpiod_set_consumer_name(sck, "rtl836x-sck"); + + sda = devm_gpiod_get(&pdev->dev, "sda", GPIOD_IN); + if (IS_ERR(sda)) + return dev_err_probe(&pdev->dev, PTR_ERR(sda), + "failed to request sda-gpio\n"); + gpiod_set_consumer_name(sda, "rtl836x-sda"); smi->gpio_sda = sda; smi->gpio_sck = sck; diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h index 2608240bb0..9592d4b6f4 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h +++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h @@ -44,8 +44,8 @@ struct rtl8366_mib_counter { struct rtl8366_smi { struct device *parent; - unsigned int gpio_sda; - unsigned int gpio_sck; + struct gpio_desc *gpio_sda; + struct gpio_desc *gpio_sck; void (*hw_reset)(struct rtl8366_smi *smi, bool active); unsigned int clk_delay; /* ns */ u8 cmd_read;