aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2011-07-21 12:30:08 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-08-22 07:23:48 -0400
commit2e47fff113b7468be2d905e381408c05df72f1ae (patch)
tree68c187902da23ae40216a5cfc2c24398b0db8def /drivers/mfd
parent1df5981b82d9eabdd6e66d1d9514164c02329345 (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.c351
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}
162EXPORT_SYMBOL_GPL(wm831x_reg_unlock); 162EXPORT_SYMBOL_GPL(wm831x_reg_unlock);
163 163
164static 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
343static 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
480static 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[] = {
1254struct regmap_config wm831x_regmap_config = { 1600struct 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};
1258EXPORT_SYMBOL_GPL(wm831x_regmap_config); 1609EXPORT_SYMBOL_GPL(wm831x_regmap_config);
1259 1610