struct palmas_pmic *pmic = rdev_get_drvdata(dev);
int id = rdev_get_id(dev);
unsigned int reg;
-
+ mutex_lock(&pmic->mutex);
+ if (pmic->shutdown) {
+ mutex_unlock(&pmic->mutex);
+ return -EINVAL;
+ }
palmas_smps_read(pmic->palmas, palmas_regs_info[id].ctrl_addr, ®);
reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
reg |= SMPS_CTRL_MODE_ON;
palmas_smps_write(pmic->palmas, palmas_regs_info[id].ctrl_addr, reg);
+ mutex_unlock(&pmic->mutex);
return 0;
}
struct palmas_pmic *pmic = rdev_get_drvdata(dev);
int id = rdev_get_id(dev);
unsigned int reg;
+ mutex_lock(&pmic->mutex);
+ if (pmic->shutdown) {
+ mutex_unlock(&pmic->mutex);
+ return -EINVAL;
+ }
palmas_smps_read(pmic->palmas, palmas_regs_info[id].ctrl_addr, ®);
reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
palmas_smps_write(pmic->palmas, palmas_regs_info[id].ctrl_addr, reg);
+ mutex_unlock(&pmic->mutex);
return 0;
}
if (!pmic)
return -ENOMEM;
+
+ mutex_init(&pmic->mutex);
pmic->dev = &pdev->dev;
pmic->palmas = palmas;
palmas->pmic = pmic;
+ pmic->shutdown = false;
platform_set_drvdata(pdev, pmic);
/* Read VREF0P425 of LDO_CTRL register for TPS80036 */
return 0;
}
+static void palams_regulators_shutdown(struct platform_device *pdev)
+{
+ struct palmas *palmas = dev_get_drvdata(pdev->dev.parent);
+ mutex_lock(&palmas->pmic->mutex);
+ palmas->pmic->shutdown = true;
+ mutex_unlock(&palmas->pmic->mutex);
+}
+
static struct of_device_id of_palmas_match_tbl[] = {
{ .compatible = "ti,palmas-pmic", },
{ .compatible = "ti,twl6035-pmic", },
},
.probe = palmas_regulators_probe,
.remove = palmas_regulators_remove,
+ .shutdown = palams_regulators_shutdown,
};
static int __init palmas_init(void)