Commit 2e47fff1 authored by Mark Brown's avatar Mark Brown

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: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 1df5981b
...@@ -161,6 +161,352 @@ int wm831x_reg_unlock(struct wm831x *wm831x) ...@@ -161,6 +161,352 @@ int wm831x_reg_unlock(struct wm831x *wm831x)
} }
EXPORT_SYMBOL_GPL(wm831x_reg_unlock); EXPORT_SYMBOL_GPL(wm831x_reg_unlock);
static bool wm831x_reg_readable(struct device *dev, unsigned int reg)
{
switch (reg) {
case WM831X_RESET_ID:
case WM831X_REVISION:
case WM831X_PARENT_ID:
case WM831X_SYSVDD_CONTROL:
case WM831X_THERMAL_MONITORING:
case WM831X_POWER_STATE:
case WM831X_WATCHDOG:
case WM831X_ON_PIN_CONTROL:
case WM831X_RESET_CONTROL:
case WM831X_CONTROL_INTERFACE:
case WM831X_SECURITY_KEY:
case WM831X_SOFTWARE_SCRATCH:
case WM831X_OTP_CONTROL:
case WM831X_GPIO_LEVEL:
case WM831X_SYSTEM_STATUS:
case WM831X_ON_SOURCE:
case WM831X_OFF_SOURCE:
case WM831X_SYSTEM_INTERRUPTS:
case WM831X_INTERRUPT_STATUS_1:
case WM831X_INTERRUPT_STATUS_2:
case WM831X_INTERRUPT_STATUS_3:
case WM831X_INTERRUPT_STATUS_4:
case WM831X_INTERRUPT_STATUS_5:
case WM831X_IRQ_CONFIG:
case WM831X_SYSTEM_INTERRUPTS_MASK:
case WM831X_INTERRUPT_STATUS_1_MASK:
case WM831X_INTERRUPT_STATUS_2_MASK:
case WM831X_INTERRUPT_STATUS_3_MASK:
case WM831X_INTERRUPT_STATUS_4_MASK:
case WM831X_INTERRUPT_STATUS_5_MASK:
case WM831X_RTC_WRITE_COUNTER:
case WM831X_RTC_TIME_1:
case WM831X_RTC_TIME_2:
case WM831X_RTC_ALARM_1:
case WM831X_RTC_ALARM_2:
case WM831X_RTC_CONTROL:
case WM831X_RTC_TRIM:
case WM831X_TOUCH_CONTROL_1:
case WM831X_TOUCH_CONTROL_2:
case WM831X_TOUCH_DATA_X:
case WM831X_TOUCH_DATA_Y:
case WM831X_TOUCH_DATA_Z:
case WM831X_AUXADC_DATA:
case WM831X_AUXADC_CONTROL:
case WM831X_AUXADC_SOURCE:
case WM831X_COMPARATOR_CONTROL:
case WM831X_COMPARATOR_1:
case WM831X_COMPARATOR_2:
case WM831X_COMPARATOR_3:
case WM831X_COMPARATOR_4:
case WM831X_GPIO1_CONTROL:
case WM831X_GPIO2_CONTROL:
case WM831X_GPIO3_CONTROL:
case WM831X_GPIO4_CONTROL:
case WM831X_GPIO5_CONTROL:
case WM831X_GPIO6_CONTROL:
case WM831X_GPIO7_CONTROL:
case WM831X_GPIO8_CONTROL:
case WM831X_GPIO9_CONTROL:
case WM831X_GPIO10_CONTROL:
case WM831X_GPIO11_CONTROL:
case WM831X_GPIO12_CONTROL:
case WM831X_GPIO13_CONTROL:
case WM831X_GPIO14_CONTROL:
case WM831X_GPIO15_CONTROL:
case WM831X_GPIO16_CONTROL:
case WM831X_CHARGER_CONTROL_1:
case WM831X_CHARGER_CONTROL_2:
case WM831X_CHARGER_STATUS:
case WM831X_BACKUP_CHARGER_CONTROL:
case WM831X_STATUS_LED_1:
case WM831X_STATUS_LED_2:
case WM831X_CURRENT_SINK_1:
case WM831X_CURRENT_SINK_2:
case WM831X_DCDC_ENABLE:
case WM831X_LDO_ENABLE:
case WM831X_DCDC_STATUS:
case WM831X_LDO_STATUS:
case WM831X_DCDC_UV_STATUS:
case WM831X_LDO_UV_STATUS:
case WM831X_DC1_CONTROL_1:
case WM831X_DC1_CONTROL_2:
case WM831X_DC1_ON_CONFIG:
case WM831X_DC1_SLEEP_CONTROL:
case WM831X_DC1_DVS_CONTROL:
case WM831X_DC2_CONTROL_1:
case WM831X_DC2_CONTROL_2:
case WM831X_DC2_ON_CONFIG:
case WM831X_DC2_SLEEP_CONTROL:
case WM831X_DC2_DVS_CONTROL:
case WM831X_DC3_CONTROL_1:
case WM831X_DC3_CONTROL_2:
case WM831X_DC3_ON_CONFIG:
case WM831X_DC3_SLEEP_CONTROL:
case WM831X_DC4_CONTROL:
case WM831X_DC4_SLEEP_CONTROL:
case WM831X_EPE1_CONTROL:
case WM831X_EPE2_CONTROL:
case WM831X_LDO1_CONTROL:
case WM831X_LDO1_ON_CONTROL:
case WM831X_LDO1_SLEEP_CONTROL:
case WM831X_LDO2_CONTROL:
case WM831X_LDO2_ON_CONTROL:
case WM831X_LDO2_SLEEP_CONTROL:
case WM831X_LDO3_CONTROL:
case WM831X_LDO3_ON_CONTROL:
case WM831X_LDO3_SLEEP_CONTROL:
case WM831X_LDO4_CONTROL:
case WM831X_LDO4_ON_CONTROL:
case WM831X_LDO4_SLEEP_CONTROL:
case WM831X_LDO5_CONTROL:
case WM831X_LDO5_ON_CONTROL:
case WM831X_LDO5_SLEEP_CONTROL:
case WM831X_LDO6_CONTROL:
case WM831X_LDO6_ON_CONTROL:
case WM831X_LDO6_SLEEP_CONTROL:
case WM831X_LDO7_CONTROL:
case WM831X_LDO7_ON_CONTROL:
case WM831X_LDO7_SLEEP_CONTROL:
case WM831X_LDO8_CONTROL:
case WM831X_LDO8_ON_CONTROL:
case WM831X_LDO8_SLEEP_CONTROL:
case WM831X_LDO9_CONTROL:
case WM831X_LDO9_ON_CONTROL:
case WM831X_LDO9_SLEEP_CONTROL:
case WM831X_LDO10_CONTROL:
case WM831X_LDO10_ON_CONTROL:
case WM831X_LDO10_SLEEP_CONTROL:
case WM831X_LDO11_ON_CONTROL:
case WM831X_LDO11_SLEEP_CONTROL:
case WM831X_POWER_GOOD_SOURCE_1:
case WM831X_POWER_GOOD_SOURCE_2:
case WM831X_CLOCK_CONTROL_1:
case WM831X_CLOCK_CONTROL_2:
case WM831X_FLL_CONTROL_1:
case WM831X_FLL_CONTROL_2:
case WM831X_FLL_CONTROL_3:
case WM831X_FLL_CONTROL_4:
case WM831X_FLL_CONTROL_5:
case WM831X_UNIQUE_ID_1:
case WM831X_UNIQUE_ID_2:
case WM831X_UNIQUE_ID_3:
case WM831X_UNIQUE_ID_4:
case WM831X_UNIQUE_ID_5:
case WM831X_UNIQUE_ID_6:
case WM831X_UNIQUE_ID_7:
case WM831X_UNIQUE_ID_8:
case WM831X_FACTORY_OTP_ID:
case WM831X_FACTORY_OTP_1:
case WM831X_FACTORY_OTP_2:
case WM831X_FACTORY_OTP_3:
case WM831X_FACTORY_OTP_4:
case WM831X_FACTORY_OTP_5:
case WM831X_CUSTOMER_OTP_ID:
case WM831X_DC1_OTP_CONTROL:
case WM831X_DC2_OTP_CONTROL:
case WM831X_DC3_OTP_CONTROL:
case WM831X_LDO1_2_OTP_CONTROL:
case WM831X_LDO3_4_OTP_CONTROL:
case WM831X_LDO5_6_OTP_CONTROL:
case WM831X_LDO7_8_OTP_CONTROL:
case WM831X_LDO9_10_OTP_CONTROL:
case WM831X_LDO11_EPE_CONTROL:
case WM831X_GPIO1_OTP_CONTROL:
case WM831X_GPIO2_OTP_CONTROL:
case WM831X_GPIO3_OTP_CONTROL:
case WM831X_GPIO4_OTP_CONTROL:
case WM831X_GPIO5_OTP_CONTROL:
case WM831X_GPIO6_OTP_CONTROL:
case WM831X_DBE_CHECK_DATA:
return true;
default:
return false;
}
}
static bool wm831x_reg_writeable(struct device *dev, unsigned int reg)
{
struct wm831x *wm831x = dev_get_drvdata(dev);
if (wm831x_reg_locked(wm831x, reg))
return false;
switch (reg) {
case WM831X_SYSVDD_CONTROL:
case WM831X_THERMAL_MONITORING:
case WM831X_POWER_STATE:
case WM831X_WATCHDOG:
case WM831X_ON_PIN_CONTROL:
case WM831X_RESET_CONTROL:
case WM831X_CONTROL_INTERFACE:
case WM831X_SECURITY_KEY:
case WM831X_SOFTWARE_SCRATCH:
case WM831X_OTP_CONTROL:
case WM831X_GPIO_LEVEL:
case WM831X_INTERRUPT_STATUS_1:
case WM831X_INTERRUPT_STATUS_2:
case WM831X_INTERRUPT_STATUS_3:
case WM831X_INTERRUPT_STATUS_4:
case WM831X_INTERRUPT_STATUS_5:
case WM831X_IRQ_CONFIG:
case WM831X_SYSTEM_INTERRUPTS_MASK:
case WM831X_INTERRUPT_STATUS_1_MASK:
case WM831X_INTERRUPT_STATUS_2_MASK:
case WM831X_INTERRUPT_STATUS_3_MASK:
case WM831X_INTERRUPT_STATUS_4_MASK:
case WM831X_INTERRUPT_STATUS_5_MASK:
case WM831X_RTC_TIME_1:
case WM831X_RTC_TIME_2:
case WM831X_RTC_ALARM_1:
case WM831X_RTC_ALARM_2:
case WM831X_RTC_CONTROL:
case WM831X_RTC_TRIM:
case WM831X_TOUCH_CONTROL_1:
case WM831X_TOUCH_CONTROL_2:
case WM831X_AUXADC_CONTROL:
case WM831X_AUXADC_SOURCE:
case WM831X_COMPARATOR_CONTROL:
case WM831X_COMPARATOR_1:
case WM831X_COMPARATOR_2:
case WM831X_COMPARATOR_3:
case WM831X_COMPARATOR_4:
case WM831X_GPIO1_CONTROL:
case WM831X_GPIO2_CONTROL:
case WM831X_GPIO3_CONTROL:
case WM831X_GPIO4_CONTROL:
case WM831X_GPIO5_CONTROL:
case WM831X_GPIO6_CONTROL:
case WM831X_GPIO7_CONTROL:
case WM831X_GPIO8_CONTROL:
case WM831X_GPIO9_CONTROL:
case WM831X_GPIO10_CONTROL:
case WM831X_GPIO11_CONTROL:
case WM831X_GPIO12_CONTROL:
case WM831X_GPIO13_CONTROL:
case WM831X_GPIO14_CONTROL:
case WM831X_GPIO15_CONTROL:
case WM831X_GPIO16_CONTROL:
case WM831X_CHARGER_CONTROL_1:
case WM831X_CHARGER_CONTROL_2:
case WM831X_CHARGER_STATUS:
case WM831X_BACKUP_CHARGER_CONTROL:
case WM831X_STATUS_LED_1:
case WM831X_STATUS_LED_2:
case WM831X_CURRENT_SINK_1:
case WM831X_CURRENT_SINK_2:
case WM831X_DCDC_ENABLE:
case WM831X_LDO_ENABLE:
case WM831X_DC1_CONTROL_1:
case WM831X_DC1_CONTROL_2:
case WM831X_DC1_ON_CONFIG:
case WM831X_DC1_SLEEP_CONTROL:
case WM831X_DC1_DVS_CONTROL:
case WM831X_DC2_CONTROL_1:
case WM831X_DC2_CONTROL_2:
case WM831X_DC2_ON_CONFIG:
case WM831X_DC2_SLEEP_CONTROL:
case WM831X_DC2_DVS_CONTROL:
case WM831X_DC3_CONTROL_1:
case WM831X_DC3_CONTROL_2:
case WM831X_DC3_ON_CONFIG:
case WM831X_DC3_SLEEP_CONTROL:
case WM831X_DC4_CONTROL:
case WM831X_DC4_SLEEP_CONTROL:
case WM831X_EPE1_CONTROL:
case WM831X_EPE2_CONTROL:
case WM831X_LDO1_CONTROL:
case WM831X_LDO1_ON_CONTROL:
case WM831X_LDO1_SLEEP_CONTROL:
case WM831X_LDO2_CONTROL:
case WM831X_LDO2_ON_CONTROL:
case WM831X_LDO2_SLEEP_CONTROL:
case WM831X_LDO3_CONTROL:
case WM831X_LDO3_ON_CONTROL:
case WM831X_LDO3_SLEEP_CONTROL:
case WM831X_LDO4_CONTROL:
case WM831X_LDO4_ON_CONTROL:
case WM831X_LDO4_SLEEP_CONTROL:
case WM831X_LDO5_CONTROL:
case WM831X_LDO5_ON_CONTROL:
case WM831X_LDO5_SLEEP_CONTROL:
case WM831X_LDO6_CONTROL:
case WM831X_LDO6_ON_CONTROL:
case WM831X_LDO6_SLEEP_CONTROL:
case WM831X_LDO7_CONTROL:
case WM831X_LDO7_ON_CONTROL:
case WM831X_LDO7_SLEEP_CONTROL:
case WM831X_LDO8_CONTROL:
case WM831X_LDO8_ON_CONTROL:
case WM831X_LDO8_SLEEP_CONTROL:
case WM831X_LDO9_CONTROL:
case WM831X_LDO9_ON_CONTROL:
case WM831X_LDO9_SLEEP_CONTROL:
case WM831X_LDO10_CONTROL:
case WM831X_LDO10_ON_CONTROL:
case WM831X_LDO10_SLEEP_CONTROL:
case WM831X_LDO11_ON_CONTROL:
case WM831X_LDO11_SLEEP_CONTROL:
case WM831X_POWER_GOOD_SOURCE_1:
case WM831X_POWER_GOOD_SOURCE_2:
case WM831X_CLOCK_CONTROL_1:
case WM831X_CLOCK_CONTROL_2:
case WM831X_FLL_CONTROL_1:
case WM831X_FLL_CONTROL_2:
case WM831X_FLL_CONTROL_3:
case WM831X_FLL_CONTROL_4:
case WM831X_FLL_CONTROL_5:
return true;
default:
return false;
}
}
static bool wm831x_reg_volatile(struct device *dev, unsigned int reg)
{
switch (reg) {
case WM831X_SYSTEM_STATUS:
case WM831X_ON_SOURCE:
case WM831X_OFF_SOURCE:
case WM831X_GPIO_LEVEL:
case WM831X_SYSTEM_INTERRUPTS:
case WM831X_INTERRUPT_STATUS_1:
case WM831X_INTERRUPT_STATUS_2:
case WM831X_INTERRUPT_STATUS_3:
case WM831X_INTERRUPT_STATUS_4:
case WM831X_INTERRUPT_STATUS_5:
case WM831X_RTC_TIME_1:
case WM831X_RTC_TIME_2:
case WM831X_TOUCH_DATA_X:
case WM831X_TOUCH_DATA_Y:
case WM831X_TOUCH_DATA_Z:
case WM831X_AUXADC_DATA:
case WM831X_CHARGER_STATUS:
case WM831X_DCDC_STATUS:
case WM831X_LDO_STATUS:
case WM831X_DCDC_UV_STATUS:
case WM831X_LDO_UV_STATUS:
return true;
default:
return false;
}
}
/** /**
* wm831x_reg_read: Read a single WM831x register. * wm831x_reg_read: Read a single WM831x register.
* *
...@@ -1254,6 +1600,11 @@ static struct mfd_cell backlight_devs[] = { ...@@ -1254,6 +1600,11 @@ static struct mfd_cell backlight_devs[] = {
struct regmap_config wm831x_regmap_config = { struct regmap_config wm831x_regmap_config = {
.reg_bits = 16, .reg_bits = 16,
.val_bits = 16, .val_bits = 16,
.max_register = WM831X_DBE_CHECK_DATA,
.readable_reg = wm831x_reg_readable,
.writeable_reg = wm831x_reg_writeable,
.volatile_reg = wm831x_reg_volatile,
}; };
EXPORT_SYMBOL_GPL(wm831x_regmap_config); EXPORT_SYMBOL_GPL(wm831x_regmap_config);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment