Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
d61b04f8
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
d61b04f8
编写于
8年前
作者:
T
Takashi Iwai
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-linus' into for-next
上级
30ff5957
473f4145
变更
38
隐藏空白更改
内联
并排
Showing
38 changed file
with
331 addition
and
192 deletion
+331
-192
Documentation/devicetree/bindings/sound/fsl-asoc-card.txt
Documentation/devicetree/bindings/sound/fsl-asoc-card.txt
+2
-0
include/sound/hdaudio.h
include/sound/hdaudio.h
+1
-1
sound/core/pcm_native.c
sound/core/pcm_native.c
+14
-2
sound/core/seq/seq_memory.c
sound/core/seq/seq_memory.c
+9
-4
sound/core/seq/seq_ports.c
sound/core/seq/seq_ports.c
+8
-5
sound/hda/hdac_controller.c
sound/hda/hdac_controller.c
+6
-1
sound/pci/hda/hda_controller.c
sound/pci/hda/hda_controller.c
+26
-21
sound/pci/hda/hda_intel.c
sound/pci/hda/hda_intel.c
+9
-11
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+37
-2
sound/soc/amd/acp-pcm-dma.c
sound/soc/amd/acp-pcm-dma.c
+1
-0
sound/soc/codecs/arizona.c
sound/soc/codecs/arizona.c
+42
-1
sound/soc/codecs/rt286.c
sound/soc/codecs/rt286.c
+3
-23
sound/soc/codecs/rt5645.c
sound/soc/codecs/rt5645.c
+1
-1
sound/soc/codecs/rt5659.c
sound/soc/codecs/rt5659.c
+14
-17
sound/soc/codecs/rt5659.h
sound/soc/codecs/rt5659.h
+0
-1
sound/soc/codecs/sigmadsp-i2c.c
sound/soc/codecs/sigmadsp-i2c.c
+4
-1
sound/soc/codecs/wm5110.c
sound/soc/codecs/wm5110.c
+1
-0
sound/soc/codecs/wm8960.c
sound/soc/codecs/wm8960.c
+21
-19
sound/soc/dwc/designware_i2s.c
sound/soc/dwc/designware_i2s.c
+2
-3
sound/soc/fsl/fsl_ssi.c
sound/soc/fsl/fsl_ssi.c
+22
-20
sound/soc/fsl/imx-spdif.c
sound/soc/fsl/imx-spdif.c
+0
-2
sound/soc/generic/simple-card.c
sound/soc/generic/simple-card.c
+1
-1
sound/soc/intel/Kconfig
sound/soc/intel/Kconfig
+11
-2
sound/soc/intel/atom/sst-mfld-platform-pcm.c
sound/soc/intel/atom/sst-mfld-platform-pcm.c
+1
-0
sound/soc/intel/boards/skl_rt286.c
sound/soc/intel/boards/skl_rt286.c
+4
-1
sound/soc/intel/common/Makefile
sound/soc/intel/common/Makefile
+3
-6
sound/soc/intel/common/sst-acpi.c
sound/soc/intel/common/sst-acpi.c
+4
-0
sound/soc/intel/common/sst-match-acpi.c
sound/soc/intel/common/sst-match-acpi.c
+3
-0
sound/soc/intel/skylake/skl-messages.c
sound/soc/intel/skylake/skl-messages.c
+3
-3
sound/soc/intel/skylake/skl-pcm.c
sound/soc/intel/skylake/skl-pcm.c
+1
-0
sound/soc/intel/skylake/skl-topology.c
sound/soc/intel/skylake/skl-topology.c
+52
-23
sound/soc/intel/skylake/skl.c
sound/soc/intel/skylake/skl.c
+0
-2
sound/soc/mediatek/Kconfig
sound/soc/mediatek/Kconfig
+2
-2
sound/soc/mxs/mxs-saif.c
sound/soc/mxs/mxs-saif.c
+11
-2
sound/soc/qcom/lpass-platform.c
sound/soc/qcom/lpass-platform.c
+6
-9
sound/soc/soc-dapm.c
sound/soc/soc-dapm.c
+4
-4
sound/soc/soc-pcm.c
sound/soc/soc-pcm.c
+2
-1
sound/usb/midi.c
sound/usb/midi.c
+0
-1
未找到文件。
Documentation/devicetree/bindings/sound/fsl-asoc-card.txt
浏览文件 @
d61b04f8
...
...
@@ -30,6 +30,8 @@ The compatible list for this generic sound card currently:
"fsl,imx-audio-sgtl5000"
(compatible with Documentation/devicetree/bindings/sound/imx-audio-sgtl5000.txt)
"fsl,imx-audio-wm8960"
Required properties:
- compatible : Contains one of entries in the compatible list.
...
...
This diff is collapsed.
Click to expand it.
include/sound/hdaudio.h
浏览文件 @
d61b04f8
...
...
@@ -343,7 +343,7 @@ void snd_hdac_bus_enter_link_reset(struct hdac_bus *bus);
void
snd_hdac_bus_exit_link_reset
(
struct
hdac_bus
*
bus
);
void
snd_hdac_bus_update_rirb
(
struct
hdac_bus
*
bus
);
void
snd_hdac_bus_handle_stream_irq
(
struct
hdac_bus
*
bus
,
unsigned
int
status
,
int
snd_hdac_bus_handle_stream_irq
(
struct
hdac_bus
*
bus
,
unsigned
int
status
,
void
(
*
ack
)(
struct
hdac_bus
*
,
struct
hdac_stream
*
));
...
...
This diff is collapsed.
Click to expand it.
sound/core/pcm_native.c
浏览文件 @
d61b04f8
...
...
@@ -74,6 +74,18 @@ static int snd_pcm_open(struct file *file, struct snd_pcm *pcm, int stream);
static
DEFINE_RWLOCK
(
snd_pcm_link_rwlock
);
static
DECLARE_RWSEM
(
snd_pcm_link_rwsem
);
/* Writer in rwsem may block readers even during its waiting in queue,
* and this may lead to a deadlock when the code path takes read sem
* twice (e.g. one in snd_pcm_action_nonatomic() and another in
* snd_pcm_stream_lock()). As a (suboptimal) workaround, let writer to
* spin until it gets the lock.
*/
static
inline
void
down_write_nonblock
(
struct
rw_semaphore
*
lock
)
{
while
(
!
down_write_trylock
(
lock
))
cond_resched
();
}
/**
* snd_pcm_stream_lock - Lock the PCM stream
* @substream: PCM substream
...
...
@@ -1813,7 +1825,7 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd)
res
=
-
ENOMEM
;
goto
_nolock
;
}
down_write
(
&
snd_pcm_link_rwsem
);
down_write
_nonblock
(
&
snd_pcm_link_rwsem
);
write_lock_irq
(
&
snd_pcm_link_rwlock
);
if
(
substream
->
runtime
->
status
->
state
==
SNDRV_PCM_STATE_OPEN
||
substream
->
runtime
->
status
->
state
!=
substream1
->
runtime
->
status
->
state
||
...
...
@@ -1860,7 +1872,7 @@ static int snd_pcm_unlink(struct snd_pcm_substream *substream)
struct
snd_pcm_substream
*
s
;
int
res
=
0
;
down_write
(
&
snd_pcm_link_rwsem
);
down_write
_nonblock
(
&
snd_pcm_link_rwsem
);
write_lock_irq
(
&
snd_pcm_link_rwlock
);
if
(
!
snd_pcm_stream_linked
(
substream
))
{
res
=
-
EALREADY
;
...
...
This diff is collapsed.
Click to expand it.
sound/core/seq/seq_memory.c
浏览文件 @
d61b04f8
...
...
@@ -383,15 +383,20 @@ int snd_seq_pool_init(struct snd_seq_pool *pool)
if
(
snd_BUG_ON
(
!
pool
))
return
-
EINVAL
;
if
(
pool
->
ptr
)
/* should be atomic? */
return
0
;
pool
->
ptr
=
vmalloc
(
sizeof
(
struct
snd_seq_event_cell
)
*
pool
->
size
);
if
(
!
pool
->
ptr
)
cell
ptr
=
vmalloc
(
sizeof
(
struct
snd_seq_event_cell
)
*
pool
->
size
);
if
(
!
cell
ptr
)
return
-
ENOMEM
;
/* add new cells to the free cell list */
spin_lock_irqsave
(
&
pool
->
lock
,
flags
);
if
(
pool
->
ptr
)
{
spin_unlock_irqrestore
(
&
pool
->
lock
,
flags
);
vfree
(
cellptr
);
return
0
;
}
pool
->
ptr
=
cellptr
;
pool
->
free
=
NULL
;
for
(
cell
=
0
;
cell
<
pool
->
size
;
cell
++
)
{
...
...
This diff is collapsed.
Click to expand it.
sound/core/seq/seq_ports.c
浏览文件 @
d61b04f8
...
...
@@ -535,19 +535,22 @@ static void delete_and_unsubscribe_port(struct snd_seq_client *client,
bool
is_src
,
bool
ack
)
{
struct
snd_seq_port_subs_info
*
grp
;
struct
list_head
*
list
;
bool
empty
;
grp
=
is_src
?
&
port
->
c_src
:
&
port
->
c_dest
;
list
=
is_src
?
&
subs
->
src_list
:
&
subs
->
dest_list
;
down_write
(
&
grp
->
list_mutex
);
write_lock_irq
(
&
grp
->
list_lock
);
if
(
is_src
)
list_del
(
&
subs
->
src_list
);
else
list_del
(
&
subs
->
dest_list
);
empty
=
list_empty
(
list
);
if
(
!
empty
)
list_del_init
(
list
);
grp
->
exclusive
=
0
;
write_unlock_irq
(
&
grp
->
list_lock
);
up_write
(
&
grp
->
list_mutex
);
unsubscribe_port
(
client
,
port
,
grp
,
&
subs
->
info
,
ack
);
if
(
!
empty
)
unsubscribe_port
(
client
,
port
,
grp
,
&
subs
->
info
,
ack
);
}
/* connect two ports */
...
...
This diff is collapsed.
Click to expand it.
sound/hda/hdac_controller.c
浏览文件 @
d61b04f8
...
...
@@ -426,18 +426,22 @@ EXPORT_SYMBOL_GPL(snd_hdac_bus_stop_chip);
* @bus: HD-audio core bus
* @status: INTSTS register value
* @ask: callback to be called for woken streams
*
* Returns the bits of handled streams, or zero if no stream is handled.
*/
void
snd_hdac_bus_handle_stream_irq
(
struct
hdac_bus
*
bus
,
unsigned
int
status
,
int
snd_hdac_bus_handle_stream_irq
(
struct
hdac_bus
*
bus
,
unsigned
int
status
,
void
(
*
ack
)(
struct
hdac_bus
*
,
struct
hdac_stream
*
))
{
struct
hdac_stream
*
azx_dev
;
u8
sd_status
;
int
handled
=
0
;
list_for_each_entry
(
azx_dev
,
&
bus
->
stream_list
,
list
)
{
if
(
status
&
azx_dev
->
sd_int_sta_mask
)
{
sd_status
=
snd_hdac_stream_readb
(
azx_dev
,
SD_STS
);
snd_hdac_stream_writeb
(
azx_dev
,
SD_STS
,
SD_INT_MASK
);
handled
|=
1
<<
azx_dev
->
index
;
if
(
!
azx_dev
->
substream
||
!
azx_dev
->
running
||
!
(
sd_status
&
SD_INT_COMPLETE
))
continue
;
...
...
@@ -445,6 +449,7 @@ void snd_hdac_bus_handle_stream_irq(struct hdac_bus *bus, unsigned int status,
ack
(
bus
,
azx_dev
);
}
}
return
handled
;
}
EXPORT_SYMBOL_GPL
(
snd_hdac_bus_handle_stream_irq
);
...
...
This diff is collapsed.
Click to expand it.
sound/pci/hda/hda_controller.c
浏览文件 @
d61b04f8
...
...
@@ -930,6 +930,8 @@ irqreturn_t azx_interrupt(int irq, void *dev_id)
struct
azx
*
chip
=
dev_id
;
struct
hdac_bus
*
bus
=
azx_bus
(
chip
);
u32
status
;
bool
active
,
handled
=
false
;
int
repeat
=
0
;
/* count for avoiding endless loop */
#ifdef CONFIG_PM
if
(
azx_has_pm_runtime
(
chip
))
...
...
@@ -939,33 +941,36 @@ irqreturn_t azx_interrupt(int irq, void *dev_id)
spin_lock
(
&
bus
->
reg_lock
);
if
(
chip
->
disabled
)
{
spin_unlock
(
&
bus
->
reg_lock
);
return
IRQ_NONE
;
}
status
=
azx_readl
(
chip
,
INTSTS
);
if
(
status
==
0
||
status
==
0xffffffff
)
{
spin_unlock
(
&
bus
->
reg_lock
);
return
IRQ_NONE
;
}
if
(
chip
->
disabled
)
goto
unlock
;
snd_hdac_bus_handle_stream_irq
(
bus
,
status
,
stream_update
);
do
{
status
=
azx_readl
(
chip
,
INTSTS
);
if
(
status
==
0
||
status
==
0xffffffff
)
break
;
/* clear rirb int */
status
=
azx_readb
(
chip
,
RIRBSTS
);
if
(
status
&
RIRB_INT_MASK
)
{
if
(
status
&
RIRB_INT_RESPONSE
)
{
if
(
chip
->
driver_caps
&
AZX_DCAPS_CTX_WORKAROUND
)
udelay
(
80
);
snd_hdac_bus_update_rirb
(
bus
);
handled
=
true
;
active
=
false
;
if
(
snd_hdac_bus_handle_stream_irq
(
bus
,
status
,
stream_update
))
active
=
true
;
/* clear rirb int */
status
=
azx_readb
(
chip
,
RIRBSTS
);
if
(
status
&
RIRB_INT_MASK
)
{
active
=
true
;
if
(
status
&
RIRB_INT_RESPONSE
)
{
if
(
chip
->
driver_caps
&
AZX_DCAPS_CTX_WORKAROUND
)
udelay
(
80
);
snd_hdac_bus_update_rirb
(
bus
);
}
azx_writeb
(
chip
,
RIRBSTS
,
RIRB_INT_MASK
);
}
azx_writeb
(
chip
,
RIRBSTS
,
RIRB_INT_MASK
);
}
}
while
(
active
&&
++
repeat
<
10
);
unlock:
spin_unlock
(
&
bus
->
reg_lock
);
return
IRQ_
HANDLED
;
return
IRQ_
RETVAL
(
handled
)
;
}
EXPORT_SYMBOL_GPL
(
azx_interrupt
);
...
...
This diff is collapsed.
Click to expand it.
sound/pci/hda/hda_intel.c
浏览文件 @
d61b04f8
...
...
@@ -363,7 +363,10 @@ enum {
((pci)->device == 0x0d0c) || \
((pci)->device == 0x160c))
#define IS_BROXTON(pci) ((pci)->device == 0x5a98)
#define IS_SKL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa170)
#define IS_SKL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d70)
#define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98)
#define IS_SKL_PLUS(pci) (IS_SKL(pci) || IS_SKL_LP(pci) || IS_BXT(pci))
static
char
*
driver_short_names
[]
=
{
[
AZX_DRIVER_ICH
]
=
"HDA Intel"
,
...
...
@@ -540,13 +543,13 @@ static void hda_intel_init_chip(struct azx *chip, bool full_reset)
if
(
chip
->
driver_caps
&
AZX_DCAPS_I915_POWERWELL
)
snd_hdac_set_codec_wakeup
(
bus
,
true
);
if
(
IS_
BROXTON
(
pci
))
{
if
(
IS_
SKL_PLUS
(
pci
))
{
pci_read_config_dword
(
pci
,
INTEL_HDA_CGCTL
,
&
val
);
val
=
val
&
~
INTEL_HDA_CGCTL_MISCBDCGE
;
pci_write_config_dword
(
pci
,
INTEL_HDA_CGCTL
,
val
);
}
azx_init_chip
(
chip
,
full_reset
);
if
(
IS_
BROXTON
(
pci
))
{
if
(
IS_
SKL_PLUS
(
pci
))
{
pci_read_config_dword
(
pci
,
INTEL_HDA_CGCTL
,
&
val
);
val
=
val
|
INTEL_HDA_CGCTL_MISCBDCGE
;
pci_write_config_dword
(
pci
,
INTEL_HDA_CGCTL
,
val
);
...
...
@@ -555,7 +558,7 @@ static void hda_intel_init_chip(struct azx *chip, bool full_reset)
snd_hdac_set_codec_wakeup
(
bus
,
false
);
/* reduce dma latency to avoid noise */
if
(
IS_B
ROXTON
(
pci
))
if
(
IS_B
XT
(
pci
))
bxt_reduce_dma_latency
(
chip
);
}
...
...
@@ -977,11 +980,6 @@ static int azx_resume(struct device *dev)
/* put codec down to D3 at hibernation for Intel SKL+;
* otherwise BIOS may still access the codec and screw up the driver
*/
#define IS_SKL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa170)
#define IS_SKL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d70)
#define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98)
#define IS_SKL_PLUS(pci) (IS_SKL(pci) || IS_SKL_LP(pci) || IS_BXT(pci))
static
int
azx_freeze_noirq
(
struct
device
*
dev
)
{
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
...
...
@@ -2168,10 +2166,10 @@ static void azx_remove(struct pci_dev *pci)
struct
hda_intel
*
hda
;
if
(
card
)
{
/*
flush
the pending probing work */
/*
cancel
the pending probing work */
chip
=
card
->
private_data
;
hda
=
container_of
(
chip
,
struct
hda_intel
,
chip
);
flush_work
(
&
hda
->
probe_work
);
cancel_work_sync
(
&
hda
->
probe_work
);
snd_card_free
(
card
);
}
...
...
This diff is collapsed.
Click to expand it.
sound/pci/hda/patch_realtek.c
浏览文件 @
d61b04f8
...
...
@@ -3801,6 +3801,10 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
static
void
alc_headset_mode_default
(
struct
hda_codec
*
codec
)
{
static
struct
coef_fw
coef0225
[]
=
{
UPDATE_COEF
(
0x45
,
0x3f
<<
10
,
0x34
<<
10
),
{}
};
static
struct
coef_fw
coef0255
[]
=
{
WRITE_COEF
(
0x45
,
0xc089
),
WRITE_COEF
(
0x45
,
0xc489
),
...
...
@@ -3842,6 +3846,9 @@ static void alc_headset_mode_default(struct hda_codec *codec)
};
switch
(
codec
->
core
.
vendor_id
)
{
case
0x10ec0225
:
alc_process_coef_fw
(
codec
,
coef0225
);
break
;
case
0x10ec0255
:
case
0x10ec0256
:
alc_process_coef_fw
(
codec
,
coef0255
);
...
...
@@ -4749,6 +4756,9 @@ enum {
ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE
,
ALC293_FIXUP_LENOVO_SPK_NOISE
,
ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY
,
ALC255_FIXUP_DELL_SPK_NOISE
,
ALC225_FIXUP_DELL1_MIC_NO_PRESENCE
,
ALC280_FIXUP_HP_HEADSET_MIC
,
};
static
const
struct
hda_fixup
alc269_fixups
[]
=
{
...
...
@@ -5368,6 +5378,29 @@ static const struct hda_fixup alc269_fixups[] = {
.
type
=
HDA_FIXUP_FUNC
,
.
v
.
func
=
alc233_fixup_lenovo_line2_mic_hotkey
,
},
[
ALC255_FIXUP_DELL_SPK_NOISE
]
=
{
.
type
=
HDA_FIXUP_FUNC
,
.
v
.
func
=
alc_fixup_disable_aamix
,
.
chained
=
true
,
.
chain_id
=
ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
},
[
ALC225_FIXUP_DELL1_MIC_NO_PRESENCE
]
=
{
.
type
=
HDA_FIXUP_VERBS
,
.
v
.
verbs
=
(
const
struct
hda_verb
[])
{
/* Disable pass-through path for FRONT 14h */
{
0x20
,
AC_VERB_SET_COEF_INDEX
,
0x36
},
{
0x20
,
AC_VERB_SET_PROC_COEF
,
0x57d7
},
{}
},
.
chained
=
true
,
.
chain_id
=
ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
},
[
ALC280_FIXUP_HP_HEADSET_MIC
]
=
{
.
type
=
HDA_FIXUP_FUNC
,
.
v
.
func
=
alc_fixup_disable_aamix
,
.
chained
=
true
,
.
chain_id
=
ALC269_FIXUP_HEADSET_MIC
,
},
};
static
const
struct
snd_pci_quirk
alc269_fixup_tbl
[]
=
{
...
...
@@ -5410,6 +5443,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK
(
0x1028
,
0x06df
,
"Dell"
,
ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK
),
SND_PCI_QUIRK
(
0x1028
,
0x06e0
,
"Dell"
,
ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK
),
SND_PCI_QUIRK
(
0x1028
,
0x0704
,
"Dell XPS 13"
,
ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE
),
SND_PCI_QUIRK
(
0x1028
,
0x0725
,
"Dell Inspiron 3162"
,
ALC255_FIXUP_DELL_SPK_NOISE
),
SND_PCI_QUIRK
(
0x1028
,
0x164a
,
"Dell"
,
ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
),
SND_PCI_QUIRK
(
0x1028
,
0x164b
,
"Dell"
,
ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
),
SND_PCI_QUIRK
(
0x103c
,
0x1586
,
"HP"
,
ALC269_FIXUP_HP_MUTE_LED_MIC2
),
...
...
@@ -5470,6 +5504,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK
(
0x103c
,
0x2335
,
"HP"
,
ALC269_FIXUP_HP_MUTE_LED_MIC1
),
SND_PCI_QUIRK
(
0x103c
,
0x2336
,
"HP"
,
ALC269_FIXUP_HP_MUTE_LED_MIC1
),
SND_PCI_QUIRK
(
0x103c
,
0x2337
,
"HP"
,
ALC269_FIXUP_HP_MUTE_LED_MIC1
),
SND_PCI_QUIRK
(
0x103c
,
0x221c
,
"HP EliteBook 755 G2"
,
ALC280_FIXUP_HP_HEADSET_MIC
),
SND_PCI_QUIRK
(
0x1043
,
0x103f
,
"ASUS TX300"
,
ALC282_FIXUP_ASUS_TX300
),
SND_PCI_QUIRK
(
0x1043
,
0x106d
,
"Asus K53BE"
,
ALC269_FIXUP_LIMIT_INT_MIC_BOOST
),
SND_PCI_QUIRK
(
0x1043
,
0x115d
,
"Asus 1015E"
,
ALC269_FIXUP_LIMIT_INT_MIC_BOOST
),
...
...
@@ -5638,10 +5673,10 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
{0x21, 0x03211020}
static
const
struct
snd_hda_pin_quirk
alc269_pin_fixup_tbl
[]
=
{
SND_HDA_PIN_QUIRK
(
0x10ec0225
,
0x1028
,
"Dell"
,
ALC2
69
_FIXUP_DELL1_MIC_NO_PRESENCE
,
SND_HDA_PIN_QUIRK
(
0x10ec0225
,
0x1028
,
"Dell"
,
ALC2
25
_FIXUP_DELL1_MIC_NO_PRESENCE
,
ALC225_STANDARD_PINS
,
{
0x14
,
0x901701a0
}),
SND_HDA_PIN_QUIRK
(
0x10ec0225
,
0x1028
,
"Dell"
,
ALC2
69
_FIXUP_DELL1_MIC_NO_PRESENCE
,
SND_HDA_PIN_QUIRK
(
0x10ec0225
,
0x1028
,
"Dell"
,
ALC2
25
_FIXUP_DELL1_MIC_NO_PRESENCE
,
ALC225_STANDARD_PINS
,
{
0x14
,
0x901701b0
}),
SND_HDA_PIN_QUIRK
(
0x10ec0255
,
0x1028
,
"Dell"
,
ALC255_FIXUP_DELL2_MIC_NO_PRESENCE
,
...
...
This diff is collapsed.
Click to expand it.
sound/soc/amd/acp-pcm-dma.c
浏览文件 @
d61b04f8
...
...
@@ -635,6 +635,7 @@ static int acp_dma_open(struct snd_pcm_substream *substream)
SNDRV_PCM_HW_PARAM_PERIODS
);
if
(
ret
<
0
)
{
dev_err
(
prtd
->
platform
->
dev
,
"set integer constraint failed
\n
"
);
kfree
(
adata
);
return
ret
;
}
...
...
This diff is collapsed.
Click to expand it.
sound/soc/codecs/arizona.c
浏览文件 @
d61b04f8
...
...
@@ -1929,6 +1929,25 @@ static struct {
{
1000000
,
13500000
,
0
,
1
},
};
static
const
unsigned
int
pseudo_fref_max
[
ARIZONA_FLL_MAX_FRATIO
]
=
{
13500000
,
6144000
,
6144000
,
3072000
,
3072000
,
2822400
,
2822400
,
1536000
,
1536000
,
1536000
,
1536000
,
1536000
,
1536000
,
1536000
,
1536000
,
768000
,
};
static
struct
{
unsigned
int
min
;
unsigned
int
max
;
...
...
@@ -2042,16 +2061,32 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
/* Adjust FRATIO/refdiv to avoid integer mode if possible */
refdiv
=
cfg
->
refdiv
;
arizona_fll_dbg
(
fll
,
"pseudo: initial ratio=%u fref=%u refdiv=%u
\n
"
,
init_ratio
,
Fref
,
refdiv
);
while
(
div
<=
ARIZONA_FLL_MAX_REFDIV
)
{
for
(
ratio
=
init_ratio
;
ratio
<=
ARIZONA_FLL_MAX_FRATIO
;
ratio
++
)
{
if
((
ARIZONA_FLL_VCO_CORNER
/
2
)
/
(
fll
->
vco_mult
*
ratio
)
<
Fref
)
(
fll
->
vco_mult
*
ratio
)
<
Fref
)
{
arizona_fll_dbg
(
fll
,
"pseudo: hit VCO corner
\n
"
);
break
;
}
if
(
Fref
>
pseudo_fref_max
[
ratio
-
1
])
{
arizona_fll_dbg
(
fll
,
"pseudo: exceeded max fref(%u) for ratio=%u
\n
"
,
pseudo_fref_max
[
ratio
-
1
],
ratio
);
break
;
}
if
(
target
%
(
ratio
*
Fref
))
{
cfg
->
refdiv
=
refdiv
;
cfg
->
fratio
=
ratio
-
1
;
arizona_fll_dbg
(
fll
,
"pseudo: found fref=%u refdiv=%d(%d) ratio=%d
\n
"
,
Fref
,
refdiv
,
div
,
ratio
);
return
ratio
;
}
}
...
...
@@ -2060,6 +2095,9 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
if
(
target
%
(
ratio
*
Fref
))
{
cfg
->
refdiv
=
refdiv
;
cfg
->
fratio
=
ratio
-
1
;
arizona_fll_dbg
(
fll
,
"pseudo: found fref=%u refdiv=%d(%d) ratio=%d
\n
"
,
Fref
,
refdiv
,
div
,
ratio
);
return
ratio
;
}
}
...
...
@@ -2068,6 +2106,9 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
Fref
/=
2
;
refdiv
++
;
init_ratio
=
arizona_find_fratio
(
Fref
,
NULL
);
arizona_fll_dbg
(
fll
,
"pseudo: change fref=%u refdiv=%d(%d) ratio=%u
\n
"
,
Fref
,
refdiv
,
div
,
init_ratio
);
}
arizona_fll_warn
(
fll
,
"Falling back to integer mode operation
\n
"
);
...
...
This diff is collapsed.
Click to expand it.
sound/soc/codecs/rt286.c
浏览文件 @
d61b04f8
...
...
@@ -266,6 +266,8 @@ static int rt286_jack_detect(struct rt286_priv *rt286, bool *hp, bool *mic)
}
else
{
*
mic
=
false
;
regmap_write
(
rt286
->
regmap
,
RT286_SET_MIC1
,
0x20
);
regmap_update_bits
(
rt286
->
regmap
,
RT286_CBJ_CTRL1
,
0x0400
,
0x0000
);
}
}
else
{
regmap_read
(
rt286
->
regmap
,
RT286_GET_HP_SENSE
,
&
buf
);
...
...
@@ -470,24 +472,6 @@ static int rt286_set_dmic1_event(struct snd_soc_dapm_widget *w,
return
0
;
}
static
int
rt286_vref_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_to_codec
(
w
->
dapm
);
switch
(
event
)
{
case
SND_SOC_DAPM_PRE_PMU
:
snd_soc_update_bits
(
codec
,
RT286_CBJ_CTRL1
,
0x0400
,
0x0000
);
mdelay
(
50
);
break
;
default:
return
0
;
}
return
0
;
}
static
int
rt286_ldo2_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
...
...
@@ -536,7 +520,7 @@ static const struct snd_soc_dapm_widget rt286_dapm_widgets[] = {
SND_SOC_DAPM_SUPPLY_S
(
"HV"
,
1
,
RT286_POWER_CTRL1
,
12
,
1
,
NULL
,
0
),
SND_SOC_DAPM_SUPPLY
(
"VREF"
,
RT286_POWER_CTRL1
,
0
,
1
,
rt286_vref_event
,
SND_SOC_DAPM_PRE_PMU
),
0
,
1
,
NULL
,
0
),
SND_SOC_DAPM_SUPPLY_S
(
"LDO1"
,
1
,
RT286_POWER_CTRL2
,
2
,
0
,
NULL
,
0
),
SND_SOC_DAPM_SUPPLY_S
(
"LDO2"
,
2
,
RT286_POWER_CTRL1
,
...
...
@@ -910,8 +894,6 @@ static int rt286_set_bias_level(struct snd_soc_codec *codec,
case
SND_SOC_BIAS_ON
:
mdelay
(
10
);
snd_soc_update_bits
(
codec
,
RT286_CBJ_CTRL1
,
0x0400
,
0x0400
);
snd_soc_update_bits
(
codec
,
RT286_DC_GAIN
,
0x200
,
0x0
);
...
...
@@ -920,8 +902,6 @@ static int rt286_set_bias_level(struct snd_soc_codec *codec,
case
SND_SOC_BIAS_STANDBY
:
snd_soc_write
(
codec
,
RT286_SET_AUDIO_POWER
,
AC_PWRST_D3
);
snd_soc_update_bits
(
codec
,
RT286_CBJ_CTRL1
,
0x0400
,
0x0000
);
break
;
default:
...
...
This diff is collapsed.
Click to expand it.
sound/soc/codecs/rt5645.c
浏览文件 @
d61b04f8
...
...
@@ -776,7 +776,7 @@ static const struct snd_kcontrol_new rt5645_snd_controls[] = {
/* IN1/IN2 Control */
SOC_SINGLE_TLV
(
"IN1 Boost"
,
RT5645_IN1_CTRL1
,
RT5645_BST_SFT1
,
8
,
0
,
bst_tlv
),
RT5645_BST_SFT1
,
12
,
0
,
bst_tlv
),
SOC_SINGLE_TLV
(
"IN2 Boost"
,
RT5645_IN2_CTRL
,
RT5645_BST_SFT2
,
8
,
0
,
bst_tlv
),
...
...
This diff is collapsed.
Click to expand it.
sound/soc/codecs/rt5659.c
浏览文件 @
d61b04f8
...
...
@@ -3985,7 +3985,6 @@ static int rt5659_i2c_probe(struct i2c_client *i2c,
if
(
rt5659
==
NULL
)
return
-
ENOMEM
;
rt5659
->
i2c
=
i2c
;
i2c_set_clientdata
(
i2c
,
rt5659
);
if
(
pdata
)
...
...
@@ -4157,24 +4156,17 @@ static int rt5659_i2c_probe(struct i2c_client *i2c,
INIT_DELAYED_WORK
(
&
rt5659
->
jack_detect_work
,
rt5659_jack_detect_work
);
if
(
rt5659
->
i2c
->
irq
)
{
ret
=
request_threaded_irq
(
rt5659
->
i2c
->
irq
,
NULL
,
rt5659_irq
,
IRQF_TRIGGER_RISING
|
IRQF_TRIGGER_FALLING
if
(
i2c
->
irq
)
{
ret
=
devm_request_threaded_irq
(
&
i2c
->
dev
,
i2c
->
irq
,
NULL
,
rt5659_irq
,
IRQF_TRIGGER_RISING
|
IRQF_TRIGGER_FALLING
|
IRQF_ONESHOT
,
"rt5659"
,
rt5659
);
if
(
ret
)
dev_err
(
&
i2c
->
dev
,
"Failed to reguest IRQ: %d
\n
"
,
ret
);
}
ret
=
snd_soc_register_codec
(
&
i2c
->
dev
,
&
soc_codec_dev_rt5659
,
ret
urn
snd_soc_register_codec
(
&
i2c
->
dev
,
&
soc_codec_dev_rt5659
,
rt5659_dai
,
ARRAY_SIZE
(
rt5659_dai
));
if
(
ret
)
{
if
(
rt5659
->
i2c
->
irq
)
free_irq
(
rt5659
->
i2c
->
irq
,
rt5659
);
}
return
0
;
}
static
int
rt5659_i2c_remove
(
struct
i2c_client
*
i2c
)
...
...
@@ -4191,24 +4183,29 @@ void rt5659_i2c_shutdown(struct i2c_client *client)
regmap_write
(
rt5659
->
regmap
,
RT5659_RESET
,
0
);
}
#ifdef CONFIG_OF
static
const
struct
of_device_id
rt5659_of_match
[]
=
{
{
.
compatible
=
"realtek,rt5658"
,
},
{
.
compatible
=
"realtek,rt5659"
,
},
{},
{
},
};
MODULE_DEVICE_TABLE
(
of
,
rt5659_of_match
);
#endif
#ifdef CONFIG_ACPI
static
struct
acpi_device_id
rt5659_acpi_match
[]
=
{
{
"10EC5658"
,
0
},
{
"10EC5659"
,
0
},
{
},
{
"10EC5658"
,
0
,
},
{
"10EC5659"
,
0
,
},
{
},
};
MODULE_DEVICE_TABLE
(
acpi
,
rt5659_acpi_match
);
#endif
struct
i2c_driver
rt5659_i2c_driver
=
{
.
driver
=
{
.
name
=
"rt5659"
,
.
owner
=
THIS_MODULE
,
.
of_match_table
=
rt5659_of_match
,
.
of_match_table
=
of_match_ptr
(
rt5659_of_match
)
,
.
acpi_match_table
=
ACPI_PTR
(
rt5659_acpi_match
),
},
.
probe
=
rt5659_i2c_probe
,
...
...
This diff is collapsed.
Click to expand it.
sound/soc/codecs/rt5659.h
浏览文件 @
d61b04f8
...
...
@@ -1792,7 +1792,6 @@ struct rt5659_priv {
struct
snd_soc_codec
*
codec
;
struct
rt5659_platform_data
pdata
;
struct
regmap
*
regmap
;
struct
i2c_client
*
i2c
;
struct
gpio_desc
*
gpiod_ldo1_en
;
struct
gpio_desc
*
gpiod_reset
;
struct
snd_soc_jack
*
hs_jack
;
...
...
This diff is collapsed.
Click to expand it.
sound/soc/codecs/sigmadsp-i2c.c
浏览文件 @
d61b04f8
...
...
@@ -31,7 +31,10 @@ static int sigmadsp_write_i2c(void *control_data,
kfree
(
buf
);
return
ret
;
if
(
ret
<
0
)
return
ret
;
return
0
;
}
static
int
sigmadsp_read_i2c
(
void
*
control_data
,
...
...
This diff is collapsed.
Click to expand it.
sound/soc/codecs/wm5110.c
浏览文件 @
d61b04f8
...
...
@@ -2382,6 +2382,7 @@ static int wm5110_probe(struct platform_device *pdev)
static
int
wm5110_remove
(
struct
platform_device
*
pdev
)
{
snd_soc_unregister_platform
(
&
pdev
->
dev
);
snd_soc_unregister_codec
(
&
pdev
->
dev
);
pm_runtime_disable
(
&
pdev
->
dev
);
...
...
This diff is collapsed.
Click to expand it.
sound/soc/codecs/wm8960.c
浏览文件 @
d61b04f8
...
...
@@ -240,13 +240,13 @@ SOC_DOUBLE_R("Capture Volume ZC Switch", WM8960_LINVOL, WM8960_RINVOL,
SOC_DOUBLE_R
(
"Capture Switch"
,
WM8960_LINVOL
,
WM8960_RINVOL
,
7
,
1
,
1
),
SOC_SINGLE_TLV
(
"
Right Input Boost Mixer R
INPUT3 Volume"
,
SOC_SINGLE_TLV
(
"
Left Input Boost Mixer L
INPUT3 Volume"
,
WM8960_INBMIX1
,
4
,
7
,
0
,
lineinboost_tlv
),
SOC_SINGLE_TLV
(
"
Right Input Boost Mixer R
INPUT2 Volume"
,
SOC_SINGLE_TLV
(
"
Left Input Boost Mixer L
INPUT2 Volume"
,
WM8960_INBMIX1
,
1
,
7
,
0
,
lineinboost_tlv
),
SOC_SINGLE_TLV
(
"
Left Input Boost Mixer L
INPUT3 Volume"
,
SOC_SINGLE_TLV
(
"
Right Input Boost Mixer R
INPUT3 Volume"
,
WM8960_INBMIX2
,
4
,
7
,
0
,
lineinboost_tlv
),
SOC_SINGLE_TLV
(
"
Left Input Boost Mixer L
INPUT2 Volume"
,
SOC_SINGLE_TLV
(
"
Right Input Boost Mixer R
INPUT2 Volume"
,
WM8960_INBMIX2
,
1
,
7
,
0
,
lineinboost_tlv
),
SOC_SINGLE_TLV
(
"Right Input Boost Mixer RINPUT1 Volume"
,
WM8960_RINPATH
,
4
,
3
,
0
,
micboost_tlv
),
...
...
@@ -643,29 +643,31 @@ static int wm8960_configure_clocking(struct snd_soc_codec *codec)
return
-
EINVAL
;
}
/* check if the sysclk frequency is available. */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
sysclk_divs
);
++
i
)
{
if
(
sysclk_divs
[
i
]
==
-
1
)
continue
;
sysclk
=
freq_out
/
sysclk_divs
[
i
];
for
(
j
=
0
;
j
<
ARRAY_SIZE
(
dac_divs
);
++
j
)
{
if
(
sysclk
==
dac_divs
[
j
]
*
lrclk
)
{
if
(
wm8960
->
clk_id
!=
WM8960_SYSCLK_PLL
)
{
/* check if the sysclk frequency is available. */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
sysclk_divs
);
++
i
)
{
if
(
sysclk_divs
[
i
]
==
-
1
)
continue
;
sysclk
=
freq_out
/
sysclk_divs
[
i
];
for
(
j
=
0
;
j
<
ARRAY_SIZE
(
dac_divs
);
++
j
)
{
if
(
sysclk
!=
dac_divs
[
j
]
*
lrclk
)
continue
;
for
(
k
=
0
;
k
<
ARRAY_SIZE
(
bclk_divs
);
++
k
)
if
(
sysclk
==
bclk
*
bclk_divs
[
k
]
/
10
)
break
;
if
(
k
!=
ARRAY_SIZE
(
bclk_divs
))
break
;
}
if
(
j
!=
ARRAY_SIZE
(
dac_divs
))
break
;
}
if
(
j
!=
ARRAY_SIZE
(
dac_divs
))
break
;
}
if
(
i
!=
ARRAY_SIZE
(
sysclk_divs
))
{
goto
configure_clock
;
}
else
if
(
wm8960
->
clk_id
!=
WM8960_SYSCLK_AUTO
)
{
dev_err
(
codec
->
dev
,
"failed to configure clock
\n
"
);
return
-
EINVAL
;
if
(
i
!=
ARRAY_SIZE
(
sysclk_divs
))
{
goto
configure_clock
;
}
else
if
(
wm8960
->
clk_id
!=
WM8960_SYSCLK_AUTO
)
{
dev_err
(
codec
->
dev
,
"failed to configure clock
\n
"
);
return
-
EINVAL
;
}
}
/* get a available pll out frequency and set pll */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
sysclk_divs
);
++
i
)
{
...
...
This diff is collapsed.
Click to expand it.
sound/soc/dwc/designware_i2s.c
浏览文件 @
d61b04f8
...
...
@@ -645,6 +645,8 @@ static int dw_i2s_probe(struct platform_device *pdev)
dev
->
dev
=
&
pdev
->
dev
;
dev
->
i2s_reg_comp1
=
I2S_COMP_PARAM_1
;
dev
->
i2s_reg_comp2
=
I2S_COMP_PARAM_2
;
if
(
pdata
)
{
dev
->
capability
=
pdata
->
cap
;
clk_id
=
NULL
;
...
...
@@ -652,9 +654,6 @@ static int dw_i2s_probe(struct platform_device *pdev)
if
(
dev
->
quirks
&
DW_I2S_QUIRK_COMP_REG_OFFSET
)
{
dev
->
i2s_reg_comp1
=
pdata
->
i2s_reg_comp1
;
dev
->
i2s_reg_comp2
=
pdata
->
i2s_reg_comp2
;
}
else
{
dev
->
i2s_reg_comp1
=
I2S_COMP_PARAM_1
;
dev
->
i2s_reg_comp2
=
I2S_COMP_PARAM_2
;
}
ret
=
dw_configure_dai_by_pd
(
dev
,
dw_i2s_dai
,
res
,
pdata
);
}
else
{
...
...
This diff is collapsed.
Click to expand it.
sound/soc/fsl/fsl_ssi.c
浏览文件 @
d61b04f8
...
...
@@ -112,20 +112,6 @@ struct fsl_ssi_rxtx_reg_val {
struct
fsl_ssi_reg_val
tx
;
};
static
const
struct
reg_default
fsl_ssi_reg_defaults
[]
=
{
{
CCSR_SSI_SCR
,
0x00000000
},
{
CCSR_SSI_SIER
,
0x00003003
},
{
CCSR_SSI_STCR
,
0x00000200
},
{
CCSR_SSI_SRCR
,
0x00000200
},
{
CCSR_SSI_STCCR
,
0x00040000
},
{
CCSR_SSI_SRCCR
,
0x00040000
},
{
CCSR_SSI_SACNT
,
0x00000000
},
{
CCSR_SSI_STMSK
,
0x00000000
},
{
CCSR_SSI_SRMSK
,
0x00000000
},
{
CCSR_SSI_SACCEN
,
0x00000000
},
{
CCSR_SSI_SACCDIS
,
0x00000000
},
};
static
bool
fsl_ssi_readable_reg
(
struct
device
*
dev
,
unsigned
int
reg
)
{
switch
(
reg
)
{
...
...
@@ -190,8 +176,7 @@ static const struct regmap_config fsl_ssi_regconfig = {
.
val_bits
=
32
,
.
reg_stride
=
4
,
.
val_format_endian
=
REGMAP_ENDIAN_NATIVE
,
.
reg_defaults
=
fsl_ssi_reg_defaults
,
.
num_reg_defaults
=
ARRAY_SIZE
(
fsl_ssi_reg_defaults
),
.
num_reg_defaults_raw
=
CCSR_SSI_SACCDIS
/
sizeof
(
uint32_t
)
+
1
,
.
readable_reg
=
fsl_ssi_readable_reg
,
.
volatile_reg
=
fsl_ssi_volatile_reg
,
.
precious_reg
=
fsl_ssi_precious_reg
,
...
...
@@ -201,6 +186,7 @@ static const struct regmap_config fsl_ssi_regconfig = {
struct
fsl_ssi_soc_data
{
bool
imx
;
bool
imx21regs
;
/* imx21-class SSI - no SACC{ST,EN,DIS} regs */
bool
offline_config
;
u32
sisr_write_mask
;
};
...
...
@@ -303,6 +289,7 @@ static struct fsl_ssi_soc_data fsl_ssi_mpc8610 = {
static
struct
fsl_ssi_soc_data
fsl_ssi_imx21
=
{
.
imx
=
true
,
.
imx21regs
=
true
,
.
offline_config
=
true
,
.
sisr_write_mask
=
0
,
};
...
...
@@ -586,8 +573,12 @@ static void fsl_ssi_setup_ac97(struct fsl_ssi_private *ssi_private)
*/
regmap_write
(
regs
,
CCSR_SSI_SACNT
,
CCSR_SSI_SACNT_AC97EN
|
CCSR_SSI_SACNT_FV
);
regmap_write
(
regs
,
CCSR_SSI_SACCDIS
,
0xff
);
regmap_write
(
regs
,
CCSR_SSI_SACCEN
,
0x300
);
/* no SACC{ST,EN,DIS} regs on imx21-class SSI */
if
(
!
ssi_private
->
soc
->
imx21regs
)
{
regmap_write
(
regs
,
CCSR_SSI_SACCDIS
,
0xff
);
regmap_write
(
regs
,
CCSR_SSI_SACCEN
,
0x300
);
}
/*
* Enable SSI, Transmit and Receive. AC97 has to communicate with the
...
...
@@ -1397,6 +1388,7 @@ static int fsl_ssi_probe(struct platform_device *pdev)
struct
resource
*
res
;
void
__iomem
*
iomem
;
char
name
[
64
];
struct
regmap_config
regconfig
=
fsl_ssi_regconfig
;
of_id
=
of_match_device
(
fsl_ssi_ids
,
&
pdev
->
dev
);
if
(
!
of_id
||
!
of_id
->
data
)
...
...
@@ -1444,15 +1436,25 @@ static int fsl_ssi_probe(struct platform_device *pdev)
return
PTR_ERR
(
iomem
);
ssi_private
->
ssi_phys
=
res
->
start
;
if
(
ssi_private
->
soc
->
imx21regs
)
{
/*
* According to datasheet imx21-class SSI
* don't have SACC{ST,EN,DIS} regs.
*/
regconfig
.
max_register
=
CCSR_SSI_SRMSK
;
regconfig
.
num_reg_defaults_raw
=
CCSR_SSI_SRMSK
/
sizeof
(
uint32_t
)
+
1
;
}
ret
=
of_property_match_string
(
np
,
"clock-names"
,
"ipg"
);
if
(
ret
<
0
)
{
ssi_private
->
has_ipg_clk_name
=
false
;
ssi_private
->
regs
=
devm_regmap_init_mmio
(
&
pdev
->
dev
,
iomem
,
&
fsl_ssi_
regconfig
);
&
regconfig
);
}
else
{
ssi_private
->
has_ipg_clk_name
=
true
;
ssi_private
->
regs
=
devm_regmap_init_mmio_clk
(
&
pdev
->
dev
,
"ipg"
,
iomem
,
&
fsl_ssi_
regconfig
);
"ipg"
,
iomem
,
&
regconfig
);
}
if
(
IS_ERR
(
ssi_private
->
regs
))
{
dev_err
(
&
pdev
->
dev
,
"Failed to init register map
\n
"
);
...
...
This diff is collapsed.
Click to expand it.
sound/soc/fsl/imx-spdif.c
浏览文件 @
d61b04f8
...
...
@@ -72,8 +72,6 @@ static int imx_spdif_audio_probe(struct platform_device *pdev)
goto
end
;
}
platform_set_drvdata
(
pdev
,
data
);
end:
of_node_put
(
spdif_np
);
...
...
This diff is collapsed.
Click to expand it.
sound/soc/generic/simple-card.c
浏览文件 @
d61b04f8
...
...
@@ -99,7 +99,7 @@ static int asoc_simple_card_hw_params(struct snd_pcm_substream *substream,
if
(
ret
&&
ret
!=
-
ENOTSUPP
)
goto
err
;
}
return
0
;
err:
return
ret
;
}
...
...
This diff is collapsed.
Click to expand it.
sound/soc/intel/Kconfig
浏览文件 @
d61b04f8
...
...
@@ -30,11 +30,15 @@ config SND_SST_IPC_ACPI
config SND_SOC_INTEL_SST
tristate
select SND_SOC_INTEL_SST_ACPI if ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
depends on (X86 || COMPILE_TEST)
config SND_SOC_INTEL_SST_ACPI
tristate
config SND_SOC_INTEL_SST_MATCH
tristate
config SND_SOC_INTEL_HASWELL
tristate
...
...
@@ -57,7 +61,7 @@ config SND_SOC_INTEL_HASWELL_MACH
config SND_SOC_INTEL_BYT_RT5640_MACH
tristate "ASoC Audio driver for Intel Baytrail with RT5640 codec"
depends on X86_INTEL_LPSS && I2C
depends on DW_DMAC_CORE=y && (SND_S
OC_INTEL_BYTCR_RT5640_MACH
= n)
depends on DW_DMAC_CORE=y && (SND_S
ST_IPC_ACPI
= n)
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_BAYTRAIL
select SND_SOC_RT5640
...
...
@@ -69,7 +73,7 @@ config SND_SOC_INTEL_BYT_RT5640_MACH
config SND_SOC_INTEL_BYT_MAX98090_MACH
tristate "ASoC Audio driver for Intel Baytrail with MAX98090 codec"
depends on X86_INTEL_LPSS && I2C
depends on DW_DMAC_CORE=y
depends on DW_DMAC_CORE=y
&& (SND_SST_IPC_ACPI = n)
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_BAYTRAIL
select SND_SOC_MAX98090
...
...
@@ -97,6 +101,7 @@ config SND_SOC_INTEL_BYTCR_RT5640_MACH
select SND_SOC_RT5640
select SND_SST_MFLD_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
This adds support for ASoC machine driver for Intel(R) Baytrail and Baytrail-CR
platforms with RT5640 audio codec.
...
...
@@ -109,6 +114,7 @@ config SND_SOC_INTEL_BYTCR_RT5651_MACH
select SND_SOC_RT5651
select SND_SST_MFLD_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
This adds support for ASoC machine driver for Intel(R) Baytrail and Baytrail-CR
platforms with RT5651 audio codec.
...
...
@@ -121,6 +127,7 @@ config SND_SOC_INTEL_CHT_BSW_RT5672_MACH
select SND_SOC_RT5670
select SND_SST_MFLD_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
This adds support for ASoC machine driver for Intel(R) Cherrytrail & Braswell
platforms with RT5672 audio codec.
...
...
@@ -133,6 +140,7 @@ config SND_SOC_INTEL_CHT_BSW_RT5645_MACH
select SND_SOC_RT5645
select SND_SST_MFLD_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
This adds support for ASoC machine driver for Intel(R) Cherrytrail & Braswell
platforms with RT5645/5650 audio codec.
...
...
@@ -145,6 +153,7 @@ config SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH
select SND_SOC_TS3A227E
select SND_SST_MFLD_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
This adds support for ASoC machine driver for Intel(R) Cherrytrail & Braswell
platforms with MAX98090 audio codec it also can support TI jack chip as aux device.
...
...
This diff is collapsed.
Click to expand it.
sound/soc/intel/atom/sst-mfld-platform-pcm.c
浏览文件 @
d61b04f8
...
...
@@ -528,6 +528,7 @@ static struct snd_soc_dai_driver sst_platform_dai[] = {
.
ops
=
&
sst_compr_dai_ops
,
.
playback
=
{
.
stream_name
=
"Compress Playback"
,
.
channels_min
=
1
,
},
},
/* BE CPU Dais */
...
...
This diff is collapsed.
Click to expand it.
sound/soc/intel/boards/skl_rt286.c
浏览文件 @
d61b04f8
...
...
@@ -212,7 +212,10 @@ static int skylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd,
{
struct
snd_interval
*
channels
=
hw_param_interval
(
params
,
SNDRV_PCM_HW_PARAM_CHANNELS
);
channels
->
min
=
channels
->
max
=
4
;
if
(
params_channels
(
params
)
==
2
)
channels
->
min
=
channels
->
max
=
2
;
else
channels
->
min
=
channels
->
max
=
4
;
return
0
;
}
...
...
This diff is collapsed.
Click to expand it.
sound/soc/intel/common/Makefile
浏览文件 @
d61b04f8
snd-soc-sst-dsp-objs
:=
sst-dsp.o
ifneq
($(CONFIG_SND_SST_IPC_ACPI),)
snd-soc-sst-acpi-objs
:=
sst-match-acpi.o
else
snd-soc-sst-acpi-objs
:=
sst-acpi.o sst-match-acpi.o
endif
snd-soc-sst-acpi-objs
:=
sst-acpi.o
snd-soc-sst-match-objs
:=
sst-match-acpi.o
snd-soc-sst-ipc-objs
:=
sst-ipc.o
snd-soc-sst-dsp-$(CONFIG_DW_DMAC_CORE)
+=
sst-firmware.o
obj-$(CONFIG_SND_SOC_INTEL_SST)
+=
snd-soc-sst-dsp.o snd-soc-sst-ipc.o
obj-$(CONFIG_SND_SOC_INTEL_SST_ACPI)
+=
snd-soc-sst-acpi.o
obj-$(CONFIG_SND_SOC_INTEL_SST_MATCH)
+=
snd-soc-sst-match.o
This diff is collapsed.
Click to expand it.
sound/soc/intel/common/sst-acpi.c
浏览文件 @
d61b04f8
...
...
@@ -215,6 +215,7 @@ static struct sst_acpi_desc sst_acpi_broadwell_desc = {
.
dma_size
=
SST_LPT_DSP_DMA_SIZE
,
};
#if !IS_ENABLED(CONFIG_SND_SST_IPC_ACPI)
static
struct
sst_acpi_mach
baytrail_machines
[]
=
{
{
"10EC5640"
,
"byt-rt5640"
,
"intel/fw_sst_0f28.bin-48kHz_i2s_master"
,
NULL
,
NULL
,
NULL
},
{
"193C9890"
,
"byt-max98090"
,
"intel/fw_sst_0f28.bin-48kHz_i2s_master"
,
NULL
,
NULL
,
NULL
},
...
...
@@ -231,11 +232,14 @@ static struct sst_acpi_desc sst_acpi_baytrail_desc = {
.
sst_id
=
SST_DEV_ID_BYT
,
.
resindex_dma_base
=
-
1
,
};
#endif
static
const
struct
acpi_device_id
sst_acpi_match
[]
=
{
{
"INT33C8"
,
(
unsigned
long
)
&
sst_acpi_haswell_desc
},
{
"INT3438"
,
(
unsigned
long
)
&
sst_acpi_broadwell_desc
},
#if !IS_ENABLED(CONFIG_SND_SST_IPC_ACPI)
{
"80860F28"
,
(
unsigned
long
)
&
sst_acpi_baytrail_desc
},
#endif
{
}
};
MODULE_DEVICE_TABLE
(
acpi
,
sst_acpi_match
);
...
...
This diff is collapsed.
Click to expand it.
sound/soc/intel/common/sst-match-acpi.c
浏览文件 @
d61b04f8
...
...
@@ -41,3 +41,6 @@ struct sst_acpi_mach *sst_acpi_find_machine(struct sst_acpi_mach *machines)
return
NULL
;
}
EXPORT_SYMBOL_GPL
(
sst_acpi_find_machine
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_DESCRIPTION
(
"Intel Common ACPI Match module"
);
This diff is collapsed.
Click to expand it.
sound/soc/intel/skylake/skl-messages.c
浏览文件 @
d61b04f8
...
...
@@ -688,14 +688,14 @@ int skl_unbind_modules(struct skl_sst *ctx,
/* get src queue index */
src_index
=
skl_get_queue_index
(
src_mcfg
->
m_out_pin
,
dst_id
,
out_max
);
if
(
src_index
<
0
)
return
-
EINVAL
;
return
0
;
msg
.
src_queue
=
src_index
;
/* get dst queue index */
dst_index
=
skl_get_queue_index
(
dst_mcfg
->
m_in_pin
,
src_id
,
in_max
);
if
(
dst_index
<
0
)
return
-
EINVAL
;
return
0
;
msg
.
dst_queue
=
dst_index
;
...
...
@@ -747,7 +747,7 @@ int skl_bind_modules(struct skl_sst *ctx,
skl_dump_bind_info
(
ctx
,
src_mcfg
,
dst_mcfg
);
if
(
src_mcfg
->
m_state
<
SKL_MODULE_INIT_DONE
&&
if
(
src_mcfg
->
m_state
<
SKL_MODULE_INIT_DONE
||
dst_mcfg
->
m_state
<
SKL_MODULE_INIT_DONE
)
return
0
;
...
...
This diff is collapsed.
Click to expand it.
sound/soc/intel/skylake/skl-pcm.c
浏览文件 @
d61b04f8
...
...
@@ -863,6 +863,7 @@ static int skl_get_delay_from_lpib(struct hdac_ext_bus *ebus,
else
delay
+=
hstream
->
bufsize
;
}
delay
=
(
hstream
->
bufsize
==
delay
)
?
0
:
delay
;
if
(
delay
>=
hstream
->
period_bytes
)
{
dev_info
(
bus
->
dev
,
...
...
This diff is collapsed.
Click to expand it.
sound/soc/intel/skylake/skl-topology.c
浏览文件 @
d61b04f8
...
...
@@ -54,12 +54,9 @@ static int is_skl_dsp_widget_type(struct snd_soc_dapm_widget *w)
/*
* Each pipelines needs memory to be allocated. Check if we have free memory
* from available pool. Then only add this to pool
* This is freed when pipe is deleted
* Note: DSP does actual memory management we only keep track for complete
* pool
* from available pool.
*/
static
bool
skl_
tplg_alloc_pipe_mem
(
struct
skl
*
skl
,
static
bool
skl_
is_pipe_mem_avail
(
struct
skl
*
skl
,
struct
skl_module_cfg
*
mconfig
)
{
struct
skl_sst
*
ctx
=
skl
->
skl_sst
;
...
...
@@ -74,10 +71,20 @@ static bool skl_tplg_alloc_pipe_mem(struct skl *skl,
"exceeds ppl memory available %d mem %d
\n
"
,
skl
->
resource
.
max_mem
,
skl
->
resource
.
mem
);
return
false
;
}
else
{
return
true
;
}
}
/*
* Add the mem to the mem pool. This is freed when pipe is deleted.
* Note: DSP does actual memory management we only keep track for complete
* pool
*/
static
void
skl_tplg_alloc_pipe_mem
(
struct
skl
*
skl
,
struct
skl_module_cfg
*
mconfig
)
{
skl
->
resource
.
mem
+=
mconfig
->
pipe
->
memory_pages
;
return
true
;
}
/*
...
...
@@ -85,10 +92,10 @@ static bool skl_tplg_alloc_pipe_mem(struct skl *skl,
* quantified in MCPS (Million Clocks Per Second) required for module/pipe
*
* Each pipelines needs mcps to be allocated. Check if we have mcps for this
* pipe. This adds the mcps to driver counter
* This is removed on pipeline delete
* pipe.
*/
static
bool
skl_tplg_alloc_pipe_mcps
(
struct
skl
*
skl
,
static
bool
skl_is_pipe_mcps_avail
(
struct
skl
*
skl
,
struct
skl_module_cfg
*
mconfig
)
{
struct
skl_sst
*
ctx
=
skl
->
skl_sst
;
...
...
@@ -98,13 +105,18 @@ static bool skl_tplg_alloc_pipe_mcps(struct skl *skl,
"%s: module_id %d instance %d
\n
"
,
__func__
,
mconfig
->
id
.
module_id
,
mconfig
->
id
.
instance_id
);
dev_err
(
ctx
->
dev
,
"exceeds ppl m
emory
available %d > mem %d
\n
"
,
"exceeds ppl m
cps
available %d > mem %d
\n
"
,
skl
->
resource
.
max_mcps
,
skl
->
resource
.
mcps
);
return
false
;
}
else
{
return
true
;
}
}
static
void
skl_tplg_alloc_pipe_mcps
(
struct
skl
*
skl
,
struct
skl_module_cfg
*
mconfig
)
{
skl
->
resource
.
mcps
+=
mconfig
->
mcps
;
return
true
;
}
/*
...
...
@@ -411,7 +423,7 @@ skl_tplg_init_pipe_modules(struct skl *skl, struct skl_pipe *pipe)
mconfig
=
w
->
priv
;
/* check resource available */
if
(
!
skl_
tplg_alloc_pipe_mcps
(
skl
,
mconfig
))
if
(
!
skl_
is_pipe_mcps_avail
(
skl
,
mconfig
))
return
-
ENOMEM
;
if
(
mconfig
->
is_loadable
&&
ctx
->
dsp
->
fw_ops
.
load_mod
)
{
...
...
@@ -435,6 +447,7 @@ skl_tplg_init_pipe_modules(struct skl *skl, struct skl_pipe *pipe)
ret
=
skl_tplg_set_module_params
(
w
,
ctx
);
if
(
ret
<
0
)
return
ret
;
skl_tplg_alloc_pipe_mcps
(
skl
,
mconfig
);
}
return
0
;
...
...
@@ -477,10 +490,10 @@ static int skl_tplg_mixer_dapm_pre_pmu_event(struct snd_soc_dapm_widget *w,
struct
skl_sst
*
ctx
=
skl
->
skl_sst
;
/* check resource available */
if
(
!
skl_
tplg_alloc_pipe_mcps
(
skl
,
mconfig
))
if
(
!
skl_
is_pipe_mcps_avail
(
skl
,
mconfig
))
return
-
EBUSY
;
if
(
!
skl_
tplg_alloc_pipe_mem
(
skl
,
mconfig
))
if
(
!
skl_
is_pipe_mem_avail
(
skl
,
mconfig
))
return
-
ENOMEM
;
/*
...
...
@@ -526,11 +539,15 @@ static int skl_tplg_mixer_dapm_pre_pmu_event(struct snd_soc_dapm_widget *w,
src_module
=
dst_module
;
}
skl_tplg_alloc_pipe_mem
(
skl
,
mconfig
);
skl_tplg_alloc_pipe_mcps
(
skl
,
mconfig
);
return
0
;
}
static
int
skl_tplg_bind_sinks
(
struct
snd_soc_dapm_widget
*
w
,
struct
skl
*
skl
,
struct
snd_soc_dapm_widget
*
src_w
,
struct
skl_module_cfg
*
src_mconfig
)
{
struct
snd_soc_dapm_path
*
p
;
...
...
@@ -547,6 +564,10 @@ static int skl_tplg_bind_sinks(struct snd_soc_dapm_widget *w,
dev_dbg
(
ctx
->
dev
,
"%s: sink widget=%s
\n
"
,
__func__
,
p
->
sink
->
name
);
next_sink
=
p
->
sink
;
if
(
!
is_skl_dsp_widget_type
(
p
->
sink
))
return
skl_tplg_bind_sinks
(
p
->
sink
,
skl
,
src_w
,
src_mconfig
);
/*
* here we will check widgets in sink pipelines, so that
* can be any widgets type and we are only interested if
...
...
@@ -576,7 +597,7 @@ static int skl_tplg_bind_sinks(struct snd_soc_dapm_widget *w,
}
if
(
!
sink
)
return
skl_tplg_bind_sinks
(
next_sink
,
skl
,
src_mconfig
);
return
skl_tplg_bind_sinks
(
next_sink
,
skl
,
src_
w
,
src_
mconfig
);
return
0
;
}
...
...
@@ -605,7 +626,7 @@ static int skl_tplg_pga_dapm_pre_pmu_event(struct snd_soc_dapm_widget *w,
* if sink is not started, start sink pipe first, then start
* this pipe
*/
ret
=
skl_tplg_bind_sinks
(
w
,
skl
,
src_mconfig
);
ret
=
skl_tplg_bind_sinks
(
w
,
skl
,
w
,
src_mconfig
);
if
(
ret
)
return
ret
;
...
...
@@ -773,10 +794,7 @@ static int skl_tplg_mixer_dapm_post_pmd_event(struct snd_soc_dapm_widget *w,
continue
;
}
ret
=
skl_unbind_modules
(
ctx
,
src_module
,
dst_module
);
if
(
ret
<
0
)
return
ret
;
skl_unbind_modules
(
ctx
,
src_module
,
dst_module
);
src_module
=
dst_module
;
}
...
...
@@ -814,9 +832,6 @@ static int skl_tplg_pga_dapm_post_pmd_event(struct snd_soc_dapm_widget *w,
* This is a connecter and if path is found that means
* unbind between source and sink has not happened yet
*/
ret
=
skl_stop_pipe
(
ctx
,
sink_mconfig
->
pipe
);
if
(
ret
<
0
)
return
ret
;
ret
=
skl_unbind_modules
(
ctx
,
src_mconfig
,
sink_mconfig
);
}
...
...
@@ -842,6 +857,12 @@ static int skl_tplg_vmixer_event(struct snd_soc_dapm_widget *w,
case
SND_SOC_DAPM_PRE_PMU
:
return
skl_tplg_mixer_dapm_pre_pmu_event
(
w
,
skl
);
case
SND_SOC_DAPM_POST_PMU
:
return
skl_tplg_mixer_dapm_post_pmu_event
(
w
,
skl
);
case
SND_SOC_DAPM_PRE_PMD
:
return
skl_tplg_mixer_dapm_pre_pmd_event
(
w
,
skl
);
case
SND_SOC_DAPM_POST_PMD
:
return
skl_tplg_mixer_dapm_post_pmd_event
(
w
,
skl
);
}
...
...
@@ -916,6 +937,13 @@ static int skl_tplg_tlv_control_get(struct snd_kcontrol *kcontrol,
skl_get_module_params
(
skl
->
skl_sst
,
(
u32
*
)
bc
->
params
,
bc
->
max
,
bc
->
param_id
,
mconfig
);
/* decrement size for TLV header */
size
-=
2
*
sizeof
(
u32
);
/* check size as we don't want to send kernel data */
if
(
size
>
bc
->
max
)
size
=
bc
->
max
;
if
(
bc
->
params
)
{
if
(
copy_to_user
(
data
,
&
bc
->
param_id
,
sizeof
(
u32
)))
return
-
EFAULT
;
...
...
@@ -1510,6 +1538,7 @@ int skl_tplg_init(struct snd_soc_platform *platform, struct hdac_ext_bus *ebus)
&
skl_tplg_ops
,
fw
,
0
);
if
(
ret
<
0
)
{
dev_err
(
bus
->
dev
,
"tplg component load failed%d
\n
"
,
ret
);
release_firmware
(
fw
);
return
-
EINVAL
;
}
...
...
This diff is collapsed.
Click to expand it.
sound/soc/intel/skylake/skl.c
浏览文件 @
d61b04f8
...
...
@@ -614,8 +614,6 @@ static int skl_probe(struct pci_dev *pci,
goto
out_unregister
;
/*configure PM */
pm_runtime_set_autosuspend_delay
(
bus
->
dev
,
SKL_SUSPEND_DELAY
);
pm_runtime_use_autosuspend
(
bus
->
dev
);
pm_runtime_put_noidle
(
bus
->
dev
);
pm_runtime_allow
(
bus
->
dev
);
...
...
This diff is collapsed.
Click to expand it.
sound/soc/mediatek/Kconfig
浏览文件 @
d61b04f8
...
...
@@ -9,7 +9,7 @@ config SND_SOC_MEDIATEK
config SND_SOC_MT8173_MAX98090
tristate "ASoC Audio driver for MT8173 with MAX98090 codec"
depends on SND_SOC_MEDIATEK
depends on SND_SOC_MEDIATEK
&& I2C
select SND_SOC_MAX98090
help
This adds ASoC driver for Mediatek MT8173 boards
...
...
@@ -19,7 +19,7 @@ config SND_SOC_MT8173_MAX98090
config SND_SOC_MT8173_RT5650_RT5676
tristate "ASoC Audio driver for MT8173 with RT5650 RT5676 codecs"
depends on SND_SOC_MEDIATEK
depends on SND_SOC_MEDIATEK
&& I2C
select SND_SOC_RT5645
select SND_SOC_RT5677
help
...
...
This diff is collapsed.
Click to expand it.
sound/soc/mxs/mxs-saif.c
浏览文件 @
d61b04f8
...
...
@@ -381,9 +381,19 @@ static int mxs_saif_startup(struct snd_pcm_substream *substream,
__raw_writel
(
BM_SAIF_CTRL_CLKGATE
,
saif
->
base
+
SAIF_CTRL
+
MXS_CLR_ADDR
);
clk_prepare
(
saif
->
clk
);
return
0
;
}
static
void
mxs_saif_shutdown
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
cpu_dai
)
{
struct
mxs_saif
*
saif
=
snd_soc_dai_get_drvdata
(
cpu_dai
);
clk_unprepare
(
saif
->
clk
);
}
/*
* Should only be called when port is inactive.
* although can be called multiple times by upper layers.
...
...
@@ -424,8 +434,6 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream,
return
ret
;
}
/* prepare clk in hw_param, enable in trigger */
clk_prepare
(
saif
->
clk
);
if
(
saif
!=
master_saif
)
{
/*
* Set an initial clock rate for the saif internal logic to work
...
...
@@ -611,6 +619,7 @@ static int mxs_saif_trigger(struct snd_pcm_substream *substream, int cmd,
static
const
struct
snd_soc_dai_ops
mxs_saif_dai_ops
=
{
.
startup
=
mxs_saif_startup
,
.
shutdown
=
mxs_saif_shutdown
,
.
trigger
=
mxs_saif_trigger
,
.
prepare
=
mxs_saif_prepare
,
.
hw_params
=
mxs_saif_hw_params
,
...
...
This diff is collapsed.
Click to expand it.
sound/soc/qcom/lpass-platform.c
浏览文件 @
d61b04f8
...
...
@@ -440,18 +440,18 @@ static irqreturn_t lpass_platform_lpaif_irq(int irq, void *data)
}
static
int
lpass_platform_alloc_buffer
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_pcm_runtime
*
soc_runtime
)
struct
snd_soc_pcm_runtime
*
rt
)
{
struct
snd_dma_buffer
*
buf
=
&
substream
->
dma_buffer
;
size_t
size
=
lpass_platform_pcm_hardware
.
buffer_bytes_max
;
buf
->
dev
.
type
=
SNDRV_DMA_TYPE_DEV
;
buf
->
dev
.
dev
=
soc_runtime
->
dev
;
buf
->
dev
.
dev
=
rt
->
platform
->
dev
;
buf
->
private_data
=
NULL
;
buf
->
area
=
dma_alloc_coherent
(
soc_runtime
->
dev
,
size
,
&
buf
->
addr
,
buf
->
area
=
dma_alloc_coherent
(
rt
->
platform
->
dev
,
size
,
&
buf
->
addr
,
GFP_KERNEL
);
if
(
!
buf
->
area
)
{
dev_err
(
soc_runtime
->
dev
,
"%s: Could not allocate DMA buffer
\n
"
,
dev_err
(
rt
->
platform
->
dev
,
"%s: Could not allocate DMA buffer
\n
"
,
__func__
);
return
-
ENOMEM
;
}
...
...
@@ -461,12 +461,12 @@ static int lpass_platform_alloc_buffer(struct snd_pcm_substream *substream,
}
static
void
lpass_platform_free_buffer
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_pcm_runtime
*
soc_runtime
)
struct
snd_soc_pcm_runtime
*
rt
)
{
struct
snd_dma_buffer
*
buf
=
&
substream
->
dma_buffer
;
if
(
buf
->
area
)
{
dma_free_coherent
(
soc_runtime
->
dev
,
buf
->
bytes
,
buf
->
area
,
dma_free_coherent
(
rt
->
dev
,
buf
->
bytes
,
buf
->
area
,
buf
->
addr
);
}
buf
->
area
=
NULL
;
...
...
@@ -499,9 +499,6 @@ static int lpass_platform_pcm_new(struct snd_soc_pcm_runtime *soc_runtime)
snd_soc_pcm_set_drvdata
(
soc_runtime
,
data
);
soc_runtime
->
dev
->
coherent_dma_mask
=
DMA_BIT_MASK
(
32
);
soc_runtime
->
dev
->
dma_mask
=
&
soc_runtime
->
dev
->
coherent_dma_mask
;
ret
=
lpass_platform_alloc_buffer
(
substream
,
soc_runtime
);
if
(
ret
)
return
ret
;
...
...
This diff is collapsed.
Click to expand it.
sound/soc/soc-dapm.c
浏览文件 @
d61b04f8
...
...
@@ -310,7 +310,7 @@ struct dapm_kcontrol_data {
};
static
int
dapm_kcontrol_data_alloc
(
struct
snd_soc_dapm_widget
*
widget
,
struct
snd_kcontrol
*
kcontrol
)
struct
snd_kcontrol
*
kcontrol
,
const
char
*
ctrl_name
)
{
struct
dapm_kcontrol_data
*
data
;
struct
soc_mixer_control
*
mc
;
...
...
@@ -333,7 +333,7 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
if
(
mc
->
autodisable
)
{
struct
snd_soc_dapm_widget
template
;
name
=
kasprintf
(
GFP_KERNEL
,
"%s %s"
,
kcontrol
->
id
.
name
,
name
=
kasprintf
(
GFP_KERNEL
,
"%s %s"
,
ctrl_
name
,
"Autodisable"
);
if
(
!
name
)
{
ret
=
-
ENOMEM
;
...
...
@@ -371,7 +371,7 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
if
(
e
->
autodisable
)
{
struct
snd_soc_dapm_widget
template
;
name
=
kasprintf
(
GFP_KERNEL
,
"%s %s"
,
kcontrol
->
id
.
name
,
name
=
kasprintf
(
GFP_KERNEL
,
"%s %s"
,
ctrl_
name
,
"Autodisable"
);
if
(
!
name
)
{
ret
=
-
ENOMEM
;
...
...
@@ -871,7 +871,7 @@ static int dapm_create_or_share_kcontrol(struct snd_soc_dapm_widget *w,
kcontrol
->
private_free
=
dapm_kcontrol_free
;
ret
=
dapm_kcontrol_data_alloc
(
w
,
kcontrol
);
ret
=
dapm_kcontrol_data_alloc
(
w
,
kcontrol
,
name
);
if
(
ret
)
{
snd_ctl_free_one
(
kcontrol
);
goto
exit_free
;
...
...
This diff is collapsed.
Click to expand it.
sound/soc/soc-pcm.c
浏览文件 @
d61b04f8
...
...
@@ -1810,7 +1810,8 @@ int dpcm_be_dai_hw_free(struct snd_soc_pcm_runtime *fe, int stream)
(
be
->
dpcm
[
stream
].
state
!=
SND_SOC_DPCM_STATE_PREPARE
)
&&
(
be
->
dpcm
[
stream
].
state
!=
SND_SOC_DPCM_STATE_HW_FREE
)
&&
(
be
->
dpcm
[
stream
].
state
!=
SND_SOC_DPCM_STATE_PAUSED
)
&&
(
be
->
dpcm
[
stream
].
state
!=
SND_SOC_DPCM_STATE_STOP
))
(
be
->
dpcm
[
stream
].
state
!=
SND_SOC_DPCM_STATE_STOP
)
&&
(
be
->
dpcm
[
stream
].
state
!=
SND_SOC_DPCM_STATE_SUSPEND
))
continue
;
dev_dbg
(
be
->
dev
,
"ASoC: hw_free BE %s
\n
"
,
...
...
This diff is collapsed.
Click to expand it.
sound/usb/midi.c
浏览文件 @
d61b04f8
...
...
@@ -2458,7 +2458,6 @@ int __snd_usbmidi_create(struct snd_card *card,
else
err
=
snd_usbmidi_create_endpoints
(
umidi
,
endpoints
);
if
(
err
<
0
)
{
snd_usbmidi_free
(
umidi
);
return
err
;
}
...
...
This diff is collapsed.
Click to expand it.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录
新手
引导
客服
返回
顶部