Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec...
[pandora-kernel.git] / arch / arm / plat-omap / include / plat / dma.h
index 0cce4ca..d1c916f 100644 (file)
 #ifndef __ASM_ARCH_DMA_H
 #define __ASM_ARCH_DMA_H
 
-/* Move omap4 specific defines to dma-44xx.h */
-#include "dma-44xx.h"
+#include <linux/platform_device.h>
 
-/* Hardware registers for omap1 */
-#define OMAP1_DMA_BASE                 (0xfffed800)
-
-#define OMAP1_DMA_GCR                  0x400
-#define OMAP1_DMA_GSCR                 0x404
-#define OMAP1_DMA_GRST                 0x408
-#define OMAP1_DMA_HW_ID                        0x442
-#define OMAP1_DMA_PCH2_ID              0x444
-#define OMAP1_DMA_PCH0_ID              0x446
-#define OMAP1_DMA_PCH1_ID              0x448
-#define OMAP1_DMA_PCHG_ID              0x44a
-#define OMAP1_DMA_PCHD_ID              0x44c
-#define OMAP1_DMA_CAPS_0_U             0x44e
-#define OMAP1_DMA_CAPS_0_L             0x450
-#define OMAP1_DMA_CAPS_1_U             0x452
-#define OMAP1_DMA_CAPS_1_L             0x454
-#define OMAP1_DMA_CAPS_2               0x456
-#define OMAP1_DMA_CAPS_3               0x458
-#define OMAP1_DMA_CAPS_4               0x45a
-#define OMAP1_DMA_PCH2_SR              0x460
-#define OMAP1_DMA_PCH0_SR              0x480
-#define OMAP1_DMA_PCH1_SR              0x482
-#define OMAP1_DMA_PCHD_SR              0x4c0
-
-/* Hardware registers for omap2 and omap3 */
-#define OMAP24XX_DMA4_BASE             (L4_24XX_BASE + 0x56000)
-#define OMAP34XX_DMA4_BASE             (L4_34XX_BASE + 0x56000)
-#define OMAP44XX_DMA4_BASE             (L4_44XX_BASE + 0x56000)
-
-#define OMAP_DMA4_REVISION             0x00
-#define OMAP_DMA4_GCR                  0x78
-#define OMAP_DMA4_IRQSTATUS_L0         0x08
-#define OMAP_DMA4_IRQSTATUS_L1         0x0c
-#define OMAP_DMA4_IRQSTATUS_L2         0x10
-#define OMAP_DMA4_IRQSTATUS_L3         0x14
-#define OMAP_DMA4_IRQENABLE_L0         0x18
-#define OMAP_DMA4_IRQENABLE_L1         0x1c
-#define OMAP_DMA4_IRQENABLE_L2         0x20
-#define OMAP_DMA4_IRQENABLE_L3         0x24
-#define OMAP_DMA4_SYSSTATUS            0x28
-#define OMAP_DMA4_OCP_SYSCONFIG                0x2c
-#define OMAP_DMA4_CAPS_0               0x64
-#define OMAP_DMA4_CAPS_2               0x6c
-#define OMAP_DMA4_CAPS_3               0x70
-#define OMAP_DMA4_CAPS_4               0x74
-
-#define OMAP1_LOGICAL_DMA_CH_COUNT     17
-#define OMAP_DMA4_LOGICAL_DMA_CH_COUNT 32      /* REVISIT: Is this 32 + 2? */
-
-/* Common channel specific registers for omap1 */
-#define OMAP1_DMA_CH_BASE(n)           (0x40 * (n) + 0x00)
-#define OMAP1_DMA_CSDP(n)              (0x40 * (n) + 0x00)
-#define OMAP1_DMA_CCR(n)               (0x40 * (n) + 0x02)
-#define OMAP1_DMA_CICR(n)              (0x40 * (n) + 0x04)
-#define OMAP1_DMA_CSR(n)               (0x40 * (n) + 0x06)
-#define OMAP1_DMA_CEN(n)               (0x40 * (n) + 0x10)
-#define OMAP1_DMA_CFN(n)               (0x40 * (n) + 0x12)
-#define OMAP1_DMA_CSFI(n)              (0x40 * (n) + 0x14)
-#define OMAP1_DMA_CSEI(n)              (0x40 * (n) + 0x16)
-#define OMAP1_DMA_CPC(n)               (0x40 * (n) + 0x18)     /* 15xx only */
-#define OMAP1_DMA_CSAC(n)              (0x40 * (n) + 0x18)
-#define OMAP1_DMA_CDAC(n)              (0x40 * (n) + 0x1a)
-#define OMAP1_DMA_CDEI(n)              (0x40 * (n) + 0x1c)
-#define OMAP1_DMA_CDFI(n)              (0x40 * (n) + 0x1e)
-#define OMAP1_DMA_CLNK_CTRL(n)         (0x40 * (n) + 0x28)
-
-/* Common channel specific registers for omap2 */
-#define OMAP_DMA4_CH_BASE(n)           (0x60 * (n) + 0x80)
-#define OMAP_DMA4_CCR(n)               (0x60 * (n) + 0x80)
-#define OMAP_DMA4_CLNK_CTRL(n)         (0x60 * (n) + 0x84)
-#define OMAP_DMA4_CICR(n)              (0x60 * (n) + 0x88)
-#define OMAP_DMA4_CSR(n)               (0x60 * (n) + 0x8c)
-#define OMAP_DMA4_CSDP(n)              (0x60 * (n) + 0x90)
-#define OMAP_DMA4_CEN(n)               (0x60 * (n) + 0x94)
-#define OMAP_DMA4_CFN(n)               (0x60 * (n) + 0x98)
-#define OMAP_DMA4_CSEI(n)              (0x60 * (n) + 0xa4)
-#define OMAP_DMA4_CSFI(n)              (0x60 * (n) + 0xa8)
-#define OMAP_DMA4_CDEI(n)              (0x60 * (n) + 0xac)
-#define OMAP_DMA4_CDFI(n)              (0x60 * (n) + 0xb0)
-#define OMAP_DMA4_CSAC(n)              (0x60 * (n) + 0xb4)
-#define OMAP_DMA4_CDAC(n)              (0x60 * (n) + 0xb8)
-
-/* Channel specific registers only on omap1 */
-#define OMAP1_DMA_CSSA_L(n)            (0x40 * (n) + 0x08)
-#define OMAP1_DMA_CSSA_U(n)            (0x40 * (n) + 0x0a)
-#define OMAP1_DMA_CDSA_L(n)            (0x40 * (n) + 0x0c)
-#define OMAP1_DMA_CDSA_U(n)            (0x40 * (n) + 0x0e)
-#define OMAP1_DMA_COLOR_L(n)           (0x40 * (n) + 0x20)
-#define OMAP1_DMA_COLOR_U(n)           (0x40 * (n) + 0x22)
-#define OMAP1_DMA_CCR2(n)              (0x40 * (n) + 0x24)
-#define OMAP1_DMA_LCH_CTRL(n)          (0x40 * (n) + 0x2a)     /* not on 15xx */
-#define OMAP1_DMA_CCEN(n)              0
-#define OMAP1_DMA_CCFN(n)              0
-
-/* Channel specific registers only on omap2 */
-#define OMAP_DMA4_CSSA(n)              (0x60 * (n) + 0x9c)
-#define OMAP_DMA4_CDSA(n)              (0x60 * (n) + 0xa0)
-#define OMAP_DMA4_CCEN(n)              (0x60 * (n) + 0xbc)
-#define OMAP_DMA4_CCFN(n)              (0x60 * (n) + 0xc0)
-#define OMAP_DMA4_COLOR(n)             (0x60 * (n) + 0xc4)
-
-/* Additional registers available on OMAP4 */
-#define OMAP_DMA4_CDP(n)               (0x60 * (n) + 0xd0)
-#define OMAP_DMA4_CNDP(n)              (0x60 * (n) + 0xd4)
-#define OMAP_DMA4_CCDN(n)              (0x60 * (n) + 0xd8)
-
-/* Dummy defines to keep multi-omap compiles happy */
-#define OMAP1_DMA_REVISION             0
-#define OMAP1_DMA_IRQSTATUS_L0         0
-#define OMAP1_DMA_IRQENABLE_L0         0
-#define OMAP1_DMA_OCP_SYSCONFIG                0
-#define OMAP_DMA4_HW_ID                        0
-#define OMAP_DMA4_CAPS_0_L             0
-#define OMAP_DMA4_CAPS_0_U             0
-#define OMAP_DMA4_CAPS_1_L             0
-#define OMAP_DMA4_CAPS_1_U             0
-#define OMAP_DMA4_GSCR                 0
-#define OMAP_DMA4_CPC(n)               0
-
-#define OMAP_DMA4_LCH_CTRL(n)          0
-#define OMAP_DMA4_COLOR_L(n)           0
-#define OMAP_DMA4_COLOR_U(n)           0
-#define OMAP_DMA4_CCR2(n)              0
-#define OMAP1_DMA_CSSA(n)              0
-#define OMAP1_DMA_CDSA(n)              0
-#define OMAP_DMA4_CSSA_L(n)            0
-#define OMAP_DMA4_CSSA_U(n)            0
-#define OMAP_DMA4_CDSA_L(n)            0
-#define OMAP_DMA4_CDSA_U(n)            0
-#define OMAP1_DMA_COLOR(n)             0
+/*
+ * TODO: These dma channel defines should go away once all
+ * the omap drivers hwmod adapted.
+ */
 
