diff options
author | Michal Simek <monstr@monstr.eu> | 2010-01-14 11:21:02 +0100 |
---|---|---|
committer | Michal Simek <monstr@monstr.eu> | 2010-03-11 13:56:29 +0100 |
commit | ccfe27d7000668b02d10fc3e06aa49e3e3603162 (patch) | |
tree | d8d624f6bd9aebf6a848f9762b0d8ed62ee2c5a6 /arch/microblaze/kernel/setup.c | |
parent | 522dba7134d6b2e5821d3457f7941ec34f668e6d (diff) | |
download | op-kernel-dev-ccfe27d7000668b02d10fc3e06aa49e3e3603162.zip op-kernel-dev-ccfe27d7000668b02d10fc3e06aa49e3e3603162.tar.gz |
microblaze: Support DMA
Add DMA support for Microblaze. There are some part of this new feature:
1. Basic DMA support
2. Enable DMA debug option
3. Setup notifier
Ad 1. dma-mapping come from powerpc and x86 version and it is based on
generic dma-mapping-common.h
Ad 2. DMA support debug features which is used in generic file.
For more information please look at Documentation/DMA-API.txt
Ad 3. notifier is very important to setup dma_ops. Without this part
for example ll_temac driver failed because there are no setup dma operations.
Signed-off-by: Michal Simek <monstr@monstr.eu>
Diffstat (limited to 'arch/microblaze/kernel/setup.c')
-rw-r--r-- | arch/microblaze/kernel/setup.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/arch/microblaze/kernel/setup.c b/arch/microblaze/kernel/setup.c index bb8c4b9..bc325ac 100644 --- a/arch/microblaze/kernel/setup.c +++ b/arch/microblaze/kernel/setup.c @@ -23,6 +23,8 @@ #include <linux/bug.h> #include <linux/param.h> #include <linux/cache.h> +#include <linux/of_platform.h> +#include <linux/dma-mapping.h> #include <asm/cacheflush.h> #include <asm/entry.h> #include <asm/cpuinfo.h> @@ -188,3 +190,37 @@ static int microblaze_debugfs_init(void) } arch_initcall(microblaze_debugfs_init); #endif + +static int dflt_bus_notify(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct device *dev = data; + + /* We are only intereted in device addition */ + if (action != BUS_NOTIFY_ADD_DEVICE) + return 0; + + set_dma_ops(dev, &dma_direct_ops); + + return NOTIFY_DONE; +} + +static struct notifier_block dflt_plat_bus_notifier = { + .notifier_call = dflt_bus_notify, + .priority = INT_MAX, +}; + +static struct notifier_block dflt_of_bus_notifier = { + .notifier_call = dflt_bus_notify, + .priority = INT_MAX, +}; + +static int __init setup_bus_notifier(void) +{ + bus_register_notifier(&platform_bus_type, &dflt_plat_bus_notifier); + bus_register_notifier(&of_platform_bus_type, &dflt_of_bus_notifier); + + return 0; +} + +arch_initcall(setup_bus_notifier); |