ASoC: wsa881x: Add loadable module support for WSA

Add support to compile WSA as a loadable module.
Move WSA kconfig tristate selection under the
machine driver loadable module kconfig.

CRs-fixed: 2036684
Change-Id: I810f22d3e9ab4849ca86e8444115f1f84c6a6a51
Signed-off-by: Karthikeyan Mani <kmani@codeaurora.org>
This commit is contained in:
Karthikeyan Mani
2017-04-19 14:06:55 -07:00
parent 7e7eb003d4
commit aa69b5e7fd
3 changed files with 43 additions and 53 deletions

View File

@@ -742,10 +742,14 @@ config SND_SOC_WCD934X_MBHC
depends on SND_SOC_WCD934X
select SND_SOC_WCD_MBHC
config REGMAP_SWR
tristate
default y
config SND_SOC_WSA881X
tristate
depends on REGMAP_SWR
tristate
select MSM_CDC_PINCTRL
select REGMAP_SWR
config SND_SOC_WSA881X_ANALOG
tristate

View File

@@ -1123,54 +1123,6 @@ static struct snd_soc_codec_driver soc_codec_dev_wsa881x = {
.get_regmap = wsa881x_get_regmap,
};
static int wsa881x_swr_startup(struct swr_device *swr_dev)
{
int ret = 0;
u8 devnum = 0;
struct wsa881x_priv *wsa881x;
wsa881x = swr_get_dev_data(swr_dev);
if (!wsa881x) {
dev_err(&swr_dev->dev, "%s: wsa881x is NULL\n", __func__);
return -EINVAL;
}
/*
* Add 5msec delay to provide sufficient time for
* soundwire auto enumeration of slave devices as
* as per HW requirement.
*/
usleep_range(5000, 5010);
ret = swr_get_logical_dev_num(swr_dev, swr_dev->addr, &devnum);
if (ret) {
dev_dbg(&swr_dev->dev,
"%s get devnum %d for dev addr %lx failed\n",
__func__, devnum, swr_dev->addr);
goto err;
}
swr_dev->dev_num = devnum;
wsa881x->regmap = devm_regmap_init_swr(swr_dev,
&wsa881x_regmap_config);
if (IS_ERR(wsa881x->regmap)) {
ret = PTR_ERR(wsa881x->regmap);
dev_err(&swr_dev->dev, "%s: regmap_init failed %d\n",
__func__, ret);
goto err;
}
ret = snd_soc_register_codec(&swr_dev->dev, &soc_codec_dev_wsa881x,
NULL, 0);
if (ret) {
dev_err(&swr_dev->dev, "%s: Codec registration failed\n",
__func__);
goto err;
}
err:
return ret;
}
static int wsa881x_gpio_ctrl(struct wsa881x_priv *wsa881x, bool enable)
{
int ret = 0;
@@ -1232,6 +1184,7 @@ static int wsa881x_swr_probe(struct swr_device *pdev)
{
int ret = 0;
struct wsa881x_priv *wsa881x;
u8 devnum = 0;
wsa881x = devm_kzalloc(&pdev->dev, sizeof(struct wsa881x_priv),
GFP_KERNEL);
@@ -1291,8 +1244,43 @@ static int wsa881x_swr_probe(struct swr_device *pdev)
&codec_debug_ops);
}
}
/*
* Add 5msec delay to provide sufficient time for
* soundwire auto enumeration of slave devices as
* as per HW requirement.
*/
usleep_range(5000, 5010);
ret = swr_get_logical_dev_num(pdev, pdev->addr, &devnum);
if (ret) {
dev_dbg(&pdev->dev,
"%s get devnum %d for dev addr %lx failed\n",
__func__, devnum, pdev->addr);
goto dev_err;
}
pdev->dev_num = devnum;
wsa881x->regmap = devm_regmap_init_swr(pdev,
&wsa881x_regmap_config);
if (IS_ERR(wsa881x->regmap)) {
ret = PTR_ERR(wsa881x->regmap);
dev_err(&pdev->dev, "%s: regmap_init failed %d\n",
__func__, ret);
goto dev_err;
}
ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wsa881x,
NULL, 0);
if (ret) {
dev_err(&pdev->dev, "%s: Codec registration failed\n",
__func__);
goto dev_err;
}
return 0;
dev_err:
swr_remove_device(pdev);
err:
return ret;
}
@@ -1425,7 +1413,6 @@ static struct swr_driver wsa881x_codec_driver = {
.device_up = wsa881x_swr_up,
.device_down = wsa881x_swr_down,
.reset_device = wsa881x_swr_reset,
.startup = wsa881x_swr_startup,
};
static int __init wsa881x_codec_init(void)

View File

@@ -192,7 +192,7 @@ config SND_SOC_MSM8996
config SND_SOC_MACHINE_MSM8998
tristate "SoC Machine driver for MSM8998 boards"
select SND_SOC_WSA881X
help
To enable the machine driver and the
corresponding DAI-links
@@ -212,7 +212,6 @@ config SND_SOC_MSM8998
select MSM_QDSP6V2_CODECS
select SND_SOC_WCD9335
select SND_SOC_WCD934X
select SND_SOC_WSA881X
select SND_SOC_MSM_HDMI_CODEC_RX
select DTS_SRS_TM
select QTI_PP