Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
c012cdc8
cloud-kernel
项目概览
openanolis
/
cloud-kernel
大约 1 年 前同步成功
通知
158
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c012cdc8
编写于
8月 12, 2011
作者:
T
Takashi Iwai
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'fix/asoc' into for-linus
上级
15439bde
f6b864a9
变更
18
隐藏空白更改
内联
并排
Showing
18 changed file
with
526 addition
and
19 deletion
+526
-19
MAINTAINERS
MAINTAINERS
+1
-1
include/sound/tlv320aic3x.h
include/sound/tlv320aic3x.h
+1
-1
sound/soc/codecs/wm8750.c
sound/soc/codecs/wm8750.c
+8
-0
sound/soc/codecs/wm8903.c
sound/soc/codecs/wm8903.c
+5
-0
sound/soc/codecs/wm8994.c
sound/soc/codecs/wm8994.c
+1
-0
sound/soc/omap/n810.c
sound/soc/omap/n810.c
+2
-2
sound/soc/omap/omap-mcbsp.c
sound/soc/omap/omap-mcbsp.c
+2
-2
sound/soc/omap/omap-mcbsp.h
sound/soc/omap/omap-mcbsp.h
+1
-1
sound/soc/omap/omap-pcm.c
sound/soc/omap/omap-pcm.c
+2
-2
sound/soc/omap/omap-pcm.h
sound/soc/omap/omap-pcm.h
+1
-1
sound/soc/omap/rx51.c
sound/soc/omap/rx51.c
+1
-1
sound/soc/samsung/Makefile
sound/soc/samsung/Makefile
+2
-0
sound/soc/samsung/idma.c
sound/soc/samsung/idma.c
+453
-0
sound/soc/samsung/idma.h
sound/soc/samsung/idma.h
+26
-0
sound/soc/samsung/jive_wm8750.c
sound/soc/samsung/jive_wm8750.c
+1
-1
sound/soc/samsung/speyside_wm8962.c
sound/soc/samsung/speyside_wm8962.c
+1
-1
sound/soc/tegra/tegra_pcm.c
sound/soc/tegra/tegra_pcm.c
+7
-2
sound/soc/tegra/tegra_wm8903.c
sound/soc/tegra/tegra_wm8903.c
+11
-4
未找到文件。
MAINTAINERS
浏览文件 @
c012cdc8
...
...
@@ -4604,7 +4604,7 @@ F: arch/arm/mach-omap2/clockdomain2xxx_3xxx.c
F: arch/arm/mach-omap2/clockdomain44xx.c
OMAP AUDIO SUPPORT
M: Jarkko Nikula <j
hnikula@gmail
.com>
M: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
L: alsa-devel@alsa-project.org (subscribers-only)
L: linux-omap@vger.kernel.org
S: Maintained
...
...
include/sound/tlv320aic3x.h
浏览文件 @
c012cdc8
/*
* Platform data for Texas Instruments TLV320AIC3x codec
*
* Author: Jarkko Nikula <j
hnikula@gmail
.com>
* Author: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
...
...
sound/soc/codecs/wm8750.c
浏览文件 @
c012cdc8
...
...
@@ -778,11 +778,19 @@ static int __devexit wm8750_spi_remove(struct spi_device *spi)
return
0
;
}
static
const
struct
spi_device_id
wm8750_spi_ids
[]
=
{
{
"wm8750"
,
0
},
{
"wm8987"
,
0
},
{
},
};
MODULE_DEVICE_TABLE
(
spi
,
wm8750_spi_ids
);
static
struct
spi_driver
wm8750_spi_driver
=
{
.
driver
=
{
.
name
=
"wm8750-codec"
,
.
owner
=
THIS_MODULE
,
},
.
id_table
=
wm8750_spi_ids
,
.
probe
=
wm8750_spi_probe
,
.
remove
=
__devexit_p
(
wm8750_spi_remove
),
};
...
...
sound/soc/codecs/wm8903.c
浏览文件 @
c012cdc8
...
...
@@ -2046,8 +2046,13 @@ static int wm8903_probe(struct snd_soc_codec *codec)
/* power down chip */
static
int
wm8903_remove
(
struct
snd_soc_codec
*
codec
)
{
struct
wm8903_priv
*
wm8903
=
snd_soc_codec_get_drvdata
(
codec
);
wm8903_free_gpio
(
codec
);
wm8903_set_bias_level
(
codec
,
SND_SOC_BIAS_OFF
);
if
(
wm8903
->
irq
)
free_irq
(
wm8903
->
irq
,
codec
);
return
0
;
}
...
...
sound/soc/codecs/wm8994.c
浏览文件 @
c012cdc8
...
...
@@ -2981,6 +2981,7 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
wm8994
->
hubs
.
dcs_readback_mode
=
1
;
break
;
}
break
;
case
WM8958
:
wm8994
->
hubs
.
dcs_readback_mode
=
1
;
...
...
sound/soc/omap/n810.c
浏览文件 @
c012cdc8
...
...
@@ -3,7 +3,7 @@
*
* Copyright (C) 2008 Nokia Corporation
*
* Contact: Jarkko Nikula <j
hnikula@gmail
.com>
* Contact: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
...
...
@@ -402,6 +402,6 @@ static void __exit n810_soc_exit(void)
module_init
(
n810_soc_init
);
module_exit
(
n810_soc_exit
);
MODULE_AUTHOR
(
"Jarkko Nikula <j
hnikula@gmail
.com>"
);
MODULE_AUTHOR
(
"Jarkko Nikula <j
arkko.nikula@bitmer
.com>"
);
MODULE_DESCRIPTION
(
"ALSA SoC Nokia N810"
);
MODULE_LICENSE
(
"GPL"
);
sound/soc/omap/omap-mcbsp.c
浏览文件 @
c012cdc8
...
...
@@ -3,7 +3,7 @@
*
* Copyright (C) 2008 Nokia Corporation
*
* Contact: Jarkko Nikula <j
hnikula@gmail
.com>
* Contact: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
* Peter Ujfalusi <peter.ujfalusi@ti.com>
*
* This program is free software; you can redistribute it and/or
...
...
@@ -780,6 +780,6 @@ static void __exit snd_omap_mcbsp_exit(void)
}
module_exit
(
snd_omap_mcbsp_exit
);
MODULE_AUTHOR
(
"Jarkko Nikula <j
hnikula@gmail
.com>"
);
MODULE_AUTHOR
(
"Jarkko Nikula <j
arkko.nikula@bitmer
.com>"
);
MODULE_DESCRIPTION
(
"OMAP I2S SoC Interface"
);
MODULE_LICENSE
(
"GPL"
);
sound/soc/omap/omap-mcbsp.h
浏览文件 @
c012cdc8
...
...
@@ -3,7 +3,7 @@
*
* Copyright (C) 2008 Nokia Corporation
*
* Contact: Jarkko Nikula <j
hnikula@gmail
.com>
* Contact: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
* Peter Ujfalusi <peter.ujfalusi@ti.com>
*
* This program is free software; you can redistribute it and/or
...
...
sound/soc/omap/omap-pcm.c
浏览文件 @
c012cdc8
...
...
@@ -3,7 +3,7 @@
*
* Copyright (C) 2008 Nokia Corporation
*
* Contact: Jarkko Nikula <j
hnikula@gmail
.com>
* Contact: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
* Peter Ujfalusi <peter.ujfalusi@ti.com>
*
* This program is free software; you can redistribute it and/or
...
...
@@ -436,6 +436,6 @@ static void __exit snd_omap_pcm_exit(void)
}
module_exit
(
snd_omap_pcm_exit
);
MODULE_AUTHOR
(
"Jarkko Nikula <j
hnikula@gmail
.com>"
);
MODULE_AUTHOR
(
"Jarkko Nikula <j
arkko.nikula@bitmer
.com>"
);
MODULE_DESCRIPTION
(
"OMAP PCM DMA module"
);
MODULE_LICENSE
(
"GPL"
);
sound/soc/omap/omap-pcm.h
浏览文件 @
c012cdc8
...
...
@@ -3,7 +3,7 @@
*
* Copyright (C) 2008 Nokia Corporation
*
* Contact: Jarkko Nikula <j
hnikula@gmail
.com>
* Contact: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
* Peter Ujfalusi <peter.ujfalusi@ti.com>
*
* This program is free software; you can redistribute it and/or
...
...
sound/soc/omap/rx51.c
浏览文件 @
c012cdc8
...
...
@@ -5,7 +5,7 @@
*
* Contact: Peter Ujfalusi <peter.ujfalusi@ti.com>
* Eduardo Valentin <eduardo.valentin@nokia.com>
* Jarkko Nikula <j
hnikula@gmail
.com>
* Jarkko Nikula <j
arkko.nikula@bitmer
.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
...
...
sound/soc/samsung/Makefile
浏览文件 @
c012cdc8
# S3c24XX Platform Support
snd-soc-s3c24xx-objs
:=
dma.o
snd-soc-idma-objs
:=
idma.o
snd-soc-s3c24xx-i2s-objs
:=
s3c24xx-i2s.o
snd-soc-s3c2412-i2s-objs
:=
s3c2412-i2s.o
snd-soc-ac97-objs
:=
ac97.o
...
...
@@ -16,6 +17,7 @@ obj-$(CONFIG_SND_S3C_I2SV2_SOC) += snd-soc-s3c-i2s-v2.o
obj-$(CONFIG_SND_SAMSUNG_SPDIF)
+=
snd-soc-samsung-spdif.o
obj-$(CONFIG_SND_SAMSUNG_PCM)
+=
snd-soc-pcm.o
obj-$(CONFIG_SND_SAMSUNG_I2S)
+=
snd-soc-i2s.o
obj-$(CONFIG_SND_SAMSUNG_I2S)
+=
snd-soc-idma.o
# S3C24XX Machine Support
snd-soc-jive-wm8750-objs
:=
jive_wm8750.o
...
...
sound/soc/samsung/idma.c
0 → 100644
浏览文件 @
c012cdc8
/*
* sound/soc/samsung/idma.c
*
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
* http://www.samsung.com
*
* I2S0's Internal DMA driver
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>
#include <linux/slab.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include "i2s.h"
#include "idma.h"
#include "dma.h"
#include "i2s-regs.h"
#define ST_RUNNING (1<<0)
#define ST_OPENED (1<<1)
static
const
struct
snd_pcm_hardware
idma_hardware
=
{
.
info
=
SNDRV_PCM_INFO_INTERLEAVED
|
SNDRV_PCM_INFO_BLOCK_TRANSFER
|
SNDRV_PCM_INFO_MMAP
|
SNDRV_PCM_INFO_MMAP_VALID
|
SNDRV_PCM_INFO_PAUSE
|
SNDRV_PCM_INFO_RESUME
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
|
SNDRV_PCM_FMTBIT_U16_LE
|
SNDRV_PCM_FMTBIT_S24_LE
|
SNDRV_PCM_FMTBIT_U24_LE
|
SNDRV_PCM_FMTBIT_U8
|
SNDRV_PCM_FMTBIT_S8
,
.
channels_min
=
2
,
.
channels_max
=
2
,
.
buffer_bytes_max
=
MAX_IDMA_BUFFER
,
.
period_bytes_min
=
128
,
.
period_bytes_max
=
MAX_IDMA_PERIOD
,
.
periods_min
=
1
,
.
periods_max
=
2
,
};
struct
idma_ctrl
{
spinlock_t
lock
;
int
state
;
dma_addr_t
start
;
dma_addr_t
pos
;
dma_addr_t
end
;
dma_addr_t
period
;
dma_addr_t
periodsz
;
void
*
token
;
void
(
*
cb
)(
void
*
dt
,
int
bytes_xfer
);
};
static
struct
idma_info
{
spinlock_t
lock
;
void
__iomem
*
regs
;
dma_addr_t
lp_tx_addr
;
}
idma
;
static
void
idma_getpos
(
dma_addr_t
*
src
)
{
*
src
=
idma
.
lp_tx_addr
+
(
readl
(
idma
.
regs
+
I2STRNCNT
)
&
0xffffff
)
*
4
;
}
static
int
idma_enqueue
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
idma_ctrl
*
prtd
=
substream
->
runtime
->
private_data
;
u32
val
;
spin_lock
(
&
prtd
->
lock
);
prtd
->
token
=
(
void
*
)
substream
;
spin_unlock
(
&
prtd
->
lock
);
/* Internal DMA Level0 Interrupt Address */
val
=
idma
.
lp_tx_addr
+
prtd
->
periodsz
;
writel
(
val
,
idma
.
regs
+
I2SLVL0ADDR
);
/* Start address0 of I2S internal DMA operation. */
val
=
idma
.
lp_tx_addr
;
writel
(
val
,
idma
.
regs
+
I2SSTR0
);
/*
* Transfer block size for I2S internal DMA.
* Should decide transfer size before start dma operation
*/
val
=
readl
(
idma
.
regs
+
I2SSIZE
);
val
&=
~
(
I2SSIZE_TRNMSK
<<
I2SSIZE_SHIFT
);
val
|=
(((
runtime
->
dma_bytes
>>
2
)
&
I2SSIZE_TRNMSK
)
<<
I2SSIZE_SHIFT
);
writel
(
val
,
idma
.
regs
+
I2SSIZE
);
val
=
readl
(
idma
.
regs
+
I2SAHB
);
val
|=
AHB_INTENLVL0
;
writel
(
val
,
idma
.
regs
+
I2SAHB
);
return
0
;
}
static
void
idma_setcallbk
(
struct
snd_pcm_substream
*
substream
,
void
(
*
cb
)(
void
*
,
int
))
{
struct
idma_ctrl
*
prtd
=
substream
->
runtime
->
private_data
;
spin_lock
(
&
prtd
->
lock
);
prtd
->
cb
=
cb
;
spin_unlock
(
&
prtd
->
lock
);
}
static
void
idma_control
(
int
op
)
{
u32
val
=
readl
(
idma
.
regs
+
I2SAHB
);
spin_lock
(
&
idma
.
lock
);
switch
(
op
)
{
case
LPAM_DMA_START
:
val
|=
(
AHB_INTENLVL0
|
AHB_DMAEN
);
break
;
case
LPAM_DMA_STOP
:
val
&=
~
(
AHB_INTENLVL0
|
AHB_DMAEN
);
break
;
default:
spin_unlock
(
&
idma
.
lock
);
return
;
}
writel
(
val
,
idma
.
regs
+
I2SAHB
);
spin_unlock
(
&
idma
.
lock
);
}
static
void
idma_done
(
void
*
id
,
int
bytes_xfer
)
{
struct
snd_pcm_substream
*
substream
=
id
;
struct
idma_ctrl
*
prtd
=
substream
->
runtime
->
private_data
;
if
(
prtd
&&
(
prtd
->
state
&
ST_RUNNING
))
snd_pcm_period_elapsed
(
substream
);
}
static
int
idma_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
idma_ctrl
*
prtd
=
substream
->
runtime
->
private_data
;
u32
mod
=
readl
(
idma
.
regs
+
I2SMOD
);
u32
ahb
=
readl
(
idma
.
regs
+
I2SAHB
);
ahb
|=
(
AHB_DMARLD
|
AHB_INTMASK
);
mod
|=
MOD_TXS_IDMA
;
writel
(
ahb
,
idma
.
regs
+
I2SAHB
);
writel
(
mod
,
idma
.
regs
+
I2SMOD
);
snd_pcm_set_runtime_buffer
(
substream
,
&
substream
->
dma_buffer
);
runtime
->
dma_bytes
=
params_buffer_bytes
(
params
);
prtd
->
start
=
prtd
->
pos
=
runtime
->
dma_addr
;
prtd
->
period
=
params_periods
(
params
);
prtd
->
periodsz
=
params_period_bytes
(
params
);
prtd
->
end
=
runtime
->
dma_addr
+
runtime
->
dma_bytes
;
idma_setcallbk
(
substream
,
idma_done
);
return
0
;
}
static
int
idma_hw_free
(
struct
snd_pcm_substream
*
substream
)
{
snd_pcm_set_runtime_buffer
(
substream
,
NULL
);
return
0
;
}
static
int
idma_prepare
(
struct
snd_pcm_substream
*
substream
)
{
struct
idma_ctrl
*
prtd
=
substream
->
runtime
->
private_data
;
prtd
->
pos
=
prtd
->
start
;
/* flush the DMA channel */
idma_control
(
LPAM_DMA_STOP
);
idma_enqueue
(
substream
);
return
0
;
}
static
int
idma_trigger
(
struct
snd_pcm_substream
*
substream
,
int
cmd
)
{
struct
idma_ctrl
*
prtd
=
substream
->
runtime
->
private_data
;
int
ret
=
0
;
spin_lock
(
&
prtd
->
lock
);
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_RESUME
:
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
prtd
->
state
|=
ST_RUNNING
;
idma_control
(
LPAM_DMA_START
);
break
;
case
SNDRV_PCM_TRIGGER_SUSPEND
:
case
SNDRV_PCM_TRIGGER_STOP
:
case
SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
prtd
->
state
&=
~
ST_RUNNING
;
idma_control
(
LPAM_DMA_STOP
);
break
;
default:
ret
=
-
EINVAL
;
break
;
}
spin_unlock
(
&
prtd
->
lock
);
return
ret
;
}
static
snd_pcm_uframes_t
idma_pointer
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
idma_ctrl
*
prtd
=
runtime
->
private_data
;
dma_addr_t
src
;
unsigned
long
res
;
spin_lock
(
&
prtd
->
lock
);
idma_getpos
(
&
src
);
res
=
src
-
prtd
->
start
;
spin_unlock
(
&
prtd
->
lock
);
return
bytes_to_frames
(
substream
->
runtime
,
res
);
}
static
int
idma_mmap
(
struct
snd_pcm_substream
*
substream
,
struct
vm_area_struct
*
vma
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
unsigned
long
size
,
offset
;
int
ret
;
/* From snd_pcm_lib_mmap_iomem */
vma
->
vm_page_prot
=
pgprot_noncached
(
vma
->
vm_page_prot
);
vma
->
vm_flags
|=
VM_IO
;
size
=
vma
->
vm_end
-
vma
->
vm_start
;
offset
=
vma
->
vm_pgoff
<<
PAGE_SHIFT
;
ret
=
io_remap_pfn_range
(
vma
,
vma
->
vm_start
,
(
runtime
->
dma_addr
+
offset
)
>>
PAGE_SHIFT
,
size
,
vma
->
vm_page_prot
);
return
ret
;
}
static
irqreturn_t
iis_irq
(
int
irqno
,
void
*
dev_id
)
{
struct
idma_ctrl
*
prtd
=
(
struct
idma_ctrl
*
)
dev_id
;
u32
iiscon
,
iisahb
,
val
,
addr
;
iisahb
=
readl
(
idma
.
regs
+
I2SAHB
);
iiscon
=
readl
(
idma
.
regs
+
I2SCON
);
val
=
(
iisahb
&
AHB_LVL0INT
)
?
AHB_CLRLVL0INT
:
0
;
if
(
val
)
{
iisahb
|=
val
;
writel
(
iisahb
,
idma
.
regs
+
I2SAHB
);
addr
=
readl
(
idma
.
regs
+
I2SLVL0ADDR
)
-
idma
.
lp_tx_addr
;
addr
+=
prtd
->
periodsz
;
addr
%=
(
prtd
->
end
-
prtd
->
start
);
addr
+=
idma
.
lp_tx_addr
;
writel
(
addr
,
idma
.
regs
+
I2SLVL0ADDR
);
if
(
prtd
->
cb
)
prtd
->
cb
(
prtd
->
token
,
prtd
->
period
);
}
return
IRQ_HANDLED
;
}
static
int
idma_open
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
idma_ctrl
*
prtd
;
int
ret
;
snd_soc_set_runtime_hwparams
(
substream
,
&
idma_hardware
);
prtd
=
kzalloc
(
sizeof
(
struct
idma_ctrl
),
GFP_KERNEL
);
if
(
prtd
==
NULL
)
return
-
ENOMEM
;
ret
=
request_irq
(
IRQ_I2S0
,
iis_irq
,
0
,
"i2s"
,
prtd
);
if
(
ret
<
0
)
{
pr_err
(
"fail to claim i2s irq , ret = %d
\n
"
,
ret
);
kfree
(
prtd
);
return
ret
;
}
spin_lock_init
(
&
prtd
->
lock
);
runtime
->
private_data
=
prtd
;
return
0
;
}
static
int
idma_close
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
idma_ctrl
*
prtd
=
runtime
->
private_data
;
free_irq
(
IRQ_I2S0
,
prtd
);
if
(
!
prtd
)
pr_err
(
"idma_close called with prtd == NULL
\n
"
);
kfree
(
prtd
);
return
0
;
}
static
struct
snd_pcm_ops
idma_ops
=
{
.
open
=
idma_open
,
.
close
=
idma_close
,
.
ioctl
=
snd_pcm_lib_ioctl
,
.
trigger
=
idma_trigger
,
.
pointer
=
idma_pointer
,
.
mmap
=
idma_mmap
,
.
hw_params
=
idma_hw_params
,
.
hw_free
=
idma_hw_free
,
.
prepare
=
idma_prepare
,
};
static
void
idma_free
(
struct
snd_pcm
*
pcm
)
{
struct
snd_pcm_substream
*
substream
;
struct
snd_dma_buffer
*
buf
;
substream
=
pcm
->
streams
[
SNDRV_PCM_STREAM_PLAYBACK
].
substream
;
if
(
!
substream
)
return
;
buf
=
&
substream
->
dma_buffer
;
if
(
!
buf
->
area
)
return
;
iounmap
(
buf
->
area
);
buf
->
area
=
NULL
;
buf
->
addr
=
0
;
}
static
int
preallocate_idma_buffer
(
struct
snd_pcm
*
pcm
,
int
stream
)
{
struct
snd_pcm_substream
*
substream
=
pcm
->
streams
[
stream
].
substream
;
struct
snd_dma_buffer
*
buf
=
&
substream
->
dma_buffer
;
buf
->
dev
.
dev
=
pcm
->
card
->
dev
;
buf
->
private_data
=
NULL
;
/* Assign PCM buffer pointers */
buf
->
dev
.
type
=
SNDRV_DMA_TYPE_CONTINUOUS
;
buf
->
addr
=
idma
.
lp_tx_addr
;
buf
->
bytes
=
idma_hardware
.
buffer_bytes_max
;
buf
->
area
=
(
unsigned
char
*
)
ioremap
(
buf
->
addr
,
buf
->
bytes
);
return
0
;
}
static
u64
idma_mask
=
DMA_BIT_MASK
(
32
);
static
int
idma_new
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
struct
snd_card
*
card
=
rtd
->
card
->
snd_card
;
struct
snd_soc_dai
*
dai
=
rtd
->
cpu_dai
;
struct
snd_pcm
*
pcm
=
rtd
->
pcm
;
int
ret
=
0
;
if
(
!
card
->
dev
->
dma_mask
)
card
->
dev
->
dma_mask
=
&
idma_mask
;
if
(
!
card
->
dev
->
coherent_dma_mask
)
card
->
dev
->
coherent_dma_mask
=
DMA_BIT_MASK
(
32
);
if
(
dai
->
driver
->
playback
.
channels_min
)
ret
=
preallocate_idma_buffer
(
pcm
,
SNDRV_PCM_STREAM_PLAYBACK
);
return
ret
;
}
void
idma_reg_addr_init
(
void
*
regs
,
dma_addr_t
addr
)
{
spin_lock_init
(
&
idma
.
lock
);
idma
.
regs
=
regs
;
idma
.
lp_tx_addr
=
addr
;
}
struct
snd_soc_platform_driver
asoc_idma_platform
=
{
.
ops
=
&
idma_ops
,
.
pcm_new
=
idma_new
,
.
pcm_free
=
idma_free
,
};
static
int
__devinit
asoc_idma_platform_probe
(
struct
platform_device
*
pdev
)
{
return
snd_soc_register_platform
(
&
pdev
->
dev
,
&
asoc_idma_platform
);
}
static
int
__devexit
asoc_idma_platform_remove
(
struct
platform_device
*
pdev
)
{
snd_soc_unregister_platform
(
&
pdev
->
dev
);
return
0
;
}
static
struct
platform_driver
asoc_idma_driver
=
{
.
driver
=
{
.
name
=
"samsung-idma"
,
.
owner
=
THIS_MODULE
,
},
.
probe
=
asoc_idma_platform_probe
,
.
remove
=
__devexit_p
(
asoc_idma_platform_remove
),
};
static
int
__init
asoc_idma_init
(
void
)
{
return
platform_driver_register
(
&
asoc_idma_driver
);
}
module_init
(
asoc_idma_init
);
static
void
__exit
asoc_idma_exit
(
void
)
{
platform_driver_unregister
(
&
asoc_idma_driver
);
}
module_exit
(
asoc_idma_exit
);
MODULE_AUTHOR
(
"Jaswinder Singh, <jassisinghbrar@gmail.com>"
);
MODULE_DESCRIPTION
(
"Samsung ASoC IDMA Driver"
);
MODULE_LICENSE
(
"GPL"
);
sound/soc/samsung/idma.h
0 → 100644
浏览文件 @
c012cdc8
/*
* sound/soc/samsung/idma.h
*
* Copyright (c) 2011 Samsung Electronics Co., Ltd
* http://www.samsung.com
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
*/
#ifndef __SND_SOC_SAMSUNG_IDMA_H_
#define __SND_SOC_SAMSUNG_IDMA_H_
extern
void
idma_reg_addr_init
(
void
*
regs
,
dma_addr_t
addr
);
/* dma_state */
#define LPAM_DMA_STOP 0
#define LPAM_DMA_START 1
#define MAX_IDMA_PERIOD (128 * 1024)
#define MAX_IDMA_BUFFER (160 * 1024)
#endif
/* __SND_SOC_SAMSUNG_IDMA_H_ */
sound/soc/samsung/jive_wm8750.c
浏览文件 @
c012cdc8
...
...
@@ -131,7 +131,7 @@ static struct snd_soc_dai_link jive_dai = {
.
cpu_dai_name
=
"s3c2412-i2s"
,
.
codec_dai_name
=
"wm8750-hifi"
,
.
platform_name
=
"samsung-audio"
,
.
codec_name
=
"wm8750-codec.0-0
x
1a"
,
.
codec_name
=
"wm8750-codec.0-0
0
1a"
,
.
init
=
jive_wm8750_init
,
.
ops
=
&
jive_ops
,
};
...
...
sound/soc/samsung/speyside_wm8962.c
浏览文件 @
c012cdc8
...
...
@@ -37,7 +37,7 @@ static int speyside_wm8962_set_bias_level(struct snd_soc_card *card,
44100
*
256
,
SND_SOC_CLOCK_IN
);
if
(
ret
<
0
)
{
pr_err
(
"Failed to set SYSCLK: %d
\n
"
);
pr_err
(
"Failed to set SYSCLK: %d
\n
"
,
ret
);
return
ret
;
}
}
...
...
sound/soc/tegra/tegra_pcm.c
浏览文件 @
c012cdc8
...
...
@@ -309,9 +309,14 @@ static int tegra_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream)
static
void
tegra_pcm_deallocate_dma_buffer
(
struct
snd_pcm
*
pcm
,
int
stream
)
{
struct
snd_pcm_substream
*
substream
=
pcm
->
streams
[
stream
].
substream
;
struct
snd_dma_buffer
*
buf
=
&
substream
->
dma_buffer
;
struct
snd_pcm_substream
*
substream
;
struct
snd_dma_buffer
*
buf
;
substream
=
pcm
->
streams
[
stream
].
substream
;
if
(
!
substream
)
return
;
buf
=
&
substream
->
dma_buffer
;
if
(
!
buf
->
area
)
return
;
...
...
sound/soc/tegra/tegra_wm8903.c
浏览文件 @
c012cdc8
...
...
@@ -56,6 +56,7 @@
#define GPIO_HP_MUTE BIT(1)
#define GPIO_INT_MIC_EN BIT(2)
#define GPIO_EXT_MIC_EN BIT(3)
#define GPIO_HP_DET BIT(4)
struct
tegra_wm8903
{
struct
tegra_asoc_utils_data
util_data
;
...
...
@@ -304,6 +305,7 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd)
snd_soc_jack_add_gpios
(
&
tegra_wm8903_hp_jack
,
1
,
&
tegra_wm8903_hp_jack_gpio
);
machine
->
gpio_requested
|=
GPIO_HP_DET
;
}
snd_soc_jack_new
(
codec
,
"Mic Jack"
,
SND_JACK_MICROPHONE
,
...
...
@@ -429,10 +431,10 @@ static int __devexit tegra_wm8903_driver_remove(struct platform_device *pdev)
struct
tegra_wm8903
*
machine
=
snd_soc_card_get_drvdata
(
card
);
struct
tegra_wm8903_platform_data
*
pdata
=
machine
->
pdata
;
snd_soc_unregister_card
(
card
);
tegra_asoc_utils_fini
(
&
machine
->
util_data
);
if
(
machine
->
gpio_requested
&
GPIO_HP_DET
)
snd_soc_jack_free_gpios
(
&
tegra_wm8903_hp_jack
,
1
,
&
tegra_wm8903_hp_jack_gpio
);
if
(
machine
->
gpio_requested
&
GPIO_EXT_MIC_EN
)
gpio_free
(
pdata
->
gpio_ext_mic_en
);
if
(
machine
->
gpio_requested
&
GPIO_INT_MIC_EN
)
...
...
@@ -441,6 +443,11 @@ static int __devexit tegra_wm8903_driver_remove(struct platform_device *pdev)
gpio_free
(
pdata
->
gpio_hp_mute
);
if
(
machine
->
gpio_requested
&
GPIO_SPKR_EN
)
gpio_free
(
pdata
->
gpio_spkr_en
);
machine
->
gpio_requested
=
0
;
snd_soc_unregister_card
(
card
);
tegra_asoc_utils_fini
(
&
machine
->
util_data
);
kfree
(
machine
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录