diff options
| author | Shiji Yang | 2025-12-12 13:39:40 +0000 |
|---|---|---|
| committer | Hauke Mehrtens | 2025-12-23 17:22:02 +0000 |
| commit | f36e9e9888d44e662da1045778e855129ce4dec0 (patch) | |
| tree | fbd2014dfc81b0c2f064f7e44094e6f27c5e02a9 | |
| parent | f8af185ec539df7af1cf29e1a1df2c15e4cb73a2 (diff) | |
| download | openwrt-f36e9e9888d44e662da1045778e855129ce4dec0.tar.gz | |
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 <yangshiji66@outlook.com>
Link: https://github.com/openwrt/openwrt/pull/21143
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
| -rw-r--r-- | target/linux/generic/files/drivers/net/phy/rtl8366_smi.c | 122 | ||||
| -rw-r--r-- | target/linux/generic/files/drivers/net/phy/rtl8366_smi.h | 4 |
2 files changed, 50 insertions, 76 deletions
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 <linux/module.h> #include <linux/device.h> #include <linux/delay.h> -#include <linux/gpio.h> +#include <linux/gpio/consumer.h> #include <linux/spinlock.h> #include <linux/skbuff.h> #include <linux/of.h> -#include <linux/of_gpio.h> #include <linux/version.h> #include <linux/of_mdio.h> #include <linux/platform_device.h> @@ -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; |