Skip to content

Commit 738f93c

Browse files
Sugar Zhangrkhuangtao
authored andcommitted
ASoC: rockchip: multi_dais: add support for parse dai format
Change-Id: Ib877400965bbe07de527a0ac95cc8193c61dbd87 Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
1 parent 109adf2 commit 738f93c

2 files changed

Lines changed: 93 additions & 2 deletions

File tree

sound/soc/rockchip/rockchip_multi_dais.c

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515

1616
#include "rockchip_multi_dais.h"
1717

18-
#define DAIS_DRV_NAME "rockchip-mdais"
18+
#define BITCLOCK_INV_STR "bitclock-inversion"
19+
#define FRAME_INV_STR "frame-inversion"
20+
#define BITCLOCK_MASTER_STR "bitclock-master"
21+
#define FRAME_MASTER_STR "frame-master"
22+
#define DAIS_DRV_NAME "rockchip-mdais"
1923

2024
static inline struct rk_mdais_dev *to_info(struct snd_soc_dai *dai)
2125
{
@@ -111,11 +115,17 @@ static int rockchip_mdais_set_fmt(struct snd_soc_dai *cpu_dai,
111115
{
112116
struct rk_mdais_dev *mdais = to_info(cpu_dai);
113117
struct snd_soc_dai *child;
118+
unsigned int dai_fmt;
114119
int ret, i = 0;
115120

116121
for (i = 0; i < mdais->num_dais; i++) {
117122
child = mdais->dais[i].dai;
118-
ret = snd_soc_dai_set_fmt(child, fmt);
123+
dai_fmt = fmt;
124+
if (mdais->dais[i].fmt_msk) {
125+
dai_fmt &= ~(mdais->dais[i].fmt_msk);
126+
dai_fmt |= mdais->dais[i].fmt;
127+
}
128+
ret = snd_soc_dai_set_fmt(child, dai_fmt);
119129
if (ret && ret != -ENOTSUPP)
120130
return ret;
121131
}
@@ -226,6 +236,83 @@ static int mdais_runtime_resume(struct device *dev)
226236
return 0;
227237
}
228238

239+
static int mdais_read_prop_array(struct device_node *node,
240+
const char *propname,
241+
unsigned int *array, int num)
242+
{
243+
int ret = 0;
244+
245+
memset(array, 0, sizeof(*array) * num);
246+
if (of_property_read_bool(node, propname)) {
247+
ret = of_property_read_u32_array(node, propname, array, num);
248+
if (ret)
249+
ret = -EINVAL;
250+
} else {
251+
ret = -EINVAL;
252+
}
253+
254+
return ret;
255+
}
256+
257+
static void mdais_parse_daifmt(struct device_node *node, struct rk_dai *dais,
258+
int num_dai)
259+
{
260+
unsigned int cinv[MAX_DAIS], finv[MAX_DAIS];
261+
unsigned int cmst[MAX_DAIS], fmst[MAX_DAIS];
262+
unsigned int format = 0, format_mask = 0;
263+
int i = 0, ret = 0;
264+
265+
ret = mdais_read_prop_array(node, BITCLOCK_INV_STR, cinv, num_dai);
266+
if (!ret)
267+
format_mask |= SND_SOC_DAIFMT_INV_MASK;
268+
ret = mdais_read_prop_array(node, FRAME_INV_STR, finv, num_dai);
269+
if (!ret)
270+
format_mask |= SND_SOC_DAIFMT_INV_MASK;
271+
ret = mdais_read_prop_array(node, BITCLOCK_MASTER_STR, cmst, num_dai);
272+
if (!ret)
273+
format_mask |= SND_SOC_DAIFMT_MASTER_MASK;
274+
ret = mdais_read_prop_array(node, FRAME_MASTER_STR, fmst, num_dai);
275+
if (!ret)
276+
format_mask |= SND_SOC_DAIFMT_MASTER_MASK;
277+
278+
for (i = 0; i < num_dai; i++) {
279+
format = 0;
280+
281+
switch ((cinv[i] << 4) + finv[i]) {
282+
case 0x11:
283+
format |= SND_SOC_DAIFMT_IB_IF;
284+
break;
285+
case 0x10:
286+
format |= SND_SOC_DAIFMT_IB_NF;
287+
break;
288+
case 0x01:
289+
format |= SND_SOC_DAIFMT_NB_IF;
290+
break;
291+
default:
292+
/* SND_SOC_DAIFMT_NB_NF is default */
293+
break;
294+
}
295+
296+
switch ((cmst[i] << 4) + fmst[i]) {
297+
case 0x11:
298+
format |= SND_SOC_DAIFMT_CBM_CFM;
299+
break;
300+
case 0x10:
301+
format |= SND_SOC_DAIFMT_CBM_CFS;
302+
break;
303+
case 0x01:
304+
format |= SND_SOC_DAIFMT_CBS_CFM;
305+
break;
306+
default:
307+
format |= SND_SOC_DAIFMT_CBS_CFS;
308+
break;
309+
}
310+
311+
dais[i].fmt = format;
312+
dais[i].fmt_msk = format_mask;
313+
}
314+
}
315+
229316
static int rockchip_mdais_probe(struct platform_device *pdev)
230317
{
231318
struct device_node *np = pdev->dev.of_node;
@@ -291,6 +378,8 @@ static int rockchip_mdais_probe(struct platform_device *pdev)
291378
return -EPROBE_DEFER;
292379
}
293380

381+
mdais_parse_daifmt(np, dais, count);
382+
294383
mdais->dais = dais;
295384
mdais->dev = &pdev->dev;
296385
dev_set_drvdata(&pdev->dev, mdais);

sound/soc/rockchip/rockchip_multi_dais.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ struct rk_dai {
1515
struct device *dev;
1616
struct device_node *of_node;
1717
struct snd_soc_dai *dai;
18+
unsigned int fmt;
19+
unsigned int fmt_msk;
1820
};
1921

2022
struct rk_mdais_dev {

0 commit comments

Comments
 (0)