hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/misc/rk803.c
....@@ -13,6 +13,7 @@
1313 #include <linux/miscdevice.h>
1414 #include <linux/module.h>
1515 #include <linux/regmap.h>
16
+#include <linux/regulator/consumer.h>
1617 #include <uapi/linux/rk803.h>
1718
1819 #define RK803_CHIPID1 0x0A
....@@ -24,8 +25,7 @@
2425 #define RK803_TIMEOUT 1000 /* usec */
2526
2627 enum SL_LED_CURRENT {
27
- LED_0MA = 0,
28
- LED_100MA,
28
+ LED_100MA = 0,
2929 LED_200MA,
3030 LED_300MA,
3131 LED_400MA,
....@@ -39,12 +39,12 @@
3939 LED_1200MA,
4040 LED_1300MA,
4141 LED_1400MA,
42
- LED_1544MA = 15,
42
+ LED_1500MA,
4343 LED_1600MA,
4444 LED_1700MA,
4545 LED_1800MA,
4646 LED_1900MA,
47
- LED_2000MA = 20,
47
+ LED_2000MA,
4848 LED_2100MA,
4949 LED_2200MA,
5050 LED_2300MA,
....@@ -54,10 +54,16 @@
5454 LED_2700MA,
5555 LED_2800MA,
5656 LED_2900MA,
57
- LED_3000MA = 30,
57
+ LED_3000MA,
5858 LED_3100MA,
5959 LED_3200MA
6060 };
61
+
62
+static const char * const rk803_supply_names[] = {
63
+ "dvdd", /* Digital power */
64
+};
65
+
66
+#define RK803_NUM_SUPPLIES ARRAY_SIZE(rk803_supply_names)
6167
6268 struct rk803_data {
6369 struct i2c_client *client;
....@@ -69,12 +75,34 @@
6975 struct gpio_desc *gpio_encc1;
7076 struct gpio_desc *gpio_encc2;
7177 struct miscdevice misc;
78
+ struct regulator_bulk_data supplies[RK803_NUM_SUPPLIES];
7279 };
7380
7481 static const struct of_device_id rk803_of_match[] = {
7582 { .compatible = "rockchip,rk803" },
7683 { },
7784 };
85
+
86
+static int rk803_power_on(struct rk803_data *rk803)
87
+{
88
+ int ret;
89
+ struct device *dev = &rk803->client->dev;
90
+
91
+ ret = regulator_bulk_enable(RK803_NUM_SUPPLIES, rk803->supplies);
92
+ if (ret < 0) {
93
+ dev_err(dev, "Failed to enable regulators\n");
94
+ return ret;
95
+ }
96
+
97
+ usleep_range(1000, 2000);
98
+
99
+ return 0;
100
+}
101
+
102
+static void rk803_power_off(struct rk803_data *rk803)
103
+{
104
+ regulator_bulk_disable(RK803_NUM_SUPPLIES, rk803->supplies);
105
+}
78106
79107 static ssize_t
80108 rk803_i2c_write_reg(struct rk803_data *rk803, uint8_t reg, uint8_t val)
....@@ -138,7 +166,7 @@
138166 int val = (int)arg;
139167
140168 rk803->current2 = val;
141
- rk803_i2c_write_reg(rk803, 0, rk803->current2);
169
+ rk803_i2c_write_reg(rk803, 1, rk803->current2);
142170 break;
143171 }
144172 default:
....@@ -151,7 +179,22 @@
151179 static const struct file_operations rk803_fops = {
152180 .owner = THIS_MODULE,
153181 .unlocked_ioctl = rk803_dev_ioctl,
182
+#ifdef CONFIG_COMPAT
183
+ .compat_ioctl = rk803_dev_ioctl
184
+#endif
154185 };
186
+
187
+static int rk803_configure_regulators(struct rk803_data *rk803)
188
+{
189
+ unsigned int i;
190
+
191
+ for (i = 0; i < RK803_NUM_SUPPLIES; i++)
192
+ rk803->supplies[i].supply = rk803_supply_names[i];
193
+
194
+ return devm_regulator_bulk_get(&rk803->client->dev,
195
+ RK803_NUM_SUPPLIES,
196
+ rk803->supplies);
197
+}
155198
156199 static int
157200 rk803_probe(struct i2c_client *client, const struct i2c_device_id *id)
....@@ -164,20 +207,50 @@
164207 struct regmap *regmap;
165208 struct regmap_config regmap_config = { };
166209 int ret;
210
+ int cnt = 3;
167211
168
- /* check chip id */
169
- msb = i2c_smbus_read_byte_data(client, RK803_CHIPID1);
170
- if (msb < 0) {
171
- dev_err(dev, "failed to read the chip1 id at 0x%x\n",
172
- RK803_CHIPID1);
173
- return msb;
212
+ rk803 = devm_kzalloc(dev, sizeof(*rk803), GFP_KERNEL);
213
+ if (!rk803)
214
+ return -ENOMEM;
215
+
216
+ rk803->client = client;
217
+
218
+ ret = rk803_configure_regulators(rk803);
219
+ if (ret) {
220
+ dev_err(dev, "Failed to get power regulators\n");
221
+ return ret;
174222 }
175
- lsb = i2c_smbus_read_byte_data(client, RK803_CHIPID2);
176
- if (lsb < 0) {
177
- dev_err(dev, "failed to read the chip2 id at 0x%x\n",
178
- RK803_CHIPID2);
179
- return lsb;
223
+
224
+ rk803_power_on(rk803);
225
+
226
+ while (cnt--) {
227
+
228
+ if (ret)
229
+ usleep_range(1000, 2000);
230
+
231
+ /* check chip id */
232
+ msb = i2c_smbus_read_byte_data(client, RK803_CHIPID1);
233
+ if (msb < 0) {
234
+ dev_err(dev, "failed to read the chip1 id at 0x%x\n",
235
+ RK803_CHIPID1);
236
+ ret = -ENODEV;
237
+ continue;
238
+ }
239
+
240
+ lsb = i2c_smbus_read_byte_data(client, RK803_CHIPID2);
241
+ if (lsb < 0) {
242
+ dev_err(dev, "failed to read the chip2 id at 0x%x\n",
243
+ RK803_CHIPID2);
244
+ ret = -ENODEV;
245
+ continue;
246
+ }
247
+
248
+ ret = 0;
249
+ break;
180250 }
251
+
252
+ if (ret)
253
+ return ret;
181254
182255 chipid = ((msb << 8) | lsb);
183256 dev_info(dev, "chip id: 0x%x\n", (unsigned int)chipid);
....@@ -187,15 +260,12 @@
187260 regmap_config.disable_locking = true;
188261
189262 regmap = devm_regmap_init_i2c(client, &regmap_config);
190
- if (IS_ERR(regmap))
191
- return PTR_ERR(regmap);
192
-
193
- rk803 = devm_kzalloc(dev, sizeof(*rk803), GFP_KERNEL);
194
- if (!rk803)
195
- return -ENOMEM;
263
+ if (IS_ERR(regmap)) {
264
+ ret = PTR_ERR(regmap);
265
+ goto error;
266
+ }
196267
197268 rk803->chip_id = chipid;
198
- rk803->client = client;
199269 rk803->regmap = regmap;
200270 rk803->current1 = IR_LED_DEFAULT_CURRENT;
201271 rk803->current2 = PRO_LED_DEFAULT_CURRENT;
....@@ -203,12 +273,14 @@
203273 rk803->gpio_encc1 = devm_gpiod_get(dev, "gpio-encc1", GPIOD_OUT_LOW);
204274 if (IS_ERR(rk803->gpio_encc1)) {
205275 dev_err(dev, "can not find gpio_encc1\n");
206
- return PTR_ERR(rk803->gpio_encc1);
276
+ ret = PTR_ERR(rk803->gpio_encc1);
277
+ goto error;
207278 }
208279 rk803->gpio_encc2 = devm_gpiod_get(dev, "gpio-encc2", GPIOD_OUT_LOW);
209280 if (IS_ERR(rk803->gpio_encc2)) {
210281 dev_err(dev, "can not find gpio_encc2\n");
211
- return PTR_ERR(rk803->gpio_encc2);
282
+ ret = PTR_ERR(rk803->gpio_encc2);
283
+ goto error;
212284 }
213285
214286 /* OVP */
....@@ -236,11 +308,15 @@
236308 if (ret < 0) {
237309 dev_err(&client->dev, "Error: misc_register returned %d\n",
238310 ret);
239
- return ret;
311
+ goto error;
240312 }
241313
242314 dev_info(dev, "rk803 probe ok!\n");
243315 return 0;
316
+
317
+error:
318
+ rk803_power_off(rk803);
319
+ return ret;
244320 }
245321
246322 static int rk803_remove(struct i2c_client *client)
....@@ -249,7 +325,9 @@
249325
250326 rk803 = i2c_get_clientdata(client);
251327 misc_deregister(&rk803->misc);
252
- i2c_unregister_device(rk803->client);
328
+
329
+ rk803_power_off(rk803);
330
+
253331 return 0;
254332 }
255333