|
@@ -52,10 +52,31 @@ struct pwm_voltages {
|
|
|
/**
|
|
|
* Voltage table call-backs
|
|
|
*/
|
|
|
+static void pwm_regulator_init_state(struct regulator_dev *rdev)
|
|
|
+{
|
|
|
+ struct pwm_regulator_data *drvdata = rdev_get_drvdata(rdev);
|
|
|
+ struct pwm_state pwm_state;
|
|
|
+ unsigned int dutycycle;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ pwm_get_state(drvdata->pwm, &pwm_state);
|
|
|
+ dutycycle = pwm_get_relative_duty_cycle(&pwm_state, 100);
|
|
|
+
|
|
|
+ for (i = 0; i < rdev->desc->n_voltages; i++) {
|
|
|
+ if (dutycycle == drvdata->duty_cycle_table[i].dutycycle) {
|
|
|
+ drvdata->state = i;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static int pwm_regulator_get_voltage_sel(struct regulator_dev *rdev)
|
|
|
{
|
|
|
struct pwm_regulator_data *drvdata = rdev_get_drvdata(rdev);
|
|
|
|
|
|
+ if (drvdata->state < 0)
|
|
|
+ pwm_regulator_init_state(rdev);
|
|
|
+
|
|
|
return drvdata->state;
|
|
|
}
|
|
|
|
|
@@ -221,6 +242,7 @@ static int pwm_regulator_init_table(struct platform_device *pdev,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ drvdata->state = -EINVAL;
|
|
|
drvdata->duty_cycle_table = duty_cycle_table;
|
|
|
memcpy(&drvdata->ops, &pwm_regulator_voltage_table_ops,
|
|
|
sizeof(drvdata->ops));
|