0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/mfd/wm8350/core.h>
0012
0013
0014
0015
0016
0017 static const struct wm8350_reg_access {
0018 u16 readable;
0019 u16 writable;
0020 u16 vol;
0021 } wm8350_reg_io_map[] = {
0022
0023 { 0xFFFF, 0xFFFF, 0x0000 },
0024 { 0x7CFF, 0x0C00, 0x0000 },
0025 { 0x007F, 0x0000, 0x0000 },
0026 { 0xBE3B, 0xBE3B, 0x8000 },
0027 { 0xFEF7, 0xFEF7, 0xF800 },
0028 { 0x80FF, 0x80FF, 0x8000 },
0029 { 0xFB0E, 0xFB0E, 0x0000 },
0030 { 0x0000, 0x0000, 0x0000 },
0031 { 0xE537, 0xE537, 0xFFFF },
0032 { 0x0FF3, 0x0FF3, 0xFFFF },
0033 { 0x008F, 0x008F, 0xFFFF },
0034 { 0x6D3C, 0x6D3C, 0xFFFF },
0035 { 0x1F8F, 0x1F8F, 0xFFFF },
0036 { 0x8F3F, 0x8F3F, 0xFFFF },
0037 { 0x0003, 0x0003, 0xFFFF },
0038 { 0x0000, 0x0000, 0x0000 },
0039 { 0x7F7F, 0x7F7F, 0xFFFF },
0040 { 0x073F, 0x073F, 0xFFFF },
0041 { 0x1F3F, 0x1F3F, 0xFFFF },
0042 { 0x3FFF, 0x00FF, 0xFFFF },
0043 { 0x7F7F, 0x7F7F, 0x0000 },
0044 { 0x0F3F, 0x0F3F, 0x0000 },
0045 { 0x1F3F, 0x1F3F, 0x0000 },
0046 { 0xEF7F, 0xEA7F, 0xFFFF },
0047 { 0x3BFF, 0x0000, 0xFFFF },
0048 { 0xFEE7, 0x0000, 0xFFFF },
0049 { 0x35FF, 0x0000, 0xFFFF },
0050 { 0x0F3F, 0x0000, 0xFFFF },
0051 { 0x0F3F, 0x0000, 0xFFFF },
0052 { 0x8000, 0x0000, 0xFFFF },
0053 { 0x1FFF, 0x0000, 0xFFFF },
0054 { 0xEF7F, 0x0000, 0xFFFF },
0055 { 0x3FFF, 0x3FFF, 0x0000 },
0056 { 0xFEE7, 0xFEE7, 0x0000 },
0057 { 0xF5FF, 0xF5FF, 0x0000 },
0058 { 0x0F3F, 0x0F3F, 0x0000 },
0059 { 0x0F3F, 0x0F3F, 0x0000 },
0060 { 0x8000, 0x8000, 0x0000 },
0061 { 0x1FFF, 0x1FFF, 0x0000 },
0062 { 0xEF7F, 0xEF7F, 0x0000 },
0063 { 0xC9F7, 0xC9F7, 0xFFFF },
0064 { 0x8001, 0x8001, 0x0000 },
0065 { 0xFFF7, 0xFFF7, 0xFFFF },
0066 { 0xFBFF, 0xFBFF, 0x0000 },
0067 { 0xFFFF, 0xFFFF, 0x0000 },
0068 { 0x0033, 0x0033, 0x0000 },
0069 { 0x0000, 0x0000, 0x0000 },
0070 { 0x0000, 0x0000, 0x0000 },
0071 { 0x3033, 0x3033, 0x0000 },
0072 { 0x0000, 0x0000, 0x0000 },
0073 { 0x81FF, 0x81FF, 0xFFFF },
0074 { 0x81FF, 0x81FF, 0xFFFF },
0075 { 0x0000, 0x0000, 0x0000 },
0076 { 0x0FFF, 0x0FFF, 0xFFFF },
0077 { 0x0017, 0x0017, 0x0000 },
0078 { 0x0000, 0x0000, 0x0000 },
0079 { 0x0000, 0x0000, 0x0000 },
0080 { 0x0000, 0x0000, 0x0000 },
0081 { 0x4000, 0x4000, 0x0000 },
0082 { 0x7000, 0x7000, 0x0000 },
0083 { 0x3C00, 0x3C00, 0x0000 },
0084 { 0x0000, 0x0000, 0x0000 },
0085 { 0x0000, 0x0000, 0x0000 },
0086 { 0x0000, 0x0000, 0x0000 },
0087 { 0x8303, 0x8303, 0xFFFF },
0088 { 0x0000, 0x0000, 0x0000 },
0089 { 0x81FF, 0x81FF, 0xFFFF },
0090 { 0x81FF, 0x81FF, 0xFFFF },
0091 { 0x0FFF, 0x0FFF, 0x0000 },
0092 { 0x0000, 0x0000, 0x0000 },
0093 { 0x0FFF, 0x0FFF, 0xFFFF },
0094 { 0x0000, 0x0000, 0x0000 },
0095 { 0x0707, 0x0707, 0xFFFF },
0096 { 0xC0C0, 0xC0C0, 0xFFFF },
0097 { 0xC09F, 0xC09F, 0xFFFF },
0098 { 0x0000, 0x0000, 0x0000 },
0099 { 0x0F15, 0x0F15, 0xFFFF },
0100 { 0xC000, 0xC000, 0xFFFF },
0101 { 0x03FF, 0x03FF, 0x0000 },
0102 { 0x0000, 0x0000, 0x0000 },
0103 { 0xE1FC, 0xE1FC, 0x8000 },
0104 { 0xE1FC, 0xE1FC, 0x8000 },
0105 { 0x0000, 0x0000, 0x0000 },
0106 { 0x0000, 0x0000, 0x0000 },
0107 { 0x0000, 0x0000, 0x0000 },
0108 { 0x0000, 0x0000, 0x0000 },
0109 { 0x0000, 0x0000, 0x0000 },
0110 { 0x0000, 0x0000, 0x0000 },
0111 { 0x9807, 0x9807, 0xFFFF },
0112 { 0x980B, 0x980B, 0xFFFF },
0113 { 0x0000, 0x0000, 0x0000 },
0114 { 0x0000, 0x0000, 0x0000 },
0115 { 0x8909, 0x8909, 0xFFFF },
0116 { 0x9E07, 0x9E07, 0xFFFF },
0117 { 0x0000, 0x0000, 0x0000 },
0118 { 0x0000, 0x0000, 0x0000 },
0119 { 0x0EEE, 0x0EEE, 0x0000 },
0120 { 0xE0EE, 0xE0EE, 0x0000 },
0121 { 0x0E0F, 0x0E0F, 0x0000 },
0122 { 0xE0E1, 0xE0E1, 0x0000 },
0123 { 0x800E, 0x800E, 0x0000 },
0124 { 0x0000, 0x0000, 0x0000 },
0125 { 0x0000, 0x0000, 0x0000 },
0126 { 0x0000, 0x0000, 0x0000 },
0127 { 0xE1FC, 0xE1FC, 0xFFFF },
0128 { 0xE1FC, 0xE1FC, 0xFFFF },
0129 { 0xE1FC, 0xE1FC, 0xFFFF },
0130 { 0xE7FC, 0xE7FC, 0xFFFF },
0131 { 0x0000, 0x0000, 0x0000 },
0132 { 0x0000, 0x0000, 0x0000 },
0133 { 0x0000, 0x0000, 0x0000 },
0134 { 0x80E0, 0x80E0, 0xFFFF },
0135 { 0xBF00, 0xBF00, 0x0000 },
0136 { 0x00F1, 0x00F1, 0x0000 },
0137 { 0x00F8, 0x00F8, 0x0000 },
0138 { 0x40FB, 0x40FB, 0x0000 },
0139 { 0x7C30, 0x7C30, 0x0000 },
0140 { 0x0000, 0x0000, 0x0000 },
0141 { 0x0000, 0x0000, 0x0000 },
0142 { 0x0000, 0x0000, 0x0000 },
0143 { 0x0000, 0x0000, 0x0000 },
0144 { 0x0000, 0x0000, 0x0000 },
0145 { 0x0000, 0x0000, 0x0000 },
0146 { 0x0000, 0x0000, 0x0000 },
0147 { 0x0000, 0x0000, 0x0000 },
0148 { 0x0000, 0x0000, 0x0000 },
0149 { 0x0000, 0x0000, 0x0000 },
0150 { 0x0000, 0x0000, 0x0000 },
0151 { 0x1FFF, 0x1FFF, 0x0000 },
0152 { 0x1FFF, 0x1FFF, 0x0000 },
0153 { 0x1FFF, 0x1FFF, 0x0000 },
0154 { 0x1FFF, 0x1FFF, 0x0000 },
0155 { 0x0000, 0x0000, 0x0000 },
0156 { 0x00C0, 0x00C0, 0x0000 },
0157 { 0x1FFF, 0x1FFF, 0x0000 },
0158 { 0x1FFF, 0x1FFF, 0x0000 },
0159 { 0x0000, 0x0000, 0x0000 },
0160 { 0x0000, 0x0000, 0x0000 },
0161 { 0x0000, 0x0000, 0x0000 },
0162 { 0x0000, 0x0000, 0x0000 },
0163 { 0xFFFF, 0xFFFF, 0x0000 },
0164 { 0xFFFF, 0xFFFF, 0x0000 },
0165 { 0xFFFF, 0xFFFF, 0x0000 },
0166 { 0x000F, 0x000F, 0x0000 },
0167 { 0xF0FF, 0xF0FF, 0xA000 },
0168 { 0x3707, 0x3707, 0x0000 },
0169 { 0x0000, 0x0000, 0x0000 },
0170 { 0x0000, 0x0000, 0x0000 },
0171 { 0x0000, 0x0000, 0x0000 },
0172 { 0x0000, 0x0000, 0x0000 },
0173 { 0x0000, 0x0000, 0x0000 },
0174 { 0x0000, 0x0000, 0x0000 },
0175 { 0x7FFF, 0x7000, 0xFFFF },
0176 { 0x7FFF, 0x7000, 0xFFFF },
0177 { 0x7FFF, 0x7000, 0xFFFF },
0178 { 0x7FFF, 0x7000, 0xFFFF },
0179 { 0x0FFF, 0x0000, 0xFFFF },
0180 { 0x0FFF, 0x0000, 0xFFFF },
0181 { 0x0FFF, 0x0000, 0xFFFF },
0182 { 0x0FFF, 0x0000, 0xFFFF },
0183 { 0x0000, 0x0000, 0x0000 },
0184 { 0x0000, 0x0000, 0x0000 },
0185 { 0x0000, 0x0000, 0x0000 },
0186 { 0x000F, 0x000F, 0x0000 },
0187 { 0xFFFF, 0xFFFF, 0x0000 },
0188 { 0xFFFF, 0xFFFF, 0x0000 },
0189 { 0xFFFF, 0xFFFF, 0x0000 },
0190 { 0xFFFF, 0xFFFF, 0x0000 },
0191 { 0xBFFF, 0xBFFF, 0x8000 },
0192 { 0xFFFF, 0x4FFF, 0xB000 },
0193 { 0x007F, 0x007F, 0x0000 },
0194 { 0x0000, 0x0000, 0x0000 },
0195 { 0x903F, 0x903F, 0xFFFF },
0196 { 0xE333, 0xE333, 0xFFFF },
0197 { 0x903F, 0x903F, 0xFFFF },
0198 { 0xE333, 0xE333, 0xFFFF },
0199 { 0x8F3F, 0x8F3F, 0xFFFF },
0200 { 0x332D, 0x332D, 0x0000 },
0201 { 0x002D, 0x002D, 0x0000 },
0202 { 0x5177, 0x5177, 0x8000 },
0203 { 0x047F, 0x047F, 0x0000 },
0204 { 0xFFC0, 0xFFC0, 0x0000 },
0205 { 0x737F, 0x737F, 0x0000 },
0206 { 0x535B, 0x535B, 0x0000 },
0207 { 0xFFC0, 0xFFC0, 0x0000 },
0208 { 0x0000, 0x0000, 0x0000 },
0209 { 0x047F, 0x047F, 0x0000 },
0210 { 0xFFC0, 0xFFC0, 0x0000 },
0211 { 0x737F, 0x737F, 0x0000 },
0212 { 0x047F, 0x047F, 0x0000 },
0213 { 0xFFC0, 0xFFC0, 0x0000 },
0214 { 0x737F, 0x737F, 0x0000 },
0215 { 0x535B, 0x535B, 0x0000 },
0216 { 0xFFC0, 0xFFC0, 0x0000 },
0217 { 0x0000, 0x0000, 0x0000 },
0218 { 0x047F, 0x047F, 0x0000 },
0219 { 0xFFC0, 0xFFC0, 0x0000 },
0220 { 0x737F, 0x737F, 0x0000 },
0221 { 0x0000, 0x0000, 0x0000 },
0222 { 0xFFD3, 0xFFD3, 0x0000 },
0223 { 0x441F, 0x441F, 0x0000 },
0224 { 0xFFC0, 0xFFC0, 0x0000 },
0225 { 0x331F, 0x331F, 0x0000 },
0226 { 0x441F, 0x441F, 0x0000 },
0227 { 0xFFC0, 0xFFC0, 0x0000 },
0228 { 0x331F, 0x331F, 0x0000 },
0229 { 0x441F, 0x441F, 0x0000 },
0230 { 0xFFC0, 0xFFC0, 0x0000 },
0231 { 0x331F, 0x331F, 0x0000 },
0232 { 0x441F, 0x441F, 0x0000 },
0233 { 0xFFC0, 0xFFC0, 0x0000 },
0234 { 0x331F, 0x331F, 0x0000 },
0235 { 0x0000, 0x0000, 0x0000 },
0236 { 0x0000, 0x0000, 0x0000 },
0237 { 0x0000, 0x0000, 0x0000 },
0238 { 0x8F3F, 0x8F3F, 0x0000 },
0239 { 0xFF3F, 0xE03F, 0x0000 },
0240 { 0xEF2F, 0xE02F, 0x0000 },
0241 { 0xF3FF, 0xB3FF, 0xc000 },
0242 { 0xFFFF, 0xFFFF, 0x0000 },
0243 { 0x09FF, 0x01FF, 0x0000 },
0244 { 0x0000, 0x0000, 0x0000 },
0245 { 0xFFFF, 0xFFFF, 0xFFFF },
0246 { 0xFFFF, 0xFFFF, 0xFFFF },
0247 { 0x0000, 0x0000, 0x0000 },
0248 { 0x8F3F, 0x0000, 0xFFFF },
0249 { 0x0000, 0x0000, 0xFFFF },
0250 { 0x34FE, 0x0000, 0xFFFF },
0251 { 0x0000, 0x0000, 0x0000 },
0252 { 0x0000, 0x0000, 0x0000 },
0253 { 0xFFFF, 0x1FFF, 0xFFFF },
0254 { 0xFFFF, 0x1FFF, 0xFFFF },
0255 { 0xFFFF, 0x1FFF, 0xFFFF },
0256 { 0xFFFF, 0x1FFF, 0xFFFF },
0257 { 0x0000, 0x0000, 0x0000 },
0258 { 0x0000, 0x0000, 0x0000 },
0259 { 0x0000, 0x0000, 0x0000 },
0260 { 0x0000, 0x0000, 0x0000 },
0261 { 0x0000, 0x0000, 0x0000 },
0262 { 0x0000, 0x0000, 0x0000 },
0263 { 0x0000, 0x0000, 0x0000 },
0264 { 0x0000, 0x0000, 0x0000 },
0265 { 0x0000, 0x0000, 0x0000 },
0266 { 0x0000, 0x0000, 0x0000 },
0267 { 0x0000, 0x0000, 0x0000 },
0268 { 0x0000, 0x0000, 0x0000 },
0269 { 0x0000, 0x0000, 0x0000 },
0270 { 0x0000, 0x0000, 0x0000 },
0271 { 0xFFFF, 0x0010, 0xFFFF },
0272 { 0x0000, 0x0000, 0x0000 },
0273 { 0xFFFF, 0x0010, 0xFFFF },
0274 { 0xFFFF, 0x0010, 0xFFFF },
0275 { 0x0000, 0x0000, 0x0000 },
0276 { 0xFFFF, 0x0010, 0xFFFF },
0277 { 0x0000, 0x0000, 0x0000 },
0278 { 0x0000, 0x0000, 0x0000 },
0279 };
0280
0281 static bool wm8350_readable(struct device *dev, unsigned int reg)
0282 {
0283 return wm8350_reg_io_map[reg].readable;
0284 }
0285
0286 static bool wm8350_writeable(struct device *dev, unsigned int reg)
0287 {
0288 struct wm8350 *wm8350 = dev_get_drvdata(dev);
0289
0290 if (!wm8350->unlocked) {
0291 if ((reg >= WM8350_GPIO_FUNCTION_SELECT_1 &&
0292 reg <= WM8350_GPIO_FUNCTION_SELECT_4) ||
0293 (reg >= WM8350_BATTERY_CHARGER_CONTROL_1 &&
0294 reg <= WM8350_BATTERY_CHARGER_CONTROL_3))
0295 return false;
0296 }
0297
0298 return wm8350_reg_io_map[reg].writable;
0299 }
0300
0301 static bool wm8350_volatile(struct device *dev, unsigned int reg)
0302 {
0303 return wm8350_reg_io_map[reg].vol;
0304 }
0305
0306 static bool wm8350_precious(struct device *dev, unsigned int reg)
0307 {
0308 switch (reg) {
0309 case WM8350_SYSTEM_INTERRUPTS:
0310 case WM8350_INT_STATUS_1:
0311 case WM8350_INT_STATUS_2:
0312 case WM8350_POWER_UP_INT_STATUS:
0313 case WM8350_UNDER_VOLTAGE_INT_STATUS:
0314 case WM8350_OVER_CURRENT_INT_STATUS:
0315 case WM8350_GPIO_INT_STATUS:
0316 case WM8350_COMPARATOR_INT_STATUS:
0317 return true;
0318
0319 default:
0320 return false;
0321 }
0322 }
0323
0324 const struct regmap_config wm8350_regmap = {
0325 .reg_bits = 8,
0326 .val_bits = 16,
0327
0328 .cache_type = REGCACHE_RBTREE,
0329
0330 .max_register = WM8350_MAX_REGISTER,
0331 .readable_reg = wm8350_readable,
0332 .writeable_reg = wm8350_writeable,
0333 .volatile_reg = wm8350_volatile,
0334 .precious_reg = wm8350_precious,
0335 };