diff options
author | John Crispin <blogic@openwrt.org> | 2012-12-15 01:59:08 +0000 |
---|---|---|
committer | John Crispin <blogic@openwrt.org> | 2012-12-15 01:59:08 +0000 |
commit | 7d0cb0b8f09e73151616e675f8e80d8c3bb3f18b (patch) | |
tree | 6ef2bbb8950081d14ea6b0e20c802c9eeaf3aee9 /target/linux/generic/files/drivers/net/phy/rtl8366_smi.c | |
parent | af0c735653111e0a182eb87a7d81924d08bdc187 (diff) | |
download | upstream-7d0cb0b8f09e73151616e675f8e80d8c3bb3f18b.tar.gz upstream-7d0cb0b8f09e73151616e675f8e80d8c3bb3f18b.tar.bz2 upstream-7d0cb0b8f09e73151616e675f8e80d8c3bb3f18b.zip |
[kernel] make rtl8366 driver OF capable
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34682 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/generic/files/drivers/net/phy/rtl8366_smi.c')
-rw-r--r-- | target/linux/generic/files/drivers/net/phy/rtl8366_smi.c | 67 |
1 files changed, 67 insertions, 0 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 be85274e78..44074633e2 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 <linux/gpio.h> #include <linux/spinlock.h> #include <linux/skbuff.h> +#include <linux/of_platform.h> +#include <linux/of_gpio.h> #include <linux/rtl8366.h> #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 <juhosg@openwrt.org>"); MODULE_LICENSE("GPL v2"); |