Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 22 additions & 3 deletions sound/soc/intel/boards/bytcht_es8316.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ struct byt_cht_es8316_private {
struct snd_soc_jack jack;
struct gpio_desc *speaker_en_gpio;
bool speaker_en;
struct device *codec_dev;
};

enum {
Expand Down Expand Up @@ -461,6 +462,7 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
const struct dmi_system_id *dmi_id;
struct device *dev = &pdev->dev;
struct snd_soc_acpi_mach *mach;
struct fwnode_handle *fwnode;
const char *platform_name;
struct acpi_device *adev;
struct device *codec_dev;
Expand Down Expand Up @@ -543,7 +545,16 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
props[cnt++] = PROPERTY_ENTRY_BOOL("everest,jack-detect-inverted");

if (cnt) {
ret = device_add_properties(codec_dev, props);
fwnode = fwnode_create_software_node(props, NULL);
if (IS_ERR(fwnode)) {
put_device(codec_dev);
return PTR_ERR(fwnode);
}

ret = device_add_software_node(codec_dev, to_software_node(fwnode));

fwnode_handle_put(fwnode);

if (ret) {
put_device(codec_dev);
return ret;
Expand All @@ -556,6 +567,7 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
/* see comment in byt_cht_es8316_resume */
GPIOD_OUT_LOW | GPIOD_FLAGS_BIT_NONEXCLUSIVE);
put_device(codec_dev);
priv->codec_dev = codec_dev;

if (IS_ERR(priv->speaker_en_gpio)) {
ret = PTR_ERR(priv->speaker_en_gpio);
Expand All @@ -567,7 +579,7 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
dev_err(dev, "get speaker GPIO failed: %d\n", ret);
fallthrough;
case -EPROBE_DEFER:
return ret;
goto err;
}
}

Expand Down Expand Up @@ -605,10 +617,15 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
if (ret) {
gpiod_put(priv->speaker_en_gpio);
dev_err(dev, "snd_soc_register_card failed: %d\n", ret);
return ret;
goto err;
}
platform_set_drvdata(pdev, &byt_cht_es8316_card);
return 0;

err:
device_remove_software_node(priv->codec_dev);

return ret;
}

static int snd_byt_cht_es8316_mc_remove(struct platform_device *pdev)
Expand All @@ -617,6 +634,8 @@ static int snd_byt_cht_es8316_mc_remove(struct platform_device *pdev)
struct byt_cht_es8316_private *priv = snd_soc_card_get_drvdata(card);

gpiod_put(priv->speaker_en_gpio);
device_remove_software_node(priv->codec_dev);

return 0;
}

Expand Down
42 changes: 36 additions & 6 deletions sound/soc/intel/boards/bytcr_rt5640.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ enum {
struct byt_rt5640_private {
struct snd_soc_jack jack;
struct clk *mclk;
struct device *codec_dev;
};
static bool is_bytcr;

Expand Down Expand Up @@ -912,9 +913,11 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
* Note this MUST be called before snd_soc_register_card(), so that the props
* are in place before the codec component driver's probe function parses them.
*/
static int byt_rt5640_add_codec_device_props(const char *i2c_dev_name)
static int byt_rt5640_add_codec_device_props(const char *i2c_dev_name,
struct byt_rt5640_private *priv)
{
struct property_entry props[MAX_NO_PROPS] = {};
struct fwnode_handle *fwnode;
struct device *i2c_dev;
int ret, cnt = 0;

Expand Down Expand Up @@ -960,7 +963,18 @@ static int byt_rt5640_add_codec_device_props(const char *i2c_dev_name)
if (byt_rt5640_quirk & BYT_RT5640_JD_NOT_INV)
props[cnt++] = PROPERTY_ENTRY_BOOL("realtek,jack-detect-not-inverted");

ret = device_add_properties(i2c_dev, props);
fwnode = fwnode_create_software_node(props, NULL);
if (IS_ERR(fwnode)) {
/* put_device() is not handled in caller */
put_device(i2c_dev);
return PTR_ERR(fwnode);
}

ret = device_add_software_node(i2c_dev, to_software_node(fwnode));

fwnode_handle_put(fwnode);
priv->codec_dev = i2c_dev;

put_device(i2c_dev);

return ret;
Expand Down Expand Up @@ -1401,7 +1415,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
}

/* Must be called before register_card, also see declaration comment. */
ret_val = byt_rt5640_add_codec_device_props(byt_rt5640_codec_name);
ret_val = byt_rt5640_add_codec_device_props(byt_rt5640_codec_name, priv);
if (ret_val)
return ret_val;

Expand Down Expand Up @@ -1434,7 +1448,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
* for all other errors, including -EPROBE_DEFER
*/
if (ret_val != -ENOENT)
return ret_val;
goto err;
byt_rt5640_quirk &= ~BYT_RT5640_MCLK_EN;
}
}
Expand Down Expand Up @@ -1467,7 +1481,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
ret_val = snd_soc_fixup_dai_links_platform_name(&byt_rt5640_card,
platform_name);
if (ret_val)
return ret_val;
goto err;

