summaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth
diff options
context:
space:
mode:
authorBjorn Andersson <bjorn.andersson@linaro.org>2019-10-18 07:24:03 +0200
committerMarcel Holtmann <marcel@holtmann.org>2019-10-17 11:12:20 +0200
commit163d42fa83c6090071698533d33babd7bbf97147 (patch)
treefdde62ab2e6317fc85e1ea5d7fe8647cec8328cd /drivers/bluetooth
parentBluetooth: hci_qca: Don't vote for specific voltage (diff)
downloadlinux-163d42fa83c6090071698533d33babd7bbf97147.tar.xz
linux-163d42fa83c6090071698533d33babd7bbf97147.zip
Bluetooth: hci_qca: Use regulator bulk enable/disable
With the regulator_set_load() and regulator_set_voltage() out of the enable/disable code paths the code can now use the standard regulator bulk enable/disable API. By cloning num_vregs into struct qca_power there's no need to lug around a reference to the struct qca_vreg_data, which further simplifies qca_power_setup(). Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'drivers/bluetooth')
-rw-r--r--drivers/bluetooth/hci_qca.c55
1 files changed, 13 insertions, 42 deletions
diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
index 0a397cd7280e..df3218072b04 100644
--- a/drivers/bluetooth/hci_qca.c
+++ b/drivers/bluetooth/hci_qca.c
@@ -144,8 +144,8 @@ struct qca_vreg_data {
*/
struct qca_power {
struct device *dev;
- const struct qca_vreg_data *vreg_data;
struct regulator_bulk_data *vreg_bulk;
+ int num_vregs;
bool vregs_on;
};
@@ -1383,63 +1383,34 @@ static int qca_power_off(struct hci_dev *hdev)
return 0;
}
-static int qca_enable_regulator(struct qca_vreg vregs,
- struct regulator *regulator)
-{
- return regulator_enable(regulator);
-
-}
-
-static void qca_disable_regulator(struct qca_vreg vregs,
- struct regulator *regulator)
-{
- regulator_disable(regulator);
-
-}
-
static int qca_power_setup(struct hci_uart *hu, bool on)
{
- struct qca_vreg *vregs;
struct regulator_bulk_data *vreg_bulk;
struct qca_serdev *qcadev;
- int i, num_vregs, ret = 0;
+ int num_vregs;
+ int ret = 0;
qcadev = serdev_device_get_drvdata(hu->serdev);
- if (!qcadev || !qcadev->bt_power || !qcadev->bt_power->vreg_data ||
- !qcadev->bt_power->vreg_bulk)
+ if (!qcadev || !qcadev->bt_power || !qcadev->bt_power->vreg_bulk)
return -EINVAL;
- vregs = qcadev->bt_power->vreg_data->vregs;
vreg_bulk = qcadev->bt_power->vreg_bulk;
- num_vregs = qcadev->bt_power->vreg_data->num_vregs;
- BT_DBG("on: %d", on);
+ num_vregs = qcadev->bt_power->num_vregs;
+ BT_DBG("on: %d (%d regulators)", on, num_vregs);
if (on && !qcadev->bt_power->vregs_on) {
- for (i = 0; i < num_vregs; i++) {
- ret = qca_enable_regulator(vregs[i],
- vreg_bulk[i].consumer);
- if (ret)
- break;
- }
+ ret = regulator_bulk_enable(num_vregs, vreg_bulk);
+ if (ret)
+ return ret;
- if (ret) {
- BT_ERR("failed to enable regulator:%s", vregs[i].name);
- /* turn off regulators which are enabled */
- for (i = i - 1; i >= 0; i--)
- qca_disable_regulator(vregs[i],
- vreg_bulk[i].consumer);
- } else {
- qcadev->bt_power->vregs_on = true;
- }
+ qcadev->bt_power->vregs_on = true;
} else if (!on && qcadev->bt_power->vregs_on) {
/* turn off regulator in reverse order */
- i = qcadev->bt_power->vreg_data->num_vregs - 1;
- for ( ; i >= 0; i--)
- qca_disable_regulator(vregs[i], vreg_bulk[i].consumer);
+ regulator_bulk_disable(num_vregs, vreg_bulk);
qcadev->bt_power->vregs_on = false;
}
- return ret;
+ return 0;
}
static int qca_init_regulators(struct qca_power *qca,
@@ -1467,6 +1438,7 @@ static int qca_init_regulators(struct qca_power *qca,
}
qca->vreg_bulk = bulk;
+ qca->num_vregs = num_vregs;
return 0;
}
@@ -1495,7 +1467,6 @@ static int qca_serdev_probe(struct serdev_device *serdev)
return -ENOMEM;
qcadev->bt_power->dev = &serdev->dev;
- qcadev->bt_power->vreg_data = data;
err = qca_init_regulators(qcadev->bt_power, data->vregs,
data->num_vregs);
if (err) {