Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Device access for Dialog DA9052 PMICs.
0004  *
0005  * Copyright(c) 2011 Dialog Semiconductor Ltd.
0006  *
0007  * Author: David Dajun Chen <dchen@diasemi.com>
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  * TBAT look-up table is computed from the R90 reg (8 bit register)
0319  * reading as below. The battery temperature is in milliCentigrade
0320  * TBAT = (1/(t1+1/298) - 273) * 1000 mC
0321  * where t1 = (1/B)* ln(( ADCval * 2.5)/(R25*ITBAT*255))
0322  * Default values are R25 = 10e3, B = 3380, ITBAT = 50e-6
0323  * Example:
0324  * R25=10E3, B=3380, ITBAT=50e-6, ADCVAL=62d calculates
0325  * TBAT = 20015 mili degrees Centrigrade
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     /* Channel gets activated on enabling the Conversion bit */
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     /* Wait for an interrupt */
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     /* ARRAY_SIZE check is not needed since TBAT is a 8-bit register */
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      * Check if touchscreen pins are used are analogue input instead
0624      * of having a touchscreen connected to them. The analogue input
0625      * functionality will be provided by hwmon driver (if enabled).
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");