-/*----------------------------------------------------------------------------*/
+/* Move omap4 specific defines to dma-44xx.h */
+#include "dma-44xx.h"
 
 /* DMA channels for omap1 */
 #define OMAP_DMA_NO_DEVICE             0
 #define DMA_CH_PRIO_HIGH               0x1
 #define DMA_CH_PRIO_LOW                        0x0 /* Def */
 
+/* Errata handling */
+#define IS_DMA_ERRATA(id)              (errata & (id))
+#define SET_DMA_ERRATA(id)             (errata |= (id))
+
+#define DMA_ERRATA_IFRAME_BUFFERING    BIT(0x0)
+#define DMA_ERRATA_PARALLEL_CHANNELS   BIT(0x1)
+#define DMA_ERRATA_i378                        BIT(0x2)
+#define DMA_ERRATA_i541                        BIT(0x3)
+#define DMA_ERRATA_i88                 BIT(0x4)
+#define DMA_ERRATA_3_3                 BIT(0x5)
+#define DMA_ROMCODE_BUG                        BIT(0x6)
+
+/* Attributes for OMAP DMA Contrller */
+#define DMA_LINKED_LCH                 BIT(0x0)
+#define GLOBAL_PRIORITY                        BIT(0x1)
+#define RESERVE_CHANNEL                        BIT(0x2)
+#define IS_CSSA_32                     BIT(0x3)
+#define IS_CDSA_32                     BIT(0x4)
+#define IS_RW_PRIORITY                 BIT(0x5)
+#define ENABLE_1510_MODE               BIT(0x6)
+#define SRC_PORT                       BIT(0x7)
+#define DST_PORT                       BIT(0x8)
+#define SRC_INDEX                      BIT(0x9)
+#define DST_INDEX                      BIT(0xA)
+#define IS_BURST_ONLY4                 BIT(0xB)
+#define CLEAR_CSR_ON_READ              BIT(0xC)
+#define IS_WORD_16                     BIT(0xD)
+
+enum omap_reg_offsets {
+
+GCR,           GSCR,           GRST1,          HW_ID,
+PCH2_ID,       PCH0_ID,        PCH1_ID,        PCHG_ID,
+PCHD_ID,       CAPS_0,         CAPS_1,         CAPS_2,
+CAPS_3,                CAPS_4,         PCH2_SR,        PCH0_SR,
+PCH1_SR,       PCHD_SR,        REVISION,       IRQSTATUS_L0,
+IRQSTATUS_L1,  IRQSTATUS_L2,   IRQSTATUS_L3,   IRQENABLE_L0,
+IRQENABLE_L1,  IRQENABLE_L2,   IRQENABLE_L3,   SYSSTATUS,
+OCP_SYSCONFIG,
+
+/* omap1+ specific */
+CPC, CCR2, LCH_CTRL,
+
+/* Common registers for all omap's */
+CSDP,          CCR,            CICR,           CSR,
+CEN,           CFN,            CSFI,           CSEI,
+CSAC,          CDAC,           CDEI,
+CDFI,          CLNK_CTRL,
+
+/* Channel specific registers */
+CSSA,          CDSA,           COLOR,
+CCEN,          CCFN,
+
+/* omap3630 and omap4 specific */
+CDP,           CNDP,           CCDN,
+
+};
+
 enum omap_dma_burst_mode {
        OMAP_DMA_DATA_BURST_DIS = 0,
        OMAP_DMA_DATA_BURST_4,
@@ -470,6 +401,41 @@ struct omap_dma_channel_params {
 #endif
 };
 
+struct omap_dma_lch {
+       int next_lch;
+       int dev_id;
+       u16 saved_csr;
+       u16 enabled_irqs;
+       const char *dev_name;
+       void (*callback)(int lch, u16 ch_status, void *data);
+       void *data;
+       long flags;
+       /* required for Dynamic chaining */
+       int prev_linked_ch;
+       int next_linked_ch;
+       int state;
+       int chain_id;
+       int status;
+};
+
+struct omap_dma_dev_attr {
+       u32 dev_caps;
+       u16 lch_count;
+       u16 chan_count;
+       struct omap_dma_lch *chan;
+};
+
+/* System DMA platform data structure */
+struct omap_system_dma_plat_info {
+       struct omap_dma_dev_attr *dma_attr;
+       u32 errata;
+       void (*disable_irq_lch)(int lch);
+       void (*show_dma_caps)(void);
+       void (*clear_lch_regs)(int lch);
+       void (*clear_dma)(int lch);
+       void (*dma_write)(u32 val, int reg, int lch);
+       u32 (*dma_read)(int reg, int lch);
+};
 
 extern void omap_set_dma_priority(int lch, int dst_port, int priority);
 extern int omap_request_dma(int dev_id, const char *dev_name,