sof_parent = snd_soc_acpi_sof_parent(&pdev->dev);

Expand All @@ -1489,17 +1503,33 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
if (ret_val) {
dev_err(&pdev->dev, "devm_snd_soc_register_card failed %d\n",
ret_val);
return ret_val;
goto err;
}
platform_set_drvdata(pdev, &byt_rt5640_card);
return ret_val;

err:
device_remove_software_node(priv->codec_dev);

return ret_val;
}

static int snd_byt_rt5640_mc_remove(struct platform_device *pdev)
{
struct snd_soc_card *card = platform_get_drvdata(pdev);
struct byt_rt5640_private *priv = snd_soc_card_get_drvdata(card);

device_remove_software_node(priv->codec_dev);

return 0;
}

static struct platform_driver snd_byt_rt5640_mc_driver = {
.driver = {
.name = "bytcr_rt5640",
},
.probe = snd_byt_rt5640_mc_probe,
.remove = snd_byt_rt5640_mc_remove
};

module_platform_driver(snd_byt_rt5640_mc_driver);
Expand Down
47 changes: 39 additions & 8 deletions sound/soc/intel/boards/bytcr_rt5651.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ struct byt_rt5651_private {
struct gpio_desc *ext_amp_gpio;
struct gpio_desc *hp_detect;
struct snd_soc_jack jack;
struct device *codec_dev;
};

static const struct acpi_gpio_mapping *byt_rt5651_gpios;
Expand Down Expand Up @@ -527,10 +528,13 @@ static const struct dmi_system_id byt_rt5651_quirk_table[] = {
* Note this MUST be called before snd_soc_register_card(), so that the props
* are in place before the codec component driver's probe function parses them.
*/
static int byt_rt5651_add_codec_device_props(struct device *i2c_dev)
static int byt_rt5651_add_codec_device_props(struct device *i2c_dev,
struct byt_rt5651_private *priv)
{
struct property_entry props[MAX_NO_PROPS] = {};
struct fwnode_handle *fwnode;
int cnt = 0;
int ret;

props[cnt++] = PROPERTY_ENTRY_U32("realtek,jack-detect-source",
BYT_RT5651_JDSRC(byt_rt5651_quirk));
Expand All @@ -547,7 +551,18 @@ static int byt_rt5651_add_codec_device_props(struct device *i2c_dev)
if (byt_rt5651_quirk & BYT_RT5651_JD_NOT_INV)
props[cnt++] = PROPERTY_ENTRY_BOOL("realtek,jack-detect-not-inverted");

return device_add_properties(i2c_dev, props);
fwnode = fwnode_create_software_node(props, NULL);
if (IS_ERR(fwnode)) {
/* put_device(i2c_dev) is handled in caller */
return PTR_ERR(fwnode);
}

ret = device_add_software_node(i2c_dev, to_software_node(fwnode));

fwnode_handle_put(fwnode);
priv->codec_dev = i2c_dev;

return ret;
}

static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime)
Expand Down Expand Up @@ -994,7 +1009,7 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
}

/* Must be called before register_card, also see declaration comment. */
ret_val = byt_rt5651_add_codec_device_props(codec_dev);
ret_val = byt_rt5651_add_codec_device_props(codec_dev, priv);
if (ret_val) {
put_device(codec_dev);
return ret_val;
Expand Down Expand Up @@ -1023,7 +1038,7 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
fallthrough;
case -EPROBE_DEFER:
put_device(codec_dev);
return ret_val;
goto err;
}
}
priv->hp_detect = devm_fwnode_gpiod_get(&pdev->dev,
Expand All @@ -1043,7 +1058,7 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
fallthrough;
case -EPROBE_DEFER:
put_device(codec_dev);
return ret_val;
goto err;
}
}
}
Expand Down Expand Up @@ -1073,7 +1088,7 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
* for all other errors, including -EPROBE_DEFER
*/
if (ret_val != -ENOENT)
return ret_val;
goto err;
byt_rt5651_quirk &= ~BYT_RT5651_MCLK_EN;
}
}
Expand Down Expand Up @@ -1102,7 +1117,7 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
ret_val = snd_soc_fixup_dai_links_platform_name(&byt_rt5651_card,
platform_name);
if (ret_val)
return ret_val;
goto err;

