git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
V4L/DVB (13906): cx18: Start IDX streams automatically as an internal associated...
[safe/jmp/linux-2.6]
/
drivers
/
amba
/
bus.c
diff --git
a/drivers/amba/bus.c
b/drivers/amba/bus.c
index
00c46e0
..
f60b2b6
100644
(file)
--- a/
drivers/amba/bus.c
+++ b/
drivers/amba/bus.c
@@
-204,13
+204,24
@@
static void amba_device_release(struct device *dev)
int amba_device_register(struct amba_device *dev, struct resource *parent)
{
u32 pid, cid;
int amba_device_register(struct amba_device *dev, struct resource *parent)
{
u32 pid, cid;
+ u32 size;
void __iomem *tmp;
int i, ret;
void __iomem *tmp;
int i, ret;
+ device_initialize(&dev->dev);
+
+ /*
+ * Copy from device_add
+ */
+ if (dev->dev.init_name) {
+ dev_set_name(&dev->dev, "%s", dev->dev.init_name);
+ dev->dev.init_name = NULL;
+ }
+
dev->dev.release = amba_device_release;
dev->dev.bus = &amba_bustype;
dev->dev.dma_mask = &dev->dma_mask;
dev->dev.release = amba_device_release;
dev->dev.bus = &amba_bustype;
dev->dev.dma_mask = &dev->dma_mask;
- dev->res.name = dev
->dev.bus_id
;
+ dev->res.name = dev
_name(&dev->dev)
;
if (!dev->dev.coherent_dma_mask && dev->dma_mask)
dev_warn(&dev->dev, "coherent dma mask is unset\n");
if (!dev->dev.coherent_dma_mask && dev->dma_mask)
dev_warn(&dev->dev, "coherent dma mask is unset\n");
@@
-219,16
+230,25
@@
int amba_device_register(struct amba_device *dev, struct resource *parent)
if (ret)
goto err_out;
if (ret)
goto err_out;
- tmp = ioremap(dev->res.start, SZ_4K);
+ /*
+ * Dynamically calculate the size of the resource
+ * and use this for iomap
+ */
+ size = resource_size(&dev->res);
+ tmp = ioremap(dev->res.start, size);
if (!tmp) {
ret = -ENOMEM;
goto err_release;
}
if (!tmp) {
ret = -ENOMEM;
goto err_release;
}
+ /*
+ * Read pid and cid based on size of resource
+ * they are located at end of region
+ */
for (pid = 0, i = 0; i < 4; i++)
for (pid = 0, i = 0; i < 4; i++)
- pid |= (readl(tmp +
0xfe
0 + 4 * i) & 255) << (i * 8);
+ pid |= (readl(tmp +
size - 0x2
0 + 4 * i) & 255) << (i * 8);
for (cid = 0, i = 0; i < 4; i++)
for (cid = 0, i = 0; i < 4; i++)
- cid |= (readl(tmp +
0xff
0 + 4 * i) & 255) << (i * 8);
+ cid |= (readl(tmp +
size - 0x1
0 + 4 * i) & 255) << (i * 8);
iounmap(tmp);
iounmap(tmp);
@@
-240,7
+260,7
@@
int amba_device_register(struct amba_device *dev, struct resource *parent)
goto err_release;
}
goto err_release;
}
- ret = device_
register
(&dev->dev);
+ ret = device_
add
(&dev->dev);
if (ret)
goto err_release;
if (ret)
goto err_release;
@@
-294,7
+314,7
@@
static int amba_find_match(struct device *dev, void *data)
if (d->parent)
r &= d->parent == dev->parent;
if (d->busid)
if (d->parent)
r &= d->parent == dev->parent;
if (d->busid)
- r &= strcmp(dev
->bus_id
, d->busid) == 0;
+ r &= strcmp(dev
_name(dev)
, d->busid) == 0;
if (r) {
get_device(dev);
if (r) {
get_device(dev);
@@
-343,11
+363,14
@@
amba_find_device(const char *busid, struct device *parent, unsigned int id,
int amba_request_regions(struct amba_device *dev, const char *name)
{
int ret = 0;
int amba_request_regions(struct amba_device *dev, const char *name)
{
int ret = 0;
+ u32 size;
if (!name)
name = dev->dev.driver->name;
if (!name)
name = dev->dev.driver->name;
- if (!request_mem_region(dev->res.start, SZ_4K, name))
+ size = resource_size(&dev->res);
+
+ if (!request_mem_region(dev->res.start, size, name))
ret = -EBUSY;
return ret;
ret = -EBUSY;
return ret;
@@
-361,7
+384,10
@@
int amba_request_regions(struct amba_device *dev, const char *name)
*/
void amba_release_regions(struct amba_device *dev)
{
*/
void amba_release_regions(struct amba_device *dev)
{
- release_mem_region(dev->res.start, SZ_4K);
+ u32 size;
+
+ size = resource_size(&dev->res);
+ release_mem_region(dev->res.start, size);
}
EXPORT_SYMBOL(amba_driver_register);
}
EXPORT_SYMBOL(amba_driver_register);