This source file includes following definitions.
- find_dbdev_id
- au1xxx_ddma_get_nextptr_virt
- au1xxx_ddma_add_device
- au1xxx_ddma_del_device
- au1xxx_dbdma_chan_alloc
- au1xxx_dbdma_set_devwidth
- au1xxx_dbdma_ring_alloc
- au1xxx_dbdma_put_source
- au1xxx_dbdma_put_dest
- au1xxx_dbdma_get_dest
- au1xxx_dbdma_stop
- au1xxx_dbdma_start
- au1xxx_dbdma_reset
- au1xxx_get_dma_residue
- au1xxx_dbdma_chan_free
- dbdma_interrupt
- au1xxx_dbdma_dump
- au1xxx_dbdma_put_dscr
- alchemy_dbdma_suspend
- alchemy_dbdma_resume
- dbdma_setup
- alchemy_dbdma_init
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 #include <linux/init.h>
  34 #include <linux/kernel.h>
  35 #include <linux/slab.h>
  36 #include <linux/spinlock.h>
  37 #include <linux/interrupt.h>
  38 #include <linux/export.h>
  39 #include <linux/syscore_ops.h>
  40 #include <asm/mach-au1x00/au1000.h>
  41 #include <asm/mach-au1x00/au1xxx_dbdma.h>
  42 
  43 
  44 
  45 
  46 
  47 
  48 
  49 
  50 
  51 
  52 
  53 
  54 static DEFINE_SPINLOCK(au1xxx_dbdma_spin_lock);
  55 
  56 
  57 #define ALIGN_ADDR(x, a)        ((((u32)(x)) + (a-1)) & ~(a-1))
  58 
  59 static dbdma_global_t *dbdma_gptr =
  60                         (dbdma_global_t *)KSEG1ADDR(AU1550_DBDMA_CONF_PHYS_ADDR);
  61 static int dbdma_initialized;
  62 
  63 static dbdev_tab_t *dbdev_tab;
  64 
  65 static dbdev_tab_t au1550_dbdev_tab[] __initdata = {
  66         
  67         { AU1550_DSCR_CMD0_UART0_TX, DEV_FLAGS_OUT, 0, 8, 0x11100004, 0, 0 },
  68         { AU1550_DSCR_CMD0_UART0_RX, DEV_FLAGS_IN,  0, 8, 0x11100000, 0, 0 },
  69         { AU1550_DSCR_CMD0_UART3_TX, DEV_FLAGS_OUT, 0, 8, 0x11400004, 0, 0 },
  70         { AU1550_DSCR_CMD0_UART3_RX, DEV_FLAGS_IN,  0, 8, 0x11400000, 0, 0 },
  71 
  72         
  73         { AU1550_DSCR_CMD0_DMA_REQ0, 0, 0, 0, 0x00000000, 0, 0 },
  74         { AU1550_DSCR_CMD0_DMA_REQ1, 0, 0, 0, 0x00000000, 0, 0 },
  75         { AU1550_DSCR_CMD0_DMA_REQ2, 0, 0, 0, 0x00000000, 0, 0 },
  76         { AU1550_DSCR_CMD0_DMA_REQ3, 0, 0, 0, 0x00000000, 0, 0 },
  77 
  78         
  79         { AU1550_DSCR_CMD0_USBDEV_RX0, DEV_FLAGS_IN,  4, 8, 0x10200000, 0, 0 },
  80         { AU1550_DSCR_CMD0_USBDEV_TX0, DEV_FLAGS_OUT, 4, 8, 0x10200004, 0, 0 },
  81         { AU1550_DSCR_CMD0_USBDEV_TX1, DEV_FLAGS_OUT, 4, 8, 0x10200008, 0, 0 },
  82         { AU1550_DSCR_CMD0_USBDEV_TX2, DEV_FLAGS_OUT, 4, 8, 0x1020000c, 0, 0 },
  83         { AU1550_DSCR_CMD0_USBDEV_RX3, DEV_FLAGS_IN,  4, 8, 0x10200010, 0, 0 },
  84         { AU1550_DSCR_CMD0_USBDEV_RX4, DEV_FLAGS_IN,  4, 8, 0x10200014, 0, 0 },
  85 
  86         
  87         { AU1550_DSCR_CMD0_PSC0_TX, DEV_FLAGS_OUT, 0, 0, 0x11a0001c, 0, 0 },
  88         { AU1550_DSCR_CMD0_PSC0_RX, DEV_FLAGS_IN,  0, 0, 0x11a0001c, 0, 0 },
  89         { AU1550_DSCR_CMD0_PSC1_TX, DEV_FLAGS_OUT, 0, 0, 0x11b0001c, 0, 0 },
  90         { AU1550_DSCR_CMD0_PSC1_RX, DEV_FLAGS_IN,  0, 0, 0x11b0001c, 0, 0 },
  91         { AU1550_DSCR_CMD0_PSC2_TX, DEV_FLAGS_OUT, 0, 0, 0x10a0001c, 0, 0 },
  92         { AU1550_DSCR_CMD0_PSC2_RX, DEV_FLAGS_IN,  0, 0, 0x10a0001c, 0, 0 },
  93         { AU1550_DSCR_CMD0_PSC3_TX, DEV_FLAGS_OUT, 0, 0, 0x10b0001c, 0, 0 },
  94         { AU1550_DSCR_CMD0_PSC3_RX, DEV_FLAGS_IN,  0, 0, 0x10b0001c, 0, 0 },
  95 
  96         { AU1550_DSCR_CMD0_PCI_WRITE,  0, 0, 0, 0x00000000, 0, 0 },  
  97         { AU1550_DSCR_CMD0_NAND_FLASH, 0, 0, 0, 0x00000000, 0, 0 }, 
  98 
  99         
 100         { AU1550_DSCR_CMD0_MAC0_RX, DEV_FLAGS_IN,  0, 0, 0x00000000, 0, 0 },
 101         { AU1550_DSCR_CMD0_MAC0_TX, DEV_FLAGS_OUT, 0, 0, 0x00000000, 0, 0 },
 102 
 103         
 104         { AU1550_DSCR_CMD0_MAC1_RX, DEV_FLAGS_IN,  0, 0, 0x00000000, 0, 0 },
 105         { AU1550_DSCR_CMD0_MAC1_TX, DEV_FLAGS_OUT, 0, 0, 0x00000000, 0, 0 },
 106 
 107         { DSCR_CMD0_THROTTLE, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 108         { DSCR_CMD0_ALWAYS,   DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 109 };
 110 
 111 static dbdev_tab_t au1200_dbdev_tab[] __initdata = {
 112         { AU1200_DSCR_CMD0_UART0_TX, DEV_FLAGS_OUT, 0, 8, 0x11100004, 0, 0 },
 113         { AU1200_DSCR_CMD0_UART0_RX, DEV_FLAGS_IN,  0, 8, 0x11100000, 0, 0 },
 114         { AU1200_DSCR_CMD0_UART1_TX, DEV_FLAGS_OUT, 0, 8, 0x11200004, 0, 0 },
 115         { AU1200_DSCR_CMD0_UART1_RX, DEV_FLAGS_IN,  0, 8, 0x11200000, 0, 0 },
 116 
 117         { AU1200_DSCR_CMD0_DMA_REQ0, 0, 0, 0, 0x00000000, 0, 0 },
 118         { AU1200_DSCR_CMD0_DMA_REQ1, 0, 0, 0, 0x00000000, 0, 0 },
 119 
 120         { AU1200_DSCR_CMD0_MAE_BE, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 121         { AU1200_DSCR_CMD0_MAE_FE, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 122         { AU1200_DSCR_CMD0_MAE_BOTH, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 123         { AU1200_DSCR_CMD0_LCD, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 124 
 125         { AU1200_DSCR_CMD0_SDMS_TX0, DEV_FLAGS_OUT, 4, 8, 0x10600000, 0, 0 },
 126         { AU1200_DSCR_CMD0_SDMS_RX0, DEV_FLAGS_IN,  4, 8, 0x10600004, 0, 0 },
 127         { AU1200_DSCR_CMD0_SDMS_TX1, DEV_FLAGS_OUT, 4, 8, 0x10680000, 0, 0 },
 128         { AU1200_DSCR_CMD0_SDMS_RX1, DEV_FLAGS_IN,  4, 8, 0x10680004, 0, 0 },
 129 
 130         { AU1200_DSCR_CMD0_AES_RX, DEV_FLAGS_IN , 4, 32, 0x10300008, 0, 0 },
 131         { AU1200_DSCR_CMD0_AES_TX, DEV_FLAGS_OUT, 4, 32, 0x10300004, 0, 0 },
 132 
 133         { AU1200_DSCR_CMD0_PSC0_TX,   DEV_FLAGS_OUT, 0, 16, 0x11a0001c, 0, 0 },
 134         { AU1200_DSCR_CMD0_PSC0_RX,   DEV_FLAGS_IN,  0, 16, 0x11a0001c, 0, 0 },
 135         { AU1200_DSCR_CMD0_PSC0_SYNC, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 136         { AU1200_DSCR_CMD0_PSC1_TX,   DEV_FLAGS_OUT, 0, 16, 0x11b0001c, 0, 0 },
 137         { AU1200_DSCR_CMD0_PSC1_RX,   DEV_FLAGS_IN,  0, 16, 0x11b0001c, 0, 0 },
 138         { AU1200_DSCR_CMD0_PSC1_SYNC, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 139 
 140         { AU1200_DSCR_CMD0_CIM_RXA,  DEV_FLAGS_IN, 0, 32, 0x14004020, 0, 0 },
 141         { AU1200_DSCR_CMD0_CIM_RXB,  DEV_FLAGS_IN, 0, 32, 0x14004040, 0, 0 },
 142         { AU1200_DSCR_CMD0_CIM_RXC,  DEV_FLAGS_IN, 0, 32, 0x14004060, 0, 0 },
 143         { AU1200_DSCR_CMD0_CIM_SYNC, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 144 
 145         { AU1200_DSCR_CMD0_NAND_FLASH, DEV_FLAGS_IN, 0, 0, 0x00000000, 0, 0 },
 146 
 147         { DSCR_CMD0_THROTTLE, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 148         { DSCR_CMD0_ALWAYS,   DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 149 };
 150 
 151 static dbdev_tab_t au1300_dbdev_tab[] __initdata = {
 152         { AU1300_DSCR_CMD0_UART0_TX, DEV_FLAGS_OUT, 0, 8,  0x10100004, 0, 0 },
 153         { AU1300_DSCR_CMD0_UART0_RX, DEV_FLAGS_IN,  0, 8,  0x10100000, 0, 0 },
 154         { AU1300_DSCR_CMD0_UART1_TX, DEV_FLAGS_OUT, 0, 8,  0x10101004, 0, 0 },
 155         { AU1300_DSCR_CMD0_UART1_RX, DEV_FLAGS_IN,  0, 8,  0x10101000, 0, 0 },
 156         { AU1300_DSCR_CMD0_UART2_TX, DEV_FLAGS_OUT, 0, 8,  0x10102004, 0, 0 },
 157         { AU1300_DSCR_CMD0_UART2_RX, DEV_FLAGS_IN,  0, 8,  0x10102000, 0, 0 },
 158         { AU1300_DSCR_CMD0_UART3_TX, DEV_FLAGS_OUT, 0, 8,  0x10103004, 0, 0 },
 159         { AU1300_DSCR_CMD0_UART3_RX, DEV_FLAGS_IN,  0, 8,  0x10103000, 0, 0 },
 160 
 161         { AU1300_DSCR_CMD0_SDMS_TX0, DEV_FLAGS_OUT, 4, 8,  0x10600000, 0, 0 },
 162         { AU1300_DSCR_CMD0_SDMS_RX0, DEV_FLAGS_IN,  4, 8,  0x10600004, 0, 0 },
 163         { AU1300_DSCR_CMD0_SDMS_TX1, DEV_FLAGS_OUT, 8, 8,  0x10601000, 0, 0 },
 164         { AU1300_DSCR_CMD0_SDMS_RX1, DEV_FLAGS_IN,  8, 8,  0x10601004, 0, 0 },
 165 
 166         { AU1300_DSCR_CMD0_AES_RX, DEV_FLAGS_IN ,   4, 32, 0x10300008, 0, 0 },
 167         { AU1300_DSCR_CMD0_AES_TX, DEV_FLAGS_OUT,   4, 32, 0x10300004, 0, 0 },
 168 
 169         { AU1300_DSCR_CMD0_PSC0_TX, DEV_FLAGS_OUT,  0, 16, 0x10a0001c, 0, 0 },
 170         { AU1300_DSCR_CMD0_PSC0_RX, DEV_FLAGS_IN,   0, 16, 0x10a0001c, 0, 0 },
 171         { AU1300_DSCR_CMD0_PSC1_TX, DEV_FLAGS_OUT,  0, 16, 0x10a0101c, 0, 0 },
 172         { AU1300_DSCR_CMD0_PSC1_RX, DEV_FLAGS_IN,   0, 16, 0x10a0101c, 0, 0 },
 173         { AU1300_DSCR_CMD0_PSC2_TX, DEV_FLAGS_OUT,  0, 16, 0x10a0201c, 0, 0 },
 174         { AU1300_DSCR_CMD0_PSC2_RX, DEV_FLAGS_IN,   0, 16, 0x10a0201c, 0, 0 },
 175         { AU1300_DSCR_CMD0_PSC3_TX, DEV_FLAGS_OUT,  0, 16, 0x10a0301c, 0, 0 },
 176         { AU1300_DSCR_CMD0_PSC3_RX, DEV_FLAGS_IN,   0, 16, 0x10a0301c, 0, 0 },
 177 
 178         { AU1300_DSCR_CMD0_LCD, DEV_FLAGS_ANYUSE,   0, 0,  0x00000000, 0, 0 },
 179         { AU1300_DSCR_CMD0_NAND_FLASH, DEV_FLAGS_IN, 0, 0, 0x00000000, 0, 0 },
 180 
 181         { AU1300_DSCR_CMD0_SDMS_TX2, DEV_FLAGS_OUT, 4, 8,  0x10602000, 0, 0 },
 182         { AU1300_DSCR_CMD0_SDMS_RX2, DEV_FLAGS_IN,  4, 8,  0x10602004, 0, 0 },
 183 
 184         { AU1300_DSCR_CMD0_CIM_SYNC, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 185 
 186         { AU1300_DSCR_CMD0_UDMA, DEV_FLAGS_ANYUSE,  0, 32, 0x14001810, 0, 0 },
 187 
 188         { AU1300_DSCR_CMD0_DMA_REQ0, 0, 0, 0, 0x00000000, 0, 0 },
 189         { AU1300_DSCR_CMD0_DMA_REQ1, 0, 0, 0, 0x00000000, 0, 0 },
 190 
 191         { DSCR_CMD0_THROTTLE, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 192         { DSCR_CMD0_ALWAYS,   DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 193 };
 194 
 195 
 196 #define DBDEV_TAB_SIZE          64
 197 
 198 static chan_tab_t *chan_tab_ptr[NUM_DBDMA_CHANS];
 199 
 200 static dbdev_tab_t *find_dbdev_id(u32 id)
 201 {
 202         int i;
 203         dbdev_tab_t *p;
 204         for (i = 0; i < DBDEV_TAB_SIZE; ++i) {
 205                 p = &dbdev_tab[i];
 206                 if (p->dev_id == id)
 207                         return p;
 208         }
 209         return NULL;
 210 }
 211 
 212 void *au1xxx_ddma_get_nextptr_virt(au1x_ddma_desc_t *dp)
 213 {
 214         return phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
 215 }
 216 EXPORT_SYMBOL(au1xxx_ddma_get_nextptr_virt);
 217 
 218 u32 au1xxx_ddma_add_device(dbdev_tab_t *dev)
 219 {
 220         u32 ret = 0;
 221         dbdev_tab_t *p;
 222         static u16 new_id = 0x1000;
 223 
 224         p = find_dbdev_id(~0);
 225         if (NULL != p) {
 226                 memcpy(p, dev, sizeof(dbdev_tab_t));
 227                 p->dev_id = DSCR_DEV2CUSTOM_ID(new_id, dev->dev_id);
 228                 ret = p->dev_id;
 229                 new_id++;
 230 #if 0
 231                 printk(KERN_DEBUG "add_device: id:%x flags:%x padd:%x\n",
 232                                   p->dev_id, p->dev_flags, p->dev_physaddr);
 233 #endif
 234         }
 235 
 236         return ret;
 237 }
 238 EXPORT_SYMBOL(au1xxx_ddma_add_device);
 239 
 240 void au1xxx_ddma_del_device(u32 devid)
 241 {
 242         dbdev_tab_t *p = find_dbdev_id(devid);
 243 
 244         if (p != NULL) {
 245                 memset(p, 0, sizeof(dbdev_tab_t));
 246                 p->dev_id = ~0;
 247         }
 248 }
 249 EXPORT_SYMBOL(au1xxx_ddma_del_device);
 250 
 251 
 252 u32 au1xxx_dbdma_chan_alloc(u32 srcid, u32 destid,
 253        void (*callback)(int, void *), void *callparam)
 254 {
 255         unsigned long   flags;
 256         u32             used, chan;
 257         u32             dcp;
 258         int             i;
 259         dbdev_tab_t     *stp, *dtp;
 260         chan_tab_t      *ctp;
 261         au1x_dma_chan_t *cp;
 262 
 263         
 264 
 265 
 266 
 267 
 268         if (!dbdma_initialized)
 269                 return 0;
 270 
 271         stp = find_dbdev_id(srcid);
 272         if (stp == NULL)
 273                 return 0;
 274         dtp = find_dbdev_id(destid);
 275         if (dtp == NULL)
 276                 return 0;
 277 
 278         used = 0;
 279 
 280         
 281         spin_lock_irqsave(&au1xxx_dbdma_spin_lock, flags);
 282         if (!(stp->dev_flags & DEV_FLAGS_INUSE) ||
 283              (stp->dev_flags & DEV_FLAGS_ANYUSE)) {
 284                 
 285                 stp->dev_flags |= DEV_FLAGS_INUSE;
 286                 if (!(dtp->dev_flags & DEV_FLAGS_INUSE) ||
 287                      (dtp->dev_flags & DEV_FLAGS_ANYUSE)) {
 288                         
 289                         dtp->dev_flags |= DEV_FLAGS_INUSE;
 290                 } else {
 291                         
 292                         stp->dev_flags &= ~DEV_FLAGS_INUSE;
 293                         used++;
 294                 }
 295         } else
 296                 used++;
 297         spin_unlock_irqrestore(&au1xxx_dbdma_spin_lock, flags);
 298 
 299         if (used)
 300                 return 0;
 301 
 302         
 303         ctp = NULL;
 304         chan = 0;
 305         spin_lock_irqsave(&au1xxx_dbdma_spin_lock, flags);
 306         for (i = 0; i < NUM_DBDMA_CHANS; i++)
 307                 if (chan_tab_ptr[i] == NULL) {
 308                         
 309 
 310 
 311 
 312                         ctp = kmalloc(sizeof(chan_tab_t), GFP_ATOMIC);
 313                         chan_tab_ptr[i] = ctp;
 314                         break;
 315                 }
 316         spin_unlock_irqrestore(&au1xxx_dbdma_spin_lock, flags);
 317 
 318         if (ctp != NULL) {
 319                 memset(ctp, 0, sizeof(chan_tab_t));
 320                 ctp->chan_index = chan = i;
 321                 dcp = KSEG1ADDR(AU1550_DBDMA_PHYS_ADDR);
 322                 dcp += (0x0100 * chan);
 323                 ctp->chan_ptr = (au1x_dma_chan_t *)dcp;
 324                 cp = (au1x_dma_chan_t *)dcp;
 325                 ctp->chan_src = stp;
 326                 ctp->chan_dest = dtp;
 327                 ctp->chan_callback = callback;
 328                 ctp->chan_callparam = callparam;
 329 
 330                 
 331                 i = 0;
 332                 if (stp->dev_intlevel)
 333                         i |= DDMA_CFG_SED;
 334                 if (stp->dev_intpolarity)
 335                         i |= DDMA_CFG_SP;
 336                 if (dtp->dev_intlevel)
 337                         i |= DDMA_CFG_DED;
 338                 if (dtp->dev_intpolarity)
 339                         i |= DDMA_CFG_DP;
 340                 if ((stp->dev_flags & DEV_FLAGS_SYNC) ||
 341                         (dtp->dev_flags & DEV_FLAGS_SYNC))
 342                                 i |= DDMA_CFG_SYNC;
 343                 cp->ddma_cfg = i;
 344                 wmb(); 
 345 
 346                 
 347 
 348 
 349 
 350                 return (u32)(&chan_tab_ptr[chan]);
 351         }
 352 
 353         
 354         stp->dev_flags &= ~DEV_FLAGS_INUSE;
 355         dtp->dev_flags &= ~DEV_FLAGS_INUSE;
 356 
 357         return 0;
 358 }
 359 EXPORT_SYMBOL(au1xxx_dbdma_chan_alloc);
 360 
 361 
 362 
 363 
 364 
 365 u32 au1xxx_dbdma_set_devwidth(u32 chanid, int bits)
 366 {
 367         u32             rv;
 368         chan_tab_t      *ctp;
 369         dbdev_tab_t     *stp, *dtp;
 370 
 371         ctp = *((chan_tab_t **)chanid);
 372         stp = ctp->chan_src;
 373         dtp = ctp->chan_dest;
 374         rv = 0;
 375 
 376         if (stp->dev_flags & DEV_FLAGS_IN) {    
 377                 rv = stp->dev_devwidth;
 378                 stp->dev_devwidth = bits;
 379         }
 380         if (dtp->dev_flags & DEV_FLAGS_OUT) {   
 381                 rv = dtp->dev_devwidth;
 382                 dtp->dev_devwidth = bits;
 383         }
 384 
 385         return rv;
 386 }
 387 EXPORT_SYMBOL(au1xxx_dbdma_set_devwidth);
 388 
 389 
 390 u32 au1xxx_dbdma_ring_alloc(u32 chanid, int entries)
 391 {
 392         int                     i;
 393         u32                     desc_base, srcid, destid;
 394         u32                     cmd0, cmd1, src1, dest1;
 395         u32                     src0, dest0;
 396         chan_tab_t              *ctp;
 397         dbdev_tab_t             *stp, *dtp;
 398         au1x_ddma_desc_t        *dp;
 399 
 400         
 401 
 402 
 403 
 404         ctp = *((chan_tab_t **)chanid);
 405         stp = ctp->chan_src;
 406         dtp = ctp->chan_dest;
 407 
 408         
 409 
 410 
 411 
 412 
 413 
 414         desc_base = (u32)kmalloc_array(entries, sizeof(au1x_ddma_desc_t),
 415                                        GFP_KERNEL|GFP_DMA);
 416         if (desc_base == 0)
 417                 return 0;
 418 
 419         if (desc_base & 0x1f) {
 420                 
 421 
 422 
 423 
 424                 kfree((const void *)desc_base);
 425                 i = entries * sizeof(au1x_ddma_desc_t);
 426                 i += (sizeof(au1x_ddma_desc_t) - 1);
 427                 desc_base = (u32)kmalloc(i, GFP_KERNEL|GFP_DMA);
 428                 if (desc_base == 0)
 429                         return 0;
 430 
 431                 ctp->cdb_membase = desc_base;
 432                 desc_base = ALIGN_ADDR(desc_base, sizeof(au1x_ddma_desc_t));
 433         } else
 434                 ctp->cdb_membase = desc_base;
 435 
 436         dp = (au1x_ddma_desc_t *)desc_base;
 437 
 438         
 439         ctp->chan_desc_base = dp;
 440 
 441         
 442         srcid = stp->dev_id;
 443         destid = dtp->dev_id;
 444 
 445         cmd0 = cmd1 = src1 = dest1 = 0;
 446         src0 = dest0 = 0;
 447 
 448         cmd0 |= DSCR_CMD0_SID(srcid);
 449         cmd0 |= DSCR_CMD0_DID(destid);
 450         cmd0 |= DSCR_CMD0_IE | DSCR_CMD0_CV;
 451         cmd0 |= DSCR_CMD0_ST(DSCR_CMD0_ST_NOCHANGE);
 452 
 453         
 454         if (((DSCR_CUSTOM2DEV_ID(srcid) == DSCR_CMD0_THROTTLE) ||
 455              (DSCR_CUSTOM2DEV_ID(srcid) == DSCR_CMD0_ALWAYS)) &&
 456             ((DSCR_CUSTOM2DEV_ID(destid) == DSCR_CMD0_THROTTLE) ||
 457              (DSCR_CUSTOM2DEV_ID(destid) == DSCR_CMD0_ALWAYS)))
 458                 cmd0 |= DSCR_CMD0_MEM;
 459 
 460         switch (stp->dev_devwidth) {
 461         case 8:
 462                 cmd0 |= DSCR_CMD0_SW(DSCR_CMD0_BYTE);
 463                 break;
 464         case 16:
 465                 cmd0 |= DSCR_CMD0_SW(DSCR_CMD0_HALFWORD);
 466                 break;
 467         case 32:
 468         default:
 469                 cmd0 |= DSCR_CMD0_SW(DSCR_CMD0_WORD);
 470                 break;
 471         }
 472 
 473         switch (dtp->dev_devwidth) {
 474         case 8:
 475                 cmd0 |= DSCR_CMD0_DW(DSCR_CMD0_BYTE);
 476                 break;
 477         case 16:
 478                 cmd0 |= DSCR_CMD0_DW(DSCR_CMD0_HALFWORD);
 479                 break;
 480         case 32:
 481         default:
 482                 cmd0 |= DSCR_CMD0_DW(DSCR_CMD0_WORD);
 483                 break;
 484         }
 485 
 486         
 487 
 488 
 489 
 490         if (stp->dev_flags & DEV_FLAGS_IN)
 491                 cmd0 |= DSCR_CMD0_SN;           
 492         if (dtp->dev_flags & DEV_FLAGS_OUT)
 493                 cmd0 |= DSCR_CMD0_DN;           
 494 
 495         
 496 
 497 
 498 
 499         switch (stp->dev_tsize) {
 500         case 1:
 501                 src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE1);
 502                 break;
 503         case 2:
 504                 src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE2);
 505                 break;
 506         case 4:
 507                 src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE4);
 508                 break;
 509         case 8:
 510         default:
 511                 src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE8);
 512                 break;
 513         }
 514 
 515         
 516         if (stp->dev_flags & DEV_FLAGS_IN) {
 517                 if (stp->dev_flags & DEV_FLAGS_BURSTABLE)
 518                         src1 |= DSCR_SRC1_SAM(DSCR_xAM_BURST);
 519                 else
 520                         src1 |= DSCR_SRC1_SAM(DSCR_xAM_STATIC);
 521         }
 522 
 523         if (stp->dev_physaddr)
 524                 src0 = stp->dev_physaddr;
 525 
 526         
 527 
 528 
 529 
 530         switch (dtp->dev_tsize) {
 531         case 1:
 532                 dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE1);
 533                 break;
 534         case 2:
 535                 dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE2);
 536                 break;
 537         case 4:
 538                 dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE4);
 539                 break;
 540         case 8:
 541         default:
 542                 dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE8);
 543                 break;
 544         }
 545 
 546         
 547         if (dtp->dev_flags & DEV_FLAGS_OUT) {
 548                 if (dtp->dev_flags & DEV_FLAGS_BURSTABLE)
 549                         dest1 |= DSCR_DEST1_DAM(DSCR_xAM_BURST);
 550                 else
 551                         dest1 |= DSCR_DEST1_DAM(DSCR_xAM_STATIC);
 552         }
 553 
 554         if (dtp->dev_physaddr)
 555                 dest0 = dtp->dev_physaddr;
 556 
 557 #if 0
 558                 printk(KERN_DEBUG "did:%x sid:%x cmd0:%x cmd1:%x source0:%x "
 559                                   "source1:%x dest0:%x dest1:%x\n",
 560                                   dtp->dev_id, stp->dev_id, cmd0, cmd1, src0,
 561                                   src1, dest0, dest1);
 562 #endif
 563         for (i = 0; i < entries; i++) {
 564                 dp->dscr_cmd0 = cmd0;
 565                 dp->dscr_cmd1 = cmd1;
 566                 dp->dscr_source0 = src0;
 567                 dp->dscr_source1 = src1;
 568                 dp->dscr_dest0 = dest0;
 569                 dp->dscr_dest1 = dest1;
 570                 dp->dscr_stat = 0;
 571                 dp->sw_context = 0;
 572                 dp->sw_status = 0;
 573                 dp->dscr_nxtptr = DSCR_NXTPTR(virt_to_phys(dp + 1));
 574                 dp++;
 575         }
 576 
 577         
 578         dp--;
 579         dp->dscr_nxtptr = DSCR_NXTPTR(virt_to_phys(ctp->chan_desc_base));
 580         ctp->get_ptr = ctp->put_ptr = ctp->cur_ptr = ctp->chan_desc_base;
 581 
 582         return (u32)ctp->chan_desc_base;
 583 }
 584 EXPORT_SYMBOL(au1xxx_dbdma_ring_alloc);
 585 
 586 
 587 
 588 
 589 
 590 
 591 u32 au1xxx_dbdma_put_source(u32 chanid, dma_addr_t buf, int nbytes, u32 flags)
 592 {
 593         chan_tab_t              *ctp;
 594         au1x_ddma_desc_t        *dp;
 595 
 596         
 597 
 598 
 599 
 600         ctp = *(chan_tab_t **)chanid;
 601 
 602         
 603 
 604 
 605 
 606 
 607         dp = ctp->put_ptr;
 608 
 609         
 610 
 611 
 612 
 613         if (dp->dscr_cmd0 & DSCR_CMD0_V)
 614                 return 0;
 615 
 616         
 617         dp->dscr_source0 = buf & ~0UL;
 618         dp->dscr_cmd1 = nbytes;
 619         
 620         if (flags & DDMA_FLAGS_IE)
 621                 dp->dscr_cmd0 |= DSCR_CMD0_IE;
 622         if (flags & DDMA_FLAGS_NOIE)
 623                 dp->dscr_cmd0 &= ~DSCR_CMD0_IE;
 624 
 625         
 626 
 627 
 628 
 629 
 630 
 631 
 632         dma_cache_wback_inv((unsigned long)buf, nbytes);
 633         dp->dscr_cmd0 |= DSCR_CMD0_V;   
 634         wmb(); 
 635         dma_cache_wback_inv((unsigned long)dp, sizeof(*dp));
 636         ctp->chan_ptr->ddma_dbell = 0;
 637 
 638         
 639         ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
 640 
 641         
 642         return nbytes;
 643 }
 644 EXPORT_SYMBOL(au1xxx_dbdma_put_source);
 645 
 646 
 647 
 648 
 649 
 650 u32 au1xxx_dbdma_put_dest(u32 chanid, dma_addr_t buf, int nbytes, u32 flags)
 651 {
 652         chan_tab_t              *ctp;
 653         au1x_ddma_desc_t        *dp;
 654 
 655         
 656 
 657 
 658         ctp = *((chan_tab_t **)chanid);
 659 
 660         
 661 
 662 
 663 
 664         dp = ctp->put_ptr;
 665 
 666         
 667 
 668 
 669         if (dp->dscr_cmd0 & DSCR_CMD0_V)
 670                 return 0;
 671 
 672         
 673 
 674         
 675         if (flags & DDMA_FLAGS_IE)
 676                 dp->dscr_cmd0 |= DSCR_CMD0_IE;
 677         if (flags & DDMA_FLAGS_NOIE)
 678                 dp->dscr_cmd0 &= ~DSCR_CMD0_IE;
 679 
 680         dp->dscr_dest0 = buf & ~0UL;
 681         dp->dscr_cmd1 = nbytes;
 682 #if 0
 683         printk(KERN_DEBUG "cmd0:%x cmd1:%x source0:%x source1:%x dest0:%x dest1:%x\n",
 684                           dp->dscr_cmd0, dp->dscr_cmd1, dp->dscr_source0,
 685                           dp->dscr_source1, dp->dscr_dest0, dp->dscr_dest1);
 686 #endif
 687         
 688 
 689 
 690 
 691 
 692 
 693 
 694         dma_cache_inv((unsigned long)buf, nbytes);
 695         dp->dscr_cmd0 |= DSCR_CMD0_V;   
 696         wmb(); 
 697         dma_cache_wback_inv((unsigned long)dp, sizeof(*dp));
 698         ctp->chan_ptr->ddma_dbell = 0;
 699 
 700         
 701         ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
 702 
 703         
 704         return nbytes;
 705 }
 706 EXPORT_SYMBOL(au1xxx_dbdma_put_dest);
 707 
 708 
 709 
 710 
 711 
 712 
 713 
 714 u32 au1xxx_dbdma_get_dest(u32 chanid, void **buf, int *nbytes)
 715 {
 716         chan_tab_t              *ctp;
 717         au1x_ddma_desc_t        *dp;
 718         u32                     rv;
 719 
 720         
 721 
 722 
 723 
 724         ctp = *((chan_tab_t **)chanid);
 725 
 726         
 727 
 728 
 729 
 730 
 731         dp = ctp->get_ptr;
 732 
 733         
 734 
 735 
 736 
 737         if (dp->dscr_cmd0 & DSCR_CMD0_V)
 738                 return 0;
 739 
 740         
 741         *buf = (void *)(phys_to_virt(dp->dscr_dest0));
 742         *nbytes = dp->dscr_cmd1;
 743         rv = dp->dscr_stat;
 744 
 745         
 746         ctp->get_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
 747 
 748         
 749         return rv;
 750 }
 751 EXPORT_SYMBOL_GPL(au1xxx_dbdma_get_dest);
 752 
 753 void au1xxx_dbdma_stop(u32 chanid)
 754 {
 755         chan_tab_t      *ctp;
 756         au1x_dma_chan_t *cp;
 757         int halt_timeout = 0;
 758 
 759         ctp = *((chan_tab_t **)chanid);
 760 
 761         cp = ctp->chan_ptr;
 762         cp->ddma_cfg &= ~DDMA_CFG_EN;   
 763         wmb(); 
 764         while (!(cp->ddma_stat & DDMA_STAT_H)) {
 765                 udelay(1);
 766                 halt_timeout++;
 767                 if (halt_timeout > 100) {
 768                         printk(KERN_WARNING "warning: DMA channel won't halt\n");
 769                         break;
 770                 }
 771         }
 772         
 773         cp->ddma_stat |= (DDMA_STAT_DB | DDMA_STAT_V);
 774         wmb(); 
 775 }
 776 EXPORT_SYMBOL(au1xxx_dbdma_stop);
 777 
 778 
 779 
 780 
 781 
 782 
 783 void au1xxx_dbdma_start(u32 chanid)
 784 {
 785         chan_tab_t      *ctp;
 786         au1x_dma_chan_t *cp;
 787 
 788         ctp = *((chan_tab_t **)chanid);
 789         cp = ctp->chan_ptr;
 790         cp->ddma_desptr = virt_to_phys(ctp->cur_ptr);
 791         cp->ddma_cfg |= DDMA_CFG_EN;    
 792         wmb(); 
 793         cp->ddma_dbell = 0;
 794         wmb(); 
 795 }
 796 EXPORT_SYMBOL(au1xxx_dbdma_start);
 797 
 798 void au1xxx_dbdma_reset(u32 chanid)
 799 {
 800         chan_tab_t              *ctp;
 801         au1x_ddma_desc_t        *dp;
 802 
 803         au1xxx_dbdma_stop(chanid);
 804 
 805         ctp = *((chan_tab_t **)chanid);
 806         ctp->get_ptr = ctp->put_ptr = ctp->cur_ptr = ctp->chan_desc_base;
 807 
 808         
 809         dp = ctp->chan_desc_base;
 810 
 811         do {
 812                 dp->dscr_cmd0 &= ~DSCR_CMD0_V;
 813                 
 814 
 815 
 816 
 817 
 818                 dp->sw_status = 0;
 819                 dp = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
 820         } while (dp != ctp->chan_desc_base);
 821 }
 822 EXPORT_SYMBOL(au1xxx_dbdma_reset);
 823 
 824 u32 au1xxx_get_dma_residue(u32 chanid)
 825 {
 826         chan_tab_t      *ctp;
 827         au1x_dma_chan_t *cp;
 828         u32             rv;
 829 
 830         ctp = *((chan_tab_t **)chanid);
 831         cp = ctp->chan_ptr;
 832 
 833         
 834         rv = cp->ddma_bytecnt;
 835         wmb(); 
 836 
 837         return rv;
 838 }
 839 EXPORT_SYMBOL_GPL(au1xxx_get_dma_residue);
 840 
 841 void au1xxx_dbdma_chan_free(u32 chanid)
 842 {
 843         chan_tab_t      *ctp;
 844         dbdev_tab_t     *stp, *dtp;
 845 
 846         ctp = *((chan_tab_t **)chanid);
 847         stp = ctp->chan_src;
 848         dtp = ctp->chan_dest;
 849 
 850         au1xxx_dbdma_stop(chanid);
 851 
 852         kfree((void *)ctp->cdb_membase);
 853 
 854         stp->dev_flags &= ~DEV_FLAGS_INUSE;
 855         dtp->dev_flags &= ~DEV_FLAGS_INUSE;
 856         chan_tab_ptr[ctp->chan_index] = NULL;
 857 
 858         kfree(ctp);
 859 }
 860 EXPORT_SYMBOL(au1xxx_dbdma_chan_free);
 861 
 862 static irqreturn_t dbdma_interrupt(int irq, void *dev_id)
 863 {
 864         u32 intstat;
 865         u32 chan_index;
 866         chan_tab_t              *ctp;
 867         au1x_ddma_desc_t        *dp;
 868         au1x_dma_chan_t *cp;
 869 
 870         intstat = dbdma_gptr->ddma_intstat;
 871         wmb(); 
 872         chan_index = __ffs(intstat);
 873 
 874         ctp = chan_tab_ptr[chan_index];
 875         cp = ctp->chan_ptr;
 876         dp = ctp->cur_ptr;
 877 
 878         
 879         cp->ddma_irq = 0;
 880         wmb(); 
 881 
 882         if (ctp->chan_callback)
 883                 ctp->chan_callback(irq, ctp->chan_callparam);
 884 
 885         ctp->cur_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
 886         return IRQ_RETVAL(1);
 887 }
 888 
 889 void au1xxx_dbdma_dump(u32 chanid)
 890 {
 891         chan_tab_t       *ctp;
 892         au1x_ddma_desc_t *dp;
 893         dbdev_tab_t      *stp, *dtp;
 894         au1x_dma_chan_t  *cp;
 895         u32 i            = 0;
 896 
 897         ctp = *((chan_tab_t **)chanid);
 898         stp = ctp->chan_src;
 899         dtp = ctp->chan_dest;
 900         cp = ctp->chan_ptr;
 901 
 902         printk(KERN_DEBUG "Chan %x, stp %x (dev %d)  dtp %x (dev %d)\n",
 903                           (u32)ctp, (u32)stp, stp - dbdev_tab, (u32)dtp,
 904                           dtp - dbdev_tab);
 905         printk(KERN_DEBUG "desc base %x, get %x, put %x, cur %x\n",
 906                           (u32)(ctp->chan_desc_base), (u32)(ctp->get_ptr),
 907                           (u32)(ctp->put_ptr), (u32)(ctp->cur_ptr));
 908 
 909         printk(KERN_DEBUG "dbdma chan %x\n", (u32)cp);
 910         printk(KERN_DEBUG "cfg %08x, desptr %08x, statptr %08x\n",
 911                           cp->ddma_cfg, cp->ddma_desptr, cp->ddma_statptr);
 912         printk(KERN_DEBUG "dbell %08x, irq %08x, stat %08x, bytecnt %08x\n",
 913                           cp->ddma_dbell, cp->ddma_irq, cp->ddma_stat,
 914                           cp->ddma_bytecnt);
 915 
 916         
 917         dp = ctp->chan_desc_base;
 918 
 919         do {
 920                 printk(KERN_DEBUG "Dp[%d]= %08x, cmd0 %08x, cmd1 %08x\n",
 921                                   i++, (u32)dp, dp->dscr_cmd0, dp->dscr_cmd1);
 922                 printk(KERN_DEBUG "src0 %08x, src1 %08x, dest0 %08x, dest1 %08x\n",
 923                                   dp->dscr_source0, dp->dscr_source1,
 924                                   dp->dscr_dest0, dp->dscr_dest1);
 925                 printk(KERN_DEBUG "stat %08x, nxtptr %08x\n",
 926                                   dp->dscr_stat, dp->dscr_nxtptr);
 927                 dp = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
 928         } while (dp != ctp->chan_desc_base);
 929 }
 930 
 931 
 932 
 933 
 934 u32 au1xxx_dbdma_put_dscr(u32 chanid, au1x_ddma_desc_t *dscr)
 935 {
 936         chan_tab_t *ctp;
 937         au1x_ddma_desc_t *dp;
 938         u32 nbytes = 0;
 939 
 940         
 941 
 942 
 943 
 944         ctp = *((chan_tab_t **)chanid);
 945 
 946         
 947 
 948 
 949 
 950 
 951         dp = ctp->put_ptr;
 952 
 953         
 954 
 955 
 956 
 957         if (dp->dscr_cmd0 & DSCR_CMD0_V)
 958                 return 0;
 959 
 960         
 961         dp->dscr_dest0 = dscr->dscr_dest0;
 962         dp->dscr_source0 = dscr->dscr_source0;
 963         dp->dscr_dest1 = dscr->dscr_dest1;
 964         dp->dscr_source1 = dscr->dscr_source1;
 965         dp->dscr_cmd1 = dscr->dscr_cmd1;
 966         nbytes = dscr->dscr_cmd1;
 967         
 968         dp->dscr_cmd0 &= ~DSCR_CMD0_IE;
 969         dp->dscr_cmd0 |= dscr->dscr_cmd0 | DSCR_CMD0_V;
 970         ctp->chan_ptr->ddma_dbell = 0;
 971 
 972         
 973         ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
 974 
 975         
 976         return nbytes;
 977 }
 978 
 979 
 980 static unsigned long alchemy_dbdma_pm_data[NUM_DBDMA_CHANS + 1][6];
 981 
 982 static int alchemy_dbdma_suspend(void)
 983 {
 984         int i;
 985         void __iomem *addr;
 986 
 987         addr = (void __iomem *)KSEG1ADDR(AU1550_DBDMA_CONF_PHYS_ADDR);
 988         alchemy_dbdma_pm_data[0][0] = __raw_readl(addr + 0x00);
 989         alchemy_dbdma_pm_data[0][1] = __raw_readl(addr + 0x04);
 990         alchemy_dbdma_pm_data[0][2] = __raw_readl(addr + 0x08);
 991         alchemy_dbdma_pm_data[0][3] = __raw_readl(addr + 0x0c);
 992 
 993         
 994         addr = (void __iomem *)KSEG1ADDR(AU1550_DBDMA_PHYS_ADDR);
 995         for (i = 1; i <= NUM_DBDMA_CHANS; i++) {
 996                 alchemy_dbdma_pm_data[i][0] = __raw_readl(addr + 0x00);
 997                 alchemy_dbdma_pm_data[i][1] = __raw_readl(addr + 0x04);
 998                 alchemy_dbdma_pm_data[i][2] = __raw_readl(addr + 0x08);
 999                 alchemy_dbdma_pm_data[i][3] = __raw_readl(addr + 0x0c);
1000                 alchemy_dbdma_pm_data[i][4] = __raw_readl(addr + 0x10);
1001                 alchemy_dbdma_pm_data[i][5] = __raw_readl(addr + 0x14);
1002 
1003                 
1004                 __raw_writel(alchemy_dbdma_pm_data[i][0] & ~1, addr + 0x00);
1005                 wmb();
1006                 while (!(__raw_readl(addr + 0x14) & 1))
1007                         wmb();
1008 
1009                 addr += 0x100;  
1010         }
1011         
1012         addr = (void __iomem *)KSEG1ADDR(AU1550_DBDMA_CONF_PHYS_ADDR);
1013         __raw_writel(0, addr + 0x0c);
1014         wmb();
1015 
1016         return 0;
1017 }
1018 
1019 static void alchemy_dbdma_resume(void)
1020 {
1021         int i;
1022         void __iomem *addr;
1023 
1024         addr = (void __iomem *)KSEG1ADDR(AU1550_DBDMA_CONF_PHYS_ADDR);
1025         __raw_writel(alchemy_dbdma_pm_data[0][0], addr + 0x00);
1026         __raw_writel(alchemy_dbdma_pm_data[0][1], addr + 0x04);
1027         __raw_writel(alchemy_dbdma_pm_data[0][2], addr + 0x08);
1028         __raw_writel(alchemy_dbdma_pm_data[0][3], addr + 0x0c);
1029 
1030         
1031         addr = (void __iomem *)KSEG1ADDR(AU1550_DBDMA_PHYS_ADDR);
1032         for (i = 1; i <= NUM_DBDMA_CHANS; i++) {
1033                 __raw_writel(alchemy_dbdma_pm_data[i][0], addr + 0x00);
1034                 __raw_writel(alchemy_dbdma_pm_data[i][1], addr + 0x04);
1035                 __raw_writel(alchemy_dbdma_pm_data[i][2], addr + 0x08);
1036                 __raw_writel(alchemy_dbdma_pm_data[i][3], addr + 0x0c);
1037                 __raw_writel(alchemy_dbdma_pm_data[i][4], addr + 0x10);
1038                 __raw_writel(alchemy_dbdma_pm_data[i][5], addr + 0x14);
1039                 wmb();
1040                 addr += 0x100;  
1041         }
1042 }
1043 
1044 static struct syscore_ops alchemy_dbdma_syscore_ops = {
1045         .suspend        = alchemy_dbdma_suspend,
1046         .resume         = alchemy_dbdma_resume,
1047 };
1048 
1049 static int __init dbdma_setup(unsigned int irq, dbdev_tab_t *idtable)
1050 {
1051         int ret;
1052 
1053         dbdev_tab = kcalloc(DBDEV_TAB_SIZE, sizeof(dbdev_tab_t), GFP_KERNEL);
1054         if (!dbdev_tab)
1055                 return -ENOMEM;
1056 
1057         memcpy(dbdev_tab, idtable, 32 * sizeof(dbdev_tab_t));
1058         for (ret = 32; ret < DBDEV_TAB_SIZE; ret++)
1059                 dbdev_tab[ret].dev_id = ~0;
1060 
1061         dbdma_gptr->ddma_config = 0;
1062         dbdma_gptr->ddma_throttle = 0;
1063         dbdma_gptr->ddma_inten = 0xffff;
1064         wmb(); 
1065 
1066         ret = request_irq(irq, dbdma_interrupt, 0, "dbdma", (void *)dbdma_gptr);
1067         if (ret)
1068                 printk(KERN_ERR "Cannot grab DBDMA interrupt!\n");
1069         else {
1070                 dbdma_initialized = 1;
1071                 register_syscore_ops(&alchemy_dbdma_syscore_ops);
1072         }
1073 
1074         return ret;
1075 }
1076 
1077 static int __init alchemy_dbdma_init(void)
1078 {
1079         switch (alchemy_get_cputype()) {
1080         case ALCHEMY_CPU_AU1550:
1081                 return dbdma_setup(AU1550_DDMA_INT, au1550_dbdev_tab);
1082         case ALCHEMY_CPU_AU1200:
1083                 return dbdma_setup(AU1200_DDMA_INT, au1200_dbdev_tab);
1084         case ALCHEMY_CPU_AU1300:
1085                 return dbdma_setup(AU1300_DDMA_INT, au1300_dbdev_tab);
1086         }
1087         return 0;
1088 }
1089 subsys_initcall(alchemy_dbdma_init);