Commit ae40b489 authored by Ben Dooks's avatar Ben Dooks Committed by Russell King

[ARM PATCH] 2226/1: S3C2410 - dma system device

Patch from Ben Dooks

Add sysfs class and devices for s3c24xx-dma code, and
add simple pm suspend code to ensure all channels are
stopped before suspending

Signed-off-by: Ben Dooks
Signed-off-by: Russell King
parent ccaf8b47
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
* *
* Changelog: * Changelog:
* 10-Nov-2004 BJD Use sys_device and sysdev_class for power management
* 08-Aug-2004 BJD Apply rmk's suggestions * 08-Aug-2004 BJD Apply rmk's suggestions
* 21-Jul-2004 BJD Ported to linux 2.6 * 21-Jul-2004 BJD Ported to linux 2.6
* 12-Jul-2004 BJD Finished re-write and change of API * 12-Jul-2004 BJD Finished re-write and change of API
...@@ -38,6 +39,7 @@ ...@@ -38,6 +39,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/sysdev.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/delay.h> #include <linux/delay.h>
...@@ -1042,12 +1044,55 @@ int s3c2410_dma_devconfig(int channel, ...@@ -1042,12 +1044,55 @@ int s3c2410_dma_devconfig(int channel,
return -EINVAL; return -EINVAL;
} }
/* system device class */
#ifdef CONFIG_PM
static int s3c2410_dma_suspend(struct sys_device *dev, u32 state)
{
s3c2410_dma_chan_t *cp = container_of(dev, s3c2410_dma_chan_t, dev);
printk(KERN_DEBUG "suspending dma channel %d\n", cp->number);
if (dma_rdreg(cp, S3C2410_DMA_DMASKTRIG) & S3C2410_DMASKTRIG_ON) {
/* the dma channel is still working, which is probably
* a bad thing to do over suspend/resume. We stop the
* channel and assume that the client is either going to
* retry after resume, or that it is broken.
*/
printk(KERN_INFO "dma: stopping channel %d due to suspend\n",
cp->number);
s3c2410_dma_dostop(cp);
}
return 0;
}
static int s3c2410_dma_resume(struct sys_device *dev)
{
return 0;
}
#else
#define s3c2410_dma_suspend NULL
#define s3c2410_dma_resume NULL
#endif /* CONFIG_PM */
static struct sysdev_class dma_sysclass = {
set_kset_name("s3c24xx-dma"),
.suspend = s3c2410_dma_suspend,
.resume = s3c2410_dma_resume,
};
/* initialisation code */ /* initialisation code */
static int __init s3c2410_init_dma(void) static int __init s3c2410_init_dma(void)
{ {
int channel;
s3c2410_dma_chan_t *cp; s3c2410_dma_chan_t *cp;
int channel;
int ret;
printk("S3C2410 DMA Driver, (c) 2003-2004 Simtec Electronics\n"); printk("S3C2410 DMA Driver, (c) 2003-2004 Simtec Electronics\n");
...@@ -1057,6 +1102,12 @@ static int __init s3c2410_init_dma(void) ...@@ -1057,6 +1102,12 @@ static int __init s3c2410_init_dma(void)
return -ENOMEM; return -ENOMEM;
} }
ret = sysdev_class_register(&dma_sysclass);
if (ret != 0) {
printk(KERN_ERR "dma sysclass registration failed\n");
goto err;
}
for (channel = 0; channel < S3C2410_DMA_CHANNELS; channel++) { for (channel = 0; channel < S3C2410_DMA_CHANNELS; channel++) {
cp = &s3c2410_chans[channel]; cp = &s3c2410_chans[channel];
...@@ -1075,11 +1126,22 @@ static int __init s3c2410_init_dma(void) ...@@ -1075,11 +1126,22 @@ static int __init s3c2410_init_dma(void)
cp->load_timeout = 1<<18; cp->load_timeout = 1<<18;
/* register system device */
cp->dev.cls = &dma_sysclass;
cp->dev.id = channel;
ret = sysdev_register(&cp->dev);
printk("DMA channel %d at %p, irq %d\n", printk("DMA channel %d at %p, irq %d\n",
cp->number, cp->regs, cp->irq); cp->number, cp->regs, cp->irq);
} }
return 0; return 0;
err:
iounmap(dma_base);
dma_base = NULL;
return ret;
} }
__initcall(s3c2410_init_dma); __initcall(s3c2410_init_dma);
/* linux/include/asm-arm/arch-bast/dma.h /* linux/include/asm-arm/arch-bast/dma.h
* *
* Copyright (C) 2003 Simtec Electronics * Copyright (C) 2003,2004 Simtec Electronics
* Ben Dooks <ben@simtec.co.uk> * Ben Dooks <ben@simtec.co.uk>
* *
* Samsung S3C2410X DMA support * Samsung S3C2410X DMA support
...@@ -12,13 +12,14 @@ ...@@ -12,13 +12,14 @@
* Changelog: * Changelog:
* ??-May-2003 BJD Created file * ??-May-2003 BJD Created file
* ??-Jun-2003 BJD Added more dma functionality to go with arch * ??-Jun-2003 BJD Added more dma functionality to go with arch
* 10-Nov-2004 BJD Added sys_device support
*/ */
#ifndef __ASM_ARCH_DMA_H #ifndef __ASM_ARCH_DMA_H
#define __ASM_ARCH_DMA_H #define __ASM_ARCH_DMA_H __FILE__
#include <linux/config.h> #include <linux/config.h>
#include <linux/sysdev.h>
#include "hardware.h" #include "hardware.h"
...@@ -215,6 +216,9 @@ struct s3c2410_dma_chan_s { ...@@ -215,6 +216,9 @@ struct s3c2410_dma_chan_s {
s3c2410_dma_buf_t *curr; /* current dma buffer */ s3c2410_dma_buf_t *curr; /* current dma buffer */
s3c2410_dma_buf_t *next; /* next buffer to load */ s3c2410_dma_buf_t *next; /* next buffer to load */
s3c2410_dma_buf_t *end; /* end of queue */ s3c2410_dma_buf_t *end; /* end of queue */
/* system device */
struct sys_device dev;
}; };
/* the currently allocated channel information */ /* the currently allocated channel information */
......
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