mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 05:02:12 +00:00
Merge branch 'for-5.13' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into asoc-5.14
This commit is contained in:
commit
d4e9889b02
@ -81,7 +81,7 @@ struct snd_compr_stream;
|
||||
#define SND_SOC_DAIFMT_CBP_CFP (1 << 12) /* codec clk provider & frame provider */
|
||||
#define SND_SOC_DAIFMT_CBC_CFP (2 << 12) /* codec clk consumer & frame provider */
|
||||
#define SND_SOC_DAIFMT_CBP_CFC (3 << 12) /* codec clk provider & frame consumer */
|
||||
#define SND_SOC_DAIFMT_CBC_CFC (4 << 12) /* codec clk consumer & frame follower */
|
||||
#define SND_SOC_DAIFMT_CBC_CFC (4 << 12) /* codec clk consumer & frame consumer */
|
||||
|
||||
/* previous definitions kept for backwards-compatibility, do not use in new contributions */
|
||||
#define SND_SOC_DAIFMT_CBM_CFM SND_SOC_DAIFMT_CBP_CFP
|
||||
|
@ -307,7 +307,7 @@ static struct snd_soc_dai_driver ak5558_dai = {
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_driver ak5552_dai = {
|
||||
.name = "ak5558-aif",
|
||||
.name = "ak5552-aif",
|
||||
.capture = {
|
||||
.stream_name = "Capture",
|
||||
.channels_min = 1,
|
||||
|
@ -262,6 +262,9 @@ static const struct regmap_config cs35l32_regmap = {
|
||||
.readable_reg = cs35l32_readable_register,
|
||||
.precious_reg = cs35l32_precious_register,
|
||||
.cache_type = REGCACHE_RBTREE,
|
||||
|
||||
.use_single_read = true,
|
||||
.use_single_write = true,
|
||||
};
|
||||
|
||||
static int cs35l32_handle_of_data(struct i2c_client *i2c_client,
|
||||
|
@ -1202,6 +1202,7 @@ static int cs35l33_i2c_probe(struct i2c_client *i2c_client,
|
||||
dev_err(&i2c_client->dev,
|
||||
"CS35L33 Device ID (%X). Expected ID %X\n",
|
||||
devid, CS35L33_CHIP_ID);
|
||||
ret = -EINVAL;
|
||||
goto err_enable;
|
||||
}
|
||||
|
||||
|
@ -801,6 +801,9 @@ static struct regmap_config cs35l34_regmap = {
|
||||
.readable_reg = cs35l34_readable_register,
|
||||
.precious_reg = cs35l34_precious_register,
|
||||
.cache_type = REGCACHE_RBTREE,
|
||||
|
||||
.use_single_read = true,
|
||||
.use_single_write = true,
|
||||
};
|
||||
|
||||
static int cs35l34_handle_of_data(struct i2c_client *i2c_client,
|
||||
|
@ -400,6 +400,9 @@ static const struct regmap_config cs42l42_regmap = {
|
||||
.reg_defaults = cs42l42_reg_defaults,
|
||||
.num_reg_defaults = ARRAY_SIZE(cs42l42_reg_defaults),
|
||||
.cache_type = REGCACHE_RBTREE,
|
||||
|
||||
.use_single_read = true,
|
||||
.use_single_write = true,
|
||||
};
|
||||
|
||||
static DECLARE_TLV_DB_SCALE(adc_tlv, -9600, 100, false);
|
||||
|
@ -1175,7 +1175,7 @@ static int cs42l56_i2c_probe(struct i2c_client *i2c_client,
|
||||
struct cs42l56_platform_data *pdata =
|
||||
dev_get_platdata(&i2c_client->dev);
|
||||
int ret, i;
|
||||
unsigned int devid = 0;
|
||||
unsigned int devid;
|
||||
unsigned int alpha_rev, metal_rev;
|
||||
unsigned int reg;
|
||||
|
||||
@ -1245,6 +1245,11 @@ static int cs42l56_i2c_probe(struct i2c_client *i2c_client,
|
||||
}
|
||||
|
||||
ret = regmap_read(cs42l56->regmap, CS42L56_CHIP_ID_1, ®);
|
||||
if (ret) {
|
||||
dev_err(&i2c_client->dev, "Failed to read chip ID: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
devid = reg & CS42L56_CHIP_ID_MASK;
|
||||
if (devid != CS42L56_DEVID) {
|
||||
dev_err(&i2c_client->dev,
|
||||
|
@ -1269,6 +1269,9 @@ static const struct regmap_config cs42l73_regmap = {
|
||||
.volatile_reg = cs42l73_volatile_register,
|
||||
.readable_reg = cs42l73_readable_register,
|
||||
.cache_type = REGCACHE_RBTREE,
|
||||
|
||||
.use_single_read = true,
|
||||
.use_single_write = true,
|
||||
};
|
||||
|
||||
static int cs42l73_i2c_probe(struct i2c_client *i2c_client,
|
||||
|
@ -913,6 +913,9 @@ static struct regmap_config cs53l30_regmap = {
|
||||
.writeable_reg = cs53l30_writeable_register,
|
||||
.readable_reg = cs53l30_readable_register,
|
||||
.cache_type = REGCACHE_RBTREE,
|
||||
|
||||
.use_single_read = true,
|
||||
.use_single_write = true,
|
||||
};
|
||||
|
||||
static int cs53l30_i2c_probe(struct i2c_client *client,
|
||||
|
@ -3579,6 +3579,7 @@ static const struct of_device_id rx_macro_dt_match[] = {
|
||||
{ .compatible = "qcom,sm8250-lpass-rx-macro" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, rx_macro_dt_match);
|
||||
|
||||
static struct platform_driver rx_macro_driver = {
|
||||
.driver = {
|
||||
|
@ -1846,6 +1846,7 @@ static const struct of_device_id tx_macro_dt_match[] = {
|
||||
{ .compatible = "qcom,sm8250-lpass-tx-macro" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, tx_macro_dt_match);
|
||||
static struct platform_driver tx_macro_driver = {
|
||||
.driver = {
|
||||
.name = "tx_macro",
|
||||
|
@ -408,6 +408,7 @@ static const struct of_device_id sti_sas_dev_match[] = {
|
||||
},
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sti_sas_dev_match);
|
||||
|
||||
static int sti_sas_driver_probe(struct platform_device *pdev)
|
||||
{
|
||||
|
@ -119,6 +119,7 @@ config SND_SOC_FSL_RPMSG
|
||||
tristate "NXP Audio Base On RPMSG support"
|
||||
depends on COMMON_CLK
|
||||
depends on RPMSG
|
||||
depends on SND_IMX_SOC || SND_IMX_SOC = n
|
||||
select SND_SOC_IMX_RPMSG if SND_IMX_SOC != n
|
||||
help
|
||||
Say Y if you want to add rpmsg audio support for the Freescale CPUs.
|
||||
|
@ -209,7 +209,7 @@ static void graph_parse_mclk_fs(struct device_node *top,
|
||||
static int graph_parse_node(struct asoc_simple_priv *priv,
|
||||
struct device_node *ep,
|
||||
struct link_info *li,
|
||||
int is_cpu)
|
||||
int *cpu)
|
||||
{
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
struct device_node *top = dev->of_node;
|
||||
@ -217,9 +217,9 @@ static int graph_parse_node(struct asoc_simple_priv *priv,
|
||||
struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
|
||||
struct snd_soc_dai_link_component *dlc;
|
||||
struct asoc_simple_dai *dai;
|
||||
int ret, single = 0;
|
||||
int ret;
|
||||
|
||||
if (is_cpu) {
|
||||
if (cpu) {
|
||||
dlc = asoc_link_to_cpu(dai_link, 0);
|
||||
dai = simple_props_to_dai_cpu(dai_props, 0);
|
||||
} else {
|
||||
@ -229,7 +229,7 @@ static int graph_parse_node(struct asoc_simple_priv *priv,
|
||||
|
||||
graph_parse_mclk_fs(top, ep, dai_props);
|
||||
|
||||
ret = asoc_simple_parse_dai(ep, dlc, &single);
|
||||
ret = asoc_simple_parse_dai(ep, dlc, cpu);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@ -241,9 +241,6 @@ static int graph_parse_node(struct asoc_simple_priv *priv,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (is_cpu)
|
||||
asoc_simple_canonicalize_cpu(dlc, single);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -276,33 +273,29 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
|
||||
struct link_info *li)
|
||||
{
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
struct snd_soc_card *card = simple_priv_to_card(priv);
|
||||
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
|
||||
struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
|
||||
struct device_node *top = dev->of_node;
|
||||
struct device_node *ep = li->cpu ? cpu_ep : codec_ep;
|
||||
struct device_node *port;
|
||||
struct device_node *ports;
|
||||
struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0);
|
||||
struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0);
|
||||
char dai_name[64];
|
||||
int ret;
|
||||
|
||||
port = of_get_parent(ep);
|
||||
ports = of_get_parent(port);
|
||||
|
||||
dev_dbg(dev, "link_of DPCM (%pOF)\n", ep);
|
||||
|
||||
if (li->cpu) {
|
||||
struct snd_soc_card *card = simple_priv_to_card(priv);
|
||||
struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0);
|
||||
int is_single_links = 0;
|
||||
|
||||
/* Codec is dummy */
|
||||
|
||||
/* FE settings */
|
||||
dai_link->dynamic = 1;
|
||||
dai_link->dpcm_merged_format = 1;
|
||||
|
||||
ret = graph_parse_node(priv, cpu_ep, li, 1);
|
||||
ret = graph_parse_node(priv, cpu_ep, li, &is_single_links);
|
||||
if (ret)
|
||||
goto out_put_node;
|
||||
return ret;
|
||||
|
||||
snprintf(dai_name, sizeof(dai_name),
|
||||
"fe.%pOFP.%s", cpus->of_node, cpus->dai_name);
|
||||
@ -318,8 +311,13 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
|
||||
*/
|
||||
if (card->component_chaining && !soc_component_is_pcm(cpus))
|
||||
dai_link->no_pcm = 1;
|
||||
|
||||
asoc_simple_canonicalize_cpu(cpus, is_single_links);
|
||||
} else {
|
||||
struct snd_soc_codec_conf *cconf;
|
||||
struct snd_soc_codec_conf *cconf = simple_props_to_codec_conf(dai_props, 0);
|
||||
struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0);
|
||||
struct device_node *port;
|
||||
struct device_node *ports;
|
||||
|
||||
/* CPU is dummy */
|
||||
|
||||
@ -327,22 +325,25 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
|
||||
dai_link->no_pcm = 1;
|
||||
dai_link->be_hw_params_fixup = asoc_simple_be_hw_params_fixup;
|
||||
|
||||
cconf = simple_props_to_codec_conf(dai_props, 0);
|
||||
|
||||
ret = graph_parse_node(priv, codec_ep, li, 0);
|
||||
ret = graph_parse_node(priv, codec_ep, li, NULL);
|
||||
if (ret < 0)
|
||||
goto out_put_node;
|
||||
return ret;
|
||||
|
||||
snprintf(dai_name, sizeof(dai_name),
|
||||
"be.%pOFP.%s", codecs->of_node, codecs->dai_name);
|
||||
|
||||
/* check "prefix" from top node */
|
||||
port = of_get_parent(ep);
|
||||
ports = of_get_parent(port);
|
||||
snd_soc_of_parse_node_prefix(top, cconf, codecs->of_node,
|
||||
"prefix");
|
||||
if (of_node_name_eq(ports, "ports"))
|
||||
snd_soc_of_parse_node_prefix(ports, cconf, codecs->of_node, "prefix");
|
||||
snd_soc_of_parse_node_prefix(port, cconf, codecs->of_node,
|
||||
"prefix");
|
||||
|
||||
of_node_put(ports);
|
||||
of_node_put(port);
|
||||
}
|
||||
|
||||
graph_parse_convert(dev, ep, &dai_props->adata);
|
||||
@ -351,11 +352,8 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
|
||||
|
||||
ret = graph_link_init(priv, cpu_ep, codec_ep, li, dai_name);
|
||||
|
||||
out_put_node:
|
||||
li->link++;
|
||||
|
||||
of_node_put(ports);
|
||||
of_node_put(port);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -369,20 +367,23 @@ static int graph_dai_link_of(struct asoc_simple_priv *priv,
|
||||
struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0);
|
||||
struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0);
|
||||
char dai_name[64];
|
||||
int ret;
|
||||
int ret, is_single_links = 0;
|
||||
|
||||
dev_dbg(dev, "link_of (%pOF)\n", cpu_ep);
|
||||
|
||||
ret = graph_parse_node(priv, cpu_ep, li, 1);
|
||||
ret = graph_parse_node(priv, cpu_ep, li, &is_single_links);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = graph_parse_node(priv, codec_ep, li, 0);
|
||||
ret = graph_parse_node(priv, codec_ep, li, NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
snprintf(dai_name, sizeof(dai_name),
|
||||
"%s-%s", cpus->dai_name, codecs->dai_name);
|
||||
|
||||
asoc_simple_canonicalize_cpu(cpus, is_single_links);
|
||||
|
||||
ret = graph_link_init(priv, cpu_ep, codec_ep, li, dai_name);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -93,12 +93,11 @@ static void simple_parse_convert(struct device *dev,
|
||||
}
|
||||
|
||||
static void simple_parse_mclk_fs(struct device_node *top,
|
||||
struct device_node *cpu,
|
||||
struct device_node *codec,
|
||||
struct device_node *np,
|
||||
struct simple_dai_props *props,
|
||||
char *prefix)
|
||||
{
|
||||
struct device_node *node = of_get_parent(cpu);
|
||||
struct device_node *node = of_get_parent(np);
|
||||
char prop[128];
|
||||
|
||||
snprintf(prop, sizeof(prop), "%smclk-fs", PREFIX);
|
||||
@ -106,12 +105,71 @@ static void simple_parse_mclk_fs(struct device_node *top,
|
||||
|
||||
snprintf(prop, sizeof(prop), "%smclk-fs", prefix);
|
||||
of_property_read_u32(node, prop, &props->mclk_fs);
|
||||
of_property_read_u32(cpu, prop, &props->mclk_fs);
|
||||
of_property_read_u32(codec, prop, &props->mclk_fs);
|
||||
of_property_read_u32(np, prop, &props->mclk_fs);
|
||||
|
||||
of_node_put(node);
|
||||
}
|
||||
|
||||
static int simple_parse_node(struct asoc_simple_priv *priv,
|
||||
struct device_node *np,
|
||||
struct link_info *li,
|
||||
char *prefix,
|
||||
int *cpu)
|
||||
{
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
struct device_node *top = dev->of_node;
|
||||
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
|
||||
struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
|
||||
struct snd_soc_dai_link_component *dlc;
|
||||
struct asoc_simple_dai *dai;
|
||||
int ret;
|
||||
|
||||
if (cpu) {
|
||||
dlc = asoc_link_to_cpu(dai_link, 0);
|
||||
dai = simple_props_to_dai_cpu(dai_props, 0);
|
||||
} else {
|
||||
dlc = asoc_link_to_codec(dai_link, 0);
|
||||
dai = simple_props_to_dai_codec(dai_props, 0);
|
||||
}
|
||||
|
||||
simple_parse_mclk_fs(top, np, dai_props, prefix);
|
||||
|
||||
ret = asoc_simple_parse_dai(np, dlc, cpu);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = asoc_simple_parse_clk(dev, np, dai, dlc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = asoc_simple_parse_tdm(np, dai);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int simple_link_init(struct asoc_simple_priv *priv,
|
||||
struct device_node *node,
|
||||
struct device_node *codec,
|
||||
struct link_info *li,
|
||||
char *prefix, char *name)
|
||||
{
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
|
||||
int ret;
|
||||
|
||||
ret = asoc_simple_parse_daifmt(dev, node, codec,
|
||||
prefix, &dai_link->dai_fmt);
|
||||
if (ret < 0)
|
||||
return 0;
|
||||
|
||||
dai_link->init = asoc_simple_dai_init;
|
||||
dai_link->ops = &simple_ops;
|
||||
|
||||
return asoc_simple_set_dailink_name(dev, dai_link, name);
|
||||
}
|
||||
|
||||
static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
|
||||
struct device_node *np,
|
||||
struct device_node *codec,
|
||||
@ -121,24 +179,21 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
|
||||
struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
|
||||
struct asoc_simple_dai *dai;
|
||||
struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0);
|
||||
struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0);
|
||||
struct snd_soc_dai_link_component *platforms = asoc_link_to_platform(dai_link, 0);
|
||||
struct device_node *top = dev->of_node;
|
||||
struct device_node *node = of_get_parent(np);
|
||||
char *prefix = "";
|
||||
char dai_name[64];
|
||||
int ret;
|
||||
|
||||
dev_dbg(dev, "link_of DPCM (%pOF)\n", np);
|
||||
|
||||
li->link++;
|
||||
|
||||
/* For single DAI link & old style of DT node */
|
||||
if (is_top)
|
||||
prefix = PREFIX;
|
||||
|
||||
if (li->cpu) {
|
||||
struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0);
|
||||
struct snd_soc_dai_link_component *platforms = asoc_link_to_platform(dai_link, 0);
|
||||
int is_single_links = 0;
|
||||
|
||||
/* Codec is dummy */
|
||||
@ -147,25 +202,16 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
|
||||
dai_link->dynamic = 1;
|
||||
dai_link->dpcm_merged_format = 1;
|
||||
|
||||
dai = simple_props_to_dai_cpu(dai_props, 0);
|
||||
|
||||
ret = asoc_simple_parse_dai(np, cpus, &is_single_links);
|
||||
if (ret)
|
||||
goto out_put_node;
|
||||
|
||||
ret = asoc_simple_parse_clk(dev, np, dai, cpus);
|
||||
ret = simple_parse_node(priv, np, li, prefix, &is_single_links);
|
||||
if (ret < 0)
|
||||
goto out_put_node;
|
||||
|
||||
ret = asoc_simple_set_dailink_name(dev, dai_link,
|
||||
"fe.%s",
|
||||
cpus->dai_name);
|
||||
if (ret < 0)
|
||||
goto out_put_node;
|
||||
snprintf(dai_name, sizeof(dai_name), "fe.%s", cpus->dai_name);
|
||||
|
||||
asoc_simple_canonicalize_cpu(cpus, is_single_links);
|
||||
asoc_simple_canonicalize_platform(platforms, cpus);
|
||||
} else {
|
||||
struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0);
|
||||
struct snd_soc_codec_conf *cconf;
|
||||
|
||||
/* CPU is dummy */
|
||||
@ -174,22 +220,13 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
|
||||
dai_link->no_pcm = 1;
|
||||
dai_link->be_hw_params_fixup = asoc_simple_be_hw_params_fixup;
|
||||
|
||||
dai = simple_props_to_dai_codec(dai_props, 0);
|
||||
cconf = simple_props_to_codec_conf(dai_props, 0);
|
||||
|
||||
ret = asoc_simple_parse_dai(np, codecs, NULL);
|
||||
ret = simple_parse_node(priv, np, li, prefix, NULL);
|
||||
if (ret < 0)
|
||||
goto out_put_node;
|
||||
|
||||
ret = asoc_simple_parse_clk(dev, np, dai, codecs);
|
||||
if (ret < 0)
|
||||
goto out_put_node;
|
||||
|
||||
ret = asoc_simple_set_dailink_name(dev, dai_link,
|
||||
"be.%s",
|
||||
codecs->dai_name);
|
||||
if (ret < 0)
|
||||
goto out_put_node;
|
||||
snprintf(dai_name, sizeof(dai_name), "be.%s", codecs->dai_name);
|
||||
|
||||
/* check "prefix" from top node */
|
||||
snd_soc_of_parse_node_prefix(top, cconf, codecs->of_node,
|
||||
@ -201,23 +238,14 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
|
||||
}
|
||||
|
||||
simple_parse_convert(dev, np, &dai_props->adata);
|
||||
simple_parse_mclk_fs(top, np, codec, dai_props, prefix);
|
||||
|
||||
ret = asoc_simple_parse_tdm(np, dai);
|
||||
if (ret)
|
||||
goto out_put_node;
|
||||
|
||||
ret = asoc_simple_parse_daifmt(dev, node, codec,
|
||||
prefix, &dai_link->dai_fmt);
|
||||
if (ret < 0)
|
||||
goto out_put_node;
|
||||
|
||||
snd_soc_dai_link_set_capabilities(dai_link);
|
||||
|
||||
dai_link->ops = &simple_ops;
|
||||
dai_link->init = asoc_simple_dai_init;
|
||||
ret = simple_link_init(priv, node, codec, li, prefix, dai_name);
|
||||
|
||||
out_put_node:
|
||||
li->link++;
|
||||
|
||||
of_node_put(node);
|
||||
return ret;
|
||||
}
|
||||
@ -230,23 +258,19 @@ static int simple_dai_link_of(struct asoc_simple_priv *priv,
|
||||
{
|
||||
struct device *dev = simple_priv_to_dev(priv);
|
||||
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
|
||||
struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
|
||||
struct asoc_simple_dai *cpu_dai = simple_props_to_dai_cpu(dai_props, 0);
|
||||
struct asoc_simple_dai *codec_dai = simple_props_to_dai_codec(dai_props, 0);
|
||||
struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0);
|
||||
struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0);
|
||||
struct snd_soc_dai_link_component *platforms = asoc_link_to_platform(dai_link, 0);
|
||||
struct device_node *top = dev->of_node;
|
||||
struct device_node *cpu = NULL;
|
||||
struct device_node *node = NULL;
|
||||
struct device_node *plat = NULL;
|
||||
char dai_name[64];
|
||||
char prop[128];
|
||||
char *prefix = "";
|
||||
int ret, single_cpu = 0;
|
||||
|
||||
cpu = np;
|
||||
node = of_get_parent(np);
|
||||
li->link++;
|
||||
|
||||
dev_dbg(dev, "link_of (%pOF)\n", node);
|
||||
|
||||
@ -257,18 +281,11 @@ static int simple_dai_link_of(struct asoc_simple_priv *priv,
|
||||
snprintf(prop, sizeof(prop), "%splat", prefix);
|
||||
plat = of_get_child_by_name(node, prop);
|
||||
|
||||
ret = asoc_simple_parse_daifmt(dev, node, codec,
|
||||
prefix, &dai_link->dai_fmt);
|
||||
ret = simple_parse_node(priv, cpu, li, prefix, &single_cpu);
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
simple_parse_mclk_fs(top, cpu, codec, dai_props, prefix);
|
||||
|
||||
ret = asoc_simple_parse_dai(cpu, cpus, &single_cpu);
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
ret = asoc_simple_parse_dai(codec, codecs, NULL);
|
||||
ret = simple_parse_node(priv, codec, li, prefix, NULL);
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
@ -276,39 +293,20 @@ static int simple_dai_link_of(struct asoc_simple_priv *priv,
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
ret = asoc_simple_parse_tdm(cpu, cpu_dai);
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
ret = asoc_simple_parse_tdm(codec, codec_dai);
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
ret = asoc_simple_parse_clk(dev, cpu, cpu_dai, cpus);
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
ret = asoc_simple_parse_clk(dev, codec, codec_dai, codecs);
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
ret = asoc_simple_set_dailink_name(dev, dai_link,
|
||||
"%s-%s",
|
||||
cpus->dai_name,
|
||||
codecs->dai_name);
|
||||
if (ret < 0)
|
||||
goto dai_link_of_err;
|
||||
|
||||
dai_link->ops = &simple_ops;
|
||||
dai_link->init = asoc_simple_dai_init;
|
||||
snprintf(dai_name, sizeof(dai_name),
|
||||
"%s-%s", cpus->dai_name, codecs->dai_name);
|
||||
|
||||
asoc_simple_canonicalize_cpu(cpus, single_cpu);
|
||||
asoc_simple_canonicalize_platform(platforms, cpus);
|
||||
|
||||
ret = simple_link_init(priv, node, codec, li, prefix, dai_name);
|
||||
|
||||
dai_link_of_err:
|
||||
of_node_put(plat);
|
||||
of_node_put(node);
|
||||
|
||||
li->link++;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -574,6 +574,17 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
|
||||
BYT_RT5640_SSP0_AIF1 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* Glavey TM800A550L */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),
|
||||
/* Above strings are too generic, also match on BIOS version */
|
||||
DMI_MATCH(DMI_BIOS_VERSION, "ZY-8-BI-PX4S70VTR400-X423B-005-D"),
|
||||
},
|
||||
.driver_data = (void *)(BYTCR_INPUT_DEFAULTS |
|
||||
BYT_RT5640_SSP0_AIF1 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
||||
@ -652,6 +663,20 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
|
||||
BYT_RT5640_MONO_SPEAKER |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* Lenovo Miix 3-830 */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 3-830"),
|
||||
},
|
||||
.driver_data = (void *)(BYT_RT5640_IN1_MAP |
|
||||
BYT_RT5640_JD_SRC_JD2_IN4N |
|
||||
BYT_RT5640_OVCD_TH_2000UA |
|
||||
BYT_RT5640_OVCD_SF_0P75 |
|
||||
BYT_RT5640_MONO_SPEAKER |
|
||||
BYT_RT5640_DIFF_MIC |
|
||||
BYT_RT5640_SSP0_AIF1 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* Linx Linx7 tablet */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LINX"),
|
||||
|
@ -835,18 +835,8 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)
|
||||
if (dai_id == LPASS_DP_RX)
|
||||
continue;
|
||||
|
||||
drvdata->mi2s_osr_clk[dai_id] = devm_clk_get(dev,
|
||||
drvdata->mi2s_osr_clk[dai_id] = devm_clk_get_optional(dev,
|
||||
variant->dai_osr_clk_names[i]);
|
||||
if (IS_ERR(drvdata->mi2s_osr_clk[dai_id])) {
|
||||
dev_warn(dev,
|
||||
"%s() error getting optional %s: %ld\n",
|
||||
__func__,
|
||||
variant->dai_osr_clk_names[i],
|
||||
PTR_ERR(drvdata->mi2s_osr_clk[dai_id]));
|
||||
|
||||
drvdata->mi2s_osr_clk[dai_id] = NULL;
|
||||
}
|
||||
|
||||
drvdata->mi2s_bit_clk[dai_id] = devm_clk_get(dev,
|
||||
variant->dai_bit_clk_names[i]);
|
||||
if (IS_ERR(drvdata->mi2s_bit_clk[dai_id])) {
|
||||
|
@ -2225,6 +2225,8 @@ static char *fmt_single_name(struct device *dev, int *id)
|
||||
return NULL;
|
||||
|
||||
name = devm_kstrdup(dev, devname, GFP_KERNEL);
|
||||
if (!name)
|
||||
return NULL;
|
||||
|
||||
/* are we a "%s.%d" name (platform and SPI components) */
|
||||
found = strstr(name, dev->driver->name);
|
||||
|
@ -421,11 +421,16 @@ static int ssp_dai_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||
struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, SOF_AUDIO_PCM_DRV_NAME);
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
|
||||
struct sof_ipc_fw_version *v = &sdev->fw_ready.version;
|
||||
struct sof_ipc_dai_config *config;
|
||||
struct snd_sof_dai *sof_dai;
|
||||
struct sof_ipc_reply reply;
|
||||
int ret;
|
||||
|
||||
/* DAI_CONFIG IPC during hw_params is not supported in older firmware */
|
||||
if (v->abi_version < SOF_ABI_VER(3, 18, 0))
|
||||
return 0;
|
||||
|
||||
list_for_each_entry(sof_dai, &sdev->dai_list, list) {
|
||||
if (!sof_dai->cpu_dai_name || !sof_dai->dai_config)
|
||||
continue;
|
||||
|
Loading…
Reference in New Issue
Block a user