Commit c3c1ba66 authored by Jun Tian's avatar Jun Tian Committed by Greg Kroah-Hartman
Browse files

goldfish: 64-bit audio driver for goldfish platform



Enable the 64-bit goldfish audio driver.
Support 64-bit buffer address and data read/write.

Signed-off-by: default avatarJun Tian <jun.j.tian@intel.com>
Signed-off-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 10f62861
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -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;