mfd: Add regmap cache support for wm8350
[cascardo/linux.git] / drivers / mfd / wm8350-regmap.c
index e965139..7974cad 100644 (file)
@@ -3433,3 +3433,59 @@ const struct wm8350_reg_access wm8350_reg_io_map[] = {
        { 0x0000, 0x0000, 0x0000 }, /* R254 */
        { 0x0000, 0x0000, 0x0000 }, /* R255 */
 };
+
+static bool wm8350_readable(struct device *dev, unsigned int reg)
+{
+       return wm8350_reg_io_map[reg].readable;
+}
+
+static bool wm8350_writeable(struct device *dev, unsigned int reg)
+{
+       struct wm8350 *wm8350 = dev_get_drvdata(dev);
+
+       if (!wm8350->unlocked) {
+               if ((reg >= WM8350_GPIO_FUNCTION_SELECT_1 &&
+                    reg <= WM8350_GPIO_FUNCTION_SELECT_4) ||
+                   (reg >= WM8350_BATTERY_CHARGER_CONTROL_1 &&
+                    reg <= WM8350_BATTERY_CHARGER_CONTROL_3))
+                       return false;
+       }
+
+       return wm8350_reg_io_map[reg].writable;
+}
+
+static bool wm8350_volatile(struct device *dev, unsigned int reg)
+{
+       return wm8350_reg_io_map[reg].vol;
+}
+
+static bool wm8350_precious(struct device *dev, unsigned int reg)
+{
+       switch (reg) {
+       case WM8350_SYSTEM_INTERRUPTS:
+       case WM8350_INT_STATUS_1:
+       case WM8350_INT_STATUS_2:
+       case WM8350_POWER_UP_INT_STATUS:
+       case WM8350_UNDER_VOLTAGE_INT_STATUS:
+       case WM8350_OVER_CURRENT_INT_STATUS:
+       case WM8350_GPIO_INT_STATUS:
+       case WM8350_COMPARATOR_INT_STATUS:
+               return true;
+
+       default:
+               return false;
+       }
+}
+
+const struct regmap_config wm8350_regmap = {
+       .reg_bits = 8,
+       .val_bits = 16,
+
+       .cache_type = REGCACHE_RBTREE,
+
+       .max_register = WM8350_MAX_REGISTER,
+       .readable_reg = wm8350_readable,
+       .writeable_reg = wm8350_writeable,
+       .volatile_reg = wm8350_volatile,
+       .precious_reg = wm8350_precious,
+};