ALSA: ctxfi - Allow 64bit DMA
[linux-2.6.git] / sound / pci / ctxfi / cthw20k1.c
index 53572d92ef5d8b2ddd666ccf64de21ea41500fe3..1da1f82fe812e605779b293a99011301008d9a6d 100644 (file)
@@ -15,8 +15,6 @@
  *
  */
 
-#include "cthw20k1.h"
-#include "ct20k1reg.h"
 #include <linux/types.h>
 #include <linux/slab.h>
 #include <linux/pci.h>
 #include <linux/spinlock.h>
 #include <linux/kernel.h>
 #include <linux/interrupt.h>
+#include <linux/delay.h>
+#include "cthw20k1.h"
+#include "ct20k1reg.h"
 
-#define CT_XFI_DMA_MASK                DMA_BIT_MASK(32) /* 32 bits */
+#if BITS_PER_LONG == 32
+#define CT_XFI_DMA_MASK                DMA_BIT_MASK(32) /* 32 bit PTE */
+#else
+#define CT_XFI_DMA_MASK                DMA_BIT_MASK(64) /* 64 bit PTE */
+#endif
 
 struct hw20k1 {
        struct hw hw;
@@ -1248,18 +1253,14 @@ static int hw_trn_init(struct hw *hw, const struct trn_conf *info)
        }
 
        trnctl = 0x13;  /* 32-bit, 4k-size page */
-#if BITS_PER_LONG == 64
-       ptp_phys_low = info->vm_pgt_phys & ((1UL<<32)-1);
-       ptp_phys_high = (info->vm_pgt_phys>>32) & ((1UL<<32)-1);
-       trnctl |= (1<<2);
-#elif BITS_PER_LONG == 32
-       ptp_phys_low = info->vm_pgt_phys & (~0UL);
-       ptp_phys_high = 0;
-#else
-#      error "Unknown BITS_PER_LONG!"
-#endif
+       ptp_phys_low = (u32)info->vm_pgt_phys;
+       ptp_phys_high = upper_32_bits(info->vm_pgt_phys);
+       if (sizeof(void *) == 8) /* 64bit address */
+               trnctl |= (1 << 2);
+#if 0 /* Only 4k h/w pages for simplicitiy */
 #if PAGE_SIZE == 8192
        trnctl |= (1<<5);
+#endif
 #endif
        hw_write_20kx(hw, PTPALX, ptp_phys_low);
        hw_write_20kx(hw, PTPAHX, ptp_phys_high);