Commit 0b50dc4f authored by Jeremy Linton's avatar Jeremy Linton Committed by David S. Miller

Convert smsc911x to use ACPI as well as DT

Add ACPI bindings for the smsc911x driver. Convert the DT specific calls
to nonspecific device* calls, This allows the driver to work
with both ACPI and DT configurations. Ethernet should now work when using
ACPI on ARM Juno.
Signed-off-by: default avatarJeremy Linton <jeremy.linton@arm.com>
Reviewed-by: default avatarGraeme Gregory <graeme.gregory@linaro.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4c96b7dc
...@@ -59,7 +59,9 @@ ...@@ -59,7 +59,9 @@
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
#include <linux/of_net.h> #include <linux/of_net.h>
#include <linux/acpi.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/property.h>
#include "smsc911x.h" #include "smsc911x.h"
...@@ -2362,59 +2364,46 @@ static const struct smsc911x_ops shifted_smsc911x_ops = { ...@@ -2362,59 +2364,46 @@ static const struct smsc911x_ops shifted_smsc911x_ops = {
.tx_writefifo = smsc911x_tx_writefifo_shift, .tx_writefifo = smsc911x_tx_writefifo_shift,
}; };
#ifdef CONFIG_OF static int smsc911x_probe_config(struct smsc911x_platform_config *config,
static int smsc911x_probe_config_dt(struct smsc911x_platform_config *config, struct device *dev)
struct device_node *np)
{ {
const char *mac;
u32 width = 0; u32 width = 0;
if (!np) if (!dev)
return -ENODEV; return -ENODEV;
config->phy_interface = of_get_phy_mode(np); config->phy_interface = device_get_phy_mode(dev);
mac = of_get_mac_address(np); device_get_mac_address(dev, config->mac, ETH_ALEN);
if (mac)
memcpy(config->mac, mac, ETH_ALEN);
of_property_read_u32(np, "reg-shift", &config->shift); device_property_read_u32(dev, "reg-shift", &config->shift);
of_property_read_u32(np, "reg-io-width", &width); device_property_read_u32(dev, "reg-io-width", &width);
if (width == 4) if (width == 4)
config->flags |= SMSC911X_USE_32BIT; config->flags |= SMSC911X_USE_32BIT;
else else
config->flags |= SMSC911X_USE_16BIT; config->flags |= SMSC911X_USE_16BIT;
if (of_get_property(np, "smsc,irq-active-high", NULL)) if (device_property_present(dev, "smsc,irq-active-high"))
config->irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH; config->irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH;
if (of_get_property(np, "smsc,irq-push-pull", NULL)) if (device_property_present(dev, "smsc,irq-push-pull"))
config->irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL; config->irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL;
if (of_get_property(np, "smsc,force-internal-phy", NULL)) if (device_property_present(dev, "smsc,force-internal-phy"))
config->flags |= SMSC911X_FORCE_INTERNAL_PHY; config->flags |= SMSC911X_FORCE_INTERNAL_PHY;
if (of_get_property(np, "smsc,force-external-phy", NULL)) if (device_property_present(dev, "smsc,force-external-phy"))
config->flags |= SMSC911X_FORCE_EXTERNAL_PHY; config->flags |= SMSC911X_FORCE_EXTERNAL_PHY;
if (of_get_property(np, "smsc,save-mac-address", NULL)) if (device_property_present(dev, "smsc,save-mac-address"))
config->flags |= SMSC911X_SAVE_MAC_ADDRESS; config->flags |= SMSC911X_SAVE_MAC_ADDRESS;
return 0; return 0;
} }
#else
static inline int smsc911x_probe_config_dt(
struct smsc911x_platform_config *config,
struct device_node *np)
{
return -ENODEV;
}
#endif /* CONFIG_OF */
static int smsc911x_drv_probe(struct platform_device *pdev) static int smsc911x_drv_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node;
struct net_device *dev; struct net_device *dev;
struct smsc911x_data *pdata; struct smsc911x_data *pdata;
struct smsc911x_platform_config *config = dev_get_platdata(&pdev->dev); struct smsc911x_platform_config *config = dev_get_platdata(&pdev->dev);
...@@ -2478,7 +2467,7 @@ static int smsc911x_drv_probe(struct platform_device *pdev) ...@@ -2478,7 +2467,7 @@ static int smsc911x_drv_probe(struct platform_device *pdev)
goto out_disable_resources; goto out_disable_resources;
} }
retval = smsc911x_probe_config_dt(&pdata->config, np); retval = smsc911x_probe_config(&pdata->config, &pdev->dev);
if (retval && config) { if (retval && config) {
/* copy config parameters across to pdata */ /* copy config parameters across to pdata */
memcpy(&pdata->config, config, sizeof(pdata->config)); memcpy(&pdata->config, config, sizeof(pdata->config));
...@@ -2654,6 +2643,12 @@ static const struct of_device_id smsc911x_dt_ids[] = { ...@@ -2654,6 +2643,12 @@ static const struct of_device_id smsc911x_dt_ids[] = {
MODULE_DEVICE_TABLE(of, smsc911x_dt_ids); MODULE_DEVICE_TABLE(of, smsc911x_dt_ids);
#endif #endif
static const struct acpi_device_id smsc911x_acpi_match[] = {
{ "ARMH9118", 0 },
{ }
};
MODULE_DEVICE_TABLE(acpi, smsc911x_acpi_match);
static struct platform_driver smsc911x_driver = { static struct platform_driver smsc911x_driver = {
.probe = smsc911x_drv_probe, .probe = smsc911x_drv_probe,
.remove = smsc911x_drv_remove, .remove = smsc911x_drv_remove,
...@@ -2661,6 +2656,7 @@ static struct platform_driver smsc911x_driver = { ...@@ -2661,6 +2656,7 @@ static struct platform_driver smsc911x_driver = {
.name = SMSC_CHIPNAME, .name = SMSC_CHIPNAME,
.pm = SMSC911X_PM_OPS, .pm = SMSC911X_PM_OPS,
.of_match_table = of_match_ptr(smsc911x_dt_ids), .of_match_table = of_match_ptr(smsc911x_dt_ids),
.acpi_match_table = ACPI_PTR(smsc911x_acpi_match),
}, },
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment