mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 14:43:16 +00:00
[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: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
44b1869390
commit
ab2c21529d
@ -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 {
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
#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
|
|||||||
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
|
|||||||
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
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
* 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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user