Commit ab2c2152 authored by Russell King's avatar Russell King Committed by Russell King

[ARM] Add a reference from struct device to the dma bounce info

dmabounce keeps a per-device structure, and finds the correct
structure by walking a list.  Since architectures can now add
fields to struct device, we can attach this structure direct to
the struct device, thereby eliminating the code to search the
list.
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 44b18693
...@@ -66,8 +66,6 @@ struct dmabounce_pool { ...@@ -66,8 +66,6 @@ struct dmabounce_pool {
}; };
struct dmabounce_device_info { struct dmabounce_device_info {
struct list_head node;
struct device *dev; struct device *dev;
struct list_head safe_buffers; struct list_head safe_buffers;
#ifdef STATS #ifdef STATS
...@@ -81,8 +79,6 @@ struct dmabounce_device_info { ...@@ -81,8 +79,6 @@ struct dmabounce_device_info {
rwlock_t lock; rwlock_t lock;
}; };
static LIST_HEAD(dmabounce_devs);
#ifdef STATS #ifdef STATS
static void print_alloc_stats(struct dmabounce_device_info *device_info) static void print_alloc_stats(struct dmabounce_device_info *device_info)
{ {
...@@ -96,19 +92,6 @@ static void print_alloc_stats(struct dmabounce_device_info *device_info) ...@@ -96,19 +92,6 @@ static void print_alloc_stats(struct dmabounce_device_info *device_info)
} }
#endif #endif
/* find the given device in the dmabounce device list */
static inline struct dmabounce_device_info *
find_dmabounce_dev(struct device *dev)
{
struct dmabounce_device_info *d;
list_for_each_entry(d, &dmabounce_devs, node)
if (d->dev == dev)
return d;
return NULL;
}
/* allocate a 'safe' buffer and keep track of it */ /* allocate a 'safe' buffer and keep track of it */
static inline struct safe_buffer * static inline struct safe_buffer *
...@@ -231,7 +214,7 @@ static inline dma_addr_t ...@@ -231,7 +214,7 @@ static inline dma_addr_t
map_single(struct device *dev, void *ptr, size_t size, map_single(struct device *dev, void *ptr, size_t size,
enum dma_data_direction dir) enum dma_data_direction dir)
{ {
struct dmabounce_device_info *device_info = find_dmabounce_dev(dev); struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
dma_addr_t dma_addr; dma_addr_t dma_addr;
int needs_bounce = 0; int needs_bounce = 0;
...@@ -292,7 +275,7 @@ static inline void ...@@ -292,7 +275,7 @@ static inline void
unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
enum dma_data_direction dir) enum dma_data_direction dir)
{ {
struct dmabounce_device_info *device_info = find_dmabounce_dev(dev); struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
struct safe_buffer *buf = NULL; struct safe_buffer *buf = NULL;
/* /*
...@@ -343,7 +326,7 @@ static inline void ...@@ -343,7 +326,7 @@ static inline void
sync_single(struct device *dev, dma_addr_t dma_addr, size_t size, sync_single(struct device *dev, dma_addr_t dma_addr, size_t size,
enum dma_data_direction dir) enum dma_data_direction dir)
{ {
struct dmabounce_device_info *device_info = find_dmabounce_dev(dev); struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
struct safe_buffer *buf = NULL; struct safe_buffer *buf = NULL;
if (device_info) if (device_info)
...@@ -606,7 +589,7 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, ...@@ -606,7 +589,7 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
device_info->bounce_count = 0; device_info->bounce_count = 0;
#endif #endif
list_add(&device_info->node, &dmabounce_devs); dev->archdata.dmabounce = device_info;
printk(KERN_INFO "dmabounce: registered device %s on %s bus\n", printk(KERN_INFO "dmabounce: registered device %s on %s bus\n",
dev->bus_id, dev->bus->name); dev->bus_id, dev->bus->name);
...@@ -623,7 +606,9 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, ...@@ -623,7 +606,9 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
void void
dmabounce_unregister_dev(struct device *dev) dmabounce_unregister_dev(struct device *dev)
{ {
struct dmabounce_device_info *device_info = find_dmabounce_dev(dev); struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
dev->archdata.dmabounce = NULL;
if (!device_info) { if (!device_info) {
printk(KERN_WARNING printk(KERN_WARNING
...@@ -649,8 +634,6 @@ dmabounce_unregister_dev(struct device *dev) ...@@ -649,8 +634,6 @@ dmabounce_unregister_dev(struct device *dev)
print_map_stats(device_info); print_map_stats(device_info);
#endif #endif
list_del(&device_info->node);
kfree(device_info); kfree(device_info);
printk(KERN_INFO "dmabounce: device %s on %s bus unregistered\n", printk(KERN_INFO "dmabounce: device %s on %s bus unregistered\n",
......
...@@ -3,5 +3,13 @@ ...@@ -3,5 +3,13 @@
* *
* This file is released under the GPLv2 * This file is released under the GPLv2
*/ */
#include <asm-generic/device.h> #ifndef ASMARM_DEVICE_H
#define ASMARM_DEVICE_H
struct dev_archdata {
#ifdef CONFIG_DMABOUNCE
struct dmabounce_device_info *dmabounce;
#endif
};
#endif
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