goldfish: 64-bit audio driver for goldfish platform
authorJun Tian <jun.j.tian@intel.com>
Mon, 28 Apr 2014 19:47:03 +0000 (20:47 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 3 May 2014 23:47:18 +0000 (19:47 -0400)
Enable the 64-bit goldfish audio driver.
Support 64-bit buffer address and data read/write.

Signed-off-by: Jun Tian <jun.j.tian@intel.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/goldfish/goldfish_audio.c

index 9243845418d64f61656f14716c5e79fd13ea3bff..383bee687151fc889dee4e8c51d99b0f318ce318 100644 (file)
@@ -78,11 +78,18 @@ enum {
        /* set number of bytes in buffer to write */
        AUDIO_WRITE_BUFFER_1  = 0x10,
        AUDIO_WRITE_BUFFER_2  = 0x14,
+#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
+       AUDIO_SET_WRITE_BUFFER_1_HIGH = 0x28,
+       AUDIO_SET_WRITE_BUFFER_2_HIGH = 0x30,
+#endif
 
        /* true if audio input is supported */
        AUDIO_READ_SUPPORTED = 0x18,
        /* buffer to use for audio input */
        AUDIO_SET_READ_BUFFER = 0x1C,
+#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
+       AUDIO_SET_READ_BUFFER_HIGH = 0x34,
+#endif
 
        /* driver writes number of bytes to read */
        AUDIO_START_READ  = 0x20,
@@ -267,6 +274,9 @@ static int goldfish_audio_probe(struct platform_device *pdev)
        struct resource *r;
        struct goldfish_audio *data;
        dma_addr_t buf_addr;
+#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
+       u32 buf_addr_high, buf_addr_low;
+#endif
 
        data = kzalloc(sizeof(*data), GFP_KERNEL);
        if (data == NULL) {
@@ -322,6 +332,28 @@ static int goldfish_audio_probe(struct platform_device *pdev)
                goto err_misc_register_failed;
        }
 
+#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
+       buf_addr_low = (u32)(buf_addr);
+       buf_addr_high = (u32)((buf_addr) >> 32);
+
+       AUDIO_WRITE(data, AUDIO_SET_WRITE_BUFFER_1, buf_addr_low);
+       AUDIO_WRITE(data, AUDIO_SET_WRITE_BUFFER_1_HIGH, buf_addr_high);
+
+       buf_addr_low = (u32)(buf_addr + WRITE_BUFFER_SIZE);
+       buf_addr_high = (u32)((buf_addr + WRITE_BUFFER_SIZE) >> 32);
+
+       AUDIO_WRITE(data, AUDIO_SET_WRITE_BUFFER_2, buf_addr_low);
+       AUDIO_WRITE(data, AUDIO_SET_WRITE_BUFFER_2_HIGH, buf_addr_high);
+
+       buf_addr_low = (u32)(buf_addr + 2 * WRITE_BUFFER_SIZE);
+       buf_addr_high = (u32)((buf_addr + 2 * WRITE_BUFFER_SIZE) >> 32);
+
+       data->read_supported = AUDIO_READ(data, AUDIO_READ_SUPPORTED);
+       if (data->read_supported){
+                AUDIO_WRITE(data, AUDIO_SET_READ_BUFFER, buf_addr_low);
+                AUDIO_WRITE(data, AUDIO_SET_READ_BUFFER_HIGH, buf_addr_high);
+       }
+#else
        AUDIO_WRITE(data, AUDIO_SET_WRITE_BUFFER_1, buf_addr);
        AUDIO_WRITE(data, AUDIO_SET_WRITE_BUFFER_2,
                                                buf_addr + WRITE_BUFFER_SIZE);
@@ -330,6 +362,7 @@ static int goldfish_audio_probe(struct platform_device *pdev)
        if (data->read_supported)
                AUDIO_WRITE(data, AUDIO_SET_READ_BUFFER,
                                        buf_addr + 2 * WRITE_BUFFER_SIZE);
+#endif
 
        audio_data = data;
        return 0;