29
29
30
30
struct rt4801_priv {
31
31
struct device * dev ;
32
- struct gpio_descs * enable_gpios ;
32
+ struct gpio_desc * enable_gpios [ DSV_OUT_MAX ] ;
33
33
unsigned int enable_flag ;
34
34
unsigned int volt_sel [DSV_OUT_MAX ];
35
35
};
36
36
37
+ static int rt4801_of_parse_cb (struct device_node * np ,
38
+ const struct regulator_desc * desc ,
39
+ struct regulator_config * config )
40
+ {
41
+ struct rt4801_priv * priv = config -> driver_data ;
42
+ int id = desc -> id ;
43
+
44
+ if (priv -> enable_gpios [id ]) {
45
+ dev_warn (priv -> dev , "duplicated enable-gpios property\n" );
46
+ return 0 ;
47
+ }
48
+ priv -> enable_gpios [id ] = devm_fwnode_gpiod_get_index (priv -> dev ,
49
+ of_fwnode_handle (np ),
50
+ "enable" , 0 ,
51
+ GPIOD_OUT_HIGH ,
52
+ "rt4801" );
53
+ if (IS_ERR (priv -> enable_gpios [id ]))
54
+ priv -> enable_gpios [id ] = NULL ;
55
+
56
+ return 0 ;
57
+ }
58
+
37
59
static int rt4801_set_voltage_sel (struct regulator_dev * rdev , unsigned int selector )
38
60
{
39
61
struct rt4801_priv * priv = rdev_get_drvdata (rdev );
@@ -63,15 +85,14 @@ static int rt4801_get_voltage_sel(struct regulator_dev *rdev)
63
85
static int rt4801_enable (struct regulator_dev * rdev )
64
86
{
65
87
struct rt4801_priv * priv = rdev_get_drvdata (rdev );
66
- struct gpio_descs * gpios = priv -> enable_gpios ;
67
88
int id = rdev_get_id (rdev ), ret ;
68
89
69
- if (!gpios || gpios -> ndescs <= id ) {
90
+ if (!priv -> enable_gpios [ id ] ) {
70
91
dev_warn (& rdev -> dev , "no dedicated gpio can control\n" );
71
92
goto bypass_gpio ;
72
93
}
73
94
74
- gpiod_set_value (gpios -> desc [id ], 1 );
95
+ gpiod_set_value (priv -> enable_gpios [id ], 1 );
75
96
76
97
bypass_gpio :
77
98
ret = regmap_write (rdev -> regmap , rdev -> desc -> vsel_reg , priv -> volt_sel [id ]);
@@ -85,15 +106,14 @@ static int rt4801_enable(struct regulator_dev *rdev)
85
106
static int rt4801_disable (struct regulator_dev * rdev )
86
107
{
87
108
struct rt4801_priv * priv = rdev_get_drvdata (rdev );
88
- struct gpio_descs * gpios = priv -> enable_gpios ;
89
109
int id = rdev_get_id (rdev );
90
110
91
- if (!gpios || gpios -> ndescs <= id ) {
111
+ if (!priv -> enable_gpios [ id ] ) {
92
112
dev_warn (& rdev -> dev , "no dedicated gpio can control\n" );
93
113
goto bypass_gpio ;
94
114
}
95
115
96
- gpiod_set_value (gpios -> desc [id ], 0 );
116
+ gpiod_set_value (priv -> enable_gpios [id ], 0 );
97
117
98
118
bypass_gpio :
99
119
priv -> enable_flag &= ~BIT (id );
@@ -122,6 +142,7 @@ static const struct regulator_desc rt4801_regulator_descs[] = {
122
142
.name = "DSVP" ,
123
143
.ops = & rt4801_regulator_ops ,
124
144
.of_match = of_match_ptr ("DSVP" ),
145
+ .of_parse_cb = rt4801_of_parse_cb ,
125
146
.type = REGULATOR_VOLTAGE ,
126
147
.id = DSV_OUT_POS ,
127
148
.min_uV = MIN_UV ,
@@ -135,6 +156,7 @@ static const struct regulator_desc rt4801_regulator_descs[] = {
135
156
.name = "DSVN" ,
136
157
.ops = & rt4801_regulator_ops ,
137
158
.of_match = of_match_ptr ("DSVN" ),
159
+ .of_parse_cb = rt4801_of_parse_cb ,
138
160
.type = REGULATOR_VOLTAGE ,
139
161
.id = DSV_OUT_NEG ,
140
162
.min_uV = MIN_UV ,
@@ -172,10 +194,15 @@ static int rt4801_probe(struct i2c_client *i2c)
172
194
return PTR_ERR (regmap );
173
195
}
174
196
175
- priv -> enable_gpios = devm_gpiod_get_array_optional (& i2c -> dev , "enable" , GPIOD_OUT_HIGH );
176
- if (IS_ERR (priv -> enable_gpios )) {
177
- dev_err (& i2c -> dev , "Failed to get gpios\n" );
178
- return PTR_ERR (priv -> enable_gpios );
197
+ for (i = 0 ; i < DSV_OUT_MAX ; i ++ ) {
198
+ priv -> enable_gpios [i ] = devm_gpiod_get_index_optional (& i2c -> dev ,
199
+ "enable" ,
200
+ i ,
201
+ GPIOD_OUT_HIGH );
202
+ if (IS_ERR (priv -> enable_gpios [i ])) {
203
+ dev_err (& i2c -> dev , "Failed to get gpios\n" );
204
+ return PTR_ERR (priv -> enable_gpios [i ]);
205
+ }
179
206
}
180
207
181
208
for (i = 0 ; i < DSV_OUT_MAX ; i ++ ) {
0 commit comments