mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-09-21 11:53:01 +00:00
ASoC: wsa881x: add new operation for wsa881x enumeration
For wsa881x dynamic detection, create a new function to handle the enumeration of a wsa881x device. Once a device is enumerated successfully, this new function will perform below 2 tasks on the device- - register device with regmap - register device as a codec with ALSA core. Change-Id: I087b6869361e880814a8f11d5912bc6530b56758 Signed-off-by: Banajit Goswami <bgoswami@codeaurora.org>
This commit is contained in:
parent
43b4c4a50b
commit
0ff6dd3c75
|
@ -962,7 +962,6 @@ static int wsa881x_probe(struct snd_soc_codec *codec)
|
|||
{
|
||||
struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
|
||||
struct swr_device *dev;
|
||||
u8 devnum = 0;
|
||||
int ret;
|
||||
|
||||
if (!wsa881x)
|
||||
|
@ -970,19 +969,6 @@ static int wsa881x_probe(struct snd_soc_codec *codec)
|
|||
|
||||
dev = wsa881x->swr_slave;
|
||||
wsa881x->codec = codec;
|
||||
/*
|
||||
* 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(dev, dev->addr, &devnum);
|
||||
if (ret) {
|
||||
dev_err(codec->dev, "%s failed to get devnum, err:%d\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
dev->dev_num = devnum;
|
||||
codec->control_data = wsa881x->regmap;
|
||||
ret = snd_soc_codec_set_cache_io(codec, WSA881X_ADDR_BITS,
|
||||
WSA881X_DATA_BITS, SND_SOC_REGMAP);
|
||||
|
@ -1027,6 +1013,53 @@ static struct snd_soc_codec_driver soc_codec_dev_wsa881x = {
|
|||
.num_dapm_routes = ARRAY_SIZE(wsa881x_audio_map),
|
||||
};
|
||||
|
||||
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 failed to get devnum, err:%d\n",
|
||||
__func__, ret);
|
||||
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)
|
||||
{
|
||||
if (wsa881x->pd_gpio < 0) {
|
||||
|
@ -1051,9 +1084,18 @@ static int wsa881x_gpio_init(struct swr_device *pdev)
|
|||
dev_dbg(&pdev->dev, "%s: gpio %d request with name %s\n",
|
||||
__func__, wsa881x->pd_gpio, dev_name(&pdev->dev));
|
||||
ret = gpio_request(wsa881x->pd_gpio, dev_name(&pdev->dev));
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "%s: Failed to request gpio %d, err: %d\n",
|
||||
__func__, wsa881x->pd_gpio, ret);
|
||||
if (ret) {
|
||||
if (ret == -EBUSY) {
|
||||
/* GPIO was already requested */
|
||||
dev_dbg(&pdev->dev,
|
||||
"%s: gpio %d is already set to high\n",
|
||||
__func__, wsa881x->pd_gpio);
|
||||
ret = 0;
|
||||
} else {
|
||||
dev_err(&pdev->dev, "%s: Failed to request gpio %d, err: %d\n",
|
||||
__func__, wsa881x->pd_gpio, ret);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1101,13 +1143,6 @@ static int wsa881x_swr_probe(struct swr_device *pdev)
|
|||
}
|
||||
swr_set_dev_data(pdev, wsa881x);
|
||||
|
||||
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 err;
|
||||
}
|
||||
wsa881x->swr_slave = pdev;
|
||||
|
||||
ret = wsa881x_pinctrl_init(wsa881x, pdev);
|
||||
|
@ -1135,13 +1170,6 @@ static int wsa881x_swr_probe(struct swr_device *pdev)
|
|||
}
|
||||
}
|
||||
|
||||
ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wsa881x,
|
||||
NULL, 0);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "%s: Codec registration failed\n",
|
||||
__func__);
|
||||
goto err1;
|
||||
}
|
||||
if (!debugfs_wsa881x_dent) {
|
||||
dbgwsa881x = wsa881x;
|
||||
debugfs_wsa881x_dent = debugfs_create_dir(
|
||||
|
@ -1167,9 +1195,6 @@ static int wsa881x_swr_probe(struct swr_device *pdev)
|
|||
}
|
||||
return 0;
|
||||
|
||||
err1:
|
||||
if (wsa881x->pd_gpio)
|
||||
gpio_free(wsa881x->pd_gpio);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
@ -1293,6 +1318,7 @@ 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)
|
||||
|
|
Loading…
Reference in a new issue