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: 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>
This commit is contained in:
Родитель
10f62861b4
Коммит
c3c1ba6640
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче