Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
3b46a67a
K
Kernel
项目概览
openeuler
/
Kernel
2 年多 前同步成功
通知
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看板
未验证
提交
3b46a67a
编写于
7月 26, 2019
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'asoc-5.3' into asoc-5.4
上级
3dcfb397
1e112c35
变更
36
隐藏空白更改
内联
并排
Showing
36 changed file
with
284 addition
and
134 deletion
+284
-134
MAINTAINERS
MAINTAINERS
+1
-1
include/sound/simple_card_utils.h
include/sound/simple_card_utils.h
+4
-0
include/uapi/sound/sof/fw.h
include/uapi/sound/sof/fw.h
+9
-7
include/uapi/sound/sof/header.h
include/uapi/sound/sof/header.h
+8
-6
sound/soc/codecs/cs42xx8.c
sound/soc/codecs/cs42xx8.c
+97
-19
sound/soc/codecs/max98357a.c
sound/soc/codecs/max98357a.c
+4
-21
sound/soc/codecs/pcm3060-i2c.c
sound/soc/codecs/pcm3060-i2c.c
+2
-2
sound/soc/codecs/pcm3060-spi.c
sound/soc/codecs/pcm3060-spi.c
+2
-2
sound/soc/codecs/pcm3060.c
sound/soc/codecs/pcm3060.c
+2
-2
sound/soc/codecs/pcm3060.h
sound/soc/codecs/pcm3060.h
+1
-1
sound/soc/codecs/rt1011.c
sound/soc/codecs/rt1011.c
+2
-2
sound/soc/codecs/rt1308.c
sound/soc/codecs/rt1308.c
+0
-0
sound/soc/codecs/rt1308.h
sound/soc/codecs/rt1308.h
+0
-0
sound/soc/generic/audio-graph-card.c
sound/soc/generic/audio-graph-card.c
+16
-14
sound/soc/generic/simple-card-utils.c
sound/soc/generic/simple-card-utils.c
+7
-0
sound/soc/generic/simple-card.c
sound/soc/generic/simple-card.c
+13
-13
sound/soc/intel/boards/bytcht_es8316.c
sound/soc/intel/boards/bytcht_es8316.c
+8
-0
sound/soc/intel/common/soc-acpi-intel-bxt-match.c
sound/soc/intel/common/soc-acpi-intel-bxt-match.c
+1
-1
sound/soc/intel/common/soc-acpi-intel-byt-match.c
sound/soc/intel/common/soc-acpi-intel-byt-match.c
+1
-1
sound/soc/intel/common/soc-acpi-intel-cht-match.c
sound/soc/intel/common/soc-acpi-intel-cht-match.c
+1
-1
sound/soc/intel/common/soc-acpi-intel-cnl-match.c
sound/soc/intel/common/soc-acpi-intel-cnl-match.c
+1
-1
sound/soc/intel/common/soc-acpi-intel-glk-match.c
sound/soc/intel/common/soc-acpi-intel-glk-match.c
+1
-1
sound/soc/intel/common/soc-acpi-intel-hda-match.c
sound/soc/intel/common/soc-acpi-intel-hda-match.c
+1
-1
sound/soc/intel/common/soc-acpi-intel-hsw-bdw-match.c
sound/soc/intel/common/soc-acpi-intel-hsw-bdw-match.c
+1
-1
sound/soc/intel/common/soc-acpi-intel-icl-match.c
sound/soc/intel/common/soc-acpi-intel-icl-match.c
+1
-1
sound/soc/intel/common/soc-acpi-intel-kbl-match.c
sound/soc/intel/common/soc-acpi-intel-kbl-match.c
+1
-1
sound/soc/intel/common/soc-acpi-intel-skl-match.c
sound/soc/intel/common/soc-acpi-intel-skl-match.c
+1
-1
sound/soc/qcom/apq8016_sbc.c
sound/soc/qcom/apq8016_sbc.c
+8
-8
sound/soc/rockchip/rockchip_i2s.c
sound/soc/rockchip/rockchip_i2s.c
+2
-3
sound/soc/rockchip/rockchip_max98090.c
sound/soc/rockchip/rockchip_max98090.c
+32
-0
sound/soc/samsung/odroid.c
sound/soc/samsung/odroid.c
+5
-3
sound/soc/soc-core.c
sound/soc/soc-core.c
+5
-2
sound/soc/soc-dapm.c
sound/soc/soc-dapm.c
+6
-4
sound/soc/sof/intel/cnl.c
sound/soc/sof/intel/cnl.c
+2
-2
sound/soc/sof/intel/hda-ipc.c
sound/soc/sof/intel/hda-ipc.c
+2
-2
sound/soc/ti/davinci-mcasp.c
sound/soc/ti/davinci-mcasp.c
+36
-10
未找到文件。
MAINTAINERS
浏览文件 @
3b46a67a
...
...
@@ -16078,7 +16078,7 @@ S: Maintained
F: drivers/net/ethernet/ti/netcp*
TI PCM3060 ASoC CODEC DRIVER
M: Kirill Marinushkin <kmarinushkin@birdec.
tech
>
M: Kirill Marinushkin <kmarinushkin@birdec.
com
>
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
S: Maintained
F: Documentation/devicetree/bindings/sound/pcm3060.txt
...
...
include/sound/simple_card_utils.h
浏览文件 @
3b46a67a
...
...
@@ -141,6 +141,10 @@ inline void asoc_simple_debug_dai(struct asoc_simple_priv *priv,
{
struct
device
*
dev
=
simple_priv_to_dev
(
priv
);
/* dai might be NULL */
if
(
!
dai
)
return
;
if
(
dai
->
name
)
dev_dbg
(
dev
,
"%s dai name = %s
\n
"
,
name
,
dai
->
name
);
...
...
include/uapi/sound/sof/fw.h
浏览文件 @
3b46a67a
...
...
@@ -13,6 +13,8 @@
#ifndef __INCLUDE_UAPI_SOF_FW_H__
#define __INCLUDE_UAPI_SOF_FW_H__
#include <linux/types.h>
#define SND_SOF_FW_SIG_SIZE 4
#define SND_SOF_FW_ABI 1
#define SND_SOF_FW_SIG "Reef"
...
...
@@ -46,8 +48,8 @@ enum snd_sof_fw_blk_type {
struct
snd_sof_blk_hdr
{
enum
snd_sof_fw_blk_type
type
;
uint32_t
size
;
/* bytes minus this header */
uint32_t
offset
;
/* offset from base */
__u32
size
;
/* bytes minus this header */
__u32
offset
;
/* offset from base */
}
__packed
;
/*
...
...
@@ -61,8 +63,8 @@ enum snd_sof_fw_mod_type {
struct
snd_sof_mod_hdr
{
enum
snd_sof_fw_mod_type
type
;
uint32_t
size
;
/* bytes minus this header */
uint32_t
num_blocks
;
/* number of blocks */
__u32
size
;
/* bytes minus this header */
__u32
num_blocks
;
/* number of blocks */
}
__packed
;
/*
...
...
@@ -70,9 +72,9 @@ struct snd_sof_mod_hdr {
*/
struct
snd_sof_fw_header
{
unsigned
char
sig
[
SND_SOF_FW_SIG_SIZE
];
/* "Reef" */
uint32_t
file_size
;
/* size of file minus this header */
uint32_t
num_modules
;
/* number of modules */
uint32_t
abi
;
/* version of header format */
__u32
file_size
;
/* size of file minus this header */
__u32
num_modules
;
/* number of modules */
__u32
abi
;
/* version of header format */
}
__packed
;
#endif
include/uapi/sound/sof/header.h
浏览文件 @
3b46a67a
...
...
@@ -9,6 +9,8 @@
#ifndef __INCLUDE_UAPI_SOUND_SOF_USER_HEADER_H__
#define __INCLUDE_UAPI_SOUND_SOF_USER_HEADER_H__
#include <linux/types.h>
/*
* Header for all non IPC ABI data.
*
...
...
@@ -16,12 +18,12 @@
* Used by any bespoke component data structures or binary blobs.
*/
struct
sof_abi_hdr
{
uint32_t
magic
;
/**< 'S', 'O', 'F', '\0' */
uint32_t
type
;
/**< component specific type */
uint32_t
size
;
/**< size in bytes of data excl. this struct */
uint32_t
abi
;
/**< SOF ABI version */
uint32_t
reserved
[
4
];
/**< reserved for future use */
uint32_t
data
[
0
];
/**< Component data - opaque to core */
__u32
magic
;
/**< 'S', 'O', 'F', '\0' */
__u32
type
;
/**< component specific type */
__u32
size
;
/**< size in bytes of data excl. this struct */
__u32
abi
;
/**< SOF ABI version */
__u32
reserved
[
4
];
/**< reserved for future use */
__u32
data
[
0
];
/**< Component data - opaque to core */
}
__packed
;
#endif
sound/soc/codecs/cs42xx8.c
浏览文件 @
3b46a67a
...
...
@@ -47,6 +47,7 @@ struct cs42xx8_priv {
unsigned
long
sysclk
;
u32
tx_channels
;
struct
gpio_desc
*
gpiod_reset
;
u32
rate
[
2
];
};
/* -127.5dB to 0dB with step of 0.5dB */
...
...
@@ -176,21 +177,27 @@ static const struct snd_soc_dapm_route cs42xx8_adc3_dapm_routes[] = {
};
struct
cs42xx8_ratios
{
unsigned
int
ratio
;
unsigned
char
speed
;
unsigned
char
mclk
;
unsigned
int
mfreq
;
unsigned
int
min_mclk
;
unsigned
int
max_mclk
;
unsigned
int
ratio
[
3
];
};
/*
* According to reference mannual, define the cs42xx8_ratio struct
* MFreq2 | MFreq1 | MFreq0 | Description | SSM | DSM | QSM |
* 0 | 0 | 0 |1.029MHz to 12.8MHz | 256 | 128 | 64 |
* 0 | 0 | 1 |1.536MHz to 19.2MHz | 384 | 192 | 96 |
* 0 | 1 | 0 |2.048MHz to 25.6MHz | 512 | 256 | 128 |
* 0 | 1 | 1 |3.072MHz to 38.4MHz | 768 | 384 | 192 |
* 1 | x | x |4.096MHz to 51.2MHz |1024 | 512 | 256 |
*/
static
const
struct
cs42xx8_ratios
cs42xx8_ratios
[]
=
{
{
64
,
CS42XX8_FM_QUAD
,
CS42XX8_FUNCMOD_MFREQ_256
(
4
)
},
{
96
,
CS42XX8_FM_QUAD
,
CS42XX8_FUNCMOD_MFREQ_384
(
4
)
},
{
128
,
CS42XX8_FM_QUAD
,
CS42XX8_FUNCMOD_MFREQ_512
(
4
)
},
{
192
,
CS42XX8_FM_QUAD
,
CS42XX8_FUNCMOD_MFREQ_768
(
4
)
},
{
256
,
CS42XX8_FM_SINGLE
,
CS42XX8_FUNCMOD_MFREQ_256
(
1
)
},
{
384
,
CS42XX8_FM_SINGLE
,
CS42XX8_FUNCMOD_MFREQ_384
(
1
)
},
{
512
,
CS42XX8_FM_SINGLE
,
CS42XX8_FUNCMOD_MFREQ_512
(
1
)
},
{
768
,
CS42XX8_FM_SINGLE
,
CS42XX8_FUNCMOD_MFREQ_768
(
1
)
},
{
1024
,
CS42XX8_FM_SINGLE
,
CS42XX8_FUNCMOD_MFREQ_1024
(
1
)
}
{
0
,
1029000
,
12800000
,
{
256
,
128
,
64
}
},
{
2
,
1536000
,
19200000
,
{
384
,
192
,
96
}
},
{
4
,
2048000
,
25600000
,
{
512
,
256
,
128
}
},
{
6
,
3072000
,
38400000
,
{
768
,
384
,
192
}
},
{
8
,
4096000
,
51200000
,
{
1024
,
512
,
256
}
},
};
static
int
cs42xx8_set_dai_sysclk
(
struct
snd_soc_dai
*
codec_dai
,
...
...
@@ -257,14 +264,68 @@ static int cs42xx8_hw_params(struct snd_pcm_substream *substream,
struct
snd_soc_component
*
component
=
dai
->
component
;
struct
cs42xx8_priv
*
cs42xx8
=
snd_soc_component_get_drvdata
(
component
);
bool
tx
=
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
;
u32
ratio
=
cs42xx8
->
sysclk
/
params_rate
(
params
);
u32
i
,
fm
,
val
,
mask
;
u32
ratio
[
2
];
u32
rate
[
2
];
u32
fm
[
2
];
u32
i
,
val
,
mask
;
bool
condition1
,
condition2
;
if
(
tx
)
cs42xx8
->
tx_channels
=
params_channels
(
params
);
rate
[
tx
]
=
params_rate
(
params
);
rate
[
!
tx
]
=
cs42xx8
->
rate
[
!
tx
];
ratio
[
tx
]
=
rate
[
tx
]
>
0
?
cs42xx8
->
sysclk
/
rate
[
tx
]
:
0
;
ratio
[
!
tx
]
=
rate
[
!
tx
]
>
0
?
cs42xx8
->
sysclk
/
rate
[
!
tx
]
:
0
;
/* Get functional mode for tx and rx according to rate */
for
(
i
=
0
;
i
<
2
;
i
++
)
{
if
(
cs42xx8
->
slave_mode
)
{
fm
[
i
]
=
CS42XX8_FM_AUTO
;
}
else
{
if
(
rate
[
i
]
<
50000
)
{
fm
[
i
]
=
CS42XX8_FM_SINGLE
;
}
else
if
(
rate
[
i
]
>
50000
&&
rate
[
i
]
<
100000
)
{
fm
[
i
]
=
CS42XX8_FM_DOUBLE
;
}
else
if
(
rate
[
i
]
>
100000
&&
rate
[
i
]
<
200000
)
{
fm
[
i
]
=
CS42XX8_FM_QUAD
;
}
else
{
dev_err
(
component
->
dev
,
"unsupported sample rate
\n
"
);
return
-
EINVAL
;
}
}
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
cs42xx8_ratios
);
i
++
)
{
if
(
cs42xx8_ratios
[
i
].
ratio
==
ratio
)
/* Is the ratio[tx] valid ? */
condition1
=
((
fm
[
tx
]
==
CS42XX8_FM_AUTO
)
?
(
cs42xx8_ratios
[
i
].
ratio
[
0
]
==
ratio
[
tx
]
||
cs42xx8_ratios
[
i
].
ratio
[
1
]
==
ratio
[
tx
]
||
cs42xx8_ratios
[
i
].
ratio
[
2
]
==
ratio
[
tx
])
:
(
cs42xx8_ratios
[
i
].
ratio
[
fm
[
tx
]]
==
ratio
[
tx
]))
&&
cs42xx8
->
sysclk
>=
cs42xx8_ratios
[
i
].
min_mclk
&&
cs42xx8
->
sysclk
<=
cs42xx8_ratios
[
i
].
max_mclk
;
if
(
!
ratio
[
tx
])
condition1
=
true
;
/* Is the ratio[!tx] valid ? */
condition2
=
((
fm
[
!
tx
]
==
CS42XX8_FM_AUTO
)
?
(
cs42xx8_ratios
[
i
].
ratio
[
0
]
==
ratio
[
!
tx
]
||
cs42xx8_ratios
[
i
].
ratio
[
1
]
==
ratio
[
!
tx
]
||
cs42xx8_ratios
[
i
].
ratio
[
2
]
==
ratio
[
!
tx
])
:
(
cs42xx8_ratios
[
i
].
ratio
[
fm
[
!
tx
]]
==
ratio
[
!
tx
]));
if
(
!
ratio
[
!
tx
])
condition2
=
true
;
/*
* Both ratio[tx] and ratio[!tx] is valid, then we get
* a proper MFreq.
*/
if
(
condition1
&&
condition2
)
break
;
}
...
...
@@ -273,15 +334,31 @@ static int cs42xx8_hw_params(struct snd_pcm_substream *substream,
return
-
EINVAL
;
}
mask
=
CS42XX8_FUNCMOD_MFREQ_MASK
;
val
=
cs42xx8_ratios
[
i
].
mclk
;
cs42xx8
->
rate
[
tx
]
=
params_rate
(
params
);
fm
=
cs42xx8
->
slave_mode
?
CS42XX8_FM_AUTO
:
cs42xx8_ratios
[
i
].
speed
;
mask
=
CS42XX8_FUNCMOD_MFREQ_MASK
;
val
=
cs42xx8_ratios
[
i
].
mfreq
;
regmap_update_bits
(
cs42xx8
->
regmap
,
CS42XX8_FUNCMOD
,
CS42XX8_FUNCMOD_xC_FM_MASK
(
tx
)
|
mask
,
CS42XX8_FUNCMOD_xC_FM
(
tx
,
fm
)
|
val
);
CS42XX8_FUNCMOD_xC_FM
(
tx
,
fm
[
tx
])
|
val
);
return
0
;
}
static
int
cs42xx8_hw_free
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
{
struct
snd_soc_component
*
component
=
dai
->
component
;
struct
cs42xx8_priv
*
cs42xx8
=
snd_soc_component_get_drvdata
(
component
);
bool
tx
=
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
;
/* Clear stored rate */
cs42xx8
->
rate
[
tx
]
=
0
;
regmap_update_bits
(
cs42xx8
->
regmap
,
CS42XX8_FUNCMOD
,
CS42XX8_FUNCMOD_xC_FM_MASK
(
tx
),
CS42XX8_FUNCMOD_xC_FM
(
tx
,
CS42XX8_FM_AUTO
));
return
0
;
}
...
...
@@ -302,6 +379,7 @@ static const struct snd_soc_dai_ops cs42xx8_dai_ops = {
.
set_fmt
=
cs42xx8_set_dai_fmt
,
.
set_sysclk
=
cs42xx8_set_dai_sysclk
,
.
hw_params
=
cs42xx8_hw_params
,
.
hw_free
=
cs42xx8_hw_free
,
.
digital_mute
=
cs42xx8_digital_mute
,
};
...
...
sound/soc/codecs/max98357a.c
浏览文件 @
3b46a67a
...
...
@@ -20,20 +20,10 @@
#include <sound/soc-dapm.h>
struct
max98357a_priv
{
struct
delayed_work
enable_sdmode_work
;
struct
gpio_desc
*
sdmode
;
unsigned
int
sdmode_delay
;
};
static
void
max98357a_enable_sdmode_work
(
struct
work_struct
*
work
)
{
struct
max98357a_priv
*
max98357a
=
container_of
(
work
,
struct
max98357a_priv
,
enable_sdmode_work
.
work
);
gpiod_set_value
(
max98357a
->
sdmode
,
1
);
}
static
int
max98357a_daiops_trigger
(
struct
snd_pcm_substream
*
substream
,
int
cmd
,
struct
snd_soc_dai
*
dai
)
{
...
...
@@ -46,14 +36,12 @@ static int max98357a_daiops_trigger(struct snd_pcm_substream *substream,
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_RESUME
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
queue_delayed_work
(
system_power_efficient_wq
,
&
max98357a
->
enable_sdmode_work
,
msecs_to_jiffies
(
max98357a
->
sdmode_delay
));
mdelay
(
max98357a
->
sdmode_delay
);
gpiod_set_value
(
max98357a
->
sdmode
,
1
);
break
;
case
SNDRV_PCM_TRIGGER_STOP
:
case
SNDRV_PCM_TRIGGER_SUSPEND
:
case
SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
cancel_delayed_work_sync
(
&
max98357a
->
enable_sdmode_work
);
gpiod_set_value
(
max98357a
->
sdmode
,
0
);
break
;
}
...
...
@@ -112,30 +100,25 @@ static int max98357a_platform_probe(struct platform_device *pdev)
int
ret
;
max98357a
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
max98357a
),
GFP_KERNEL
);
if
(
!
max98357a
)
return
-
ENOMEM
;
max98357a
->
sdmode
=
devm_gpiod_get_optional
(
&
pdev
->
dev
,
"sdmode"
,
GPIOD_OUT_LOW
);
if
(
IS_ERR
(
max98357a
->
sdmode
))
return
PTR_ERR
(
max98357a
->
sdmode
);
ret
=
device_property_read_u32
(
&
pdev
->
dev
,
"sdmode-delay"
,
&
max98357a
->
sdmode_delay
);
if
(
ret
)
{
max98357a
->
sdmode_delay
=
0
;
dev_dbg
(
&
pdev
->
dev
,
"no optional property 'sdmode-delay' found, default: no delay
\n
"
);
"no optional property 'sdmode-delay' found, "
"default: no delay
\n
"
);
}
dev_set_drvdata
(
&
pdev
->
dev
,
max98357a
);
INIT_DELAYED_WORK
(
&
max98357a
->
enable_sdmode_work
,
max98357a_enable_sdmode_work
);
return
devm_snd_soc_register_component
(
&
pdev
->
dev
,
&
max98357a_component_driver
,
&
max98357a_dai_driver
,
1
);
...
...
sound/soc/codecs/pcm3060-i2c.c
浏览文件 @
3b46a67a
...
...
@@ -2,7 +2,7 @@
//
// PCM3060 I2C driver
//
// Copyright (C) 2018 Kirill Marinushkin <kmarinushkin@birdec.
tech
>
// Copyright (C) 2018 Kirill Marinushkin <kmarinushkin@birdec.
com
>
#include <linux/i2c.h>
#include <linux/module.h>
...
...
@@ -56,5 +56,5 @@ static struct i2c_driver pcm3060_i2c_driver = {
module_i2c_driver
(
pcm3060_i2c_driver
);
MODULE_DESCRIPTION
(
"PCM3060 I2C driver"
);
MODULE_AUTHOR
(
"Kirill Marinushkin <kmarinushkin@birdec.
tech
>"
);
MODULE_AUTHOR
(
"Kirill Marinushkin <kmarinushkin@birdec.
com
>"
);
MODULE_LICENSE
(
"GPL v2"
);
sound/soc/codecs/pcm3060-spi.c
浏览文件 @
3b46a67a
...
...
@@ -2,7 +2,7 @@
//
// PCM3060 SPI driver
//
// Copyright (C) 2018 Kirill Marinushkin <kmarinushkin@birdec.
tech
>
// Copyright (C) 2018 Kirill Marinushkin <kmarinushkin@birdec.
com
>
#include <linux/module.h>
#include <linux/spi/spi.h>
...
...
@@ -55,5 +55,5 @@ static struct spi_driver pcm3060_spi_driver = {
module_spi_driver
(
pcm3060_spi_driver
);
MODULE_DESCRIPTION
(
"PCM3060 SPI driver"
);
MODULE_AUTHOR
(
"Kirill Marinushkin <kmarinushkin@birdec.
tech
>"
);
MODULE_AUTHOR
(
"Kirill Marinushkin <kmarinushkin@birdec.
com
>"
);
MODULE_LICENSE
(
"GPL v2"
);
sound/soc/codecs/pcm3060.c
浏览文件 @
3b46a67a
...
...
@@ -2,7 +2,7 @@
//
// PCM3060 codec driver
//
// Copyright (C) 2018 Kirill Marinushkin <kmarinushkin@birdec.
tech
>
// Copyright (C) 2018 Kirill Marinushkin <kmarinushkin@birdec.
com
>
#include <linux/module.h>
#include <sound/pcm_params.h>
...
...
@@ -342,5 +342,5 @@ int pcm3060_probe(struct device *dev)
EXPORT_SYMBOL
(
pcm3060_probe
);
MODULE_DESCRIPTION
(
"PCM3060 codec driver"
);
MODULE_AUTHOR
(
"Kirill Marinushkin <kmarinushkin@birdec.
tech
>"
);
MODULE_AUTHOR
(
"Kirill Marinushkin <kmarinushkin@birdec.
com
>"
);
MODULE_LICENSE
(
"GPL v2"
);
sound/soc/codecs/pcm3060.h
浏览文件 @
3b46a67a
...
...
@@ -2,7 +2,7 @@
/*
* PCM3060 codec driver
*
* Copyright (C) 2018 Kirill Marinushkin <kmarinushkin@birdec.
tech
>
* Copyright (C) 2018 Kirill Marinushkin <kmarinushkin@birdec.
com
>
*/
#ifndef _SND_SOC_PCM3060_H
...
...
sound/soc/codecs/rt1011.c
浏览文件 @
3b46a67a
...
...
@@ -39,7 +39,7 @@ static const struct reg_sequence init_list[] = {
{
RT1011_POWER_9
,
0xa840
},
{
RT1011_ADC_SET_5
,
0x0a20
},
{
RT1011_DAC_SET_2
,
0xa
2
32
},
{
RT1011_DAC_SET_2
,
0xa
0
32
},
{
RT1011_ADC_SET_1
,
0x2925
},
{
RT1011_SPK_PRO_DC_DET_1
,
0xb00c
},
...
...
@@ -1917,7 +1917,7 @@ static int rt1011_set_bias_level(struct snd_soc_component *component,
snd_soc_component_write
(
component
,
RT1011_SYSTEM_RESET_2
,
0x0000
);
snd_soc_component_write
(
component
,
RT1011_SYSTEM_RESET_3
,
0x000
0
);
RT1011_SYSTEM_RESET_3
,
0x000
1
);
snd_soc_component_write
(
component
,
RT1011_SYSTEM_RESET_1
,
0x003f
);
snd_soc_component_write
(
component
,
...
...
sound/soc/codecs/rt1308.c
100755 → 100644
浏览文件 @
3b46a67a
文件模式从 100755 更改为 100644
sound/soc/codecs/rt1308.h
100755 → 100644
浏览文件 @
3b46a67a
文件模式从 100755 更改为 100644
sound/soc/generic/audio-graph-card.c
浏览文件 @
3b46a67a
...
...
@@ -63,6 +63,7 @@ static int graph_get_dai_id(struct device_node *ep)
struct
device_node
*
endpoint
;
struct
of_endpoint
info
;
int
i
,
id
;
const
u32
*
reg
;
int
ret
;
/* use driver specified DAI ID if exist */
...
...
@@ -83,8 +84,9 @@ static int graph_get_dai_id(struct device_node *ep)
return
info
.
id
;
node
=
of_get_parent
(
ep
);
reg
=
of_get_property
(
node
,
"reg"
,
NULL
);
of_node_put
(
node
);
if
(
of_get_property
(
node
,
"reg"
,
NULL
)
)
if
(
reg
)
return
info
.
port
;
}
node
=
of_graph_get_port_parent
(
ep
);
...
...
@@ -208,10 +210,6 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
dev_dbg
(
dev
,
"link_of DPCM (%pOF)
\n
"
,
ep
);
of_node_put
(
ports
);
of_node_put
(
port
);
of_node_put
(
node
);
if
(
li
->
cpu
)
{
int
is_single_links
=
0
;
...
...
@@ -229,17 +227,17 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
ret
=
asoc_simple_parse_cpu
(
ep
,
dai_link
,
&
is_single_links
);
if
(
ret
)
return
ret
;
goto
out_put_node
;
ret
=
asoc_simple_parse_clk_cpu
(
dev
,
ep
,
dai_link
,
dai
);
if
(
ret
<
0
)
return
ret
;
goto
out_put_node
;
ret
=
asoc_simple_set_dailink_name
(
dev
,
dai_link
,
"fe.%s"
,
cpus
->
dai_name
);
if
(
ret
<
0
)
return
ret
;
goto
out_put_node
;
/* card->num_links includes Codec */
asoc_simple_canonicalize_cpu
(
dai_link
,
is_single_links
);
...
...
@@ -263,17 +261,17 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
ret
=
asoc_simple_parse_codec
(
ep
,
dai_link
);
if
(
ret
<
0
)
return
ret
;
goto
out_put_node
;
ret
=
asoc_simple_parse_clk_codec
(
dev
,
ep
,
dai_link
,
dai
);
if
(
ret
<
0
)
return
ret
;
goto
out_put_node
;
ret
=
asoc_simple_set_dailink_name
(
dev
,
dai_link
,
"be.%s"
,
codecs
->
dai_name
);
if
(
ret
<
0
)
return
ret
;
goto
out_put_node
;
/* check "prefix" from top node */
snd_soc_of_parse_node_prefix
(
top
,
cconf
,
codecs
->
of_node
,
...
...
@@ -293,19 +291,23 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
ret
=
asoc_simple_parse_tdm
(
ep
,
dai
);
if
(
ret
)
return
ret
;
goto
out_put_node
;
ret
=
asoc_simple_parse_daifmt
(
dev
,
cpu_ep
,
codec_ep
,
NULL
,
&
dai_link
->
dai_fmt
);
if
(
ret
<
0
)
return
ret
;
goto
out_put_node
;
dai_link
->
dpcm_playback
=
1
;
dai_link
->
dpcm_capture
=
1
;
dai_link
->
ops
=
&
graph_ops
;
dai_link
->
init
=
asoc_simple_dai_init
;
return
0
;
out_put_node:
of_node_put
(
ports
);
of_node_put
(
port
);
of_node_put
(
node
);
return
ret
;
}
static
int
graph_dai_link_of
(
struct
asoc_simple_priv
*
priv
,
...
...
sound/soc/generic/simple-card-utils.c
浏览文件 @
3b46a67a
...
...
@@ -349,6 +349,13 @@ void asoc_simple_canonicalize_platform(struct snd_soc_dai_link *dai_link)
/* Assumes platform == cpu */
if
(
!
dai_link
->
platforms
->
of_node
)
dai_link
->
platforms
->
of_node
=
dai_link
->
cpus
->
of_node
;
/*
* DPCM BE can be no platform.
* Alloced memory will be waste, but not leak.
*/
if
(
!
dai_link
->
platforms
->
of_node
)
dai_link
->
num_platforms
=
0
;
}
EXPORT_SYMBOL_GPL
(
asoc_simple_canonicalize_platform
);
...
...
sound/soc/generic/simple-card.c
浏览文件 @
3b46a67a
...
...
@@ -124,8 +124,6 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
li
->
link
++
;
of_node_put
(
node
);
/* For single DAI link & old style of DT node */
if
(
is_top
)
prefix
=
PREFIX
;
...
...
@@ -147,17 +145,17 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
ret
=
asoc_simple_parse_cpu
(
np
,
dai_link
,
&
is_single_links
);
if
(
ret
)
return
ret
;
goto
out_put_node
;
ret
=
asoc_simple_parse_clk_cpu
(
dev
,
np
,
dai_link
,
dai
);
if
(
ret
<
0
)
return
ret
;
goto
out_put_node
;
ret
=
asoc_simple_set_dailink_name
(
dev
,
dai_link
,
"fe.%s"
,
cpus
->
dai_name
);
if
(
ret
<
0
)
return
ret
;
goto
out_put_node
;
asoc_simple_canonicalize_cpu
(
dai_link
,
is_single_links
);
}
else
{
...
...
@@ -180,17 +178,17 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
ret
=
asoc_simple_parse_codec
(
np
,
dai_link
);
if
(
ret
<
0
)
return
ret
;
goto
out_put_node
;
ret
=
asoc_simple_parse_clk_codec
(
dev
,
np
,
dai_link
,
dai
);
if
(
ret
<
0
)
return
ret
;
goto
out_put_node
;
ret
=
asoc_simple_set_dailink_name
(
dev
,
dai_link
,
"be.%s"
,
codecs
->
dai_name
);
if
(
ret
<
0
)
return
ret
;
goto
out_put_node
;
/* check "prefix" from top node */
snd_soc_of_parse_node_prefix
(
top
,
cconf
,
codecs
->
of_node
,
...
...
@@ -208,19 +206,21 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
ret
=
asoc_simple_parse_tdm
(
np
,
dai
);
if
(
ret
)
return
ret
;
goto
out_put_node
;
ret
=
asoc_simple_parse_daifmt
(
dev
,
node
,
codec
,
prefix
,
&
dai_link
->
dai_fmt
);
if
(
ret
<
0
)
return
ret
;
goto
out_put_node
;
dai_link
->
dpcm_playback
=
1
;
dai_link
->
dpcm_capture
=
1
;
dai_link
->
ops
=
&
simple_ops
;
dai_link
->
init
=
asoc_simple_dai_init
;
return
0
;
out_put_node:
of_node_put
(
node
);
return
ret
;
}
static
int
simple_dai_link_of
(
struct
asoc_simple_priv
*
priv
,
...
...
@@ -364,8 +364,6 @@ static int simple_for_each_link(struct asoc_simple_priv *priv,
goto
error
;
}
of_node_put
(
codec
);
/* get convert-xxx property */
memset
(
&
adata
,
0
,
sizeof
(
adata
));
for_each_child_of_node
(
node
,
np
)
...
...
@@ -387,11 +385,13 @@ static int simple_for_each_link(struct asoc_simple_priv *priv,
ret
=
func_noml
(
priv
,
np
,
codec
,
li
,
is_top
);
if
(
ret
<
0
)
{
of_node_put
(
codec
);
of_node_put
(
np
);
goto
error
;
}
}
of_node_put
(
codec
);
node
=
of_get_next_child
(
top
,
node
);
}
while
(
!
is_top
&&
node
);
...
...
sound/soc/intel/boards/bytcht_es8316.c
浏览文件 @
3b46a67a
...
...
@@ -437,6 +437,14 @@ static const struct acpi_gpio_mapping byt_cht_es8316_gpios[] = {
/* Please keep this list alphabetically sorted */
static
const
struct
dmi_system_id
byt_cht_es8316_quirk_table
[]
=
{
{
/* Irbis NB41 */
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"IRBIS"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"NB41"
),
},
.
driver_data
=
(
void
*
)(
BYT_CHT_ES8316_INTMIC_IN2_MAP
|
BYT_CHT_ES8316_JD_INVERTED
),
},
{
/* Teclast X98 Plus II */
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"TECLAST"
),
...
...
sound/soc/intel/common/soc-acpi-intel-bxt-match.c
浏览文件 @
3b46a67a
// SPDX-License-Identifier: GPL-2.0
/*
* soc-a
pc
i-intel-bxt-match.c - tables and support for BXT ACPI enumeration.
* soc-a
cp
i-intel-bxt-match.c - tables and support for BXT ACPI enumeration.
*
* Copyright (c) 2018, Intel Corporation.
*
...
...
sound/soc/intel/common/soc-acpi-intel-byt-match.c
浏览文件 @
3b46a67a
// SPDX-License-Identifier: GPL-2.0-only
/*
* soc-a
pc
i-intel-byt-match.c - tables and support for BYT ACPI enumeration.
* soc-a
cp
i-intel-byt-match.c - tables and support for BYT ACPI enumeration.
*
* Copyright (c) 2017, Intel Corporation.
*/
...
...
sound/soc/intel/common/soc-acpi-intel-cht-match.c
浏览文件 @
3b46a67a
// SPDX-License-Identifier: GPL-2.0-only
/*
* soc-a
pc
i-intel-cht-match.c - tables and support for CHT ACPI enumeration.
* soc-a
cp
i-intel-cht-match.c - tables and support for CHT ACPI enumeration.
*
* Copyright (c) 2017, Intel Corporation.
*/
...
...
sound/soc/intel/common/soc-acpi-intel-cnl-match.c
浏览文件 @
3b46a67a
// SPDX-License-Identifier: GPL-2.0
/*
* soc-a
pc
i-intel-cnl-match.c - tables and support for CNL ACPI enumeration.
* soc-a
cp
i-intel-cnl-match.c - tables and support for CNL ACPI enumeration.
*
* Copyright (c) 2018, Intel Corporation.
*
...
...
sound/soc/intel/common/soc-acpi-intel-glk-match.c
浏览文件 @
3b46a67a
// SPDX-License-Identifier: GPL-2.0
/*
* soc-a
pc
i-intel-glk-match.c - tables and support for GLK ACPI enumeration.
* soc-a
cp
i-intel-glk-match.c - tables and support for GLK ACPI enumeration.
*
* Copyright (c) 2018, Intel Corporation.
*
...
...
sound/soc/intel/common/soc-acpi-intel-hda-match.c
浏览文件 @
3b46a67a
...
...
@@ -2,7 +2,7 @@
// Copyright (c) 2018, Intel Corporation.
/*
* soc-a
pc
i-intel-hda-match.c - tables and support for HDA+ACPI enumeration.
* soc-a
cp
i-intel-hda-match.c - tables and support for HDA+ACPI enumeration.
*
*/
...
...
sound/soc/intel/common/soc-acpi-intel-hsw-bdw-match.c
浏览文件 @
3b46a67a
// SPDX-License-Identifier: GPL-2.0-only
/*
* soc-a
pc
i-intel-hsw-bdw-match.c - tables and support for ACPI enumeration.
* soc-a
cp
i-intel-hsw-bdw-match.c - tables and support for ACPI enumeration.
*
* Copyright (c) 2017, Intel Corporation.
*/
...
...
sound/soc/intel/common/soc-acpi-intel-icl-match.c
浏览文件 @
3b46a67a
// SPDX-License-Identifier: GPL-2.0
/*
* soc-a
pc
i-intel-icl-match.c - tables and support for ICL ACPI enumeration.
* soc-a
cp
i-intel-icl-match.c - tables and support for ICL ACPI enumeration.
*
* Copyright (c) 2018, Intel Corporation.
*
...
...
sound/soc/intel/common/soc-acpi-intel-kbl-match.c
浏览文件 @
3b46a67a
// SPDX-License-Identifier: GPL-2.0
/*
* soc-a
pc
i-intel-kbl-match.c - tables and support for KBL ACPI enumeration.
* soc-a
cp
i-intel-kbl-match.c - tables and support for KBL ACPI enumeration.
*
* Copyright (c) 2018, Intel Corporation.
*
...
...
sound/soc/intel/common/soc-acpi-intel-skl-match.c
浏览文件 @
3b46a67a
// SPDX-License-Identifier: GPL-2.0
/*
* soc-a
pc
i-intel-skl-match.c - tables and support for SKL ACPI enumeration.
* soc-a
cp
i-intel-skl-match.c - tables and support for SKL ACPI enumeration.
*
* Copyright (c) 2018, Intel Corporation.
*
...
...
sound/soc/qcom/apq8016_sbc.c
浏览文件 @
3b46a67a
...
...
@@ -150,17 +150,17 @@ static struct apq8016_sbc_data *apq8016_sbc_parse_of(struct snd_soc_card *card)
link
=
data
->
dai_link
;
dlc
=
devm_kzalloc
(
dev
,
2
*
sizeof
(
*
dlc
),
GFP_KERNEL
);
if
(
!
dlc
)
return
ERR_PTR
(
-
ENOMEM
);
for_each_child_of_node
(
node
,
np
)
{
dlc
=
devm_kzalloc
(
dev
,
2
*
sizeof
(
*
dlc
),
GFP_KERNEL
);
if
(
!
dlc
)
return
ERR_PTR
(
-
ENOMEM
);
link
->
cpus
=
&
dlc
[
0
];
link
->
platforms
=
&
dlc
[
1
];
link
->
cpus
=
&
dlc
[
0
];
link
->
platforms
=
&
dlc
[
1
];
link
->
num_cpus
=
1
;
link
->
num_platforms
=
1
;
link
->
num_cpus
=
1
;
link
->
num_platforms
=
1
;
for_each_child_of_node
(
node
,
np
)
{
cpu
=
of_get_child_by_name
(
np
,
"cpu"
);
codec
=
of_get_child_by_name
(
np
,
"codec"
);
...
...
sound/soc/rockchip/rockchip_i2s.c
浏览文件 @
3b46a67a
...
...
@@ -326,7 +326,6 @@ static int rockchip_i2s_hw_params(struct snd_pcm_substream *substream,
val
|=
I2S_CHN_4
;
break
;
case
2
:
case
1
:
val
|=
I2S_CHN_2
;
break
;
default:
...
...
@@ -459,7 +458,7 @@ static struct snd_soc_dai_driver rockchip_i2s_dai = {
},
.
capture
=
{
.
stream_name
=
"Capture"
,
.
channels_min
=
1
,
.
channels_min
=
2
,
.
channels_max
=
2
,
.
rates
=
SNDRV_PCM_RATE_8000_192000
,
.
formats
=
(
SNDRV_PCM_FMTBIT_S8
|
...
...
@@ -659,7 +658,7 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
}
if
(
!
of_property_read_u32
(
node
,
"rockchip,capture-channels"
,
&
val
))
{
if
(
val
>=
1
&&
val
<=
8
)
if
(
val
>=
2
&&
val
<=
8
)
soc_dai
->
capture
.
channels_max
=
val
;
}
...
...
sound/soc/rockchip/rockchip_max98090.c
浏览文件 @
3b46a67a
...
...
@@ -60,6 +60,37 @@ static const struct snd_kcontrol_new rk_mc_controls[] = {
SOC_DAPM_PIN_SWITCH
(
"Speaker"
),
};
static
int
rk_jack_event
(
struct
notifier_block
*
nb
,
unsigned
long
event
,
void
*
data
)
{
struct
snd_soc_jack
*
jack
=
(
struct
snd_soc_jack
*
)
data
;
struct
snd_soc_dapm_context
*
dapm
=
&
jack
->
card
->
dapm
;
if
(
event
&
SND_JACK_MICROPHONE
)
snd_soc_dapm_force_enable_pin
(
dapm
,
"MICBIAS"
);
else
snd_soc_dapm_disable_pin
(
dapm
,
"MICBIAS"
);
snd_soc_dapm_sync
(
dapm
);
return
0
;
}
static
struct
notifier_block
rk_jack_nb
=
{
.
notifier_call
=
rk_jack_event
,
};
static
int
rk_init
(
struct
snd_soc_pcm_runtime
*
runtime
)
{
/*
* The jack has already been created in the rk_98090_headset_init()
* function.
*/
snd_soc_jack_notifier_register
(
&
headset_jack
,
&
rk_jack_nb
);
return
0
;
}
static
int
rk_aif1_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
{
...
...
@@ -118,6 +149,7 @@ SND_SOC_DAILINK_DEFS(hifi,
static
struct
snd_soc_dai_link
rk_dailink
=
{
.
name
=
"max98090"
,
.
stream_name
=
"Audio"
,
.
init
=
rk_init
,
.
ops
=
&
rk_aif1_ops
,
/* set max98090 as slave */
.
dai_fmt
=
SND_SOC_DAIFMT_I2S
|
SND_SOC_DAIFMT_NB_NF
|
...
...
sound/soc/samsung/odroid.c
浏览文件 @
3b46a67a
...
...
@@ -284,9 +284,8 @@ static int odroid_audio_probe(struct platform_device *pdev)
}
of_node_put
(
cpu
);
of_node_put
(
codec
);
if
(
ret
<
0
)
return
ret
;
goto
err_put_node
;
ret
=
snd_soc_of_get_dai_link_codecs
(
dev
,
codec
,
codec_link
);
if
(
ret
<
0
)
...
...
@@ -309,7 +308,6 @@ static int odroid_audio_probe(struct platform_device *pdev)
ret
=
PTR_ERR
(
priv
->
clk_i2s_bus
);
goto
err_put_sclk
;
}
of_node_put
(
cpu_dai
);
ret
=
devm_snd_soc_register_card
(
dev
,
card
);
if
(
ret
<
0
)
{
...
...
@@ -317,6 +315,8 @@ static int odroid_audio_probe(struct platform_device *pdev)
goto
err_put_clk_i2s
;
}
of_node_put
(
cpu_dai
);
of_node_put
(
codec
);
return
0
;
err_put_clk_i2s:
...
...
@@ -326,6 +326,8 @@ static int odroid_audio_probe(struct platform_device *pdev)
err_put_cpu_dai:
of_node_put
(
cpu_dai
);
snd_soc_of_put_dai_link_codecs
(
codec_link
);
err_put_node:
of_node_put
(
codec
);
return
ret
;
}
...
...
sound/soc/soc-core.c
浏览文件 @
3b46a67a
...
...
@@ -1511,8 +1511,11 @@ static int soc_probe_link_dais(struct snd_soc_card *card,
}
}
if
(
dai_link
->
dai_fmt
)
snd_soc_runtime_set_dai_fmt
(
rtd
,
dai_link
->
dai_fmt
);
if
(
dai_link
->
dai_fmt
)
{
ret
=
snd_soc_runtime_set_dai_fmt
(
rtd
,
dai_link
->
dai_fmt
);
if
(
ret
)
return
ret
;
}
ret
=
soc_post_component_init
(
rtd
,
dai_link
->
name
);
if
(
ret
)
...
...
sound/soc/soc-dapm.c
浏览文件 @
3b46a67a
...
...
@@ -1157,8 +1157,8 @@ static __always_inline int is_connected_ep(struct snd_soc_dapm_widget *widget,
list_add_tail
(
&
widget
->
work_list
,
list
);
if
(
custom_stop_condition
&&
custom_stop_condition
(
widget
,
dir
))
{
widget
->
endpoints
[
dir
]
=
1
;
return
widget
->
endpoints
[
dir
]
;
list
=
NULL
;
custom_stop_condition
=
NULL
;
}
if
((
widget
->
is_ep
&
SND_SOC_DAPM_DIR_TO_EP
(
dir
))
&&
widget
->
connected
)
{
...
...
@@ -1195,8 +1195,8 @@ static __always_inline int is_connected_ep(struct snd_soc_dapm_widget *widget,
*
* Optionally, can be supplied with a function acting as a stopping condition.
* This function takes the dapm widget currently being examined and the walk
* direction as an arguments, it should return true if
the walk should be
*
stopped and false otherwise
.
* direction as an arguments, it should return true if
widgets from that point
*
in the graph onwards should not be added to the widget list
.
*/
static
int
is_connected_output_ep
(
struct
snd_soc_dapm_widget
*
widget
,
struct
list_head
*
list
,
...
...
@@ -3706,6 +3706,8 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
dev_err
(
dapm
->
dev
,
"ASoC: Failed to request %s: %d
\n
"
,
w
->
name
,
ret
);
kfree_const
(
w
->
sname
);
kfree
(
w
);
return
ERR_PTR
(
ret
);
}
...
...
sound/soc/sof/intel/cnl.c
浏览文件 @
3b46a67a
...
...
@@ -101,8 +101,8 @@ static irqreturn_t cnl_ipc_irq_thread(int irq, void *context)
/*
* This interrupt is not shared so no need to return IRQ_NONE.
*/
dev_
err
_ratelimited
(
sdev
->
dev
,
"
error: nothing to do in
IRQ thread
\n
"
);
dev_
dbg
_ratelimited
(
sdev
->
dev
,
"
nothing to do in IPC
IRQ thread
\n
"
);
}
/* re-enable IPC interrupt */
...
...
sound/soc/sof/intel/hda-ipc.c
浏览文件 @
3b46a67a
...
...
@@ -224,8 +224,8 @@ irqreturn_t hda_dsp_ipc_irq_thread(int irq, void *context)
/*
* This interrupt is not shared so no need to return IRQ_NONE.
*/
dev_
err
_ratelimited
(
sdev
->
dev
,
"
error: nothing to do in
IRQ thread
\n
"
);
dev_
dbg
_ratelimited
(
sdev
->
dev
,
"
nothing to do in IPC
IRQ thread
\n
"
);
}
/* re-enable IPC interrupt */
...
...
sound/soc/ti/davinci-mcasp.c
浏览文件 @
3b46a67a
...
...
@@ -196,7 +196,7 @@ static inline void mcasp_set_axr_pdir(struct davinci_mcasp *mcasp, bool enable)
{
u32
bit
;
for_each_set_bit
(
bit
,
&
mcasp
->
pdir
,
PIN_BIT_A
FSR
)
{
for_each_set_bit
(
bit
,
&
mcasp
->
pdir
,
PIN_BIT_A
MUTE
)
{
if
(
enable
)
mcasp_set_bits
(
mcasp
,
DAVINCI_MCASP_PDIR_REG
,
BIT
(
bit
));
else
...
...
@@ -224,6 +224,7 @@ static void mcasp_start_rx(struct davinci_mcasp *mcasp)
if
(
mcasp_is_synchronous
(
mcasp
))
{
mcasp_set_ctl_reg
(
mcasp
,
DAVINCI_MCASP_GBLCTLX_REG
,
TXHCLKRST
);
mcasp_set_ctl_reg
(
mcasp
,
DAVINCI_MCASP_GBLCTLX_REG
,
TXCLKRST
);
mcasp_set_clk_pdir
(
mcasp
,
true
);
}
/* Activate serializer(s) */
...
...
@@ -1263,6 +1264,28 @@ static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
return
ret
;
}
static
int
davinci_mcasp_hw_rule_slot_width
(
struct
snd_pcm_hw_params
*
params
,
struct
snd_pcm_hw_rule
*
rule
)
{
struct
davinci_mcasp_ruledata
*
rd
=
rule
->
private
;
struct
snd_mask
*
fmt
=
hw_param_mask
(
params
,
SNDRV_PCM_HW_PARAM_FORMAT
);
struct
snd_mask
nfmt
;
int
i
,
slot_width
;
snd_mask_none
(
&
nfmt
);
slot_width
=
rd
->
mcasp
->
slot_width
;
for
(
i
=
0
;
i
<=
SNDRV_PCM_FORMAT_LAST
;
i
++
)
{
if
(
snd_mask_test
(
fmt
,
i
))
{
if
(
snd_pcm_format_width
(
i
)
<=
slot_width
)
{
snd_mask_set
(
&
nfmt
,
i
);
}
}
}
return
snd_mask_refine
(
fmt
,
&
nfmt
);
}
static
const
unsigned
int
davinci_mcasp_dai_rates
[]
=
{
8000
,
11025
,
16000
,
22050
,
32000
,
44100
,
48000
,
64000
,
88200
,
96000
,
176400
,
192000
,
...
...
@@ -1384,7 +1407,7 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
struct
davinci_mcasp_ruledata
*
ruledata
=
&
mcasp
->
ruledata
[
substream
->
stream
];
u32
max_channels
=
0
;
int
i
,
dir
;
int
i
,
dir
,
ret
;
int
tdm_slots
=
mcasp
->
tdm_slots
;
/* Do not allow more then one stream per direction */
...
...
@@ -1413,6 +1436,7 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
max_channels
++
;
}
ruledata
->
serializers
=
max_channels
;
ruledata
->
mcasp
=
mcasp
;
max_channels
*=
tdm_slots
;
/*
* If the already active stream has less channels than the calculated
...
...
@@ -1439,20 +1463,22 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
0
,
SNDRV_PCM_HW_PARAM_CHANNELS
,
&
mcasp
->
chconstr
[
substream
->
stream
]);
if
(
mcasp
->
slot_width
)
snd_pcm_hw_constraint_minmax
(
substream
->
runtime
,
SNDRV_PCM_HW_PARAM_SAMPLE_BITS
,
8
,
mcasp
->
slot_width
);
if
(
mcasp
->
slot_width
)
{
/* Only allow formats require <= slot_width bits on the bus */
ret
=
snd_pcm_hw_rule_add
(
substream
->
runtime
,
0
,
SNDRV_PCM_HW_PARAM_FORMAT
,
davinci_mcasp_hw_rule_slot_width
,
ruledata
,
SNDRV_PCM_HW_PARAM_FORMAT
,
-
1
);
if
(
ret
)
return
ret
;
}
/*
* If we rely on implicit BCLK divider setting we should
* set constraints based on what we can provide.
*/
if
(
mcasp
->
bclk_master
&&
mcasp
->
bclk_div
==
0
&&
mcasp
->
sysclk_freq
)
{
int
ret
;
ruledata
->
mcasp
=
mcasp
;
ret
=
snd_pcm_hw_rule_add
(
substream
->
runtime
,
0
,
SNDRV_PCM_HW_PARAM_RATE
,
davinci_mcasp_hw_rule_rate
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录