summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Chang <bobpcchang@google.com>2021-12-29 18:32:17 +0800
committerTreeHugger Robot <treehugger-gerrit@google.com>2022-01-17 14:47:12 +0000
commitba64a7b2de9b04d1a85d19429695b0f50547b323 (patch)
tree6063da1f2b01f03d30aecc25575b0dbf1f086054
parent5e727e99b86691ff4a12e0454ccf10c0ec544047 (diff)
downloadaoc-ba64a7b2de9b04d1a85d19429695b0f50547b323.tar.gz
Read the sensor power list from device tree.
Instead of using fixed names of the power supply, read the sensor power lists from the device tree and control them in sequence. Bug: 212528682 Test: Restart AoC and sensors can work properly. Test: Use an additional test patch and check sensors cannot work when regulators are disabled. Change-Id: Ia7f97db5364b4a14812f1956f8201b3e78623a84
-rw-r--r--aoc.c92
1 files changed, 52 insertions, 40 deletions
diff --git a/aoc.c b/aoc.c
index 7ef6725..7a548e1 100644
--- a/aoc.c
+++ b/aoc.c
@@ -86,6 +86,8 @@
#define AOC_CP_APERTURE_START_OFFSET 0x5FDF80
#define AOC_CP_APERTURE_END_OFFSET 0x5FFFFF
+#define MAX_SENSOR_POWER_NUM 5
+
static DEFINE_MUTEX(aoc_service_lock);
enum AOC_FW_STATE {
@@ -170,8 +172,9 @@ struct aoc_prvdata {
#endif
struct device *gsa_dev;
- struct regulator *regulator_sensor_1v8;
- struct regulator *regulator_sensor_3v3;
+ int sensor_power_count;
+ const char *sensor_power_list[MAX_SENSOR_POWER_NUM];
+ struct regulator *sensor_regulator[MAX_SENSOR_POWER_NUM];
};
/* TODO: Reduce the global variables (move into a driver structure) */
@@ -2142,40 +2145,34 @@ err:
static bool configure_sensor_regulator(struct aoc_prvdata *prvdata, bool enable)
{
bool check_enabled;
-
+ int i;
if (enable) {
check_enabled = true;
- if (prvdata->regulator_sensor_1v8 &&
- !regulator_is_enabled(prvdata->regulator_sensor_1v8)) {
- if (regulator_enable(prvdata->regulator_sensor_1v8)) {
- pr_warn("encountered error on enabling sensor 1v8");
+ for (i = 0; i < prvdata->sensor_power_count; i++) {
+ if (!prvdata->sensor_regulator[i] ||
+ regulator_is_enabled(prvdata->sensor_regulator[i])) {
+ continue;
}
- check_enabled &= regulator_is_enabled(prvdata->regulator_sensor_1v8);
- }
- if (prvdata->regulator_sensor_3v3 &&
- !regulator_is_enabled(prvdata->regulator_sensor_3v3)) {
- if (regulator_enable(prvdata->regulator_sensor_3v3)) {
- pr_warn("encountered error on enabling sensor 3v3");
+ if (regulator_enable(prvdata->sensor_regulator[i])) {
+ pr_warn("encountered error on enabling %s.",
+ prvdata->sensor_power_list[i]);
}
- check_enabled &= regulator_is_enabled(prvdata->regulator_sensor_3v3);
+ check_enabled &= regulator_is_enabled(prvdata->sensor_regulator[i]);
}
} else {
check_enabled = false;
- if (prvdata->regulator_sensor_3v3 &&
- regulator_is_enabled(prvdata->regulator_sensor_3v3)) {
- if (regulator_disable(prvdata->regulator_sensor_3v3)) {
- pr_warn("encountered error on disabling sensor 3v3");
+ for (i = prvdata->sensor_power_count - 1; i >= 0; i--) {
+ if (!prvdata->sensor_regulator[i] ||
+ !regulator_is_enabled(prvdata->sensor_regulator[i])) {
+ continue;
}
- check_enabled |= regulator_is_enabled(prvdata->regulator_sensor_3v3);
- }
- if (prvdata->regulator_sensor_1v8 &&
- regulator_is_enabled(prvdata->regulator_sensor_1v8)) {
- if (regulator_disable(prvdata->regulator_sensor_1v8)) {
- pr_warn("encountered error on disabling sensor 1v8");
+ if (regulator_disable(prvdata->sensor_regulator[i])) {
+ pr_warn("encountered error on disabling %s.",
+ prvdata->sensor_power_list[i]);
}
- check_enabled |= regulator_is_enabled(prvdata->regulator_sensor_1v8);
+ check_enabled |= regulator_is_enabled(prvdata->sensor_regulator[i]);
}
}
@@ -2188,6 +2185,10 @@ static void reset_sensor_power(struct aoc_prvdata *prvdata, bool is_init)
int count;
bool success;
+ if (prvdata->sensor_power_count == 0) {
+ return;
+ }
+
if (!is_init) {
count = 0;
success = false;
@@ -3126,16 +3127,27 @@ static int aoc_platform_probe(struct platform_device *pdev)
}
#endif
- prvdata->regulator_sensor_1v8 = devm_regulator_get_exclusive(dev, "sensor_1v8");
- if (IS_ERR_OR_NULL(prvdata->regulator_sensor_1v8)) {
- prvdata->regulator_sensor_1v8 = NULL;
- pr_err("failed to get sensor 1v8 regulator");
- }
-
- prvdata->regulator_sensor_3v3 = devm_regulator_get_exclusive(dev, "sensor_3v3");
- if (IS_ERR_OR_NULL(prvdata->regulator_sensor_3v3)) {
- prvdata->regulator_sensor_3v3 = NULL;
- pr_err("failed to get sensor 3v3 regulator");
+ prvdata->sensor_power_count = of_property_count_strings(dev->of_node, "sensor_power_list");
+ if (prvdata->sensor_power_count > MAX_SENSOR_POWER_NUM) {
+ pr_warn("sensor power count %i is larger than available number.",
+ prvdata->sensor_power_count);
+ prvdata->sensor_power_count = MAX_SENSOR_POWER_NUM;
+ } else if (prvdata->sensor_power_count < 0) {
+ pr_err("unsupported sensor power list, err = %i.", prvdata->sensor_power_count);
+ prvdata->sensor_power_count = 0;
+ }
+
+ ret = of_property_read_string_array(dev->of_node, "sensor_power_list",
+ (const char**)&prvdata->sensor_power_list,
+ prvdata->sensor_power_count);
+
+ for (i = 0; i < prvdata->sensor_power_count; i++) {
+ prvdata->sensor_regulator[i] =
+ devm_regulator_get_exclusive(dev, prvdata->sensor_power_list[i]);
+ if (IS_ERR_OR_NULL(prvdata->sensor_regulator[i])) {
+ prvdata->sensor_regulator[i] = NULL;
+ pr_err("failed to get %s regulator.", prvdata->sensor_power_list[i]);
+ }
}
reset_sensor_power(prvdata, true);
@@ -3216,16 +3228,16 @@ err_platform_not_null:
static int aoc_platform_remove(struct platform_device *pdev)
{
struct aoc_prvdata *prvdata;
+ int i;
pr_debug("platform_remove\n");
prvdata = platform_get_drvdata(pdev);
acpm_ipc_release_channel(pdev->dev.of_node, prvdata->acpm_async_id);
- if (prvdata->regulator_sensor_1v8) {
- regulator_put(prvdata->regulator_sensor_1v8);
- }
- if (prvdata->regulator_sensor_3v3) {
- regulator_put(prvdata->regulator_sensor_3v3);
+ for (i = 0; i < prvdata->sensor_power_count; i++) {
+ if (prvdata->sensor_regulator[i]) {
+ regulator_put(prvdata->sensor_regulator[i]);
+ }
}
sysfs_remove_groups(&pdev->dev.kobj, aoc_groups);