.. | .. |
---|
13 | 13 | #include <linux/miscdevice.h> |
---|
14 | 14 | #include <linux/module.h> |
---|
15 | 15 | #include <linux/regmap.h> |
---|
| 16 | +#include <linux/regulator/consumer.h> |
---|
16 | 17 | #include <uapi/linux/rk803.h> |
---|
17 | 18 | |
---|
18 | 19 | #define RK803_CHIPID1 0x0A |
---|
.. | .. |
---|
24 | 25 | #define RK803_TIMEOUT 1000 /* usec */ |
---|
25 | 26 | |
---|
26 | 27 | enum SL_LED_CURRENT { |
---|
27 | | - LED_0MA = 0, |
---|
28 | | - LED_100MA, |
---|
| 28 | + LED_100MA = 0, |
---|
29 | 29 | LED_200MA, |
---|
30 | 30 | LED_300MA, |
---|
31 | 31 | LED_400MA, |
---|
.. | .. |
---|
39 | 39 | LED_1200MA, |
---|
40 | 40 | LED_1300MA, |
---|
41 | 41 | LED_1400MA, |
---|
42 | | - LED_1544MA = 15, |
---|
| 42 | + LED_1500MA, |
---|
43 | 43 | LED_1600MA, |
---|
44 | 44 | LED_1700MA, |
---|
45 | 45 | LED_1800MA, |
---|
46 | 46 | LED_1900MA, |
---|
47 | | - LED_2000MA = 20, |
---|
| 47 | + LED_2000MA, |
---|
48 | 48 | LED_2100MA, |
---|
49 | 49 | LED_2200MA, |
---|
50 | 50 | LED_2300MA, |
---|
.. | .. |
---|
54 | 54 | LED_2700MA, |
---|
55 | 55 | LED_2800MA, |
---|
56 | 56 | LED_2900MA, |
---|
57 | | - LED_3000MA = 30, |
---|
| 57 | + LED_3000MA, |
---|
58 | 58 | LED_3100MA, |
---|
59 | 59 | LED_3200MA |
---|
60 | 60 | }; |
---|
| 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) |
---|
61 | 67 | |
---|
62 | 68 | struct rk803_data { |
---|
63 | 69 | struct i2c_client *client; |
---|
.. | .. |
---|
69 | 75 | struct gpio_desc *gpio_encc1; |
---|
70 | 76 | struct gpio_desc *gpio_encc2; |
---|
71 | 77 | struct miscdevice misc; |
---|
| 78 | + struct regulator_bulk_data supplies[RK803_NUM_SUPPLIES]; |
---|
72 | 79 | }; |
---|
73 | 80 | |
---|
74 | 81 | static const struct of_device_id rk803_of_match[] = { |
---|
75 | 82 | { .compatible = "rockchip,rk803" }, |
---|
76 | 83 | { }, |
---|
77 | 84 | }; |
---|
| 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 | +} |
---|
78 | 106 | |
---|
79 | 107 | static ssize_t |
---|
80 | 108 | rk803_i2c_write_reg(struct rk803_data *rk803, uint8_t reg, uint8_t val) |
---|
.. | .. |
---|
138 | 166 | int val = (int)arg; |
---|
139 | 167 | |
---|
140 | 168 | rk803->current2 = val; |
---|
141 | | - rk803_i2c_write_reg(rk803, 0, rk803->current2); |
---|
| 169 | + rk803_i2c_write_reg(rk803, 1, rk803->current2); |
---|
142 | 170 | break; |
---|
143 | 171 | } |
---|
144 | 172 | default: |
---|
.. | .. |
---|
151 | 179 | static const struct file_operations rk803_fops = { |
---|
152 | 180 | .owner = THIS_MODULE, |
---|
153 | 181 | .unlocked_ioctl = rk803_dev_ioctl, |
---|
| 182 | +#ifdef CONFIG_COMPAT |
---|
| 183 | + .compat_ioctl = rk803_dev_ioctl |
---|
| 184 | +#endif |
---|
154 | 185 | }; |
---|
| 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 | +} |
---|
155 | 198 | |
---|
156 | 199 | static int |
---|
157 | 200 | rk803_probe(struct i2c_client *client, const struct i2c_device_id *id) |
---|
.. | .. |
---|
164 | 207 | struct regmap *regmap; |
---|
165 | 208 | struct regmap_config regmap_config = { }; |
---|
166 | 209 | int ret; |
---|
| 210 | + int cnt = 3; |
---|
167 | 211 | |
---|
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; |
---|
174 | 222 | } |
---|
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; |
---|
180 | 250 | } |
---|
| 251 | + |
---|
| 252 | + if (ret) |
---|
| 253 | + return ret; |
---|
181 | 254 | |
---|
182 | 255 | chipid = ((msb << 8) | lsb); |
---|
183 | 256 | dev_info(dev, "chip id: 0x%x\n", (unsigned int)chipid); |
---|
.. | .. |
---|
187 | 260 | regmap_config.disable_locking = true; |
---|
188 | 261 | |
---|
189 | 262 | regmap = devm_regmap_init_i2c(client, ®map_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 | + } |
---|
196 | 267 | |
---|
197 | 268 | rk803->chip_id = chipid; |
---|
198 | | - rk803->client = client; |
---|
199 | 269 | rk803->regmap = regmap; |
---|
200 | 270 | rk803->current1 = IR_LED_DEFAULT_CURRENT; |
---|
201 | 271 | rk803->current2 = PRO_LED_DEFAULT_CURRENT; |
---|
.. | .. |
---|
203 | 273 | rk803->gpio_encc1 = devm_gpiod_get(dev, "gpio-encc1", GPIOD_OUT_LOW); |
---|
204 | 274 | if (IS_ERR(rk803->gpio_encc1)) { |
---|
205 | 275 | 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; |
---|
207 | 278 | } |
---|
208 | 279 | rk803->gpio_encc2 = devm_gpiod_get(dev, "gpio-encc2", GPIOD_OUT_LOW); |
---|
209 | 280 | if (IS_ERR(rk803->gpio_encc2)) { |
---|
210 | 281 | 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; |
---|
212 | 284 | } |
---|
213 | 285 | |
---|
214 | 286 | /* OVP */ |
---|
.. | .. |
---|
236 | 308 | if (ret < 0) { |
---|
237 | 309 | dev_err(&client->dev, "Error: misc_register returned %d\n", |
---|
238 | 310 | ret); |
---|
239 | | - return ret; |
---|
| 311 | + goto error; |
---|
240 | 312 | } |
---|
241 | 313 | |
---|
242 | 314 | dev_info(dev, "rk803 probe ok!\n"); |
---|
243 | 315 | return 0; |
---|
| 316 | + |
---|
| 317 | +error: |
---|
| 318 | + rk803_power_off(rk803); |
---|
| 319 | + return ret; |
---|
244 | 320 | } |
---|
245 | 321 | |
---|
246 | 322 | static int rk803_remove(struct i2c_client *client) |
---|
.. | .. |
---|
249 | 325 | |
---|
250 | 326 | rk803 = i2c_get_clientdata(client); |
---|
251 | 327 | misc_deregister(&rk803->misc); |
---|
252 | | - i2c_unregister_device(rk803->client); |
---|
| 328 | + |
---|
| 329 | + rk803_power_off(rk803); |
---|
| 330 | + |
---|
253 | 331 | return 0; |
---|
254 | 332 | } |
---|
255 | 333 | |
---|