|
@@ -540,6 +540,14 @@ int rsnd_rdai_ssi_lane_ctrl(struct rsnd_dai *rdai,
|
|
|
return rdai->ssi_lane;
|
|
|
}
|
|
|
|
|
|
+int rsnd_rdai_width_ctrl(struct rsnd_dai *rdai, int width)
|
|
|
+{
|
|
|
+ if (width > 0)
|
|
|
+ rdai->chan_width = width;
|
|
|
+
|
|
|
+ return rdai->chan_width;
|
|
|
+}
|
|
|
+
|
|
|
struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id)
|
|
|
{
|
|
|
if ((id < 0) || (id >= rsnd_rdai_nr(priv)))
|
|
@@ -720,6 +728,16 @@ static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai,
|
|
|
struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
|
|
|
struct device *dev = rsnd_priv_to_dev(priv);
|
|
|
|
|
|
+ switch (slot_width) {
|
|
|
+ case 16:
|
|
|
+ case 24:
|
|
|
+ case 32:
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ dev_err(dev, "unsupported slot width value: %d\n", slot_width);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
switch (slots) {
|
|
|
case 2:
|
|
|
case 6:
|
|
@@ -727,6 +745,7 @@ static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai,
|
|
|
/* TDM Extend Mode */
|
|
|
rsnd_rdai_channels_set(rdai, slots);
|
|
|
rsnd_rdai_ssi_lane_set(rdai, 1);
|
|
|
+ rsnd_rdai_width_set(rdai, slot_width);
|
|
|
break;
|
|
|
default:
|
|
|
dev_err(dev, "unsupported TDM slots (%d)\n", slots);
|
|
@@ -755,7 +774,7 @@ static unsigned int rsnd_soc_hw_rate_list[] = {
|
|
|
192000,
|
|
|
};
|
|
|
|
|
|
-static int rsnd_soc_hw_rule(struct rsnd_priv *priv,
|
|
|
+static int rsnd_soc_hw_rule(struct rsnd_dai *rdai,
|
|
|
unsigned int *list, int list_num,
|
|
|
struct snd_interval *baseline, struct snd_interval *iv)
|
|
|
{
|
|
@@ -772,14 +791,14 @@ static int rsnd_soc_hw_rule(struct rsnd_priv *priv,
|
|
|
if (!snd_interval_test(iv, list[i]))
|
|
|
continue;
|
|
|
|
|
|
- rate = rsnd_ssi_clk_query(priv,
|
|
|
+ rate = rsnd_ssi_clk_query(rdai,
|
|
|
baseline->min, list[i], NULL);
|
|
|
if (rate > 0) {
|
|
|
p.min = min(p.min, list[i]);
|
|
|
p.max = max(p.max, list[i]);
|
|
|
}
|
|
|
|
|
|
- rate = rsnd_ssi_clk_query(priv,
|
|
|
+ rate = rsnd_ssi_clk_query(rdai,
|
|
|
baseline->max, list[i], NULL);
|
|
|
if (rate > 0) {
|
|
|
p.min = min(p.min, list[i]);
|
|
@@ -799,7 +818,6 @@ static int __rsnd_soc_hw_rule_rate(struct snd_pcm_hw_params *params,
|
|
|
struct snd_interval ic;
|
|
|
struct snd_soc_dai *dai = rule->private;
|
|
|
struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
|
|
|
- struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
|
|
|
struct rsnd_dai_stream *io = is_play ? &rdai->playback : &rdai->capture;
|
|
|
|
|
|
/*
|
|
@@ -811,7 +829,7 @@ static int __rsnd_soc_hw_rule_rate(struct snd_pcm_hw_params *params,
|
|
|
ic.min =
|
|
|
ic.max = rsnd_runtime_channel_for_ssi_with_params(io, params);
|
|
|
|
|
|
- return rsnd_soc_hw_rule(priv, rsnd_soc_hw_rate_list,
|
|
|
+ return rsnd_soc_hw_rule(rdai, rsnd_soc_hw_rate_list,
|
|
|
ARRAY_SIZE(rsnd_soc_hw_rate_list),
|
|
|
&ic, ir);
|
|
|
}
|
|
@@ -837,7 +855,6 @@ static int __rsnd_soc_hw_rule_channels(struct snd_pcm_hw_params *params,
|
|
|
struct snd_interval ic;
|
|
|
struct snd_soc_dai *dai = rule->private;
|
|
|
struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
|
|
|
- struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
|
|
|
struct rsnd_dai_stream *io = is_play ? &rdai->playback : &rdai->capture;
|
|
|
|
|
|
/*
|
|
@@ -849,7 +866,7 @@ static int __rsnd_soc_hw_rule_channels(struct snd_pcm_hw_params *params,
|
|
|
ic.min =
|
|
|
ic.max = rsnd_runtime_channel_for_ssi_with_params(io, params);
|
|
|
|
|
|
- return rsnd_soc_hw_rule(priv, rsnd_soc_hw_channels_list,
|
|
|
+ return rsnd_soc_hw_rule(rdai, rsnd_soc_hw_channels_list,
|
|
|
ARRAY_SIZE(rsnd_soc_hw_channels_list),
|
|
|
ir, &ic);
|
|
|
}
|
|
@@ -1072,6 +1089,7 @@ static void __rsnd_dai_probe(struct rsnd_priv *priv,
|
|
|
rdai->capture.rdai = rdai;
|
|
|
rsnd_rdai_channels_set(rdai, 2); /* default 2ch */
|
|
|
rsnd_rdai_ssi_lane_set(rdai, 1); /* default 1lane */
|
|
|
+ rsnd_rdai_width_set(rdai, 32); /* default 32bit width */
|
|
|
|
|
|
for (io_i = 0;; io_i++) {
|
|
|
playback = of_parse_phandle(dai_np, "playback", io_i);
|