|
36 | 36 | #define MP8859_GO_BIT 0x01
|
37 | 37 |
|
38 | 38 | #define MP8859_ENABLE_MASK 0x80
|
| 39 | +#define MP8859_MODE_MASK 0x08 |
39 | 40 |
|
40 | 41 | static int mp8859_set_voltage_sel(struct regulator_dev *rdev, unsigned int sel)
|
41 | 42 | {
|
@@ -74,6 +75,42 @@ static int mp8859_get_voltage_sel(struct regulator_dev *rdev)
|
74 | 75 | return val;
|
75 | 76 | }
|
76 | 77 |
|
| 78 | +static unsigned int mp8859_get_mode(struct regulator_dev *rdev) |
| 79 | +{ |
| 80 | + unsigned int val; |
| 81 | + int ret; |
| 82 | + |
| 83 | + ret = regmap_read(rdev->regmap, MP8859_CTL1_REG, &val); |
| 84 | + if (ret != 0) { |
| 85 | + dev_err(&rdev->dev, "Failed to read mode: %d\n", ret); |
| 86 | + return 0; |
| 87 | + } |
| 88 | + |
| 89 | + if (val & MP8859_MODE_MASK) |
| 90 | + return REGULATOR_MODE_FAST; |
| 91 | + else |
| 92 | + return REGULATOR_MODE_NORMAL; |
| 93 | +} |
| 94 | + |
| 95 | +static int mp8859_set_mode(struct regulator_dev *rdev, unsigned int mode) |
| 96 | +{ |
| 97 | + unsigned int val; |
| 98 | + |
| 99 | + switch (mode) { |
| 100 | + case REGULATOR_MODE_FAST: |
| 101 | + val = MP8859_MODE_MASK; |
| 102 | + break; |
| 103 | + case REGULATOR_MODE_NORMAL: |
| 104 | + val = 0; |
| 105 | + break; |
| 106 | + default: |
| 107 | + return -EINVAL; |
| 108 | + } |
| 109 | + |
| 110 | + return regmap_update_bits(rdev->regmap, MP8859_CTL1_REG, |
| 111 | + MP8859_MODE_MASK, val); |
| 112 | +} |
| 113 | + |
77 | 114 | static const struct linear_range mp8859_dcdc_ranges[] = {
|
78 | 115 | REGULATOR_LINEAR_RANGE(0, VOL_MIN_IDX, VOL_MAX_IDX, 10000),
|
79 | 116 | };
|
@@ -128,6 +165,8 @@ static const struct regulator_ops mp8859_ops = {
|
128 | 165 | .enable = regulator_enable_regmap,
|
129 | 166 | .disable = regulator_disable_regmap,
|
130 | 167 | .is_enabled = regulator_is_enabled_regmap,
|
| 168 | + .set_mode = mp8859_set_mode, |
| 169 | + .get_mode = mp8859_get_mode, |
131 | 170 | };
|
132 | 171 |
|
133 | 172 | static const struct regulator_desc mp8859_regulators[] = {
|
|
0 commit comments