|
15 | 15 |
|
16 | 16 | #include "rockchip_multi_dais.h" |
17 | 17 |
|
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" |
19 | 23 |
|
20 | 24 | static inline struct rk_mdais_dev *to_info(struct snd_soc_dai *dai) |
21 | 25 | { |
@@ -111,11 +115,17 @@ static int rockchip_mdais_set_fmt(struct snd_soc_dai *cpu_dai, |
111 | 115 | { |
112 | 116 | struct rk_mdais_dev *mdais = to_info(cpu_dai); |
113 | 117 | struct snd_soc_dai *child; |
| 118 | + unsigned int dai_fmt; |
114 | 119 | int ret, i = 0; |
115 | 120 |
|
116 | 121 | for (i = 0; i < mdais->num_dais; i++) { |
117 | 122 | 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); |
119 | 129 | if (ret && ret != -ENOTSUPP) |
120 | 130 | return ret; |
121 | 131 | } |
@@ -226,6 +236,83 @@ static int mdais_runtime_resume(struct device *dev) |
226 | 236 | return 0; |
227 | 237 | } |
228 | 238 |
|
| 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 | + |
229 | 316 | static int rockchip_mdais_probe(struct platform_device *pdev) |
230 | 317 | { |
231 | 318 | struct device_node *np = pdev->dev.of_node; |
@@ -291,6 +378,8 @@ static int rockchip_mdais_probe(struct platform_device *pdev) |
291 | 378 | return -EPROBE_DEFER; |
292 | 379 | } |
293 | 380 |
|
| 381 | + mdais_parse_daifmt(np, dais, count); |
| 382 | + |
294 | 383 | mdais->dais = dais; |
295 | 384 | mdais->dev = &pdev->dev; |
296 | 385 | dev_set_drvdata(&pdev->dev, mdais); |
|
0 commit comments