linux/arch/arm/plat-samsung/dma.c
<<
>>
Prefs
   1/* linux/arch/arm/plat-samsung/dma.c
   2 *
   3 * Copyright (c) 2003-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/* dma channel state information */
  24struct s3c2410_dma_chan s3c2410_chans[S3C_DMA_CHANNELS];
  25struct s3c2410_dma_chan *s3c_dma_chan_map[DMACH_MAX];
  26
  27/* s3c_dma_lookup_channel
  28 *
  29 * change the dma channel number given into a real dma channel id
  30*/
  31
  32struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel)
  33{
  34        if (channel & DMACH_LOW_LEVEL)
  35                return &s3c2410_chans[channel & ~DMACH_LOW_LEVEL];
  36        else
  37                return s3c_dma_chan_map[channel];
  38}
  39
  40/* do we need to protect the settings of the fields from
  41 * irq?
  42*/
  43
  44int s3c2410_dma_set_opfn(enum dma_ch channel, s3c2410_dma_opfn_t rtn)
  45{
  46        struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
  47
  48        if (chan == NULL)
  49                return -EINVAL;
  50
  51        pr_debug("%s: chan=%p, op rtn=%p\n", __func__, chan, rtn);
  52
  53        chan->op_fn = rtn;
  54
  55        return 0;
  56}
  57EXPORT_SYMBOL(s3c2410_dma_set_opfn);
  58
  59int s3c2410_dma_set_buffdone_fn(enum dma_ch channel, s3c2410_dma_cbfn_t rtn)
  60{
  61        struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
  62
  63        if (chan == NULL)
  64                return -EINVAL;
  65
  66        pr_debug("%s: chan=%p, callback rtn=%p\n", __func__, chan, rtn);
  67
  68        chan->callback_fn = rtn;
  69
  70        return 0;
  71}
  72EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn);
  73
  74int s3c2410_dma_setflags(enum dma_ch channel, unsigned int flags)
  75{
  76        struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
  77
  78        if (chan == NULL)
  79                return -EINVAL;
  80
  81        chan->flags = flags;
  82        return 0;
  83}
  84EXPORT_SYMBOL(s3c2410_dma_setflags);
  85