diff options
author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2011-07-23 17:42:28 +0800 |
---|---|---|
committer | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2011-07-29 14:04:24 +0800 |
commit | 06c36cf09e08cfd054c2d1e61be8492c4e5dc929 (patch) | |
tree | 15b21f44075e7deeeabde516f9b55478dbcce050 /drivers | |
parent | 3465da7aa8821252f95aec5e8bb7e6a8f4f4a4f0 (diff) | |
download | barebox-06c36cf09e08cfd054c2d1e61be8492c4e5dc929.tar.gz barebox-06c36cf09e08cfd054c2d1e61be8492c4e5dc929.tar.xz |
dm9000: introduce add_dm9000_device to register dm9000 device
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/base/resource.c | 57 | ||||
-rw-r--r-- | drivers/net/dm9000.c | 3 |
2 files changed, 55 insertions, 5 deletions
diff --git a/drivers/base/resource.c b/drivers/base/resource.c index f0450d32fe..98fc68a24e 100644 --- a/drivers/base/resource.c +++ b/drivers/base/resource.c @@ -25,15 +25,25 @@ #include <driver.h> #include <xfuncs.h> -struct device_d *add_generic_device(const char* devname, int id, const char *resname, - resource_size_t start, resource_size_t size, unsigned int flags, - void *pdata) +static struct device_d *alloc_device(const char* devname, int id, void *pdata) { struct device_d *dev; dev = xzalloc(sizeof(*dev)); strcpy(dev->name, devname); dev->id = id; + dev->platform_data = pdata; + + return dev; +} + +struct device_d *add_generic_device(const char* devname, int id, const char *resname, + resource_size_t start, resource_size_t size, unsigned int flags, + void *pdata) +{ + struct device_d *dev; + + dev = alloc_device(devname, id, pdata); dev->resource = xzalloc(sizeof(struct resource)); dev->num_resources = 1; if (resname) @@ -41,10 +51,49 @@ struct device_d *add_generic_device(const char* devname, int id, const char *res dev->resource[0].start = start; dev->resource[0].size = size; dev->resource[0].flags = flags; - dev->platform_data = pdata; register_device(dev); return dev; } EXPORT_SYMBOL(add_generic_device); + +#ifdef CONFIG_DRIVER_NET_DM9000 +struct device_d *add_dm9000_device(int id, resource_size_t base, + resource_size_t data, int flags, void *pdata) +{ + struct device_d *dev; + resource_size_t size; + + dev = alloc_device("dm9000", id, pdata); + dev->resource = xzalloc(sizeof(struct resource) * 2); + dev->num_resources = 2; + + switch (flags) { + case IORESOURCE_MEM_32BIT: + size = 8; + break; + case IORESOURCE_MEM_16BIT: + size = 4; + break; + case IORESOURCE_MEM_8BIT: + size = 2; + break; + default: + printf("dm9000: memory width flag missing\n"); + return NULL; + } + + dev->resource[0].start = base; + dev->resource[0].size = size; + dev->resource[0].flags = IORESOURCE_MEM | flags; + dev->resource[1].start = data; + dev->resource[1].size = size; + dev->resource[1].flags = IORESOURCE_MEM | flags; + + register_device(dev); + + return dev; +} +EXPORT_SYMBOL(add_dm9000_device); +#endif diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c index 691d8771e3..be14317eff 100644 --- a/drivers/net/dm9000.c +++ b/drivers/net/dm9000.c @@ -500,7 +500,8 @@ static int dm9000_probe(struct device_d *dev) pdata = dev->platform_data; priv = edev->priv; - priv->buswidth = pdata->buswidth; + + priv->buswidth = dev->resource[0].flags & IORESOURCE_MEM_TYPE_MASK; priv->iodata = dev_request_mem_region(dev, 1); priv->iobase = dev_request_mem_region(dev, 0); priv->srom = pdata->srom; |