summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>2011-07-23 17:42:28 +0800
committerJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>2011-07-29 14:04:24 +0800
commit06c36cf09e08cfd054c2d1e61be8492c4e5dc929 (patch)
tree15b21f44075e7deeeabde516f9b55478dbcce050 /drivers
parent3465da7aa8821252f95aec5e8bb7e6a8f4f4a4f0 (diff)
downloadbarebox-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.c57
-rw-r--r--drivers/net/dm9000.c3
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;