0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/device.h>
0011 #include <linux/delay.h>
0012 #include <linux/input.h>
0013 #include <linux/interrupt.h>
0014 #include <linux/mfd/core.h>
0015 #include <linux/slab.h>
0016 #include <linux/module.h>
0017 #include <linux/property.h>
0018
0019 #include <linux/mfd/da9052/da9052.h>
0020 #include <linux/mfd/da9052/pdata.h>
0021 #include <linux/mfd/da9052/reg.h>
0022
0023 static bool da9052_reg_readable(struct device *dev, unsigned int reg)
0024 {
0025 switch (reg) {
0026 case DA9052_PAGE0_CON_REG:
0027 case DA9052_STATUS_A_REG:
0028 case DA9052_STATUS_B_REG:
0029 case DA9052_STATUS_C_REG:
0030 case DA9052_STATUS_D_REG:
0031 case DA9052_EVENT_A_REG:
0032 case DA9052_EVENT_B_REG:
0033 case DA9052_EVENT_C_REG:
0034 case DA9052_EVENT_D_REG:
0035 case DA9052_FAULTLOG_REG:
0036 case DA9052_IRQ_MASK_A_REG:
0037 case DA9052_IRQ_MASK_B_REG:
0038 case DA9052_IRQ_MASK_C_REG:
0039 case DA9052_IRQ_MASK_D_REG:
0040 case DA9052_CONTROL_A_REG:
0041 case DA9052_CONTROL_B_REG:
0042 case DA9052_CONTROL_C_REG:
0043 case DA9052_CONTROL_D_REG:
0044 case DA9052_PDDIS_REG:
0045 case DA9052_INTERFACE_REG:
0046 case DA9052_RESET_REG:
0047 case DA9052_GPIO_0_1_REG:
0048 case DA9052_GPIO_2_3_REG:
0049 case DA9052_GPIO_4_5_REG:
0050 case DA9052_GPIO_6_7_REG:
0051 case DA9052_GPIO_8_9_REG:
0052 case DA9052_GPIO_10_11_REG:
0053 case DA9052_GPIO_12_13_REG:
0054 case DA9052_GPIO_14_15_REG:
0055 case DA9052_ID_0_1_REG:
0056 case DA9052_ID_2_3_REG:
0057 case DA9052_ID_4_5_REG:
0058 case DA9052_ID_6_7_REG:
0059 case DA9052_ID_8_9_REG:
0060 case DA9052_ID_10_11_REG:
0061 case DA9052_ID_12_13_REG:
0062 case DA9052_ID_14_15_REG:
0063 case DA9052_ID_16_17_REG:
0064 case DA9052_ID_18_19_REG:
0065 case DA9052_ID_20_21_REG:
0066 case DA9052_SEQ_STATUS_REG:
0067 case DA9052_SEQ_A_REG:
0068 case DA9052_SEQ_B_REG:
0069 case DA9052_SEQ_TIMER_REG:
0070 case DA9052_BUCKA_REG:
0071 case DA9052_BUCKB_REG:
0072 case DA9052_BUCKCORE_REG:
0073 case DA9052_BUCKPRO_REG:
0074 case DA9052_BUCKMEM_REG:
0075 case DA9052_BUCKPERI_REG:
0076 case DA9052_LDO1_REG:
0077 case DA9052_LDO2_REG:
0078 case DA9052_LDO3_REG:
0079 case DA9052_LDO4_REG:
0080 case DA9052_LDO5_REG:
0081 case DA9052_LDO6_REG:
0082 case DA9052_LDO7_REG:
0083 case DA9052_LDO8_REG:
0084 case DA9052_LDO9_REG:
0085 case DA9052_LDO10_REG:
0086 case DA9052_SUPPLY_REG:
0087 case DA9052_PULLDOWN_REG:
0088 case DA9052_CHGBUCK_REG:
0089 case DA9052_WAITCONT_REG:
0090 case DA9052_ISET_REG:
0091 case DA9052_BATCHG_REG:
0092 case DA9052_CHG_CONT_REG:
0093 case DA9052_INPUT_CONT_REG:
0094 case DA9052_CHG_TIME_REG:
0095 case DA9052_BBAT_CONT_REG:
0096 case DA9052_BOOST_REG:
0097 case DA9052_LED_CONT_REG:
0098 case DA9052_LEDMIN123_REG:
0099 case DA9052_LED1_CONF_REG:
0100 case DA9052_LED2_CONF_REG:
0101 case DA9052_LED3_CONF_REG:
0102 case DA9052_LED1CONT_REG:
0103 case DA9052_LED2CONT_REG:
0104 case DA9052_LED3CONT_REG:
0105 case DA9052_LED_CONT_4_REG:
0106 case DA9052_LED_CONT_5_REG:
0107 case DA9052_ADC_MAN_REG:
0108 case DA9052_ADC_CONT_REG:
0109 case DA9052_ADC_RES_L_REG:
0110 case DA9052_ADC_RES_H_REG:
0111 case DA9052_VDD_RES_REG:
0112 case DA9052_VDD_MON_REG:
0113 case DA9052_ICHG_AV_REG:
0114 case DA9052_ICHG_THD_REG:
0115 case DA9052_ICHG_END_REG:
0116 case DA9052_TBAT_RES_REG:
0117 case DA9052_TBAT_HIGHP_REG:
0118 case DA9052_TBAT_HIGHN_REG:
0119 case DA9052_TBAT_LOW_REG:
0120 case DA9052_T_OFFSET_REG:
0121 case DA9052_ADCIN4_RES_REG:
0122 case DA9052_AUTO4_HIGH_REG:
0123 case DA9052_AUTO4_LOW_REG:
0124 case DA9052_ADCIN5_RES_REG:
0125 case DA9052_AUTO5_HIGH_REG:
0126 case DA9052_AUTO5_LOW_REG:
0127 case DA9052_ADCIN6_RES_REG:
0128 case DA9052_AUTO6_HIGH_REG:
0129 case DA9052_AUTO6_LOW_REG:
0130 case DA9052_TJUNC_RES_REG:
0131 case DA9052_TSI_CONT_A_REG:
0132 case DA9052_TSI_CONT_B_REG:
0133 case DA9052_TSI_X_MSB_REG:
0134 case DA9052_TSI_Y_MSB_REG:
0135 case DA9052_TSI_LSB_REG:
0136 case DA9052_TSI_Z_MSB_REG:
0137 case DA9052_COUNT_S_REG:
0138 case DA9052_COUNT_MI_REG:
0139 case DA9052_COUNT_H_REG:
0140 case DA9052_COUNT_D_REG:
0141 case DA9052_COUNT_MO_REG:
0142 case DA9052_COUNT_Y_REG:
0143 case DA9052_ALARM_MI_REG:
0144 case DA9052_ALARM_H_REG:
0145 case DA9052_ALARM_D_REG:
0146 case DA9052_ALARM_MO_REG:
0147 case DA9052_ALARM_Y_REG:
0148 case DA9052_SECOND_A_REG:
0149 case DA9052_SECOND_B_REG:
0150 case DA9052_SECOND_C_REG:
0151 case DA9052_SECOND_D_REG:
0152 case DA9052_PAGE1_CON_REG:
0153 return true;
0154 default:
0155 return false;
0156 }
0157 }
0158
0159 static bool da9052_reg_writeable(struct device *dev, unsigned int reg)
0160 {
0161 switch (reg) {
0162 case DA9052_PAGE0_CON_REG:
0163 case DA9052_EVENT_A_REG:
0164 case DA9052_EVENT_B_REG:
0165 case DA9052_EVENT_C_REG:
0166 case DA9052_EVENT_D_REG:
0167 case DA9052_FAULTLOG_REG:
0168 case DA9052_IRQ_MASK_A_REG:
0169 case DA9052_IRQ_MASK_B_REG:
0170 case DA9052_IRQ_MASK_C_REG:
0171 case DA9052_IRQ_MASK_D_REG:
0172 case DA9052_CONTROL_A_REG:
0173 case DA9052_CONTROL_B_REG:
0174 case DA9052_CONTROL_C_REG:
0175 case DA9052_CONTROL_D_REG:
0176 case DA9052_PDDIS_REG:
0177 case DA9052_RESET_REG:
0178 case DA9052_GPIO_0_1_REG:
0179 case DA9052_GPIO_2_3_REG:
0180 case DA9052_GPIO_4_5_REG:
0181 case DA9052_GPIO_6_7_REG:
0182 case DA9052_GPIO_8_9_REG:
0183 case DA9052_GPIO_10_11_REG:
0184 case DA9052_GPIO_12_13_REG:
0185 case DA9052_GPIO_14_15_REG:
0186 case DA9052_ID_0_1_REG:
0187 case DA9052_ID_2_3_REG:
0188 case DA9052_ID_4_5_REG:
0189 case DA9052_ID_6_7_REG:
0190 case DA9052_ID_8_9_REG:
0191 case DA9052_ID_10_11_REG:
0192 case DA9052_ID_12_13_REG:
0193 case DA9052_ID_14_15_REG:
0194 case DA9052_ID_16_17_REG:
0195 case DA9052_ID_18_19_REG:
0196 case DA9052_ID_20_21_REG:
0197 case DA9052_SEQ_STATUS_REG:
0198 case DA9052_SEQ_A_REG:
0199 case DA9052_SEQ_B_REG:
0200 case DA9052_SEQ_TIMER_REG:
0201 case DA9052_BUCKA_REG:
0202 case DA9052_BUCKB_REG:
0203 case DA9052_BUCKCORE_REG:
0204 case DA9052_BUCKPRO_REG:
0205 case DA9052_BUCKMEM_REG:
0206 case DA9052_BUCKPERI_REG:
0207 case DA9052_LDO1_REG:
0208 case DA9052_LDO2_REG:
0209 case DA9052_LDO3_REG:
0210 case DA9052_LDO4_REG:
0211 case DA9052_LDO5_REG:
0212 case DA9052_LDO6_REG:
0213 case DA9052_LDO7_REG:
0214 case DA9052_LDO8_REG:
0215 case DA9052_LDO9_REG:
0216 case DA9052_LDO10_REG:
0217 case DA9052_SUPPLY_REG:
0218 case DA9052_PULLDOWN_REG:
0219 case DA9052_CHGBUCK_REG:
0220 case DA9052_WAITCONT_REG:
0221 case DA9052_ISET_REG:
0222 case DA9052_BATCHG_REG:
0223 case DA9052_CHG_CONT_REG:
0224 case DA9052_INPUT_CONT_REG:
0225 case DA9052_BBAT_CONT_REG:
0226 case DA9052_BOOST_REG:
0227 case DA9052_LED_CONT_REG:
0228 case DA9052_LEDMIN123_REG:
0229 case DA9052_LED1_CONF_REG:
0230 case DA9052_LED2_CONF_REG:
0231 case DA9052_LED3_CONF_REG:
0232 case DA9052_LED1CONT_REG:
0233 case DA9052_LED2CONT_REG:
0234 case DA9052_LED3CONT_REG:
0235 case DA9052_LED_CONT_4_REG:
0236 case DA9052_LED_CONT_5_REG:
0237 case DA9052_ADC_MAN_REG:
0238 case DA9052_ADC_CONT_REG:
0239 case DA9052_ADC_RES_L_REG:
0240 case DA9052_ADC_RES_H_REG:
0241 case DA9052_VDD_RES_REG:
0242 case DA9052_VDD_MON_REG:
0243 case DA9052_ICHG_THD_REG:
0244 case DA9052_ICHG_END_REG:
0245 case DA9052_TBAT_HIGHP_REG:
0246 case DA9052_TBAT_HIGHN_REG:
0247 case DA9052_TBAT_LOW_REG:
0248 case DA9052_T_OFFSET_REG:
0249 case DA9052_AUTO4_HIGH_REG:
0250 case DA9052_AUTO4_LOW_REG:
0251 case DA9052_AUTO5_HIGH_REG:
0252 case DA9052_AUTO5_LOW_REG:
0253 case DA9052_AUTO6_HIGH_REG:
0254 case DA9052_AUTO6_LOW_REG:
0255 case DA9052_TSI_CONT_A_REG:
0256 case DA9052_TSI_CONT_B_REG:
0257 case DA9052_COUNT_S_REG:
0258 case DA9052_COUNT_MI_REG:
0259 case DA9052_COUNT_H_REG:
0260 case DA9052_COUNT_D_REG:
0261 case DA9052_COUNT_MO_REG:
0262 case DA9052_COUNT_Y_REG:
0263 case DA9052_ALARM_MI_REG:
0264 case DA9052_ALARM_H_REG:
0265 case DA9052_ALARM_D_REG:
0266 case DA9052_ALARM_MO_REG:
0267 case DA9052_ALARM_Y_REG:
0268 case DA9052_PAGE1_CON_REG:
0269 return true;
0270 default:
0271 return false;
0272 }
0273 }
0274
0275 static bool da9052_reg_volatile(struct device *dev, unsigned int reg)
0276 {
0277 switch (reg) {
0278 case DA9052_STATUS_A_REG:
0279 case DA9052_STATUS_B_REG:
0280 case DA9052_STATUS_C_REG:
0281 case DA9052_STATUS_D_REG:
0282 case DA9052_EVENT_A_REG:
0283 case DA9052_EVENT_B_REG:
0284 case DA9052_EVENT_C_REG:
0285 case DA9052_EVENT_D_REG:
0286 case DA9052_CONTROL_B_REG:
0287 case DA9052_CONTROL_D_REG:
0288 case DA9052_SUPPLY_REG:
0289 case DA9052_FAULTLOG_REG:
0290 case DA9052_CHG_TIME_REG:
0291 case DA9052_ADC_RES_L_REG:
0292 case DA9052_ADC_RES_H_REG:
0293 case DA9052_VDD_RES_REG:
0294 case DA9052_ICHG_AV_REG:
0295 case DA9052_TBAT_RES_REG:
0296 case DA9052_ADCIN4_RES_REG:
0297 case DA9052_ADCIN5_RES_REG:
0298 case DA9052_ADCIN6_RES_REG:
0299 case DA9052_TJUNC_RES_REG:
0300 case DA9052_TSI_X_MSB_REG:
0301 case DA9052_TSI_Y_MSB_REG:
0302 case DA9052_TSI_LSB_REG:
0303 case DA9052_TSI_Z_MSB_REG:
0304 case DA9052_COUNT_S_REG:
0305 case DA9052_COUNT_MI_REG:
0306 case DA9052_COUNT_H_REG:
0307 case DA9052_COUNT_D_REG:
0308 case DA9052_COUNT_MO_REG:
0309 case DA9052_COUNT_Y_REG:
0310 case DA9052_ALARM_MI_REG:
0311 return true;
0312 default:
0313 return false;
0314 }
0315 }
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328 static const int32_t tbat_lookup[255] = {
0329 183258, 144221, 124334, 111336, 101826, 94397, 88343, 83257,
0330 78889, 75071, 71688, 68656, 65914, 63414, 61120, 59001,
0331 570366, 55204, 53490, 51881, 50364, 48931, 47574, 46285,
0332 45059, 43889, 42772, 41703, 40678, 39694, 38748, 37838,
0333 36961, 36115, 35297, 34507, 33743, 33002, 32284, 31588,
0334 30911, 30254, 29615, 28994, 28389, 27799, 27225, 26664,
0335 26117, 25584, 25062, 24553, 24054, 23567, 23091, 22624,
0336 22167, 21719, 21281, 20851, 20429, 20015, 19610, 19211,
0337 18820, 18436, 18058, 17688, 17323, 16965, 16612, 16266,
0338 15925, 15589, 15259, 14933, 14613, 14298, 13987, 13681,
0339 13379, 13082, 12788, 12499, 12214, 11933, 11655, 11382,
0340 11112, 10845, 10582, 10322, 10066, 9812, 9562, 9315,
0341 9071, 8830, 8591, 8356, 8123, 7893, 7665, 7440,
0342 7218, 6998, 6780, 6565, 6352, 6141, 5933, 5726,
0343 5522, 5320, 5120, 4922, 4726, 4532, 4340, 4149,
0344 3961, 3774, 3589, 3406, 3225, 3045, 2867, 2690,
0345 2516, 2342, 2170, 2000, 1831, 1664, 1498, 1334,
0346 1171, 1009, 849, 690, 532, 376, 221, 67,
0347 -84, -236, -386, -535, -683, -830, -975, -1119,
0348 -1263, -1405, -1546, -1686, -1825, -1964, -2101, -2237,
0349 -2372, -2506, -2639, -2771, -2902, -3033, -3162, -3291,
0350 -3418, -3545, -3671, -3796, -3920, -4044, -4166, -4288,
0351 -4409, -4529, -4649, -4767, -4885, -5002, -5119, -5235,
0352 -5349, -5464, -5577, -5690, -5802, -5913, -6024, -6134,
0353 -6244, -6352, -6461, -6568, -6675, -6781, -6887, -6992,
0354 -7096, -7200, -7303, -7406, -7508, -7609, -7710, -7810,
0355 -7910, -8009, -8108, -8206, -8304, -8401, -8497, -8593,
0356 -8689, -8784, -8878, -8972, -9066, -9159, -9251, -9343,
0357 -9435, -9526, -9617, -9707, -9796, -9886, -9975, -10063,
0358 -10151, -10238, -10325, -10412, -10839, -10923, -11007, -11090,
0359 -11173, -11256, -11338, -11420, -11501, -11583, -11663, -11744,
0360 -11823, -11903, -11982
0361 };
0362
0363 static const u8 chan_mux[DA9052_ADC_VBBAT + 1] = {
0364 [DA9052_ADC_VDDOUT] = DA9052_ADC_MAN_MUXSEL_VDDOUT,
0365 [DA9052_ADC_ICH] = DA9052_ADC_MAN_MUXSEL_ICH,
0366 [DA9052_ADC_TBAT] = DA9052_ADC_MAN_MUXSEL_TBAT,
0367 [DA9052_ADC_VBAT] = DA9052_ADC_MAN_MUXSEL_VBAT,
0368 [DA9052_ADC_IN4] = DA9052_ADC_MAN_MUXSEL_AD4,
0369 [DA9052_ADC_IN5] = DA9052_ADC_MAN_MUXSEL_AD5,
0370 [DA9052_ADC_IN6] = DA9052_ADC_MAN_MUXSEL_AD6,
0371 [DA9052_ADC_VBBAT] = DA9052_ADC_MAN_MUXSEL_VBBAT
0372 };
0373
0374 int da9052_adc_manual_read(struct da9052 *da9052, unsigned char channel)
0375 {
0376 int ret;
0377 unsigned short calc_data;
0378 unsigned short data;
0379 unsigned char mux_sel;
0380
0381 if (channel > DA9052_ADC_VBBAT)
0382 return -EINVAL;
0383
0384 mutex_lock(&da9052->auxadc_lock);
0385
0386 reinit_completion(&da9052->done);
0387
0388
0389 mux_sel = chan_mux[channel] | DA9052_ADC_MAN_MAN_CONV;
0390
0391 ret = da9052_reg_write(da9052, DA9052_ADC_MAN_REG, mux_sel);
0392 if (ret < 0)
0393 goto err;
0394
0395
0396 if (!wait_for_completion_timeout(&da9052->done,
0397 msecs_to_jiffies(500))) {
0398 dev_err(da9052->dev,
0399 "timeout waiting for ADC conversion interrupt\n");
0400 ret = -ETIMEDOUT;
0401 goto err;
0402 }
0403
0404 ret = da9052_reg_read(da9052, DA9052_ADC_RES_H_REG);
0405 if (ret < 0)
0406 goto err;
0407
0408 calc_data = (unsigned short)ret;
0409 data = calc_data << 2;
0410
0411 ret = da9052_reg_read(da9052, DA9052_ADC_RES_L_REG);
0412 if (ret < 0)
0413 goto err;
0414
0415 calc_data = (unsigned short)(ret & DA9052_ADC_RES_LSB);
0416 data |= calc_data;
0417
0418 ret = data;
0419
0420 err:
0421 mutex_unlock(&da9052->auxadc_lock);
0422 return ret;
0423 }
0424 EXPORT_SYMBOL_GPL(da9052_adc_manual_read);
0425
0426 int da9052_adc_read_temp(struct da9052 *da9052)
0427 {
0428 int tbat;
0429
0430 tbat = da9052_reg_read(da9052, DA9052_TBAT_RES_REG);
0431 if (tbat <= 0)
0432 return tbat;
0433
0434
0435 return tbat_lookup[tbat - 1];
0436 }
0437 EXPORT_SYMBOL_GPL(da9052_adc_read_temp);
0438
0439 static const struct mfd_cell da9052_subdev_info[] = {
0440 {
0441 .name = "da9052-regulator",
0442 .id = 0,
0443 },
0444 {
0445 .name = "da9052-regulator",
0446 .id = 1,
0447 },
0448 {
0449 .name = "da9052-regulator",
0450 .id = 2,
0451 },
0452 {
0453 .name = "da9052-regulator",
0454 .id = 3,
0455 },
0456 {
0457 .name = "da9052-regulator",
0458 .id = 4,
0459 },
0460 {
0461 .name = "da9052-regulator",
0462 .id = 5,
0463 },
0464 {
0465 .name = "da9052-regulator",
0466 .id = 6,
0467 },
0468 {
0469 .name = "da9052-regulator",
0470 .id = 7,
0471 },
0472 {
0473 .name = "da9052-regulator",
0474 .id = 8,
0475 },
0476 {
0477 .name = "da9052-regulator",
0478 .id = 9,
0479 },
0480 {
0481 .name = "da9052-regulator",
0482 .id = 10,
0483 },
0484 {
0485 .name = "da9052-regulator",
0486 .id = 11,
0487 },
0488 {
0489 .name = "da9052-regulator",
0490 .id = 12,
0491 },
0492 {
0493 .name = "da9052-regulator",
0494 .id = 13,
0495 },
0496 {
0497 .name = "da9052-onkey",
0498 },
0499 {
0500 .name = "da9052-rtc",
0501 },
0502 {
0503 .name = "da9052-gpio",
0504 },
0505 {
0506 .name = "da9052-hwmon",
0507 },
0508 {
0509 .name = "da9052-leds",
0510 },
0511 {
0512 .name = "da9052-wled1",
0513 },
0514 {
0515 .name = "da9052-wled2",
0516 },
0517 {
0518 .name = "da9052-wled3",
0519 },
0520 {
0521 .name = "da9052-bat",
0522 },
0523 {
0524 .name = "da9052-watchdog",
0525 },
0526 };
0527
0528 static const struct mfd_cell da9052_tsi_subdev_info[] = {
0529 { .name = "da9052-tsi" },
0530 };
0531
0532 const struct regmap_config da9052_regmap_config = {
0533 .reg_bits = 8,
0534 .val_bits = 8,
0535
0536 .cache_type = REGCACHE_RBTREE,
0537
0538 .max_register = DA9052_PAGE1_CON_REG,
0539 .readable_reg = da9052_reg_readable,
0540 .writeable_reg = da9052_reg_writeable,
0541 .volatile_reg = da9052_reg_volatile,
0542 };
0543 EXPORT_SYMBOL_GPL(da9052_regmap_config);
0544
0545 static int da9052_clear_fault_log(struct da9052 *da9052)
0546 {
0547 int ret = 0;
0548 int fault_log = 0;
0549
0550 fault_log = da9052_reg_read(da9052, DA9052_FAULTLOG_REG);
0551 if (fault_log < 0) {
0552 dev_err(da9052->dev,
0553 "Cannot read FAULT_LOG %d\n", fault_log);
0554 return fault_log;
0555 }
0556
0557 if (fault_log) {
0558 if (fault_log & DA9052_FAULTLOG_TWDERROR)
0559 dev_dbg(da9052->dev,
0560 "Fault log entry detected: TWD_ERROR\n");
0561 if (fault_log & DA9052_FAULTLOG_VDDFAULT)
0562 dev_dbg(da9052->dev,
0563 "Fault log entry detected: VDD_FAULT\n");
0564 if (fault_log & DA9052_FAULTLOG_VDDSTART)
0565 dev_dbg(da9052->dev,
0566 "Fault log entry detected: VDD_START\n");
0567 if (fault_log & DA9052_FAULTLOG_TEMPOVER)
0568 dev_dbg(da9052->dev,
0569 "Fault log entry detected: TEMP_OVER\n");
0570 if (fault_log & DA9052_FAULTLOG_KEYSHUT)
0571 dev_dbg(da9052->dev,
0572 "Fault log entry detected: KEY_SHUT\n");
0573 if (fault_log & DA9052_FAULTLOG_NSDSET)
0574 dev_dbg(da9052->dev,
0575 "Fault log entry detected: nSD_SHUT\n");
0576 if (fault_log & DA9052_FAULTLOG_WAITSET)
0577 dev_dbg(da9052->dev,
0578 "Fault log entry detected: WAIT_SHUT\n");
0579
0580 ret = da9052_reg_write(da9052,
0581 DA9052_FAULTLOG_REG,
0582 0xFF);
0583 if (ret < 0)
0584 dev_err(da9052->dev,
0585 "Cannot reset FAULT_LOG values %d\n", ret);
0586 }
0587
0588 return ret;
0589 }
0590
0591 int da9052_device_init(struct da9052 *da9052, u8 chip_id)
0592 {
0593 struct da9052_pdata *pdata = dev_get_platdata(da9052->dev);
0594 int ret;
0595
0596 mutex_init(&da9052->auxadc_lock);
0597 init_completion(&da9052->done);
0598
0599 ret = da9052_clear_fault_log(da9052);
0600 if (ret < 0)
0601 dev_warn(da9052->dev, "Cannot clear FAULT_LOG\n");
0602
0603 if (pdata && pdata->init != NULL)
0604 pdata->init(da9052);
0605
0606 da9052->chip_id = chip_id;
0607
0608 ret = da9052_irq_init(da9052);
0609 if (ret != 0) {
0610 dev_err(da9052->dev, "da9052_irq_init failed: %d\n", ret);
0611 return ret;
0612 }
0613
0614 ret = mfd_add_devices(da9052->dev, PLATFORM_DEVID_AUTO,
0615 da9052_subdev_info,
0616 ARRAY_SIZE(da9052_subdev_info), NULL, 0, NULL);
0617 if (ret) {
0618 dev_err(da9052->dev, "mfd_add_devices failed: %d\n", ret);
0619 goto err;
0620 }
0621
0622
0623
0624
0625
0626
0627 if (!device_property_read_bool(da9052->dev, "dlg,tsi-as-adc")) {
0628 ret = mfd_add_devices(da9052->dev, PLATFORM_DEVID_AUTO,
0629 da9052_tsi_subdev_info,
0630 ARRAY_SIZE(da9052_tsi_subdev_info),
0631 NULL, 0, NULL);
0632 if (ret) {
0633 dev_err(da9052->dev, "failed to add TSI subdev: %d\n",
0634 ret);
0635 goto err;
0636 }
0637 }
0638
0639 return 0;
0640
0641 err:
0642 mfd_remove_devices(da9052->dev);
0643 da9052_irq_exit(da9052);
0644
0645 return ret;
0646 }
0647
0648 void da9052_device_exit(struct da9052 *da9052)
0649 {
0650 mfd_remove_devices(da9052->dev);
0651 da9052_irq_exit(da9052);
0652 }
0653
0654 MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>");
0655 MODULE_DESCRIPTION("DA9052 MFD Core");
0656 MODULE_LICENSE("GPL");