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:
Fenglin Wu
2021-03-25 09:25:51 +08:00
committed by Gerrit - the friendly Code Review server
parent 7cc7e513af
commit e3c6149759

View File

@@ -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)