asoc: codec: swr-haptics: update slave-vdd regulator control logic
Update the slave-vdd regulator control logic to avoid unbalanced regulator_enable() regulator_disable() calls. Meanwhile, correct the jump label when bailing out from soundwire enumeration failure. This helps to avoid the regulator_put() call in the device remove process throwing a warning for a dangling regulator enable status. Change-Id: I89157f5f9177db69bbbf6aedcc8e605c43a7584e Signed-off-by: Fenglin Wu <fenglinw@codeaurora.org>
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
7cc7e513af
commit
e3c6149759
@@ -76,7 +76,8 @@ struct swr_haptics_dev {
|
|||||||
struct snd_soc_component *component;
|
struct snd_soc_component *component;
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
struct swr_port port;
|
struct swr_port port;
|
||||||
struct regulator *vdd;
|
struct regulator *slave_vdd;
|
||||||
|
bool slave_enabled;
|
||||||
u8 vmax;
|
u8 vmax;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -119,6 +120,44 @@ static bool swr_hap_writeable_register(struct device *dev, unsigned int reg)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int swr_haptics_slave_enable(struct swr_haptics_dev *swr_hap)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (swr_hap->slave_enabled)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
rc = regulator_enable(swr_hap->slave_vdd);
|
||||||
|
if (rc < 0) {
|
||||||
|
dev_err(swr_hap->dev, "%s: enable swr-slave-vdd failed, rc=%d\n",
|
||||||
|
__func__, rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev_dbg(swr_hap->dev, "%s: enable swr-slave-vdd success\n", __func__);
|
||||||
|
swr_hap->slave_enabled = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int swr_haptics_slave_disable(struct swr_haptics_dev *swr_hap)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (!swr_hap->slave_enabled)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
rc = regulator_disable(swr_hap->slave_vdd);
|
||||||
|
if (rc < 0) {
|
||||||
|
dev_err(swr_hap->dev, "%s: disable swr-slave-vdd failed, rc=%d\n",
|
||||||
|
__func__, rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev_dbg(swr_hap->dev, "%s: disable swr-slave-vdd success\n", __func__);
|
||||||
|
swr_hap->slave_enabled = false;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct regmap_config swr_hap_regmap_config = {
|
struct regmap_config swr_hap_regmap_config = {
|
||||||
.reg_bits = 16,
|
.reg_bits = 16,
|
||||||
.val_bits = 8,
|
.val_bits = 8,
|
||||||
@@ -379,16 +418,16 @@ static int swr_haptics_probe(struct swr_device *sdev)
|
|||||||
goto clean;
|
goto clean;
|
||||||
}
|
}
|
||||||
|
|
||||||
swr_hap->vdd = devm_regulator_get(swr_hap->dev, "swr-slave");
|
swr_hap->slave_vdd = devm_regulator_get(swr_hap->dev, "swr-slave");
|
||||||
if (IS_ERR(swr_hap->vdd)) {
|
if (IS_ERR(swr_hap->slave_vdd)) {
|
||||||
rc = PTR_ERR(swr_hap->vdd);
|
rc = PTR_ERR(swr_hap->slave_vdd);
|
||||||
if (rc != -EPROBE_DEFER)
|
if (rc != -EPROBE_DEFER)
|
||||||
dev_err(swr_hap->dev, "%s: get swr-slave-supply failed, rc=%d\n",
|
dev_err(swr_hap->dev, "%s: get swr-slave-supply failed, rc=%d\n",
|
||||||
__func__, rc);
|
__func__, rc);
|
||||||
goto clean;
|
goto clean;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = regulator_enable(swr_hap->vdd);
|
rc = swr_haptics_slave_enable(swr_hap);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
dev_err(swr_hap->dev, "%s: enable swr-slave-vdd failed, rc=%d\n",
|
dev_err(swr_hap->dev, "%s: enable swr-slave-vdd failed, rc=%d\n",
|
||||||
__func__, rc);
|
__func__, rc);
|
||||||
@@ -404,7 +443,7 @@ static int swr_haptics_probe(struct swr_device *sdev)
|
|||||||
dev_err(swr_hap->dev, "%s: failed to get devnum for swr-haptics, rc=%d\n",
|
dev_err(swr_hap->dev, "%s: failed to get devnum for swr-haptics, rc=%d\n",
|
||||||
__func__, rc);
|
__func__, rc);
|
||||||
rc = -EPROBE_DEFER;
|
rc = -EPROBE_DEFER;
|
||||||
goto clean;
|
goto dev_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
sdev->dev_num = devnum;
|
sdev->dev_num = devnum;
|
||||||
@@ -426,7 +465,7 @@ static int swr_haptics_probe(struct swr_device *sdev)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
dev_err:
|
dev_err:
|
||||||
regulator_disable(swr_hap->vdd);
|
swr_haptics_slave_disable(swr_hap);
|
||||||
swr_remove_device(sdev);
|
swr_remove_device(sdev);
|
||||||
clean:
|
clean:
|
||||||
swr_set_dev_data(sdev, NULL);
|
swr_set_dev_data(sdev, NULL);
|
||||||
@@ -445,7 +484,7 @@ static int swr_haptics_remove(struct swr_device *sdev)
|
|||||||
goto clean;
|
goto clean;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = regulator_disable(swr_hap->vdd);
|
rc = swr_haptics_slave_disable(swr_hap);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
dev_err(swr_hap->dev, "%s: disable swr-slave failed, rc=%d\n",
|
dev_err(swr_hap->dev, "%s: disable swr-slave failed, rc=%d\n",
|
||||||
__func__, rc);
|
__func__, rc);
|
||||||
@@ -460,7 +499,6 @@ clean:
|
|||||||
static int swr_haptics_device_up(struct swr_device *sdev)
|
static int swr_haptics_device_up(struct swr_device *sdev)
|
||||||
{
|
{
|
||||||
struct swr_haptics_dev *swr_hap;
|
struct swr_haptics_dev *swr_hap;
|
||||||
int rc;
|
|
||||||
|
|
||||||
swr_hap = swr_get_dev_data(sdev);
|
swr_hap = swr_get_dev_data(sdev);
|
||||||
if (!swr_hap) {
|
if (!swr_hap) {
|
||||||
@@ -469,20 +507,12 @@ static int swr_haptics_device_up(struct swr_device *sdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Take SWR slave out of reset */
|
/* Take SWR slave out of reset */
|
||||||
rc = regulator_enable(swr_hap->vdd);
|
return swr_haptics_slave_enable(swr_hap);
|
||||||
if (rc < 0) {
|
|
||||||
dev_err(swr_hap->dev, "%s: enable swr-slave failed, rc=%d\n",
|
|
||||||
__func__, rc);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int swr_haptics_device_down(struct swr_device *sdev)
|
static int swr_haptics_device_down(struct swr_device *sdev)
|
||||||
{
|
{
|
||||||
struct swr_haptics_dev *swr_hap = swr_get_dev_data(sdev);
|
struct swr_haptics_dev *swr_hap = swr_get_dev_data(sdev);
|
||||||
int rc;
|
|
||||||
|
|
||||||
if (!swr_hap) {
|
if (!swr_hap) {
|
||||||
dev_err(&sdev->dev, "%s: no data for swr_hap\n", __func__);
|
dev_err(&sdev->dev, "%s: no data for swr_hap\n", __func__);
|
||||||
@@ -490,14 +520,7 @@ static int swr_haptics_device_down(struct swr_device *sdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Put SWR slave into reset */
|
/* Put SWR slave into reset */
|
||||||
rc = regulator_disable(swr_hap->vdd);
|
return swr_haptics_slave_disable(swr_hap);
|
||||||
if (rc < 0) {
|
|
||||||
dev_err(swr_hap->dev, "%s: disable swr-slave failed, rc=%d\n",
|
|
||||||
__func__, rc);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int swr_haptics_suspend(struct device *dev)
|
static int swr_haptics_suspend(struct device *dev)
|
||||||
|
Reference in New Issue
Block a user