|
@@ -18,74 +18,11 @@
|
|
#include <linux/regulator/machine.h>
|
|
#include <linux/regulator/machine.h>
|
|
#include <linux/regulator/db8500-prcmu.h>
|
|
#include <linux/regulator/db8500-prcmu.h>
|
|
#include <linux/module.h>
|
|
#include <linux/module.h>
|
|
-
|
|
|
|
-/*
|
|
|
|
- * power state reference count
|
|
|
|
- */
|
|
|
|
-static int power_state_active_cnt; /* will initialize to zero */
|
|
|
|
-static DEFINE_SPINLOCK(power_state_active_lock);
|
|
|
|
-
|
|
|
|
-static void power_state_active_enable(void)
|
|
|
|
-{
|
|
|
|
- unsigned long flags;
|
|
|
|
-
|
|
|
|
- spin_lock_irqsave(&power_state_active_lock, flags);
|
|
|
|
- power_state_active_cnt++;
|
|
|
|
- spin_unlock_irqrestore(&power_state_active_lock, flags);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int power_state_active_disable(void)
|
|
|
|
-{
|
|
|
|
- int ret = 0;
|
|
|
|
- unsigned long flags;
|
|
|
|
-
|
|
|
|
- spin_lock_irqsave(&power_state_active_lock, flags);
|
|
|
|
- if (power_state_active_cnt <= 0) {
|
|
|
|
- pr_err("power state: unbalanced enable/disable calls\n");
|
|
|
|
- ret = -EINVAL;
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- power_state_active_cnt--;
|
|
|
|
-out:
|
|
|
|
- spin_unlock_irqrestore(&power_state_active_lock, flags);
|
|
|
|
- return ret;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Exported interface for CPUIdle only. This function is called when interrupts
|
|
|
|
- * are turned off. Hence, no locking.
|
|
|
|
- */
|
|
|
|
-int power_state_active_is_enabled(void)
|
|
|
|
-{
|
|
|
|
- return (power_state_active_cnt > 0);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * struct db8500_regulator_info - db8500 regulator information
|
|
|
|
- * @dev: device pointer
|
|
|
|
- * @desc: regulator description
|
|
|
|
- * @rdev: regulator device pointer
|
|
|
|
- * @is_enabled: status of the regulator
|
|
|
|
- * @epod_id: id for EPOD (power domain)
|
|
|
|
- * @is_ramret: RAM retention switch for EPOD (power domain)
|
|
|
|
- * @operating_point: operating point (only for vape, to be removed)
|
|
|
|
- *
|
|
|
|
- */
|
|
|
|
-struct db8500_regulator_info {
|
|
|
|
- struct device *dev;
|
|
|
|
- struct regulator_desc desc;
|
|
|
|
- struct regulator_dev *rdev;
|
|
|
|
- bool is_enabled;
|
|
|
|
- u16 epod_id;
|
|
|
|
- bool is_ramret;
|
|
|
|
- bool exclude_from_power_state;
|
|
|
|
- unsigned int operating_point;
|
|
|
|
-};
|
|
|
|
|
|
+#include "dbx500-prcmu.h"
|
|
|
|
|
|
static int db8500_regulator_enable(struct regulator_dev *rdev)
|
|
static int db8500_regulator_enable(struct regulator_dev *rdev)
|
|
{
|
|
{
|
|
- struct db8500_regulator_info *info = rdev_get_drvdata(rdev);
|
|
|
|
|
|
+ struct dbx500_regulator_info *info = rdev_get_drvdata(rdev);
|
|
|
|
|
|
if (info == NULL)
|
|
if (info == NULL)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
@@ -93,16 +30,18 @@ static int db8500_regulator_enable(struct regulator_dev *rdev)
|
|
dev_vdbg(rdev_get_dev(rdev), "regulator-%s-enable\n",
|
|
dev_vdbg(rdev_get_dev(rdev), "regulator-%s-enable\n",
|
|
info->desc.name);
|
|
info->desc.name);
|
|
|
|
|
|
- info->is_enabled = true;
|
|
|
|
- if (!info->exclude_from_power_state)
|
|
|
|
- power_state_active_enable();
|
|
|
|
|
|
+ if (!info->is_enabled) {
|
|
|
|
+ info->is_enabled = true;
|
|
|
|
+ if (!info->exclude_from_power_state)
|
|
|
|
+ power_state_active_enable();
|
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
static int db8500_regulator_disable(struct regulator_dev *rdev)
|
|
static int db8500_regulator_disable(struct regulator_dev *rdev)
|
|
{
|
|
{
|
|
- struct db8500_regulator_info *info = rdev_get_drvdata(rdev);
|
|
|
|
|
|
+ struct dbx500_regulator_info *info = rdev_get_drvdata(rdev);
|
|
int ret = 0;
|
|
int ret = 0;
|
|
|
|
|
|
if (info == NULL)
|
|
if (info == NULL)
|
|
@@ -111,16 +50,18 @@ static int db8500_regulator_disable(struct regulator_dev *rdev)
|
|
dev_vdbg(rdev_get_dev(rdev), "regulator-%s-disable\n",
|
|
dev_vdbg(rdev_get_dev(rdev), "regulator-%s-disable\n",
|
|
info->desc.name);
|
|
info->desc.name);
|
|
|
|
|
|
- info->is_enabled = false;
|
|
|
|
- if (!info->exclude_from_power_state)
|
|
|
|
- ret = power_state_active_disable();
|
|
|
|
|
|
+ if (info->is_enabled) {
|
|
|
|
+ info->is_enabled = false;
|
|
|
|
+ if (!info->exclude_from_power_state)
|
|
|
|
+ ret = power_state_active_disable();
|
|
|
|
+ }
|
|
|
|
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
static int db8500_regulator_is_enabled(struct regulator_dev *rdev)
|
|
static int db8500_regulator_is_enabled(struct regulator_dev *rdev)
|
|
{
|
|
{
|
|
- struct db8500_regulator_info *info = rdev_get_drvdata(rdev);
|
|
|
|
|
|
+ struct dbx500_regulator_info *info = rdev_get_drvdata(rdev);
|
|
|
|
|
|
if (info == NULL)
|
|
if (info == NULL)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
@@ -197,7 +138,7 @@ static int disable_epod(u16 epod_id, bool ramret)
|
|
*/
|
|
*/
|
|
static int db8500_regulator_switch_enable(struct regulator_dev *rdev)
|
|
static int db8500_regulator_switch_enable(struct regulator_dev *rdev)
|
|
{
|
|
{
|
|
- struct db8500_regulator_info *info = rdev_get_drvdata(rdev);
|
|
|
|
|
|
+ struct dbx500_regulator_info *info = rdev_get_drvdata(rdev);
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
if (info == NULL)
|
|
if (info == NULL)
|
|
@@ -221,7 +162,7 @@ out:
|
|
|
|
|
|
static int db8500_regulator_switch_disable(struct regulator_dev *rdev)
|
|
static int db8500_regulator_switch_disable(struct regulator_dev *rdev)
|
|
{
|
|
{
|
|
- struct db8500_regulator_info *info = rdev_get_drvdata(rdev);
|
|
|
|
|
|
+ struct dbx500_regulator_info *info = rdev_get_drvdata(rdev);
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
if (info == NULL)
|
|
if (info == NULL)
|
|
@@ -245,7 +186,7 @@ out:
|
|
|
|
|
|
static int db8500_regulator_switch_is_enabled(struct regulator_dev *rdev)
|
|
static int db8500_regulator_switch_is_enabled(struct regulator_dev *rdev)
|
|
{
|
|
{
|
|
- struct db8500_regulator_info *info = rdev_get_drvdata(rdev);
|
|
|
|
|
|
+ struct dbx500_regulator_info *info = rdev_get_drvdata(rdev);
|
|
|
|
|
|
if (info == NULL)
|
|
if (info == NULL)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
@@ -266,8 +207,8 @@ static struct regulator_ops db8500_regulator_switch_ops = {
|
|
/*
|
|
/*
|
|
* Regulator information
|
|
* Regulator information
|
|
*/
|
|
*/
|
|
-static struct db8500_regulator_info
|
|
|
|
-db8500_regulator_info[DB8500_NUM_REGULATORS] = {
|
|
|
|
|
|
+static struct dbx500_regulator_info
|
|
|
|
+dbx500_regulator_info[DB8500_NUM_REGULATORS] = {
|
|
[DB8500_REGULATOR_VAPE] = {
|
|
[DB8500_REGULATOR_VAPE] = {
|
|
.desc = {
|
|
.desc = {
|
|
.name = "db8500-vape",
|
|
.name = "db8500-vape",
|
|
@@ -476,12 +417,12 @@ static int __devinit db8500_regulator_probe(struct platform_device *pdev)
|
|
int i, err;
|
|
int i, err;
|
|
|
|
|
|
/* register all regulators */
|
|
/* register all regulators */
|
|
- for (i = 0; i < ARRAY_SIZE(db8500_regulator_info); i++) {
|
|
|
|
- struct db8500_regulator_info *info;
|
|
|
|
|
|
+ for (i = 0; i < ARRAY_SIZE(dbx500_regulator_info); i++) {
|
|
|
|
+ struct dbx500_regulator_info *info;
|
|
struct regulator_init_data *init_data = &db8500_init_data[i];
|
|
struct regulator_init_data *init_data = &db8500_init_data[i];
|
|
|
|
|
|
/* assign per-regulator data */
|
|
/* assign per-regulator data */
|
|
- info = &db8500_regulator_info[i];
|
|
|
|
|
|
+ info = &dbx500_regulator_info[i];
|
|
info->dev = &pdev->dev;
|
|
info->dev = &pdev->dev;
|
|
|
|
|
|
/* register with the regulator framework */
|
|
/* register with the regulator framework */
|
|
@@ -494,7 +435,7 @@ static int __devinit db8500_regulator_probe(struct platform_device *pdev)
|
|
|
|
|
|
/* if failing, unregister all earlier regulators */
|
|
/* if failing, unregister all earlier regulators */
|
|
while (--i >= 0) {
|
|
while (--i >= 0) {
|
|
- info = &db8500_regulator_info[i];
|
|
|
|
|
|
+ info = &dbx500_regulator_info[i];
|
|
regulator_unregister(info->rdev);
|
|
regulator_unregister(info->rdev);
|
|
}
|
|
}
|
|
return err;
|
|
return err;
|
|
@@ -503,17 +444,22 @@ static int __devinit db8500_regulator_probe(struct platform_device *pdev)
|
|
dev_dbg(rdev_get_dev(info->rdev),
|
|
dev_dbg(rdev_get_dev(info->rdev),
|
|
"regulator-%s-probed\n", info->desc.name);
|
|
"regulator-%s-probed\n", info->desc.name);
|
|
}
|
|
}
|
|
|
|
+ err = ux500_regulator_debug_init(pdev,
|
|
|
|
+ dbx500_regulator_info,
|
|
|
|
+ ARRAY_SIZE(dbx500_regulator_info));
|
|
|
|
|
|
- return 0;
|
|
|
|
|
|
+ return err;
|
|
}
|
|
}
|
|
|
|
|
|
static int __exit db8500_regulator_remove(struct platform_device *pdev)
|
|
static int __exit db8500_regulator_remove(struct platform_device *pdev)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
|
|
|
|
- for (i = 0; i < ARRAY_SIZE(db8500_regulator_info); i++) {
|
|
|
|
- struct db8500_regulator_info *info;
|
|
|
|
- info = &db8500_regulator_info[i];
|
|
|
|
|
|
+ ux500_regulator_debug_exit();
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < ARRAY_SIZE(dbx500_regulator_info); i++) {
|
|
|
|
+ struct dbx500_regulator_info *info;
|
|
|
|
+ info = &dbx500_regulator_info[i];
|
|
|
|
|
|
dev_vdbg(rdev_get_dev(info->rdev),
|
|
dev_vdbg(rdev_get_dev(info->rdev),
|
|
"regulator-%s-remove\n", info->desc.name);
|
|
"regulator-%s-remove\n", info->desc.name);
|