sof_parent = snd_soc_acpi_sof_parent(&pdev->dev);

Expand All @@ -1124,17 +1139,33 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
if (ret_val) {
dev_err(&pdev->dev, "devm_snd_soc_register_card failed %d\n",
ret_val);
return ret_val;
goto err;
}
platform_set_drvdata(pdev, &byt_rt5651_card);
return ret_val;

err:
device_remove_software_node(priv->codec_dev);

return ret_val;
}

static int snd_byt_rt5651_mc_remove(struct platform_device *pdev)
{
struct snd_soc_card *card = platform_get_drvdata(pdev);
struct byt_rt5651_private *priv = snd_soc_card_get_drvdata(card);

device_remove_software_node(priv->codec_dev);

return 0;
}

static struct platform_driver snd_byt_rt5651_mc_driver = {
.driver = {
.name = "bytcr_rt5651",
},
.probe = snd_byt_rt5651_mc_probe,
.remove = snd_byt_rt5651_mc_remove,
};

module_platform_driver(snd_byt_rt5651_mc_driver);
Expand Down
20 changes: 15 additions & 5 deletions sound/soc/intel/boards/sof_sdw_rt711.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,29 @@
static int rt711_add_codec_device_props(const char *sdw_dev_name)
{
struct property_entry props[MAX_NO_PROPS] = {};
struct fwnode_handle *fwnode;
struct device *sdw_dev;
int ret;

if (!SOF_RT711_JDSRC(sof_sdw_quirk))
return 0;

sdw_dev = bus_find_device_by_name(&sdw_bus_type, NULL, sdw_dev_name);
if (!sdw_dev)
return -EPROBE_DEFER;

if (SOF_RT711_JDSRC(sof_sdw_quirk)) {
props[0] = PROPERTY_ENTRY_U32("realtek,jd-src",
SOF_RT711_JDSRC(sof_sdw_quirk));
props[0] = PROPERTY_ENTRY_U32("realtek,jd-src",
SOF_RT711_JDSRC(sof_sdw_quirk));

fwnode = fwnode_create_software_node(props, NULL);
if (IS_ERR(fwnode)) {
put_device(sdw_dev);
return PTR_ERR(fwnode);
}

ret = device_add_properties(sdw_dev, props);
ret = device_add_software_node(sdw_dev, to_software_node(fwnode));

fwnode_handle_put(fwnode);
put_device(sdw_dev);

return ret;
Expand Down Expand Up @@ -144,7 +154,7 @@ int sof_sdw_rt711_exit(struct device *dev, struct snd_soc_dai_link *dai_link)
if (!sdw_dev)
return -EINVAL;

device_remove_properties(sdw_dev);
device_remove_software_node(sdw_dev);
put_device(sdw_dev);

return 0;
Expand Down
20 changes: 15 additions & 5 deletions sound/soc/intel/boards/sof_sdw_rt711_sdca.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,29 @@
static int rt711_sdca_add_codec_device_props(const char *sdw_dev_name)
{
struct property_entry props[MAX_NO_PROPS] = {};
struct fwnode_handle *fwnode;
struct device *sdw_dev;
int ret;

if (!SOF_RT711_JDSRC(sof_sdw_quirk))
return 0;

sdw_dev = bus_find_device_by_name(&sdw_bus_type, NULL, sdw_dev_name);
if (!sdw_dev)
return -EPROBE_DEFER;

if (SOF_RT711_JDSRC(sof_sdw_quirk)) {
props[0] = PROPERTY_ENTRY_U32("realtek,jd-src",
SOF_RT711_JDSRC(sof_sdw_quirk));
props[0] = PROPERTY_ENTRY_U32("realtek,jd-src",
SOF_RT711_JDSRC(sof_sdw_quirk));

fwnode = fwnode_create_software_node(props, NULL);
if (IS_ERR(fwnode)) {
put_device(sdw_dev);
return PTR_ERR(fwnode);
}

ret = device_add_properties(sdw_dev, props);
ret = device_add_software_node(sdw_dev, to_software_node(fwnode));

fwnode_handle_put(fwnode);
put_device(sdw_dev);

return ret;
Expand Down Expand Up @@ -144,7 +154,7 @@ int sof_sdw_rt711_sdca_exit(struct device *dev, struct snd_soc_dai_link *dai_lin
if (!sdw_dev)
return -EINVAL;

device_remove_properties(sdw_dev);
device_remove_software_node(sdw_dev);
put_device(sdw_dev);

return 0;
Expand Down