Commit 97c1b145 authored by Ben Dooks's avatar Ben Dooks Committed by Ben Dooks

[ARM] S3C: Move DMA channel management code to plat-s3c

Change the name of S3C2410_DMA_CHANNELS to S3C_DMA_CHANNELS in the process.
Signed-off-by: default avatarBen Dooks <ben@simtec.co.uk>
Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
parent 20934cdb
...@@ -55,9 +55,9 @@ enum dma_ch { ...@@ -55,9 +55,9 @@ enum dma_ch {
/* we have 4 dma channels */ /* we have 4 dma channels */
#ifndef CONFIG_CPU_S3C2443 #ifndef CONFIG_CPU_S3C2443
#define S3C2410_DMA_CHANNELS (4) #define S3C_DMA_CHANNELS (4)
#else #else
#define S3C2410_DMA_CHANNELS (6) #define S3C_DMA_CHANNELS (6)
#endif #endif
/* types */ /* types */
...@@ -192,10 +192,6 @@ struct s3c2410_dma_chan { ...@@ -192,10 +192,6 @@ struct s3c2410_dma_chan {
struct sys_device dev; struct sys_device dev;
}; };
/* the currently allocated channel information */
extern struct s3c2410_dma_chan s3c2410_chans[];
/* note, we don't really use dma_device_t at the moment */
typedef unsigned long dma_device_t; typedef unsigned long dma_device_t;
#endif /* __ASM_ARCH_DMA_H */ #endif /* __ASM_ARCH_DMA_H */
...@@ -150,6 +150,13 @@ config S3C_GPIO_CFG_S3C64XX ...@@ -150,6 +150,13 @@ config S3C_GPIO_CFG_S3C64XX
Internal configuration to enable S3C64XX style GPIO configuration Internal configuration to enable S3C64XX style GPIO configuration
functions. functions.
# DMA
config S3C_DMA
bool
help
Internal configuration for S3C DMA core
# device definitions to compile in # device definitions to compile in
config S3C_DEV_HSMMC config S3C_DEV_HSMMC
......
...@@ -18,6 +18,10 @@ obj-y += pwm-clock.o ...@@ -18,6 +18,10 @@ obj-y += pwm-clock.o
obj-y += gpio.o obj-y += gpio.o
obj-y += gpio-config.o obj-y += gpio-config.o
# DMA support
obj-$(CONFIG_S3C_DMA) += dma.o
# PM support # PM support
obj-$(CONFIG_PM) += pm.o obj-$(CONFIG_PM) += pm.o
......
/* linux/arch/arm/plat-s3c/dma.c
*
* Copyright (c) 2003-2005,2006,2009 Simtec Electronics
* Ben Dooks <ben@simtec.co.uk>
* http://armlinux.simtec.co.uk/
*
* S3C DMA core
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
struct s3c2410_dma_buf;
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <mach/dma.h>
#include <mach/irqs.h>
#include <plat/dma-plat.h>
/* dma channel state information */
struct s3c2410_dma_chan s3c2410_chans[S3C_DMA_CHANNELS];
struct s3c2410_dma_chan *s3c_dma_chan_map[DMACH_MAX];
/* s3c_dma_lookup_channel
*
* change the dma channel number given into a real dma channel id
*/
struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel)
{
if (channel & DMACH_LOW_LEVEL)
return &s3c2410_chans[channel & ~DMACH_LOW_LEVEL];
else
return s3c_dma_chan_map[channel];
}
/* do we need to protect the settings of the fields from
* irq?
*/
int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn)
{
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
if (chan == NULL)
return -EINVAL;
pr_debug("%s: chan=%p, op rtn=%p\n", __func__, chan, rtn);
chan->op_fn = rtn;
return 0;
}
EXPORT_SYMBOL(s3c2410_dma_set_opfn);
int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn)
{
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
if (chan == NULL)
return -EINVAL;
pr_debug("%s: chan=%p, callback rtn=%p\n", __func__, chan, rtn);
chan->callback_fn = rtn;
return 0;
}
EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn);
int s3c2410_dma_setflags(unsigned int channel, unsigned int flags)
{
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
if (chan == NULL)
return -EINVAL;
chan->flags = flags;
return 0;
}
EXPORT_SYMBOL(s3c2410_dma_setflags);
/* arch/arm/plat-s3c/include/plat/dma.h
*
* Copyright 2008 Openmoko, Inc.
* Copyright 2008 Simtec Electronics
* Ben Dooks <ben@simtec.co.uk>
* http://armlinux.simtec.co.uk/
*
* Samsung S3C DMA core support
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
extern struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel);
extern struct s3c2410_dma_chan *s3c_dma_chan_map[];
/* the currently allocated channel information */
extern struct s3c2410_dma_chan s3c2410_chans[];
...@@ -71,6 +71,7 @@ config PM_SIMTEC ...@@ -71,6 +71,7 @@ config PM_SIMTEC
config S3C2410_DMA config S3C2410_DMA
bool "S3C2410 DMA support" bool "S3C2410 DMA support"
depends on ARCH_S3C2410 depends on ARCH_S3C2410
select S3C_DMA
help help
S3C2410 DMA support. This is needed for drivers like sound which S3C2410 DMA support. This is needed for drivers like sound which
use the S3C2410's DMA system to move data to and from the use the S3C2410's DMA system to move data to and from the
......
...@@ -44,8 +44,6 @@ static int dma_channels; ...@@ -44,8 +44,6 @@ static int dma_channels;
static struct s3c24xx_dma_selection dma_sel; static struct s3c24xx_dma_selection dma_sel;
/* dma channel state information */
struct s3c2410_dma_chan s3c2410_chans[S3C2410_DMA_CHANNELS];
/* debugging functions */ /* debugging functions */
...@@ -135,21 +133,6 @@ dmadbg_showregs(const char *fname, int line, struct s3c2410_dma_chan *chan) ...@@ -135,21 +133,6 @@ dmadbg_showregs(const char *fname, int line, struct s3c2410_dma_chan *chan)
#define dbg_showchan(chan) do { } while(0) #define dbg_showchan(chan) do { } while(0)
#endif /* CONFIG_S3C2410_DMA_DEBUG */ #endif /* CONFIG_S3C2410_DMA_DEBUG */
static struct s3c2410_dma_chan *dma_chan_map[DMACH_MAX];
/* lookup_dma_channel
*
* change the dma channel number given into a real dma channel id
*/
static struct s3c2410_dma_chan *lookup_dma_channel(unsigned int channel)
{
if (channel & DMACH_LOW_LEVEL)
return &s3c2410_chans[channel & ~DMACH_LOW_LEVEL];
else
return dma_chan_map[channel];
}
/* s3c2410_dma_stats_timeout /* s3c2410_dma_stats_timeout
* *
* Update DMA stats from timeout info * Update DMA stats from timeout info
...@@ -214,8 +197,6 @@ s3c2410_dma_waitforload(struct s3c2410_dma_chan *chan, int line) ...@@ -214,8 +197,6 @@ s3c2410_dma_waitforload(struct s3c2410_dma_chan *chan, int line)
return 0; return 0;
} }
/* s3c2410_dma_loadbuffer /* s3c2410_dma_loadbuffer
* *
* load a buffer, and update the channel state * load a buffer, and update the channel state
...@@ -453,7 +434,7 @@ s3c2410_dma_canload(struct s3c2410_dma_chan *chan) ...@@ -453,7 +434,7 @@ s3c2410_dma_canload(struct s3c2410_dma_chan *chan)
int s3c2410_dma_enqueue(unsigned int channel, void *id, int s3c2410_dma_enqueue(unsigned int channel, void *id,
dma_addr_t data, int size) dma_addr_t data, int size)
{ {
struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
struct s3c2410_dma_buf *buf; struct s3c2410_dma_buf *buf;
unsigned long flags; unsigned long flags;
...@@ -804,7 +785,7 @@ EXPORT_SYMBOL(s3c2410_dma_request); ...@@ -804,7 +785,7 @@ EXPORT_SYMBOL(s3c2410_dma_request);
int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *client) int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *client)
{ {
struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
unsigned long flags; unsigned long flags;
if (chan == NULL) if (chan == NULL)
...@@ -836,7 +817,7 @@ int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *client) ...@@ -836,7 +817,7 @@ int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *client)
chan->irq_claimed = 0; chan->irq_claimed = 0;
if (!(channel & DMACH_LOW_LEVEL)) if (!(channel & DMACH_LOW_LEVEL))
dma_chan_map[channel] = NULL; s3c_dma_chan_map[channel] = NULL;
local_irq_restore(flags); local_irq_restore(flags);
...@@ -995,7 +976,7 @@ static int s3c2410_dma_started(struct s3c2410_dma_chan *chan) ...@@ -995,7 +976,7 @@ static int s3c2410_dma_started(struct s3c2410_dma_chan *chan)
int int
s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op) s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op)
{ {
struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
if (chan == NULL) if (chan == NULL)
return -EINVAL; return -EINVAL;
...@@ -1043,7 +1024,7 @@ EXPORT_SYMBOL(s3c2410_dma_ctrl); ...@@ -1043,7 +1024,7 @@ EXPORT_SYMBOL(s3c2410_dma_ctrl);
int s3c2410_dma_config(unsigned int channel, int s3c2410_dma_config(unsigned int channel,
int xferunit) int xferunit)
{ {
struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
unsigned int dcon; unsigned int dcon;
pr_debug("%s: chan=%d, xfer_unit=%d, dcon=%08x\n", pr_debug("%s: chan=%d, xfer_unit=%d, dcon=%08x\n",
...@@ -1112,58 +1093,6 @@ int s3c2410_dma_config(unsigned int channel, ...@@ -1112,58 +1093,6 @@ int s3c2410_dma_config(unsigned int channel,
EXPORT_SYMBOL(s3c2410_dma_config); EXPORT_SYMBOL(s3c2410_dma_config);
int s3c2410_dma_setflags(unsigned int channel, unsigned int flags)
{
struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
if (chan == NULL)
return -EINVAL;
pr_debug("%s: chan=%p, flags=%08x\n", __func__, chan, flags);
chan->flags = flags;
return 0;
}
EXPORT_SYMBOL(s3c2410_dma_setflags);
/* do we need to protect the settings of the fields from
* irq?
*/
int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn)
{
struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
if (chan == NULL)
return -EINVAL;
pr_debug("%s: chan=%p, op rtn=%p\n", __func__, chan, rtn);
chan->op_fn = rtn;
return 0;
}
EXPORT_SYMBOL(s3c2410_dma_set_opfn);
int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn)
{
struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
if (chan == NULL)
return -EINVAL;
pr_debug("%s: chan=%p, callback rtn=%p\n", __func__, chan, rtn);
chan->callback_fn = rtn;
return 0;
}
EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn);
/* s3c2410_dma_devconfig /* s3c2410_dma_devconfig
* *
...@@ -1179,7 +1108,7 @@ int s3c2410_dma_devconfig(int channel, ...@@ -1179,7 +1108,7 @@ int s3c2410_dma_devconfig(int channel,
enum s3c2410_dmasrc source, enum s3c2410_dmasrc source,
unsigned long devaddr) unsigned long devaddr)
{ {
struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
unsigned int hwcfg; unsigned int hwcfg;
if (chan == NULL) if (chan == NULL)
...@@ -1250,7 +1179,7 @@ EXPORT_SYMBOL(s3c2410_dma_devconfig); ...@@ -1250,7 +1179,7 @@ EXPORT_SYMBOL(s3c2410_dma_devconfig);
int s3c2410_dma_getposition(unsigned int channel, dma_addr_t *src, dma_addr_t *dst) int s3c2410_dma_getposition(unsigned int channel, dma_addr_t *src, dma_addr_t *dst)
{ {
struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
if (chan == NULL) if (chan == NULL)
return -EINVAL; return -EINVAL;
...@@ -1508,7 +1437,7 @@ static struct s3c2410_dma_chan *s3c2410_dma_map_channel(int channel) ...@@ -1508,7 +1437,7 @@ static struct s3c2410_dma_chan *s3c2410_dma_map_channel(int channel)
dmach = &s3c2410_chans[ch]; dmach = &s3c2410_chans[ch];
dmach->map = ch_map; dmach->map = ch_map;
dmach->req_ch = channel; dmach->req_ch = channel;
dma_chan_map[channel] = dmach; s3c_dma_chan_map[channel] = dmach;
/* select the channel */ /* select the channel */
......
...@@ -10,8 +10,10 @@ ...@@ -10,8 +10,10 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <plat/dma-core.h>
extern struct sysdev_class dma_sysclass; extern struct sysdev_class dma_sysclass;
extern struct s3c2410_dma_chan s3c2410_chans[S3C2410_DMA_CHANNELS]; extern struct s3c2410_dma_chan s3c2410_chans[S3C_DMA_CHANNELS];
#define DMA_CH_VALID (1<<31) #define DMA_CH_VALID (1<<31)
#define DMA_CH_NEVER (1<<30) #define DMA_CH_NEVER (1<<30)
...@@ -31,8 +33,8 @@ struct s3c24xx_dma_map { ...@@ -31,8 +33,8 @@ struct s3c24xx_dma_map {
const char *name; const char *name;
struct s3c24xx_dma_addr hw_addr; struct s3c24xx_dma_addr hw_addr;
unsigned long channels[S3C2410_DMA_CHANNELS]; unsigned long channels[S3C_DMA_CHANNELS];
unsigned long channels_rx[S3C2410_DMA_CHANNELS]; unsigned long channels_rx[S3C_DMA_CHANNELS];
}; };
struct s3c24xx_dma_selection { struct s3c24xx_dma_selection {
...@@ -58,7 +60,7 @@ extern int s3c24xx_dma_init_map(struct s3c24xx_dma_selection *sel); ...@@ -58,7 +60,7 @@ extern int s3c24xx_dma_init_map(struct s3c24xx_dma_selection *sel);
*/ */
struct s3c24xx_dma_order_ch { struct s3c24xx_dma_order_ch {
unsigned int list[S3C2410_DMA_CHANNELS]; /* list of channels */ unsigned int list[S3C_DMA_CHANNELS]; /* list of channels */
unsigned int flags; /* flags */ unsigned int flags; /* flags */
}; };
......
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