ASoC: SAMSUNG: Modify I2S driver to support idma
[deliverable/linux.git] / sound / soc / samsung / i2s.c
index ffa09b3b2caaeedf98568331ec0825888829e5eb..c086b78539ee5075f14b76d99089e4abb7f0abf1 100644 (file)
 #include <plat/audio.h>
 
 #include "dma.h"
+#include "idma.h"
 #include "i2s.h"
-
-#define I2SCON         0x0
-#define I2SMOD         0x4
-#define I2SFIC         0x8
-#define I2SPSR         0xc
-#define I2STXD         0x10
-#define I2SRXD         0x14
-#define I2SFICS                0x18
-#define I2STXDS                0x1c
-
-#define CON_RSTCLR             (1 << 31)
-#define CON_FRXOFSTATUS                (1 << 26)
-#define CON_FRXORINTEN         (1 << 25)
-#define CON_FTXSURSTAT         (1 << 24)
-#define CON_FTXSURINTEN                (1 << 23)
-#define CON_TXSDMA_PAUSE       (1 << 20)
-#define CON_TXSDMA_ACTIVE      (1 << 18)
-
-#define CON_FTXURSTATUS                (1 << 17)
-#define CON_FTXURINTEN         (1 << 16)
-#define CON_TXFIFO2_EMPTY      (1 << 15)
-#define CON_TXFIFO1_EMPTY      (1 << 14)
-#define CON_TXFIFO2_FULL       (1 << 13)
-#define CON_TXFIFO1_FULL       (1 << 12)
-
-#define CON_LRINDEX            (1 << 11)
-#define CON_TXFIFO_EMPTY       (1 << 10)
-#define CON_RXFIFO_EMPTY       (1 << 9)
-#define CON_TXFIFO_FULL                (1 << 8)
-#define CON_RXFIFO_FULL                (1 << 7)
-#define CON_TXDMA_PAUSE                (1 << 6)
-#define CON_RXDMA_PAUSE                (1 << 5)
-#define CON_TXCH_PAUSE         (1 << 4)
-#define CON_RXCH_PAUSE         (1 << 3)
-#define CON_TXDMA_ACTIVE       (1 << 2)
-#define CON_RXDMA_ACTIVE       (1 << 1)
-#define CON_ACTIVE             (1 << 0)
-
-#define MOD_OPCLK_CDCLK_OUT    (0 << 30)
-#define MOD_OPCLK_CDCLK_IN     (1 << 30)
-#define MOD_OPCLK_BCLK_OUT     (2 << 30)
-#define MOD_OPCLK_PCLK         (3 << 30)
-#define MOD_OPCLK_MASK         (3 << 30)
-#define MOD_TXS_IDMA           (1 << 28) /* Sec_TXFIFO use I-DMA */
-
-#define MOD_BLCS_SHIFT 26
-#define MOD_BLCS_16BIT (0 << MOD_BLCS_SHIFT)
-#define MOD_BLCS_8BIT  (1 << MOD_BLCS_SHIFT)
-#define MOD_BLCS_24BIT (2 << MOD_BLCS_SHIFT)
-#define MOD_BLCS_MASK  (3 << MOD_BLCS_SHIFT)
-#define MOD_BLCP_SHIFT 24
-#define MOD_BLCP_16BIT (0 << MOD_BLCP_SHIFT)
-#define MOD_BLCP_8BIT  (1 << MOD_BLCP_SHIFT)
-#define MOD_BLCP_24BIT (2 << MOD_BLCP_SHIFT)
-#define MOD_BLCP_MASK  (3 << MOD_BLCP_SHIFT)
-
-#define MOD_C2DD_HHALF         (1 << 21) /* Discard Higher-half */
-#define MOD_C2DD_LHALF         (1 << 20) /* Discard Lower-half */
-#define MOD_C1DD_HHALF         (1 << 19)
-#define MOD_C1DD_LHALF         (1 << 18)
-#define MOD_DC2_EN             (1 << 17)
-#define MOD_DC1_EN             (1 << 16)
-#define MOD_BLC_16BIT          (0 << 13)
-#define MOD_BLC_8BIT           (1 << 13)
-#define MOD_BLC_24BIT          (2 << 13)
-#define MOD_BLC_MASK           (3 << 13)
-
-#define MOD_IMS_SYSMUX         (1 << 10)
-#define MOD_SLAVE              (1 << 11)
-#define MOD_TXONLY             (0 << 8)
-#define MOD_RXONLY             (1 << 8)
-#define MOD_TXRX               (2 << 8)
-#define MOD_MASK               (3 << 8)
-#define MOD_LR_LLOW            (0 << 7)
-#define MOD_LR_RLOW            (1 << 7)
-#define MOD_SDF_IIS            (0 << 5)
-#define MOD_SDF_MSB            (1 << 5)
-#define MOD_SDF_LSB            (2 << 5)
-#define MOD_SDF_MASK           (3 << 5)
-#define MOD_RCLK_256FS         (0 << 3)
-#define MOD_RCLK_512FS         (1 << 3)
-#define MOD_RCLK_384FS         (2 << 3)
-#define MOD_RCLK_768FS         (3 << 3)
-#define MOD_RCLK_MASK          (3 << 3)
-#define MOD_BCLK_32FS          (0 << 1)
-#define MOD_BCLK_48FS          (1 << 1)
-#define MOD_BCLK_16FS          (2 << 1)
-#define MOD_BCLK_24FS          (3 << 1)
-#define MOD_BCLK_MASK          (3 << 1)
-#define MOD_8BIT               (1 << 0)
-
-#define MOD_CDCLKCON           (1 << 12)
-
-#define PSR_PSREN              (1 << 15)
-
-#define FIC_TX2COUNT(x)                (((x) >>  24) & 0xf)
-#define FIC_TX1COUNT(x)                (((x) >>  16) & 0xf)
-
-#define FIC_TXFLUSH            (1 << 15)
-#define FIC_RXFLUSH            (1 << 7)
-#define FIC_TXCOUNT(x)         (((x) >>  8) & 0xf)
-#define FIC_RXCOUNT(x)         (((x) >>  0) & 0xf)
-#define FICS_TXCOUNT(x)                (((x) >>  8) & 0x7f)
+#include "i2s-regs.h"
 
 #define msecs_to_loops(t) (loops_per_jiffy / 1000 * HZ * t)
 
