diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-07-21 12:30:08 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-08-22 07:23:48 -0400 |
commit | 2e47fff113b7468be2d905e381408c05df72f1ae (patch) | |
tree | 68c187902da23ae40216a5cfc2c24398b0db8def /drivers/mfd | |
parent | 1df5981b82d9eabdd6e66d1d9514164c02329345 (diff) |
mfd: Provide regmap register access info from wm831x driver
Lets us see the register map in debugfs and will enable us to push
access checking down into the regmap API.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/mfd')
-rw-r--r-- | drivers/mfd/wm831x-core.c | 351 |
1 files changed, 351 insertions, 0 deletions
diff --git a/drivers/mfd/wm831x-core.c b/drivers/mfd/wm831x-core.c index 578e0c2ad82b..9338f8dcbb83 100644 --- a/drivers/mfd/wm831x-core.c +++ b/drivers/mfd/wm831x-core.c | |||
@@ -161,6 +161,352 @@ int wm831x_reg_unlock(struct wm831x *wm831x) | |||
161 | } | 161 | } |
162 | EXPORT_SYMBOL_GPL(wm831x_reg_unlock); | 162 | EXPORT_SYMBOL_GPL(wm831x_reg_unlock); |
163 | 163 | ||
164 | static bool wm831x_reg_readable(struct device *dev, unsigned int reg) | ||
165 | { | ||
166 | switch (reg) { | ||
167 | case WM831X_RESET_ID: | ||
168 | case WM831X_REVISION: | ||
169 | case WM831X_PARENT_ID: | ||
170 | case WM831X_SYSVDD_CONTROL: | ||
171 | case WM831X_THERMAL_MONITORING: | ||
172 | case WM831X_POWER_STATE: | ||
173 | case WM831X_WATCHDOG: | ||
174 | case WM831X_ON_PIN_CONTROL: | ||
175 | case WM831X_RESET_CONTROL: | ||
176 | case WM831X_CONTROL_INTERFACE: | ||
177 | case WM831X_SECURITY_KEY: | ||
178 | case WM831X_SOFTWARE_SCRATCH: | ||
179 | case WM831X_OTP_CONTROL: | ||
180 | case WM831X_GPIO_LEVEL: | ||
181 | case WM831X_SYSTEM_STATUS: | ||
182 | case WM831X_ON_SOURCE: | ||
183 | case WM831X_OFF_SOURCE: | ||
184 | case WM831X_SYSTEM_INTERRUPTS: | ||
185 | case WM831X_INTERRUPT_STATUS_1: | ||
186 | case WM831X_INTERRUPT_STATUS_2: | ||
187 | case WM831X_INTERRUPT_STATUS_3: | ||
188 | case WM831X_INTERRUPT_STATUS_4: | ||
189 | case WM831X_INTERRUPT_STATUS_5: | ||
190 | case WM831X_IRQ_CONFIG: | ||
191 | case WM831X_SYSTEM_INTERRUPTS_MASK: | ||
192 | case WM831X_INTERRUPT_STATUS_1_MASK: | ||
193 | case WM831X_INTERRUPT_STATUS_2_MASK: | ||
194 | case WM831X_INTERRUPT_STATUS_3_MASK: | ||
195 | case WM831X_INTERRUPT_STATUS_4_MASK: | ||
196 | case WM831X_INTERRUPT_STATUS_5_MASK: | ||
197 | case WM831X_RTC_WRITE_COUNTER: | ||
198 | case WM831X_RTC_TIME_1: | ||
199 | case WM831X_RTC_TIME_2: | ||
200 | case WM831X_RTC_ALARM_1: | ||
201 | case WM831X_RTC_ALARM_2: | ||
202 | case WM831X_RTC_CONTROL: | ||
203 | case WM831X_RTC_TRIM: | ||
204 | case WM831X_TOUCH_CONTROL_1: | ||
205 | case WM831X_TOUCH_CONTROL_2: | ||
206 | case WM831X_TOUCH_DATA_X: | ||
207 | case WM831X_TOUCH_DATA_Y: | ||
208 | case WM831X_TOUCH_DATA_Z: | ||
209 | case WM831X_AUXADC_DATA: | ||
210 | case WM831X_AUXADC_CONTROL: | ||
211 | case WM831X_AUXADC_SOURCE: | ||
212 | case WM831X_COMPARATOR_CONTROL: | ||
213 | case WM831X_COMPARATOR_1: | ||
214 | case WM831X_COMPARATOR_2: | ||
215 | case WM831X_COMPARATOR_3: | ||
216 | case WM831X_COMPARATOR_4: | ||
217 | case WM831X_GPIO1_CONTROL: | ||
218 | case WM831X_GPIO2_CONTROL: | ||
219 | case WM831X_GPIO3_CONTROL: | ||
220 | case WM831X_GPIO4_CONTROL: | ||
221 | case WM831X_GPIO5_CONTROL: | ||
222 | case WM831X_GPIO6_CONTROL: | ||
223 | case WM831X_GPIO7_CONTROL: | ||
224 | case WM831X_GPIO8_CONTROL: | ||
225 | case WM831X_GPIO9_CONTROL: | ||
226 | case WM831X_GPIO10_CONTROL: | ||
227 | case WM831X_GPIO11_CONTROL: | ||
228 | case WM831X_GPIO12_CONTROL: | ||
229 | case WM831X_GPIO13_CONTROL: | ||
230 | case WM831X_GPIO14_CONTROL: | ||
231 | case WM831X_GPIO15_CONTROL: | ||
232 | case WM831X_GPIO16_CONTROL: | ||
233 | case WM831X_CHARGER_CONTROL_1: | ||
234 | case WM831X_CHARGER_CONTROL_2: | ||
235 | case WM831X_CHARGER_STATUS: | ||
236 | case WM831X_BACKUP_CHARGER_CONTROL: | ||
237 | case WM831X_STATUS_LED_1: | ||
238 | case WM831X_STATUS_LED_2: | ||
239 | case WM831X_CURRENT_SINK_1: | ||
240 | case WM831X_CURRENT_SINK_2: | ||
241 | case WM831X_DCDC_ENABLE: | ||
242 | case WM831X_LDO_ENABLE: | ||
243 | case WM831X_DCDC_STATUS: | ||
244 | case WM831X_LDO_STATUS: | ||
245 | case WM831X_DCDC_UV_STATUS: | ||
246 | case WM831X_LDO_UV_STATUS: | ||
247 | case WM831X_DC1_CONTROL_1: | ||
248 | case WM831X_DC1_CONTROL_2: | ||
249 | case WM831X_DC1_ON_CONFIG: | ||
250 | case WM831X_DC1_SLEEP_CONTROL: | ||
251 | case WM831X_DC1_DVS_CONTROL: | ||
252 | case WM831X_DC2_CONTROL_1: | ||
253 | case WM831X_DC2_CONTROL_2: | ||
254 | case WM831X_DC2_ON_CONFIG: | ||
255 | case WM831X_DC2_SLEEP_CONTROL: | ||
256 | case WM831X_DC2_DVS_CONTROL: | ||
257 | case WM831X_DC3_CONTROL_1: | ||
258 | case WM831X_DC3_CONTROL_2: | ||
259 | case WM831X_DC3_ON_CONFIG: | ||
260 | case WM831X_DC3_SLEEP_CONTROL: | ||
261 | case WM831X_DC4_CONTROL: | ||
262 | case WM831X_DC4_SLEEP_CONTROL: | ||
263 | case WM831X_EPE1_CONTROL: | ||
264 | case WM831X_EPE2_CONTROL: | ||
265 | case WM831X_LDO1_CONTROL: | ||
266 | case WM831X_LDO1_ON_CONTROL: | ||
267 | case WM831X_LDO1_SLEEP_CONTROL: | ||
268 | case WM831X_LDO2_CONTROL: | ||
269 | case WM831X_LDO2_ON_CONTROL: | ||
270 | case WM831X_LDO2_SLEEP_CONTROL: | ||
271 | case WM831X_LDO3_CONTROL: | ||
272 | case WM831X_LDO3_ON_CONTROL: | ||
273 | case WM831X_LDO3_SLEEP_CONTROL: | ||
274 | case WM831X_LDO4_CONTROL: | ||
275 | case WM831X_LDO4_ON_CONTROL: | ||
276 | case WM831X_LDO4_SLEEP_CONTROL: | ||
277 | case WM831X_LDO5_CONTROL: | ||
278 | case WM831X_LDO5_ON_CONTROL: | ||
279 | case WM831X_LDO5_SLEEP_CONTROL: | ||
280 | case WM831X_LDO6_CONTROL: | ||
281 | case WM831X_LDO6_ON_CONTROL: | ||
282 | case WM831X_LDO6_SLEEP_CONTROL: | ||
283 | case WM831X_LDO7_CONTROL: | ||
284 | case WM831X_LDO7_ON_CONTROL: | ||
285 | case WM831X_LDO7_SLEEP_CONTROL: | ||
286 | case WM831X_LDO8_CONTROL: | ||
287 | case WM831X_LDO8_ON_CONTROL: | ||
288 | case WM831X_LDO8_SLEEP_CONTROL: | ||
289 | case WM831X_LDO9_CONTROL: | ||
290 | case WM831X_LDO9_ON_CONTROL: | ||
291 | case WM831X_LDO9_SLEEP_CONTROL: | ||
292 | case WM831X_LDO10_CONTROL: | ||
293 | case WM831X_LDO10_ON_CONTROL: | ||
294 | case WM831X_LDO10_SLEEP_CONTROL: | ||
295 | case WM831X_LDO11_ON_CONTROL: | ||
296 | case WM831X_LDO11_SLEEP_CONTROL: | ||
297 | case WM831X_POWER_GOOD_SOURCE_1: | ||
298 | case WM831X_POWER_GOOD_SOURCE_2: | ||
299 | case WM831X_CLOCK_CONTROL_1: | ||
300 | case WM831X_CLOCK_CONTROL_2: | ||
301 | case WM831X_FLL_CONTROL_1: | ||
302 | case WM831X_FLL_CONTROL_2: | ||
303 | case WM831X_FLL_CONTROL_3: | ||
304 | case WM831X_FLL_CONTROL_4: | ||
305 | case WM831X_FLL_CONTROL_5: | ||
306 | case WM831X_UNIQUE_ID_1: | ||
307 | case WM831X_UNIQUE_ID_2: | ||
308 | case WM831X_UNIQUE_ID_3: | ||
309 | case WM831X_UNIQUE_ID_4: | ||
310 | case WM831X_UNIQUE_ID_5: | ||
311 | case WM831X_UNIQUE_ID_6: | ||
312 | case WM831X_UNIQUE_ID_7: | ||
313 | case WM831X_UNIQUE_ID_8: | ||
314 | case WM831X_FACTORY_OTP_ID: | ||
315 | case WM831X_FACTORY_OTP_1: | ||
316 | case WM831X_FACTORY_OTP_2: | ||
317 | case WM831X_FACTORY_OTP_3: | ||
318 | case WM831X_FACTORY_OTP_4: | ||
319 | case WM831X_FACTORY_OTP_5: | ||
320 | case WM831X_CUSTOMER_OTP_ID: | ||
321 | case WM831X_DC1_OTP_CONTROL: | ||
322 | case WM831X_DC2_OTP_CONTROL: | ||
323 | case WM831X_DC3_OTP_CONTROL: | ||
324 | case WM831X_LDO1_2_OTP_CONTROL: | ||
325 | case WM831X_LDO3_4_OTP_CONTROL: | ||
326 | case WM831X_LDO5_6_OTP_CONTROL: | ||
327 | case WM831X_LDO7_8_OTP_CONTROL: | ||
328 | case WM831X_LDO9_10_OTP_CONTROL: | ||
329 | case WM831X_LDO11_EPE_CONTROL: | ||
330 | case WM831X_GPIO1_OTP_CONTROL: | ||
331 | case WM831X_GPIO2_OTP_CONTROL: | ||
332 | case WM831X_GPIO3_OTP_CONTROL: | ||
333 | case WM831X_GPIO4_OTP_CONTROL: | ||
334 | case WM831X_GPIO5_OTP_CONTROL: | ||
335 | case WM831X_GPIO6_OTP_CONTROL: | ||
336 | case WM831X_DBE_CHECK_DATA: | ||
337 | return true; | ||
338 | default: | ||
339 | return false; | ||
340 | } | ||
341 | } | ||
342 | |||
343 | static bool wm831x_reg_writeable(struct device *dev, unsigned int reg) | ||
344 | { | ||
345 | struct wm831x *wm831x = dev_get_drvdata(dev); | ||
346 | |||
347 | if (wm831x_reg_locked(wm831x, reg)) | ||
348 | return false; | ||
349 | |||
350 | switch (reg) { | ||
351 | case WM831X_SYSVDD_CONTROL: | ||
352 | case WM831X_THERMAL_MONITORING: | ||
353 | case WM831X_POWER_STATE: | ||
354 | case WM831X_WATCHDOG: | ||
355 | case WM831X_ON_PIN_CONTROL: | ||
356 | case WM831X_RESET_CONTROL: | ||
357 | case WM831X_CONTROL_INTERFACE: | ||
358 | case WM831X_SECURITY_KEY: | ||
359 | case WM831X_SOFTWARE_SCRATCH: | ||
360 | case WM831X_OTP_CONTROL: | ||
361 | case WM831X_GPIO_LEVEL: | ||
362 | case WM831X_INTERRUPT_STATUS_1: | ||
363 | case WM831X_INTERRUPT_STATUS_2: | ||
364 | case WM831X_INTERRUPT_STATUS_3: | ||
365 | case WM831X_INTERRUPT_STATUS_4: | ||
366 | case WM831X_INTERRUPT_STATUS_5: | ||
367 | case WM831X_IRQ_CONFIG: | ||
368 | case WM831X_SYSTEM_INTERRUPTS_MASK: | ||
369 | case WM831X_INTERRUPT_STATUS_1_MASK: | ||
370 | case WM831X_INTERRUPT_STATUS_2_MASK: | ||
371 | case WM831X_INTERRUPT_STATUS_3_MASK: | ||
372 | case WM831X_INTERRUPT_STATUS_4_MASK: | ||
373 | case WM831X_INTERRUPT_STATUS_5_MASK: | ||
374 | case WM831X_RTC_TIME_1: | ||
375 | case WM831X_RTC_TIME_2: | ||
376 | case WM831X_RTC_ALARM_1: | ||
377 | case WM831X_RTC_ALARM_2: | ||
378 | case WM831X_RTC_CONTROL: | ||
379 | case WM831X_RTC_TRIM: | ||
380 | case WM831X_TOUCH_CONTROL_1: | ||
381 | case WM831X_TOUCH_CONTROL_2: | ||
382 | case WM831X_AUXADC_CONTROL: | ||
383 | case WM831X_AUXADC_SOURCE: | ||
384 | case WM831X_COMPARATOR_CONTROL: | ||
385 | case WM831X_COMPARATOR_1: | ||
386 | case WM831X_COMPARATOR_2: | ||
387 | case WM831X_COMPARATOR_3: | ||
388 | case WM831X_COMPARATOR_4: | ||
389 | case WM831X_GPIO1_CONTROL: | ||
390 | case WM831X_GPIO2_CONTROL: | ||
391 | case WM831X_GPIO3_CONTROL: | ||
392 | case WM831X_GPIO4_CONTROL: | ||
393 | case WM831X_GPIO5_CONTROL: | ||
394 | case WM831X_GPIO6_CONTROL: | ||
395 | case WM831X_GPIO7_CONTROL: | ||
396 | case WM831X_GPIO8_CONTROL: | ||
397 | case WM831X_GPIO9_CONTROL: | ||
398 | case WM831X_GPIO10_CONTROL: | ||
399 | case WM831X_GPIO11_CONTROL: | ||
400 | case WM831X_GPIO12_CONTROL: | ||
401 | case WM831X_GPIO13_CONTROL: | ||
402 | case WM831X_GPIO14_CONTROL: | ||
403 | case WM831X_GPIO15_CONTROL: | ||
404 | case WM831X_GPIO16_CONTROL: | ||
405 | case WM831X_CHARGER_CONTROL_1: | ||
406 | case WM831X_CHARGER_CONTROL_2: | ||
407 | case WM831X_CHARGER_STATUS: | ||
408 | case WM831X_BACKUP_CHARGER_CONTROL: | ||
409 | case WM831X_STATUS_LED_1: | ||
410 | case WM831X_STATUS_LED_2: | ||
411 | case WM831X_CURRENT_SINK_1: | ||
412 | case WM831X_CURRENT_SINK_2: | ||
413 | case WM831X_DCDC_ENABLE: | ||
414 | case WM831X_LDO_ENABLE: | ||
415 | case WM831X_DC1_CONTROL_1: | ||
416 | case WM831X_DC1_CONTROL_2: | ||
417 | case WM831X_DC1_ON_CONFIG: | ||
418 | case WM831X_DC1_SLEEP_CONTROL: | ||
419 | case WM831X_DC1_DVS_CONTROL: | ||
420 | case WM831X_DC2_CONTROL_1: | ||
421 | case WM831X_DC2_CONTROL_2: | ||
422 | case WM831X_DC2_ON_CONFIG: | ||
423 | case WM831X_DC2_SLEEP_CONTROL: | ||
424 | case WM831X_DC2_DVS_CONTROL: | ||
425 | case WM831X_DC3_CONTROL_1: | ||
426 | case WM831X_DC3_CONTROL_2: | ||
427 | case WM831X_DC3_ON_CONFIG: | ||
428 | case WM831X_DC3_SLEEP_CONTROL: | ||
429 | case WM831X_DC4_CONTROL: | ||
430 | case WM831X_DC4_SLEEP_CONTROL: | ||
431 | case WM831X_EPE1_CONTROL: | ||
432 | case WM831X_EPE2_CONTROL: | ||
433 | case WM831X_LDO1_CONTROL: | ||
434 | case WM831X_LDO1_ON_CONTROL: | ||
435 | case WM831X_LDO1_SLEEP_CONTROL: | ||
436 | case WM831X_LDO2_CONTROL: | ||
437 | case WM831X_LDO2_ON_CONTROL: | ||
438 | case WM831X_LDO2_SLEEP_CONTROL: | ||
439 | case WM831X_LDO3_CONTROL: | ||
440 | case WM831X_LDO3_ON_CONTROL: | ||
441 | case WM831X_LDO3_SLEEP_CONTROL: | ||
442 | case WM831X_LDO4_CONTROL: | ||
443 | case WM831X_LDO4_ON_CONTROL: | ||
444 | case WM831X_LDO4_SLEEP_CONTROL: | ||
445 | case WM831X_LDO5_CONTROL: | ||
446 | case WM831X_LDO5_ON_CONTROL: | ||
447 | case WM831X_LDO5_SLEEP_CONTROL: | ||
448 | case WM831X_LDO6_CONTROL: | ||
449 | case WM831X_LDO6_ON_CONTROL: | ||
450 | case WM831X_LDO6_SLEEP_CONTROL: | ||
451 | case WM831X_LDO7_CONTROL: | ||
452 | case WM831X_LDO7_ON_CONTROL: | ||
453 | case WM831X_LDO7_SLEEP_CONTROL: | ||
454 | case WM831X_LDO8_CONTROL: | ||
455 | case WM831X_LDO8_ON_CONTROL: | ||
456 | case WM831X_LDO8_SLEEP_CONTROL: | ||
457 | case WM831X_LDO9_CONTROL: | ||
458 | case WM831X_LDO9_ON_CONTROL: | ||
459 | case WM831X_LDO9_SLEEP_CONTROL: | ||
460 | case WM831X_LDO10_CONTROL: | ||
461 | case WM831X_LDO10_ON_CONTROL: | ||
462 | case WM831X_LDO10_SLEEP_CONTROL: | ||
463 | case WM831X_LDO11_ON_CONTROL: | ||
464 | case WM831X_LDO11_SLEEP_CONTROL: | ||
465 | case WM831X_POWER_GOOD_SOURCE_1: | ||
466 | case WM831X_POWER_GOOD_SOURCE_2: | ||
467 | case WM831X_CLOCK_CONTROL_1: | ||
468 | case WM831X_CLOCK_CONTROL_2: | ||
469 | case WM831X_FLL_CONTROL_1: | ||
470 | case WM831X_FLL_CONTROL_2: | ||
471 | case WM831X_FLL_CONTROL_3: | ||
472 | case WM831X_FLL_CONTROL_4: | ||
473 | case WM831X_FLL_CONTROL_5: | ||
474 | return true; | ||
475 | default: | ||
476 | return false; | ||
477 | } | ||
478 | } | ||
479 | |||
480 | static bool wm831x_reg_volatile(struct device *dev, unsigned int reg) | ||
481 | { | ||
482 | switch (reg) { | ||
483 | case WM831X_SYSTEM_STATUS: | ||
484 | case WM831X_ON_SOURCE: | ||
485 | case WM831X_OFF_SOURCE: | ||
486 | case WM831X_GPIO_LEVEL: | ||
487 | case WM831X_SYSTEM_INTERRUPTS: | ||
488 | case WM831X_INTERRUPT_STATUS_1: | ||
489 | case WM831X_INTERRUPT_STATUS_2: | ||
490 | case WM831X_INTERRUPT_STATUS_3: | ||
491 | case WM831X_INTERRUPT_STATUS_4: | ||
492 | case WM831X_INTERRUPT_STATUS_5: | ||
493 | case WM831X_RTC_TIME_1: | ||
494 | case WM831X_RTC_TIME_2: | ||
495 | case WM831X_TOUCH_DATA_X: | ||
496 | case WM831X_TOUCH_DATA_Y: | ||
497 | case WM831X_TOUCH_DATA_Z: | ||
498 | case WM831X_AUXADC_DATA: | ||
499 | case WM831X_CHARGER_STATUS: | ||
500 | case WM831X_DCDC_STATUS: | ||
501 | case WM831X_LDO_STATUS: | ||
502 | case WM831X_DCDC_UV_STATUS: | ||
503 | case WM831X_LDO_UV_STATUS: | ||
504 | return true; | ||
505 | default: | ||
506 | return false; | ||
507 | } | ||
508 | } | ||
509 | |||
164 | /** | 510 | /** |
165 | * wm831x_reg_read: Read a single WM831x register. | 511 | * wm831x_reg_read: Read a single WM831x register. |
166 | * | 512 | * |
@@ -1254,6 +1600,11 @@ static struct mfd_cell backlight_devs[] = { | |||
1254 | struct regmap_config wm831x_regmap_config = { | 1600 | struct regmap_config wm831x_regmap_config = { |
1255 | .reg_bits = 16, | 1601 | .reg_bits = 16, |
1256 | .val_bits = 16, | 1602 | .val_bits = 16, |
1603 | |||
1604 | .max_register = WM831X_DBE_CHECK_DATA, | ||
1605 | .readable_reg = wm831x_reg_readable, | ||
1606 | .writeable_reg = wm831x_reg_writeable, | ||
1607 | .volatile_reg = wm831x_reg_volatile, | ||
1257 | }; | 1608 | }; |
1258 | EXPORT_SYMBOL_GPL(wm831x_regmap_config); | 1609 | EXPORT_SYMBOL_GPL(wm831x_regmap_config); |
1259 | 1610 | ||