From 6886519f62cf784ed12a0367fa100092130d8522 Mon Sep 17 00:00:00 2001 From: blogic Date: Sat, 15 Dec 2012 01:59:08 +0000 Subject: [kernel] make rtl8366 driver OF capable git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34682 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../generic/files/drivers/net/phy/rtl8366_smi.c | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'target/linux/generic/files/drivers/net/phy/rtl8366_smi.c') 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 be85274e7..44074633e 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #ifdef CONFIG_RTL8366_SMI_DEBUG_FS @@ -1370,6 +1372,71 @@ void rtl8366_smi_cleanup(struct rtl8366_smi *smi) } EXPORT_SYMBOL_GPL(rtl8366_smi_cleanup); +#ifdef CONFIG_OF +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); + + if (!sck || !sda) { + dev_err(&pdev->dev, "gpios missing in devictree\n"); + return -EINVAL; + } + + smi->gpio_sda = sda; + smi->gpio_sck = sck; + + return 0; +} +#else +static inline int rtl8366_smi_probe_of(struct device_node *np, struct rtl8366_smi *smi) +{ + return -ENODEV; +} +#endif + +int rtl8366_smi_probe_plat(struct platform_device *pdev, struct rtl8366_smi *smi) +{ + struct rtl8366_platform_data *pdata = pdev->dev.platform_data; + + if (!pdev->dev.platform_data) { + dev_err(&pdev->dev, "no platform data specified\n"); + return -EINVAL; + } + + smi->gpio_sda = pdata->gpio_sda; + smi->gpio_sck = pdata->gpio_sck; + smi->hw_reset = pdata->hw_reset; + + return 0; +} + + +struct rtl8366_smi *rtl8366_smi_probe(struct platform_device *pdev) +{ + struct rtl8366_smi *smi; + int err; + + smi = rtl8366_smi_alloc(&pdev->dev); + if (!smi) + return NULL; + + if (pdev->dev.of_node) + err = rtl8366_smi_probe_of(pdev, smi); + else + err = rtl8366_smi_probe_plat(pdev, smi); + + if (err) + goto free_smi; + + return smi; + +free_smi: + kfree(smi); + return NULL; +} +EXPORT_SYMBOL_GPL(rtl8366_smi_probe); + MODULE_DESCRIPTION("Realtek RTL8366 SMI interface driver"); MODULE_AUTHOR("Gabor Juhos "); MODULE_LICENSE("GPL v2"); -- cgit v1.2.3 From 6f8f4723ff1b59d2e5723da351e8a47fbaa30350 Mon Sep 17 00:00:00 2001 From: jogo Date: Sat, 15 Dec 2012 13:32:02 +0000 Subject: linux: generic: rtl836*: fix compilation with !CONFIG_OF fixes the following errors caused by r34682: CC [M] drivers/net/phy/rtl8366_smi.o In file included from drivers/net/phy/rtl8366_smi.c:26:0: drivers/net/phy/rtl8366_smi.h:149:46: warning: 'struct platform_device' declared inside parameter list [enabled by default] drivers/net/phy/rtl8366_smi.h:149:46: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default] drivers/net/phy/rtl8366_smi.c:1398:65: warning: 'struct platform_device' declared inside parameter list [enabled by default] drivers/net/phy/rtl8366_smi.c: In function 'rtl8366_smi_probe_plat': drivers/net/phy/rtl8366_smi.c:1400:44: error: dereferencing pointer to incomplete type drivers/net/phy/rtl8366_smi.c:1402:11: error: dereferencing pointer to incomplete type drivers/net/phy/rtl8366_smi.c:1403:16: error: dereferencing pointer to incomplete type drivers/net/phy/rtl8366_smi.c: At top level: drivers/net/phy/rtl8366_smi.c:1415:46: warning: 'struct platform_device' declared inside parameter list [enabled by default] drivers/net/phy/rtl8366_smi.c:1415:21: error: conflicting types for 'rtl8366_smi_probe' drivers/net/phy/rtl8366_smi.h:149:21: note: previous declaration of 'rtl8366_smi_probe' was here drivers/net/phy/rtl8366_smi.c: In function 'rtl8366_smi_probe': drivers/net/phy/rtl8366_smi.c:1420:31: error: dereferencing pointer to incomplete type drivers/net/phy/rtl8366_smi.c:1424:10: error: dereferencing pointer to incomplete type drivers/net/phy/rtl8366_smi.c:1425:3: warning: passing argument 1 of 'rtl8366_smi_probe_of' from incompatible pointer type [enabled by default] drivers/net/phy/rtl8366_smi.c:1392:19: note: expected 'struct device_node *' but argument is of type 'struct platform_device *' drivers/net/phy/rtl8366_smi.c:1427:3: warning: passing argument 1 of 'rtl8366_smi_probe_plat' from incompatible pointer type [enabled by default] drivers/net/phy/rtl8366_smi.c:1398:5: note: expected 'struct platform_device *' but argument is of type 'struct platform_device *' drivers/net/phy/rtl8366_smi.c: At top level: drivers/net/phy/rtl8366_smi.c:1438:1: error: conflicting types for 'rtl8366_smi_probe' drivers/net/phy/rtl8366_smi.h:149:21: note: previous declaration of 'rtl8366_smi_probe' was here make[7]: *** [drivers/net/phy/rtl8366_smi.o] Error 1 make[6]: *** [drivers/net/phy] Error 2 make[5]: *** [drivers/net] Error 2 make[4]: *** [drivers] Error 2 Signed-off-by: Jonas Gorski git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34703 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/rtl8366_smi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'target/linux/generic/files/drivers/net/phy/rtl8366_smi.c') 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 44074633e..570d12adb 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -1389,7 +1390,7 @@ int rtl8366_smi_probe_of(struct platform_device *pdev, struct rtl8366_smi *smi) return 0; } #else -static inline int rtl8366_smi_probe_of(struct device_node *np, struct rtl8366_smi *smi) +static inline int rtl8366_smi_probe_of(struct platform_device *pdev, struct rtl8366_smi *smi) { return -ENODEV; } -- cgit v1.2.3 From 33374b75ccd64172da5597852e1b7354abad7550 Mon Sep 17 00:00:00 2001 From: blogic Date: Fri, 21 Dec 2012 13:47:14 +0000 Subject: [kernel] make to rtl8366_smi of binding use gpio_is_valid git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34816 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/rtl8366_smi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'target/linux/generic/files/drivers/net/phy/rtl8366_smi.c') 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 570d12adb..804e827db 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c @@ -1379,7 +1379,7 @@ 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); - if (!sck || !sda) { + if (!gpio_is_valid(sck) || !gpio_is_valid(sda)) { dev_err(&pdev->dev, "gpios missing in devictree\n"); return -EINVAL; } -- cgit v1.2.3 From 8d8c86f762063894cde5c92749ee5dfce6bdee58 Mon Sep 17 00:00:00 2001 From: jogo Date: Fri, 18 Jan 2013 15:19:11 +0000 Subject: generic: rtl8366_smi: only assign pvid if no pvid was set yet Only assign a pvid if the current pvid is 0. Fixes using mixed tagged and untagged traffic on a port and the untagged vlan isn't the last one of which the port is a member. Tested on RTL8366S and RTL8367R. Fixes #8501. Signed-off-by: Jonas Gorski git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35227 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/rtl8366_smi.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'target/linux/generic/files/drivers/net/phy/rtl8366_smi.c') 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 804e827db..d43390813 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c @@ -1109,6 +1109,7 @@ int rtl8366_sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val) port = &val->value.ports[0]; for (i = 0; i < val->len; i++, port++) { + int pvid; member |= BIT(port->id); if (!(port->flags & BIT(SWITCH_PORT_FLAG_TAGGED))) @@ -1118,9 +1119,14 @@ int rtl8366_sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val) * To ensure that we have a valid MC entry for this VLAN, * initialize the port VLAN ID here. */ - err = rtl8366_set_pvid(smi, port->id, val->port_vlan); + err = rtl8366_get_pvid(smi, port->id, &pvid); if (err < 0) return err; + if (pvid == 0) { + err = rtl8366_set_pvid(smi, port->id, val->port_vlan); + if (err < 0) + return err; + } } return rtl8366_set_vlan(smi, val->port_vlan, member, untag, 0); -- cgit v1.2.3 From bd8898af343a95550424396c464114a81f9b9015 Mon Sep 17 00:00:00 2001 From: blogic Date: Thu, 25 Apr 2013 19:03:29 +0000 Subject: generic: fix rtl8366_smi compile warning drivers/net/phy/rtl8366_smi.c: In function 'rtl8366_sw_set_vlan_ports': drivers/net/phy/rtl8366_smi.c:1125:6: warning: 'pvid' may be used uninitialized in this function [-Wuninitialized] Signed-off-by: John Crispin git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36442 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/rtl8366_smi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'target/linux/generic/files/drivers/net/phy/rtl8366_smi.c') 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 d43390813..e2b4f02ef 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c @@ -1109,7 +1109,7 @@ int rtl8366_sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val) port = &val->value.ports[0]; for (i = 0; i < val->len; i++, port++) { - int pvid; + int pvid = 0; member |= BIT(port->id); if (!(port->flags & BIT(SWITCH_PORT_FLAG_TAGGED))) -- cgit v1.2.3