@@ -162,6 +61,7 @@ struct i2s_dai {
        /* DMA parameters */
        struct s3c_dma_params dma_playback;
        struct s3c_dma_params dma_capture;
+       struct s3c_dma_params idma_playback;
        u32     quirks;
        u32     suspend_i2smod;
        u32     suspend_i2scon;
@@ -191,7 +91,7 @@ static inline bool tx_active(struct i2s_dai *i2s)
        if (!i2s)
                return false;
 
-       active = readl(i2s->addr + I2SMOD);
+       active = readl(i2s->addr + I2SCON);
 
        if (is_secondary(i2s))
                active &= CON_TXSDMA_ACTIVE;
@@ -223,7 +123,7 @@ static inline bool rx_active(struct i2s_dai *i2s)
        if (!i2s)
                return false;
 
-       active = readl(i2s->addr + I2SMOD) & CON_RXDMA_ACTIVE;
+       active = readl(i2s->addr + I2SCON) & CON_RXDMA_ACTIVE;
 
        return active ? true : false;
 }
@@ -979,6 +879,10 @@ static int samsung_i2s_dai_probe(struct snd_soc_dai *dai)
        if (i2s->quirks & QUIRK_NEED_RSTCLR)
                writel(CON_RSTCLR, i2s->addr + I2SCON);
 
+       if (i2s->quirks & QUIRK_SEC_DAI)
+               idma_reg_addr_init((void *)i2s->addr,
+                                       i2s->sec_dai->idma_playback.dma_addr);
+
 probe_exit:
        /* Reset any constraint on RFS and BFS */
        i2s->rfs = 0;
@@ -1179,6 +1083,7 @@ static __devinit int samsung_i2s_probe(struct platform_device *pdev)
                sec_dai->dma_playback.dma_size = 4;
                sec_dai->base = regs_base;
                sec_dai->quirks = quirks;
+               sec_dai->idma_playback.dma_addr = i2s_cfg->idma_addr;
                sec_dai->pri_dai = pri_dai;
                pri_dai->sec_dai = sec_dai;
        }
This page took 0.027822 seconds and 5 git commands to generate.