linux/arch/arm/plat-s3c/dma.c
<<
>>
Prefs
   1/* linux/arch/arm/plat-s3c/dma.c
   2 *
   3 * Copyright (c) 2003-2005,2006,2009 Simtec Electronics
   4 *      Ben Dooks <ben@simtec.co.uk>
   5 *      http://armlinux.simtec.co.uk/
   6 *
   7 * S3C DMA core
   8 *
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License version 2 as
  11 * published by the Free Software Foundation.
  12*/
  13
  14struct s3c2410_dma_buf;
  15
  16#include <linux/kernel.h>
  17#include <linux/module.h>
  18#include <linux/errno.h>
  19
  20#include <mach/dma.h>
  21#include <mach/irqs.h>
  22
  23#include <plat/dma-plat.h>
  24
  25/* dma channel state information */
  26struct s3c2410_dma_chan s3c2410_chans[S3C_DMA_CHANNELS];
  27struct s3c2410_dma_chan *s3c_dma_chan_map[DMACH_MAX];
  28
  29/* s3c_dma_lookup_channel
  30 *
  31 * change the dma channel number given into a real dma channel id
  32*/
  33
  34struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel)
  35{
  36        if (channel & DMACH_LOW_LEVEL)
  37                return &s3c2410_chans[channel & ~DMACH_LOW_LEVEL];
  38        else
  39                return s3c_dma_chan_map[channel];
  40}
  41
  42/* do we need to protect the settings of the fields from
  43 * irq?
  44*/
  45
  46int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn)
  47{
  48        struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
  49
  50        if (chan == NULL)
  51                return -EINVAL;
  52
  53        pr_debug("%s: chan=%p, op rtn=%p\n", __func__, chan, rtn);
  54
  55        chan->op_fn = rtn;
  56
  57        return 0;
  58}
  59EXPORT_SYMBOL(s3c2410_dma_set_opfn);
  60
  61int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn)
  62{
  63        struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
  64
  65        if (chan == NULL)
  66                return -EINVAL;
  67
  68        pr_debug("%s: chan=%p, callback rtn=%p\n", __func__, chan, rtn);
  69
  70        chan->callback_fn = rtn;
  71
  72        return 0;
  73}
  74EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn);
  75
  76int s3c2410_dma_setflags(unsigned int channel, unsigned int flags)
  77{
  78        struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
  79
  80        if (chan == NULL)
  81                return -EINVAL;
  82
  83        chan->flags = flags;
  84        return 0;
  85}
  86EXPORT_SYMBOL(s3c2410_dma_setflags);
  87