diff options
Diffstat (limited to 'drivers/misc/max8997-muic.c')
-rw-r--r-- | drivers/misc/max8997-muic.c | 1710 |
1 files changed, 1104 insertions, 606 deletions
diff --git a/drivers/misc/max8997-muic.c b/drivers/misc/max8997-muic.c index 3321545..202df3d 100644 --- a/drivers/misc/max8997-muic.c +++ b/drivers/misc/max8997-muic.c @@ -35,7 +35,10 @@ #ifdef CONFIG_USBHUB_USB3803 #include <linux/usb3803.h> #endif - +#ifdef CONFIG_EXTCON +#include <linux/extcon.h> +#define DEV_NAME "max8997-muic" +#endif /* MAX8997 STATUS1 register */ #define STATUS1_ADC_SHIFT 0 @@ -83,6 +86,13 @@ #define INT_DETACH (0x1 << 1) #define INT_ATTACH (0x1 << 0) +enum { + CTRL1_TO_OPEN = 0x0, + CTRL1_TO_USB = 0x1, + CTRL1_TO_AUDIO = 0x2, + CTRL1_TO_UART = 0x3, +}; + /* MAX8997 MUIC CHG_TYP setting values */ enum { /* No Valid voltage at VB (Vvb < Vvbdet) */ @@ -151,7 +161,8 @@ struct max8997_muic_info { int irq_adcerr; int mansw; - enum cable_type cable_type; + enum muic_acc_type acc_type; + enum muic_chg_type chg_type; struct delayed_work init_work; struct delayed_work usb_work; struct delayed_work mhl_work; @@ -160,13 +171,16 @@ struct max8997_muic_info { int irq_chgins; int irq_chgrm; bool is_ovp_state; -#endif +#endif /* CONFIG_MUIC_MAX8997_OVPUI */ bool is_usb_ready; bool is_mhl_ready; struct input_dev *input; int previous_key; +#ifdef CONFIG_EXTCON + struct extcon_dev *edev; +#endif }; #if 0 @@ -194,11 +208,12 @@ static ssize_t max8997_muic_show_usb_state(struct device *dev, { struct max8997_muic_info *info = dev_get_drvdata(dev); - switch (info->cable_type) { - case CABLE_TYPE_USB: - case CABLE_TYPE_JIG_USB_OFF: - case CABLE_TYPE_JIG_USB_ON: - return sprintf(buf, "USB_STATE_CONFIGURED\n"); + switch (info->acc_type) { + case MUIC_ACC_TYPE_USB: + case MUIC_ACC_TYPE_JIG_USB_OFF: + case MUIC_ACC_TYPE_JIG_USB_ON: + if (info->chg_type == MUIC_CHG_TYPE_USB) + return sprintf(buf, "USB_STATE_CONFIGURED\n"); default: break; } @@ -212,33 +227,35 @@ static ssize_t max8997_muic_show_device(struct device *dev, { struct max8997_muic_info *info = dev_get_drvdata(dev); - switch (info->cable_type) { - case CABLE_TYPE_NONE: + switch (info->acc_type) { + case MUIC_ACC_TYPE_NONE: return sprintf(buf, "No cable\n"); - case CABLE_TYPE_USB: + case MUIC_ACC_TYPE_USB: return sprintf(buf, "USB\n"); - case CABLE_TYPE_OTG: + case MUIC_ACC_TYPE_OTG: return sprintf(buf, "OTG\n"); - case CABLE_TYPE_TA: + case MUIC_ACC_TYPE_TA: return sprintf(buf, "TA\n"); - case CABLE_TYPE_DESKDOCK: + case MUIC_ACC_TYPE_DESKDOCK: return sprintf(buf, "Desk Dock\n"); - case CABLE_TYPE_CARDOCK: + case MUIC_ACC_TYPE_CARDOCK: return sprintf(buf, "Car Dock\n"); - case CABLE_TYPE_JIG_UART_OFF: - return sprintf(buf, "JIG UART OFF\n"); - case CABLE_TYPE_JIG_UART_OFF_VB: - return sprintf(buf, "JIG UART OFF/VB\n"); - case CABLE_TYPE_JIG_UART_ON: + case MUIC_ACC_TYPE_JIG_UART_OFF: + if (info->chg_type == MUIC_CHG_TYPE_TA) + return sprintf(buf, "JIG UART OFF VB\n"); + else + return sprintf(buf, "JIG UART OFF\n"); + case MUIC_ACC_TYPE_JIG_UART_ON: return sprintf(buf, "JIG UART ON\n"); - case CABLE_TYPE_JIG_USB_OFF: + case MUIC_ACC_TYPE_JIG_USB_OFF: return sprintf(buf, "JIG USB OFF\n"); - case CABLE_TYPE_JIG_USB_ON: + case MUIC_ACC_TYPE_JIG_USB_ON: return sprintf(buf, "JIG USB ON\n"); - case CABLE_TYPE_MHL: - return sprintf(buf, "mHL\n"); - case CABLE_TYPE_MHL_VB: - return sprintf(buf, "mHL charging\n"); + case MUIC_ACC_TYPE_MHL: + if (info->chg_type == MUIC_CHG_TYPE_MHL_VB) + return sprintf(buf, "mHL charging\n"); + else + return sprintf(buf, "mHL\n"); default: break; } @@ -251,7 +268,7 @@ static ssize_t max8997_muic_show_manualsw(struct device *dev, { struct max8997_muic_info *info = dev_get_drvdata(dev); - switch (info->muic_data->sw_path) { + switch (info->muic_data->usb_path) { case AP_USB_MODE: return sprintf(buf, "PDA\n"); case CP_USB_MODE: @@ -272,10 +289,10 @@ static ssize_t max8997_muic_set_manualsw(struct device *dev, struct max8997_muic_info *info = dev_get_drvdata(dev); if (!strncasecmp(buf, "PDA", 3)) { - info->muic_data->sw_path = AP_USB_MODE; + info->muic_data->usb_path = AP_USB_MODE; dev_info(info->dev, "%s: AP_USB_MODE\n", __func__); } else if (!strncasecmp(buf, "MODEM", 5)) { - info->muic_data->sw_path = CP_USB_MODE; + info->muic_data->usb_path = CP_USB_MODE; dev_info(info->dev, "%s: CP_USB_MODE\n", __func__); } else dev_warn(info->dev, "%s: Wrong command\n", __func__); @@ -417,47 +434,6 @@ static void max8997_muic_set_adcdbset(struct max8997_muic_info *info, dev_err(info->dev, "%s: fail to update reg\n", __func__); } -static ssize_t max8997_muic_show_adc_debounce_time(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct max8997_muic_info *info = dev_get_drvdata(dev); - int ret; - u8 val; - - if (!info->muic) - return sprintf(buf, "No I2C client\n"); - - ret = max8997_read_reg(info->muic, MAX8997_MUIC_REG_CTRL3, &val); - if (ret) { - dev_err(info->dev, "%s: fail to read muic reg\n", __func__); - return sprintf(buf, "UNKNOWN\n"); - } - val &= CTRL3_ADCDBSET_MASK; - val = val >> CTRL3_ADCDBSET_SHIFT; - - return sprintf(buf, "%x\n", val); -} - -static ssize_t max8997_muic_set_adc_debounce_time(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct max8997_muic_info *info = dev_get_drvdata(dev); - int value; - - sscanf(buf, "%d", &value); - - value = (value & 0x3); - -#if 0 - max8997_muic_set_adcdbset(info, value); -#else - dev_info(info->dev, "%s: Do nothing\n", __func__); -#endif - - return count; -} - static ssize_t max8997_muic_show_status(struct device *dev, struct device_attribute *attr, char *buf) @@ -530,9 +506,6 @@ static DEVICE_ATTR(audio_path, 0664, max8997_muic_show_audio_path, max8997_muic_set_audio_path); static DEVICE_ATTR(otg_test, 0664, max8997_muic_show_otg_test, max8997_muic_set_otg_test); -static DEVICE_ATTR(adc_debounce_time, 0664, - max8997_muic_show_adc_debounce_time, - max8997_muic_set_adc_debounce_time); static DEVICE_ATTR(status, 0664, max8997_muic_show_status, max8997_muic_set_status); @@ -543,7 +516,6 @@ static struct attribute *max8997_muic_attributes[] = { &dev_attr_adc.attr, &dev_attr_audio_path.attr, &dev_attr_otg_test.attr, - &dev_attr_adc_debounce_time.attr, &dev_attr_status.attr, NULL }; @@ -552,103 +524,882 @@ static const struct attribute_group max8997_muic_group = { .attrs = max8997_muic_attributes, }; -static int max8997_muic_set_usb_path(struct max8997_muic_info *info, int path) +static int set_usb_sel(struct max8997_muic_info *info, int path) +{ + int gpio_usb_sel = info->muic_data->gpio_usb_sel; + int ret = 0; + int val = (path == USB_SEL_CP) ? GPIO_LEVEL_HIGH : GPIO_LEVEL_LOW; + int temp; + +#if !defined(CONFIG_TARGET_LOCALE_NA) + if (gpio_is_valid(gpio_usb_sel) && gpio_usb_sel) { + dev_info(info->dev, "%s(%d)\n", __func__, val); + gpio_direction_output(gpio_usb_sel, val); + + temp = gpio_get_value(gpio_usb_sel); + if (val != temp) { + dev_err(info->dev, "%s(%d)=>%d\n", __func__, val, temp); + ret = -EAGAIN; + } + } +#endif /* !CONFIG_TARGET_LOCALE_NA */ + + return ret; +} + +static int set_uart_sel(struct max8997_muic_info *info, int path) +{ + int gpio_uart_sel = info->muic_data->gpio_uart_sel; + int ret = 0; + int val = (path == UART_PATH_AP) ? GPIO_LEVEL_HIGH : GPIO_LEVEL_LOW; + int temp; + +#if !defined(CONFIG_TARGET_LOCALE_NA) + if (gpio_is_valid(gpio_uart_sel) && gpio_uart_sel) { + dev_info(info->dev, "%s(%d)\n", __func__, val); + gpio_direction_output(gpio_uart_sel, val); + + temp = gpio_get_value(gpio_uart_sel); + if (val != temp) { + dev_err(info->dev, "%s(%d)=>%d\n", __func__, val, temp); + ret = -EAGAIN; + } + } +#endif /* !CONFIG_TARGET_LOCALE_NA */ + + return ret; +} + +static int set_mic(struct max8997_muic_info *info, bool micen) +{ + struct i2c_client *client = info->muic; + int ret = 0; + u8 cntl1_val = micen << MICEN_SHIFT; + u8 temp = 0; + + /* MIC */ + dev_info(info->dev, "%s(%s) cntl1(0x%02x)\n", __func__, + (micen ? "en" : "dis"), cntl1_val); + ret = max8997_update_reg(client, MAX8997_MUIC_REG_CTRL1, cntl1_val, + MICEN_MASK); + if (ret < 0) { + dev_err(info->dev, "%s: update reg err\n", __func__); + return ret; + } + + ret = max8997_read_reg(client, MAX8997_MUIC_REG_CTRL1, &temp); + if (ret < 0) { + dev_err(info->dev, "%s: read reg err\n", __func__); + return ret; + } + + if ((temp & MICEN_MASK) ^ cntl1_val) { + dev_err(info->dev, "%s: err CNTL1(0x%02x)\n", __func__, temp); + ret = -EAGAIN; + } + + return ret; +} + +static int set_accdet(struct max8997_muic_info *info, u8 accdet) { struct i2c_client *client = info->muic; + int ret = 0; + u8 cntl2_val = accdet << CTRL2_ACCDET_SHIFT; + u8 temp = 0; + + /* accdet */ + dev_info(info->dev, "%s(%s) cntl2(0x%02x)\n", __func__, + (accdet ? "en" : "dis"), cntl2_val); + ret = max8997_update_reg(client, MAX8997_MUIC_REG_CTRL2, cntl2_val, + CTRL2_ACCDET_MASK); + if (ret < 0) { + dev_err(info->dev, "%s: update reg err\n", __func__); + return ret; + } + + ret = max8997_read_reg(client, MAX8997_MUIC_REG_CTRL2, &temp); + if (ret < 0) { + dev_err(info->dev, "%s: read reg err\n", __func__); + return ret; + } + + if ((temp & CTRL2_ACCDET_MASK) ^ cntl2_val) { + dev_err(info->dev, "%s: err CNTL2(0x%02x)\n", __func__, temp); + ret = -EAGAIN; + } + + return ret; +} + +static int set_com_sw(struct max8997_muic_info *info, u8 cntl1_val) +{ + struct i2c_client *client = info->muic; + int ret = 0; + u8 cntl1_msk = COMN1SW_MASK | COMP2SW_MASK; + u8 temp = 0; + + /* com sw */ + dev_info(info->dev, "%s(0x%02x)\n", __func__, cntl1_val); + ret = max8997_update_reg(client, MAX8997_MUIC_REG_CTRL1, cntl1_val, + cntl1_msk); + if (ret < 0) { + dev_err(info->dev, "%s: update reg err\n", __func__); + return ret; + } + + ret = max8997_read_reg(client, MAX8997_MUIC_REG_CTRL1, &temp); + if (ret < 0) { + dev_err(info->dev, "%s: read reg err\n", __func__); + return ret; + } + + if ((temp & (COMN1SW_MASK | COMP2SW_MASK)) ^ cntl1_val) { + dev_err(info->dev, "%s: err CNTL1(0x%02x)\n", __func__, temp); + ret = -EAGAIN; + } + + return ret; +} + +static int com_to_open(struct max8997_muic_info *info) +{ + int ret = 0; + u8 cntl1_val; + u8 temp = 0; + + /* Disable Factory Accessory Detection State Machine for manual open*/ + ret = set_accdet(info, 0x00); + if (ret) { + dev_err(info->dev, "%s: set_accdet err\n", __func__); + return ret; + } + + /* com to open */ + cntl1_val = (CTRL1_TO_OPEN << COMN1SW_SHIFT) | + (CTRL1_TO_OPEN << COMP2SW_SHIFT); + ret = set_com_sw(info, cntl1_val); + while (ret) { + ret = max8997_read_reg(info->muic, MAX8997_MUIC_REG_CTRL1, + &temp); + if (ret < 0) { + dev_err(info->dev, "%s: read reg err\n", __func__); + return ret; + } + + if ((temp & (COMN1SW_MASK | COMP2SW_MASK)) ^ cntl1_val) { + dev_err(info->dev, "%s: err CNTL1(0x%02x)\n", __func__, + temp); + ret = -EAGAIN; + } +#if 0 + if (ret) { + dev_err(info->dev, "%s: set_com_sw err\n", __func__); + return ret; + } +#endif + } + + return ret; +} + +static int com_to_usb(struct max8997_muic_info *info) +{ + int ret = 0; + u8 accdet = 0x01; + u8 cntl1_val; + + if (info->acc_type == MUIC_ACC_TYPE_OTG) { + accdet = 0x00; + /* com to usb */ + cntl1_val = (CTRL1_TO_USB << COMN1SW_SHIFT) | + (CTRL1_TO_USB << COMP2SW_SHIFT); + } + + /* Enable/Disable Factory Accessory Detection State Machine */ + ret = set_accdet(info, accdet); + if (ret) { + dev_err(info->dev, "%s: set_accdet err\n", __func__); + return ret; + } + + if (!accdet) { + ret = set_com_sw(info, cntl1_val); + if (ret) { + dev_err(info->dev, "%s: set_com_sw err\n", __func__); + return ret; + } + } + + return ret; +} + +static int com_to_uart(struct max8997_muic_info *info) +{ + int ret = 0; + u8 cntl1_val; + + /* Disable Factory Accessory Detection State Machine for manual open*/ + ret = set_accdet(info, 0x00); + if (ret) { + dev_err(info->dev, "%s: set_accdet err\n", __func__); + return ret; + } + + /* com to uart */ + cntl1_val = (CTRL1_TO_UART << COMN1SW_SHIFT) | + (CTRL1_TO_UART << COMP2SW_SHIFT); + ret = set_com_sw(info, cntl1_val); + if (ret) { + dev_err(info->dev, "%s: set_com_sw err\n", __func__); + return ret; + } + + return ret; +} + +static int com_to_audio(struct max8997_muic_info *info) +{ + int ret = 0; + u8 cntl1_val; + + /* Disable Factory Accessory Detection State Machine for manual open*/ + ret = set_accdet(info, 0x00); + if (ret) { + dev_err(info->dev, "%s: set_accdet err\n", __func__); + return ret; + } + + /* com to audio */ + cntl1_val = (CTRL1_TO_AUDIO << COMN1SW_SHIFT) | + (CTRL1_TO_AUDIO << COMP2SW_SHIFT); + ret = set_com_sw(info, cntl1_val); + if (ret) { + dev_err(info->dev, "%s: set_com_sw err\n", __func__); + return ret; + } + + return ret; +} + +static int switch_to_ap_usb(struct max8997_muic_info *info) +{ struct max8997_muic_data *mdata = info->muic_data; - int ret; - int gpio_val; - u8 accdet, cntl1_val, cntl1_msk = 0, cntl2_val; + int ret = 0; if (mdata->set_safeout) { - ret = mdata->set_safeout(path); + ret = mdata->set_safeout(AP_USB_MODE); if (ret) { - dev_err(info->dev, "%s: fail to set safout!\n", - __func__); + dev_err(info->dev, "%s: safout set err\n", __func__); return ret; } } - switch (path) { - case AP_USB_MODE: - dev_info(info->dev, "%s: AP_USB_MODE\n", __func__); - gpio_val = 0; - accdet = 1; - - if (info->cable_type == CABLE_TYPE_OTG) { - accdet = 0; - /* DN1, DP2 */ - cntl1_val = (1 << COMN1SW_SHIFT) | (1 << COMP2SW_SHIFT); - cntl1_msk = COMN1SW_MASK | COMP2SW_MASK; + dev_info(info->dev, "%s\n", __func__); + + ret = com_to_usb(info); + if (ret) { + dev_err(info->dev, "%s: com->usb set err\n", __func__); + return ret; + } + + return ret; +} + +static int switch_to_ap_uart(struct max8997_muic_info *info) +{ + int ret = 0; + + dev_info(info->dev, "%s\n", __func__); + + ret = set_uart_sel(info, UART_PATH_AP); + if (ret) { + dev_err(info->dev, "%s: uart sel set err\n", __func__); + return ret; + } + + ret = set_usb_sel(info, USB_SEL_IF); + if (ret) { + dev_err(info->dev, "%s: usb sel set err\n", __func__); + return ret; + } + + ret = com_to_uart(info); + if (ret) { + dev_err(info->dev, "%s: com->uart set err\n", __func__); + return ret; + } + + return ret; +} + +static int switch_to_cp_usb(struct max8997_muic_info *info) +{ + struct max8997_muic_data *mdata = info->muic_data; + int ret = 0; + + if (mdata->set_safeout) { + ret = mdata->set_safeout(CP_USB_MODE); + if (ret) { + dev_err(info->dev, "%s: safout set err\n", __func__); + return ret; } + } + + dev_info(info->dev, "%s\n", __func__); + + ret = set_usb_sel(info, USB_SEL_CP); + if (ret) { + dev_err(info->dev, "%s: usb sel set err\n", __func__); + return ret; + } + + ret = com_to_uart(info); + if (ret) { + dev_err(info->dev, "%s: com->uart set err\n", __func__); + return ret; + } + + return ret; +} + +static int switch_to_cp_uart(struct max8997_muic_info *info) +{ + int ret = 0; + + dev_info(info->dev, "%s\n", __func__); + + ret = set_uart_sel(info, UART_PATH_CP); + if (ret) { + dev_err(info->dev, "%s: uart sel set err\n", __func__); + return ret; + } + + ret = set_usb_sel(info, USB_SEL_IF); + if (ret) { + dev_err(info->dev, "%s: usb sel set err\n", __func__); + return ret; + } + + ret = com_to_uart(info); + if (ret) { + dev_err(info->dev, "%s: com->uart set err\n", __func__); + return ret; + } + + return ret; +} + +static int switch_to_audio(struct max8997_muic_info *info) +{ + int ret = 0; + + dev_info(info->dev, "%s\n", __func__); + + ret = set_mic(info, false); + if (ret) { + dev_err(info->dev, "%s: mic en set err\n", __func__); + return ret; + } + + ret = com_to_audio(info); + if (ret) { + dev_err(info->dev, "%s: com->audio set err\n", __func__); + return ret; + } + + return ret; +} + +static enum cable_type chg_type_convertor(enum muic_chg_type chg_type) +{ + enum cable_type charger_type; + switch (chg_type) { + case MUIC_CHG_TYPE_USB: + charger_type = CABLE_TYPE_USB; break; - case CP_USB_MODE: - dev_info(info->dev, "%s: CP_USB_MODE\n", __func__); - gpio_val = 1; - accdet = 0; - /* UT1, UR2 */ - cntl1_val = (3 << COMN1SW_SHIFT) | (3 << COMP2SW_SHIFT); - cntl1_msk = COMN1SW_MASK | COMP2SW_MASK; + case MUIC_CHG_TYPE_TA: + charger_type = CABLE_TYPE_TA; break; - case AUDIO_MODE: - dev_info(info->dev, "%s: AUDIO_MODE\n", __func__); - gpio_val = 0; - accdet = 0; - /* SL1, SR2 */ - cntl1_val = (2 << COMN1SW_SHIFT) | (2 << COMP2SW_SHIFT) | - (0 << MICEN_SHIFT); - cntl1_msk = COMN1SW_MASK | COMP2SW_MASK | MICEN_MASK; + case MUIC_CHG_TYPE_MHL_VB: + charger_type = CABLE_TYPE_MHL_VB; break; + case MUIC_CHG_TYPE_NONE: + case MUIC_CHG_TYPE_UNKNOWN: default: - dev_warn(info->dev, "%s: invalid path(%d)\n", __func__, path); - return -EINVAL; + charger_type = CABLE_TYPE_NONE; + break; } -#if !defined(CONFIG_TARGET_LOCALE_NA) && !defined(CONFIG_MACH_U1CAMERA_BD) - if (gpio_is_valid(info->muic_data->gpio_usb_sel)) - gpio_direction_output(mdata->gpio_usb_sel, gpio_val); -#endif /* !CONFIG_TARGET_LOCALE_NA && !CONFIG_MACH_U1CAMERA_BD */ - /* Enable/Disable Factory Accessory Detection State Machine */ - cntl2_val = accdet << CTRL2_ACCDET_SHIFT; - max8997_update_reg(client, MAX8997_MUIC_REG_CTRL2, cntl2_val, - CTRL2_ACCDET_MASK); + return charger_type; +} - if (!accdet) { - dev_info(info->dev, "%s: Set manual path\n", __func__); - max8997_update_reg(client, MAX8997_MUIC_REG_CTRL1, cntl1_val, - cntl1_msk); +static int attach_charger(struct max8997_muic_info *info, + enum muic_chg_type chg_type) +{ + struct max8997_muic_data *mdata = info->muic_data; + int ret = 0; - cntl1_val = 0; - max8997_read_reg(client, MAX8997_MUIC_REG_CTRL1, &cntl1_val); - dev_info(info->dev, "%s: CNTL1(0x%02x)\n", __func__, cntl1_val); + dev_info(info->dev, "%s: chg_type(0x%x)\n", __func__, chg_type); + + if (!mdata->charger_cb) { + dev_err(info->dev, "%s: charger_cb is NULL\n", __func__); + return -ENXIO; } - return 0; + if (info->chg_type == chg_type) { + dev_info(info->dev, "%s: already, ignore.\n", __func__); + return ret; + } + + ret = mdata->charger_cb(chg_type_convertor(chg_type)); + if (ret) { + info->chg_type = MUIC_CHG_TYPE_NONE; + dev_err(info->dev, "%s: charger_cb(%d) err\n", __func__, ret); + return ret; + } + + info->chg_type = chg_type; + + return ret; } -static int max8997_muic_set_charging_type(struct max8997_muic_info *info, - bool force_disable) +static int attach_usb_util(struct max8997_muic_info *info) +{ + int ret = 0; + + ret = attach_charger(info, MUIC_CHG_TYPE_USB); + if (ret) + return ret; + + if (info->muic_data->usb_path == CP_USB_MODE) { + ret = switch_to_cp_usb(info); + return ret; + } + + ret = switch_to_ap_usb(info); + return ret; +} + +static int detach_charger(struct max8997_muic_info *info) { struct max8997_muic_data *mdata = info->muic_data; int ret = 0; - if (mdata->charger_cb) { - if (force_disable) - ret = mdata->charger_cb(CABLE_TYPE_NONE); - else - ret = mdata->charger_cb(info->cable_type); + dev_info(info->dev, "%s\n", __func__); + + if (!mdata->charger_cb) { + dev_err(info->dev, "%s: charger_cb is NULL\n", __func__); + return -ENXIO; } + ret = mdata->charger_cb(chg_type_convertor(MUIC_CHG_TYPE_NONE)); if (ret) { - dev_err(info->dev, "%s: error from charger_cb(%d)\n", __func__, - ret); + dev_err(info->dev, "%s: charger_cb(%d) err\n", __func__, ret); return ret; } - return 0; + info->chg_type = MUIC_CHG_TYPE_NONE; + + return ret; +} + +static int attach_jig_usb_boot_off(struct max8997_muic_info *info, u8 vbvolt) +{ + int ret = 0; + + if (!(vbvolt & STATUS2_VBVOLT_MASK)) + return ret; + + if (info->acc_type == MUIC_ACC_TYPE_JIG_USB_OFF) { + dev_info(info->dev, "%s: duplicated(JIG USB OFF)\n", __func__); + return ret; + } + + dev_info(info->dev, "%s\n", __func__); + info->acc_type = MUIC_ACC_TYPE_JIG_USB_OFF; + + ret = attach_usb_util(info); + return ret; +} + +static int attach_jig_usb_boot_on(struct max8997_muic_info *info, u8 vbvolt) +{ + int ret = 0; + + if (!(vbvolt & STATUS2_VBVOLT_MASK)) + return ret; + + if (info->acc_type == MUIC_ACC_TYPE_JIG_USB_ON) { + dev_info(info->dev, "%s: duplicated(JIG USB ON)\n", __func__); + return ret; + } + + dev_info(info->dev, "%s\n", __func__); + info->acc_type = MUIC_ACC_TYPE_JIG_USB_ON; + + ret = attach_usb_util(info); + return ret; +} + +static int attach_usb(struct max8997_muic_info *info) +{ + struct max8997_muic_data *mdata = info->muic_data; + int ret = 0; + + if (info->acc_type == MUIC_ACC_TYPE_USB) { + dev_info(info->dev, "%s: duplicated(USB)\n", __func__); + return ret; + } + + dev_info(info->dev, "%s\n", __func__); + info->acc_type = MUIC_ACC_TYPE_USB; + + ret = attach_usb_util(info); + if (ret) + return ret; + + if (mdata->usb_cb && info->is_usb_ready) + mdata->usb_cb(USB_CABLE_ATTACHED); + + return ret; +} + +static int detach_usb(struct max8997_muic_info *info) +{ + struct max8997_muic_data *mdata = info->muic_data; + int ret = 0; + + dev_info(info->dev, "%s: acc_type(0x%x)\n", __func__, info->acc_type); + + if (info->acc_type != MUIC_ACC_TYPE_MHL) { + ret = detach_charger(info); + if (ret) + return ret; + + ret = com_to_open(info); + if (ret) + return ret; + + info->acc_type = MUIC_ACC_TYPE_NONE; + } + + if (mdata->usb_path == CP_USB_MODE) + return ret; + + if (mdata->usb_cb && info->is_usb_ready) + mdata->usb_cb(USB_CABLE_DETACHED); + + return ret; +} + +static int attach_mhl(struct max8997_muic_info *info, u8 chgtyp) +{ + struct max8997_muic_data *mdata = info->muic_data; + int ret = 0; + + if (mdata->is_mhl_attached && mdata->is_mhl_attached()) { + dev_info(info->dev, "%s: mhl_sel HIGH, do nothing\n", __func__); + return ret; + } + + dev_info(info->dev, "%s\n", __func__); + + info->acc_type = MUIC_ACC_TYPE_MHL; + + if (info->chg_type == MUIC_CHG_TYPE_USB) { + dev_info(info->dev, "%s: chg_type USB, detach usb\n", __func__); + ret = detach_usb(info); + } + +#ifdef CONFIG_EXTCON + if (info->edev && info->is_mhl_ready) + extcon_set_cable_state(info->edev, "MHL", true); +#else + if (mdata->mhl_cb && info->is_mhl_ready) + mdata->mhl_cb(MAX8997_MUIC_ATTACHED); +#endif /* CONFIG_EXTCON */ + + if (chgtyp == CHGTYP_USB) { + dev_info(info->dev, "%s: chgtyp USB, attach TA\n", __func__); + ret = attach_charger(info, MUIC_CHG_TYPE_MHL_VB); + } + + return ret; +} + +static int detach_mhl(struct max8997_muic_info *info) +{ + struct max8997_muic_data *mdata = info->muic_data; + int ret = 0; + + dev_info(info->dev, "%s%s\n", __func__, + info->chg_type == MUIC_CHG_TYPE_MHL_VB ? " VBUS" : ""); + + if (info->chg_type != MUIC_CHG_TYPE_MHL_VB) { + if (mdata->is_mhl_attached && mdata->is_mhl_attached()) + dev_info(info->dev, "%s: MHL attached, Do Nothing\n", + __func__); + else + info->acc_type = MUIC_ACC_TYPE_NONE; + + return ret; + } + + ret = detach_charger(info); + if (ret) + dev_err(info->dev, "%s: detach_charger err\n", __func__); + + if (mdata->is_mhl_attached && mdata->is_mhl_attached() && + mdata->mhl_cb && info->is_mhl_ready) + mdata->mhl_cb(MAX8997_MUIC_DETACHED); + + info->acc_type = MUIC_ACC_TYPE_NONE; + + return ret; +} + +static int attach_otg(struct max8997_muic_info *info, u8 chgtyp) +{ + struct max8997_muic_data *mdata = info->muic_data; + int ret = 0; + + switch (chgtyp) { + case CHGTYP_NO_VOLTAGE: + if (info->acc_type == MUIC_ACC_TYPE_OTG) { + dev_info(info->dev, "%s: duplicated(OTG)\n", __func__); + return ret; + } + + info->acc_type = MUIC_ACC_TYPE_OTG; + ret = switch_to_ap_usb(info); + if (mdata->usb_cb && info->is_usb_ready) + mdata->usb_cb(USB_OTGHOST_ATTACHED); + break; + case CHGTYP_USB: + case CHGTYP_DOWNSTREAM_PORT: + case CHGTYP_DEDICATED_CHGR: + case CHGTYP_500MA: + case CHGTYP_1A: + dev_info(info->dev, "%s: OTG charging pump\n", __func__); + ret = attach_charger(info, MUIC_CHG_TYPE_NONE); + break; + default: + break; + } + + return ret; +} + +static int detach_otg(struct max8997_muic_info *info) +{ + struct max8997_muic_data *mdata = info->muic_data; + int ret = 0; + + dev_info(info->dev, "%s\n", __func__); + info->acc_type = MUIC_ACC_TYPE_NONE; + + if (mdata->usb_cb && info->is_usb_ready) + mdata->usb_cb(USB_OTGHOST_DETACHED); + + return ret; } -static int max8997_muic_handle_dock_vol_key(struct max8997_muic_info *info, +/* TODO : should be removed */ +#define NOTIFY_TEST_MODE 3 + +static int attach_jig_uart_boot_off(struct max8997_muic_info *info, u8 vbvolt) +{ + struct max8997_muic_data *mdata = info->muic_data; + bool is_otgtest = false; + int ret = 0; + + dev_info(info->dev, "%s: JIG UART/BOOTOFF(0x%x)\n", __func__, vbvolt); + +#if defined(CONFIG_SEC_MODEM_M0_TD) + gpio_set_value(GPIO_AP_CP_INT1, 1); +#endif + + if (mdata->uart_path == UART_PATH_AP) + ret = switch_to_ap_uart(info); + else + ret = switch_to_cp_uart(info); + + info->acc_type = MUIC_ACC_TYPE_JIG_UART_OFF; + + if (vbvolt & STATUS2_VBVOLT_MASK) { + if (mdata->host_notify_cb) { + if (mdata->host_notify_cb(1) == NOTIFY_TEST_MODE) { + is_otgtest = true; + dev_info(info->dev, "%s: OTG TEST\n", __func__); + } + } + + if (is_otgtest) + ret = detach_charger(info); + else + ret = attach_charger(info, MUIC_CHG_TYPE_TA); + } else { + if (info->chg_type == MUIC_CHG_TYPE_TA) { + ret = detach_charger(info); + + if (mdata->host_notify_cb) + mdata->host_notify_cb(0); + } + } + + return ret; +} + +static int detach_jig_uart_boot_off(struct max8997_muic_info *info) +{ + int ret = 0; + + dev_info(info->dev, "%s\n", __func__); + info->acc_type = MUIC_ACC_TYPE_NONE; + + if (info->chg_type == MUIC_CHG_TYPE_TA) + ret = detach_charger(info); + + return ret; +} + +static int detach_jig_uart_boot_on(struct max8997_muic_info *info) +{ + int ret = 0; + + dev_info(info->dev, "%s\n", __func__); + info->acc_type = MUIC_ACC_TYPE_NONE; + + if (info->chg_type == MUIC_CHG_TYPE_TA) + ret = detach_charger(info); + + return ret; +} + +static int attach_desk_dock(struct max8997_muic_info *info, u8 status2) +{ + struct max8997_muic_data *mdata = info->muic_data; + u8 chgtyp, chgdetrun; + int ret = 0; + + chgtyp = status2 & STATUS2_CHGTYP_MASK; + chgdetrun = status2 & STATUS2_CHGDETRUN_MASK; + + if (info->acc_type == MUIC_ACC_TYPE_DESKDOCK) + dev_info(info->dev, "%s: duplicated(DeskDock)\n", __func__); + else { + dev_info(info->dev, "%s\n", __func__); + info->acc_type = MUIC_ACC_TYPE_DESKDOCK; + + ret = switch_to_audio(info); + + if (mdata->deskdock_cb) + mdata->deskdock_cb(MAX8997_MUIC_ATTACHED); + } + + switch (chgtyp) { + case CHGTYP_USB: + case CHGTYP_DOWNSTREAM_PORT: + case CHGTYP_DEDICATED_CHGR: + case CHGTYP_500MA: + case CHGTYP_1A: + ret = attach_charger(info, MUIC_CHG_TYPE_TA); + break; + case CHGTYP_NO_VOLTAGE: + if ((info->chg_type == MUIC_CHG_TYPE_TA) && (!chgdetrun)) + ret = detach_charger(info); + break; + default: + break; + } + + return ret; +} + +static int detach_desk_dock(struct max8997_muic_info *info) +{ + struct max8997_muic_data *mdata = info->muic_data; + int ret = 0; + + dev_info(info->dev, "%s\n", __func__); + + if (info->chg_type == MUIC_CHG_TYPE_TA) { + ret = detach_charger(info); + if (ret) + return ret; + } + + if (mdata->deskdock_cb) + mdata->deskdock_cb(MAX8997_MUIC_DETACHED); + + info->acc_type = MUIC_ACC_TYPE_NONE; + + return ret; +} + +static int attach_car_dock(struct max8997_muic_info *info, u8 status2) +{ + struct max8997_muic_data *mdata = info->muic_data; + u8 chgtyp, chgdetrun; + int ret = 0; + + chgtyp = status2 & STATUS2_CHGTYP_MASK; + chgdetrun = status2 & STATUS2_CHGDETRUN_MASK; + + if (info->acc_type == MUIC_ACC_TYPE_CARDOCK) + dev_info(info->dev, "%s: duplicated(CarDock)\n", __func__); + else { + dev_info(info->dev, "%s\n", __func__); + info->acc_type = MUIC_ACC_TYPE_CARDOCK; + + ret = switch_to_audio(info); + + if (mdata->cardock_cb) + mdata->cardock_cb(MAX8997_MUIC_ATTACHED); + } + + switch (chgtyp) { + case CHGTYP_USB: + case CHGTYP_DOWNSTREAM_PORT: + case CHGTYP_DEDICATED_CHGR: + case CHGTYP_500MA: + case CHGTYP_1A: + ret = attach_charger(info, MUIC_CHG_TYPE_TA); + break; + case CHGTYP_NO_VOLTAGE: + if ((info->chg_type == MUIC_CHG_TYPE_TA) && (!chgdetrun)) + ret = detach_charger(info); + break; + default: + break; + } + + return ret; +} + +static int detach_car_dock(struct max8997_muic_info *info) +{ + struct max8997_muic_data *mdata = info->muic_data; + int ret = 0; + + dev_info(info->dev, "%s\n", __func__); + + if (info->chg_type == MUIC_CHG_TYPE_TA) { + ret = detach_charger(info); + if (ret) + return ret; + } + + if (mdata->cardock_cb) + mdata->cardock_cb(MAX8997_MUIC_DETACHED); + + info->acc_type = MUIC_ACC_TYPE_NONE; + + return ret; +} + +static int handle_dock_vol_key(struct max8997_muic_info *info, u8 status1) { struct input_dev *input = info->input; @@ -659,7 +1410,7 @@ static int max8997_muic_handle_dock_vol_key(struct max8997_muic_info *info, adc = status1 & STATUS1_ADC_MASK; - if (info->cable_type != CABLE_TYPE_DESKDOCK) + if (info->acc_type != MUIC_ACC_TYPE_DESKDOCK) return 0; if (adc == ADC_OPEN) { @@ -774,203 +1525,7 @@ static int max8997_muic_handle_dock_vol_key(struct max8997_muic_info *info, return 1; } -static int max8997_muic_attach_usb_type(struct max8997_muic_info *info, int adc) -{ - struct max8997_muic_data *mdata = info->muic_data; - int ret, path; - - if (info->cable_type == CABLE_TYPE_MHL || - info->cable_type == CABLE_TYPE_MHL_VB) { - dev_warn(info->dev, "%s: mHL was attached!\n", __func__); - return 0; - } - - switch (adc) { - case ADC_JIG_USB_OFF: - if (info->cable_type == CABLE_TYPE_JIG_USB_OFF) { - dev_info(info->dev, "%s: duplicated(JIG USB OFF)\n", - __func__); - return 0; - } - - dev_info(info->dev, "%s:JIG USB BOOTOFF\n", __func__); - info->cable_type = CABLE_TYPE_JIG_USB_OFF; - path = AP_USB_MODE; - break; - case ADC_JIG_USB_ON: - if (info->cable_type == CABLE_TYPE_JIG_USB_ON) { - dev_info(info->dev, "%s: duplicated(JIG USB ON)\n", - __func__); - return 0; - } - - dev_info(info->dev, "%s:JIG USB BOOTON\n", __func__); - info->cable_type = CABLE_TYPE_JIG_USB_ON; - path = AP_USB_MODE; - break; - case ADC_OPEN: - if (info->cable_type == CABLE_TYPE_USB) { - dev_info(info->dev, "%s: duplicated(USB)\n", __func__); - return 0; - } - - dev_info(info->dev, "%s:USB\n", __func__); - info->cable_type = CABLE_TYPE_USB; - path = AP_USB_MODE; - break; - default: - dev_info(info->dev, "%s: Unkown cable(0x%x)\n", __func__, adc); - return 0; - } - - ret = max8997_muic_set_charging_type(info, false); - if (ret) { - info->cable_type = CABLE_TYPE_NONE; - return ret; - } - - if (mdata->sw_path == CP_USB_MODE) { - info->cable_type = CABLE_TYPE_USB; - max8997_muic_set_usb_path(info, CP_USB_MODE); - return 0; - } - - max8997_muic_set_usb_path(info, path); - - if ((path == AP_USB_MODE) && (adc == ADC_OPEN)) { - if (mdata->usb_cb && info->is_usb_ready) - mdata->usb_cb(USB_CABLE_ATTACHED); - } - - return 0; -} - -static int max8997_muic_attach_dock_type(struct max8997_muic_info *info, - int adc) -{ - struct max8997_muic_data *mdata = info->muic_data; - int path; - - switch (adc) { - case ADC_DESKDOCK: - /* Desk Dock */ - if (info->cable_type == CABLE_TYPE_DESKDOCK) { - dev_info(info->dev, "%s: duplicated(DeskDock)\n", - __func__); - return 0; - } - dev_info(info->dev, "%s:DeskDock\n", __func__); - info->cable_type = CABLE_TYPE_DESKDOCK; - path = AUDIO_MODE; - - if (mdata->deskdock_cb) - mdata->deskdock_cb(MAX8997_MUIC_ATTACHED); - break; - case ADC_CARDOCK: - /* Car Dock */ - if (info->cable_type == CABLE_TYPE_CARDOCK) { - dev_info(info->dev, "%s: duplicated(CarDock)\n", - __func__); - return 0; - } - dev_info(info->dev, "%s:CarDock\n", __func__); - info->cable_type = CABLE_TYPE_CARDOCK; - path = AUDIO_MODE; - - if (mdata->cardock_cb) - mdata->cardock_cb(MAX8997_MUIC_ATTACHED); - break; - default: - dev_info(info->dev, "%s: should not reach here(0x%x)\n", - __func__, adc); - return 0; - } - - max8997_muic_set_usb_path(info, path); - - return 0; -} - -static void max8997_muic_attach_mhl(struct max8997_muic_info *info, u8 chgtyp) -{ - struct max8997_muic_data *mdata = info->muic_data; - - dev_info(info->dev, "%s\n", __func__); - - if (info->cable_type == CABLE_TYPE_USB) { - if (mdata->usb_cb && info->is_usb_ready) - mdata->usb_cb(USB_CABLE_DETACHED); - - max8997_muic_set_charging_type(info, true); - } -#if 0 - if (info->cable_type == CABLE_TYPE_MHL) { - dev_info(info->dev, "%s: duplicated(MHL)\n", __func__); - return; - } -#endif - info->cable_type = CABLE_TYPE_MHL; - - if (mdata->mhl_cb && info->is_mhl_ready) - mdata->mhl_cb(MAX8997_MUIC_ATTACHED); - - if (chgtyp == CHGTYP_USB) { - info->cable_type = CABLE_TYPE_MHL_VB; - max8997_muic_set_charging_type(info, false); - } -} - -/* TODO : should be removed */ -#define NOTIFY_TEST_MODE 3 - -static void max8997_muic_handle_jig_uart(struct max8997_muic_info *info, - u8 vbvolt) -{ - struct max8997_muic_data *mdata = info->muic_data; - enum cable_type prev_ct = info->cable_type; - bool is_otgtest = false; - u8 cntl1_val, cntl1_msk; - - dev_info(info->dev, "%s: JIG UART/BOOTOFF(0x%x)\n", __func__, vbvolt); - -#if defined(CONFIG_SEC_MODEM_M0_TD) - gpio_set_value(GPIO_AP_CP_INT1, 1); -#endif - - /* UT1, UR2 */ - cntl1_val = (3 << COMN1SW_SHIFT) | (3 << COMP2SW_SHIFT); - cntl1_msk = COMN1SW_MASK | COMP2SW_MASK; - max8997_update_reg(info->muic, MAX8997_MUIC_REG_CTRL1, cntl1_val, - cntl1_msk); - - if (vbvolt & STATUS2_VBVOLT_MASK) { - if (mdata->host_notify_cb) { - if (mdata->host_notify_cb(1) == NOTIFY_TEST_MODE) { - is_otgtest = true; - dev_info(info->dev, "%s: OTG TEST\n", __func__); - } - } - - info->cable_type = CABLE_TYPE_JIG_UART_OFF_VB; - max8997_muic_set_charging_type(info, is_otgtest); - - } else { - info->cable_type = CABLE_TYPE_JIG_UART_OFF; -#if 0 - if (mdata->uart_path == UART_PATH_CP && - mdata->jig_uart_cb) - mdata->jig_uart_cb(UART_PATH_CP); -#endif - if (prev_ct == CABLE_TYPE_JIG_UART_OFF_VB) { - max8997_muic_set_charging_type(info, false); - - if (mdata->host_notify_cb) - mdata->host_notify_cb(0); - } - } -} - -static int max8997_muic_handle_attach(struct max8997_muic_info *info, +static int handle_attach(struct max8997_muic_info *info, u8 status1, u8 status2) { struct max8997_muic_data *mdata = info->muic_data; @@ -988,9 +1543,8 @@ static int max8997_muic_handle_attach(struct max8997_muic_info *info, vbvolt = status2 & STATUS2_VBVOLT_MASK; chgdetrun = status2 & STATUS2_CHGDETRUN_MASK; - switch (info->cable_type) { - case CABLE_TYPE_JIG_UART_OFF: - case CABLE_TYPE_JIG_UART_OFF_VB: + switch (info->acc_type) { + case MUIC_ACC_TYPE_JIG_UART_OFF: /* Workaround for Factory mode. * Abandon adc interrupt of approximately +-100K range * if previous cable status was JIG UART BOOT OFF. @@ -998,62 +1552,51 @@ static int max8997_muic_handle_attach(struct max8997_muic_info *info, if (adc == (ADC_JIG_UART_OFF + 1) || adc == (ADC_JIG_UART_OFF - 1)) { dev_warn(info->dev, "%s: abandon ADC\n", __func__); - return 0; + return ret; } if (adcerr) { - dev_warn(info->dev, "%s: current state is jig_uart_off," - "just ignore\n", __func__); - return 0; + dev_warn(info->dev, "%s: current jig_uart_off, ignore\n", + __func__); + return ret; } if (adc != ADC_JIG_UART_OFF) { - if (info->cable_type == CABLE_TYPE_JIG_UART_OFF_VB) { - dev_info(info->dev, "%s: adc != JIG_UART_OFF, remove JIG UART/OFF/VB\n", __func__); - info->cable_type = CABLE_TYPE_NONE; - max8997_muic_set_charging_type(info, false); - } else { - dev_info(info->dev, "%s: adc != JIG_UART_OFF, remove JIG UART/BOOTOFF\n", __func__); - info->cable_type = CABLE_TYPE_NONE; - } + dev_info(info->dev, "%s: adc != JIG_UART_OFF," + " remove JIG UART/BOOTOFF\n", __func__); + ret = detach_jig_uart_boot_off(info); } break; - case CABLE_TYPE_DESKDOCK: + case MUIC_ACC_TYPE_DESKDOCK: if (adcerr || (adc != ADC_DESKDOCK)) { if (adcerr) - dev_err(info->dev, "%s: ADC err occured(DESKDOCK)\n", __func__); + dev_err(info->dev, "%s: ADC err occured(DESKDOCK)\n", + __func__); else - dev_warn(info->dev, "%s: ADC != DESKDOCK, remove DESKDOCK\n", __func__); - - info->cable_type = CABLE_TYPE_NONE; - - max8997_muic_set_charging_type(info, false); + dev_warn(info->dev, "%s: ADC != DESKDOCK, remove DESKDOCK\n", + __func__); - if (mdata->deskdock_cb) - mdata->deskdock_cb(MAX8997_MUIC_DETACHED); + ret = detach_desk_dock(info); if (adcerr) - return 0; + return ret; } break; - case CABLE_TYPE_CARDOCK: + case MUIC_ACC_TYPE_CARDOCK: if (adcerr || (adc != ADC_CARDOCK)) { if (adcerr) - dev_err(info->dev, "%s: ADC err occured(CARDOCK)\n", __func__); + dev_err(info->dev, "%s: ADC err occured(CARDOCK)\n", + __func__); else - dev_warn(info->dev, "%s: ADC != CARDOCK, remove CARDOCK\n", __func__); - - info->cable_type = CABLE_TYPE_NONE; - - max8997_muic_set_charging_type(info, false); + dev_warn(info->dev, "%s: ADC != CARDOCK, remove CARDOCK\n", + __func__); - if (mdata->cardock_cb) - mdata->cardock_cb(MAX8997_MUIC_DETACHED); + ret = detach_car_dock(info); if (adcerr) - return 0; + return ret; } break; @@ -1066,119 +1609,102 @@ static int max8997_muic_handle_attach(struct max8997_muic_info *info, * New MUIC : ADC value is not set(Open), ADCLow:1, ADCError:1 */ if (adclow && adcerr) { - max8997_muic_attach_mhl(info, chgtyp); - return 0; + ret = attach_mhl(info, chgtyp); + return ret; } switch (adc) { case ADC_GND: -#if defined(CONFIG_MACH_U1) +#if defined(CONFIG_MACH_U1) || defined(CONFIG_MACH_TRATS) /* This is for support old MUIC */ if (adclow) { - max8997_muic_attach_mhl(info, chgtyp); + ret = attach_mhl(info, chgtyp); break; } -#endif - - if (chgtyp == CHGTYP_NO_VOLTAGE) { - if (info->cable_type == CABLE_TYPE_OTG) { - dev_info(info->dev, - "%s: duplicated(OTG)\n", - __func__); - break; - } - - info->cable_type = CABLE_TYPE_OTG; - max8997_muic_set_usb_path(info, AP_USB_MODE); - if (mdata->usb_cb && info->is_usb_ready) - mdata->usb_cb(USB_OTGHOST_ATTACHED); - } else if (chgtyp == CHGTYP_USB || - chgtyp == CHGTYP_DOWNSTREAM_PORT || - chgtyp == CHGTYP_DEDICATED_CHGR || - chgtyp == CHGTYP_500MA || - chgtyp == CHGTYP_1A) { - dev_info(info->dev, "%s: OTG charging pump\n", - __func__); - ret = max8997_muic_set_charging_type(info, false); - } +#endif /* CONFIG_MACH_U1 || CONFIG_MACH_TRATS */ + ret = attach_otg(info, chgtyp); break; case ADC_MHL: -#if defined(CONFIG_MACH_U1) +#if defined(CONFIG_MACH_U1) || defined(CONFIG_MACH_TRATS) /* This is for support old MUIC */ - max8997_muic_attach_mhl(info, chgtyp); -#endif + ret = attach_mhl(info, chgtyp); +#endif /* CONFIG_MACH_U1 || CONFIG_MACH_TRATS */ break; case ADC_JIG_UART_OFF: - max8997_muic_handle_jig_uart(info, vbvolt); + ret = attach_jig_uart_boot_off(info, vbvolt); break; case ADC_JIG_USB_OFF: + ret = attach_jig_usb_boot_off(info, vbvolt); + break; case ADC_JIG_USB_ON: - if (vbvolt & STATUS2_VBVOLT_MASK) - ret = max8997_muic_attach_usb_type(info, adc); + ret = attach_jig_usb_boot_on(info, vbvolt); break; case ADC_DESKDOCK: + ret = attach_desk_dock(info, status2); + break; case ADC_CARDOCK: - max8997_muic_attach_dock_type(info, adc); - if (chgtyp == CHGTYP_USB || - chgtyp == CHGTYP_DOWNSTREAM_PORT || - chgtyp == CHGTYP_DEDICATED_CHGR || - chgtyp == CHGTYP_500MA || - chgtyp == CHGTYP_1A) - ret = max8997_muic_set_charging_type(info, false); - else if (chgtyp == CHGTYP_NO_VOLTAGE && !chgdetrun) - ret = max8997_muic_set_charging_type(info, true); + ret = attach_car_dock(info, status2); break; case ADC_CEA936ATYPE1_CHG: case ADC_CEA936ATYPE2_CHG: case ADC_OPEN: switch (chgtyp) { case CHGTYP_USB: - if (adc == ADC_CEA936ATYPE1_CHG - || adc == ADC_CEA936ATYPE2_CHG) + if (adc == ADC_CEA936ATYPE1_CHG || + adc == ADC_CEA936ATYPE2_CHG) break; - if (mdata->is_mhl_attached - && mdata->is_mhl_attached() && - info->cable_type == CABLE_TYPE_MHL) { + + if (mdata->is_mhl_attached && + mdata->is_mhl_attached() && + info->acc_type == MUIC_ACC_TYPE_MHL) { + if (info->chg_type == MUIC_CHG_TYPE_MHL_VB) { + dev_info(info->dev, + "%s: MHL charging already, do nothing\n", + __func__); + return ret; + } + dev_info(info->dev, "%s: MHL(charging)\n", __func__); - info->cable_type = CABLE_TYPE_MHL_VB; - ret = max8997_muic_set_charging_type(info, - false); + ret = attach_charger(info, + MUIC_CHG_TYPE_MHL_VB); return ret; } - ret = max8997_muic_attach_usb_type(info, adc); + ret = attach_usb(info); break; case CHGTYP_DOWNSTREAM_PORT: case CHGTYP_DEDICATED_CHGR: case CHGTYP_500MA: case CHGTYP_1A: + if (info->acc_type == MUIC_ACC_TYPE_TA && + info->chg_type == MUIC_CHG_TYPE_TA) { + dev_info(info->dev, "%s: duplicated(TA)\n", + __func__); + return ret; + } dev_info(info->dev, "%s:TA\n", __func__); - info->cable_type = CABLE_TYPE_TA; #ifdef CONFIG_USBHUB_USB3803 /* setting usb hub in default mode (standby) */ usb3803_set_mode(USB_3803_MODE_STANDBY); -#endif /* CONFIG_USBHUB_USB3803 */ - ret = max8997_muic_set_charging_type(info, false); - if (ret) - info->cable_type = CABLE_TYPE_NONE; +#endif /* CONFIG_USBHUB_USB3803 */ + ret = attach_charger(info, MUIC_CHG_TYPE_TA); + if (ret == 0) + info->acc_type = MUIC_ACC_TYPE_TA; break; default: break; } break; default: - dev_warn(info->dev, "%s: unsupported adc=0x%x\n", __func__, - adc); + dev_warn(info->dev, "%s: unsupported adc=0x%x\n", + __func__, adc); break; } return ret; } -static int max8997_muic_handle_detach(struct max8997_muic_info *info) +static int handle_detach(struct max8997_muic_info *info) { - struct i2c_client *client = info->muic; - struct max8997_muic_data *mdata = info->muic_data; - enum cable_type prev_ct = CABLE_TYPE_NONE; int ret = 0; #if defined(CONFIG_SEC_MODEM_M0_TD) @@ -1193,13 +1719,13 @@ static int max8997_muic_handle_detach(struct max8997_muic_info *info) * D+/D- is short) if charger(TA) insertion is followed right after the * JIG off. Reset CONTROL1 is needed when detaching cable. */ - max8997_write_reg(client, MAX8997_MUIC_REG_CTRL1, 0x00); - - if (info->cable_type == CABLE_TYPE_MHL) { + ret = max8997_write_reg(info->muic, MAX8997_MUIC_REG_CTRL1, 0x00); + if (ret) + dev_err(info->dev, "%s: reset CONTROL1 err\n", __func__); + if (info->acc_type == MUIC_ACC_TYPE_MHL) { /* Enable Factory Accessory Detection State Machine */ - max8997_update_reg(client, MAX8997_MUIC_REG_CTRL2, - (1 << CTRL2_ACCDET_SHIFT), CTRL2_ACCDET_MASK); + set_accdet(info, 0x01); } #ifdef CONFIG_USBHUB_USB3803 @@ -1208,163 +1734,100 @@ static int max8997_muic_handle_detach(struct max8997_muic_info *info) #endif /* CONFIG_USBHUB_USB3803 */ info->previous_key = DOCK_KEY_NONE; - if (info->cable_type == CABLE_TYPE_NONE) { - dev_info(info->dev, "%s: duplicated(NONE)\n", __func__); - return 0; - } -#if 0 - if (mdata->jig_uart_cb) - mdata->jig_uart_cb(UART_PATH_AP); -#endif - if (mdata->is_mhl_attached && mdata->is_mhl_attached() - && info->cable_type == CABLE_TYPE_MHL) { - dev_info(info->dev, "%s: MHL attached. Do Nothing\n", - __func__); - return 0; - } - - switch (info->cable_type) { - case CABLE_TYPE_OTG: - dev_info(info->dev, "%s: OTG\n", __func__); - info->cable_type = CABLE_TYPE_NONE; - - if (mdata->usb_cb && info->is_usb_ready) - mdata->usb_cb(USB_OTGHOST_DETACHED); + switch (info->acc_type) { + case MUIC_ACC_TYPE_OTG: + ret = detach_otg(info); break; - case CABLE_TYPE_USB: - case CABLE_TYPE_JIG_USB_OFF: - case CABLE_TYPE_JIG_USB_ON: - dev_info(info->dev, "%s: USB(0x%x)\n", __func__, - info->cable_type); - prev_ct = info->cable_type; - info->cable_type = CABLE_TYPE_NONE; - - ret = max8997_muic_set_charging_type(info, false); - if (ret) { - info->cable_type = prev_ct; - break; - } - - if (mdata->sw_path == CP_USB_MODE) - return 0; - - if (mdata->usb_cb && info->is_usb_ready) - mdata->usb_cb(USB_CABLE_DETACHED); + case MUIC_ACC_TYPE_USB: + case MUIC_ACC_TYPE_JIG_USB_OFF: + case MUIC_ACC_TYPE_JIG_USB_ON: + ret = detach_usb(info); break; - case CABLE_TYPE_DESKDOCK: - dev_info(info->dev, "%s: DESKDOCK\n", __func__); - info->cable_type = CABLE_TYPE_NONE; - - ret = max8997_muic_set_charging_type(info, false); - if (ret) { - info->cable_type = CABLE_TYPE_DESKDOCK; - break; - } - - if (mdata->deskdock_cb) - mdata->deskdock_cb(MAX8997_MUIC_DETACHED); + case MUIC_ACC_TYPE_DESKDOCK: + ret = detach_desk_dock(info); break; - case CABLE_TYPE_CARDOCK: - dev_info(info->dev, "%s: CARDOCK\n", __func__); - info->cable_type = CABLE_TYPE_NONE; - - ret = max8997_muic_set_charging_type(info, false); - if (ret) { - info->cable_type = CABLE_TYPE_CARDOCK; - break; - } - - if (mdata->cardock_cb) - mdata->cardock_cb(MAX8997_MUIC_DETACHED); + case MUIC_ACC_TYPE_CARDOCK: + ret = detach_car_dock(info); break; - case CABLE_TYPE_TA: - dev_info(info->dev, "%s: TA\n", __func__); - info->cable_type = CABLE_TYPE_NONE; - ret = max8997_muic_set_charging_type(info, false); - if (ret) - info->cable_type = CABLE_TYPE_TA; - break; - case CABLE_TYPE_JIG_UART_ON: - dev_info(info->dev, "%s: JIG UART/BOOTON\n", __func__); - info->cable_type = CABLE_TYPE_NONE; + case MUIC_ACC_TYPE_TA: + ret = detach_charger(info); + info->acc_type = MUIC_ACC_TYPE_NONE; break; - case CABLE_TYPE_JIG_UART_OFF: - dev_info(info->dev, "%s: JIG UART/BOOTOFF\n", __func__); - info->cable_type = CABLE_TYPE_NONE; + case MUIC_ACC_TYPE_JIG_UART_ON: + ret = detach_jig_uart_boot_on(info); break; - case CABLE_TYPE_JIG_UART_OFF_VB: - dev_info(info->dev, "%s: JIG UART/OFF/VB\n", __func__); - info->cable_type = CABLE_TYPE_NONE; - ret = max8997_muic_set_charging_type(info, false); - if (ret) - info->cable_type = CABLE_TYPE_JIG_UART_OFF_VB; + case MUIC_ACC_TYPE_JIG_UART_OFF: + ret = detach_jig_uart_boot_off(info); break; - case CABLE_TYPE_MHL: - dev_info(info->dev, "%s: MHL\n", __func__); - info->cable_type = CABLE_TYPE_NONE; + case MUIC_ACC_TYPE_MHL: + ret = detach_mhl(info); +#ifdef CONFIG_EXTCON + if (info->edev && info->is_mhl_ready) + extcon_set_cable_state(info->edev, "MHL", false); +#endif break; - case CABLE_TYPE_MHL_VB: - dev_info(info->dev, "%s: MHL VBUS\n", __func__); - info->cable_type = CABLE_TYPE_NONE; - max8997_muic_set_charging_type(info, false); - - if (mdata->is_mhl_attached && mdata->is_mhl_attached()) { - if (mdata->mhl_cb && info->is_mhl_ready) - mdata->mhl_cb(MAX8997_MUIC_DETACHED); - } + case MUIC_ACC_TYPE_NONE: + dev_info(info->dev, "%s: duplicated(NONE)\n", __func__); break; - case CABLE_TYPE_UNKNOWN: + case MUIC_ACC_TYPE_UNKNOWN: dev_info(info->dev, "%s: UNKNOWN\n", __func__); - info->cable_type = CABLE_TYPE_NONE; - - ret = max8997_muic_set_charging_type(info, false); - if (ret) - info->cable_type = CABLE_TYPE_UNKNOWN; + ret = detach_charger(info); + info->acc_type = MUIC_ACC_TYPE_NONE; break; default: dev_info(info->dev, "%s:invalid cable type %d\n", - __func__, info->cable_type); + __func__, info->acc_type); break; } + return ret; } -static void max8997_muic_detect_dev(struct max8997_muic_info *info, int irq) +static int detect_dev(struct max8997_muic_info *info, int irq) { struct i2c_client *client = info->muic; u8 status[2]; - u8 adc, chgtyp, adcerr; + u8 adc, chgtyp, adcerr, chgdetrun; int intr = INT_ATTACH; - int ret; + int ret = 0; ret = max8997_bulk_read(client, MAX8997_MUIC_REG_STATUS1, 2, status); if (ret) { - dev_err(info->dev, "%s: fail to read muic reg(%d)\n", __func__, + dev_err(info->dev, "%s: read muic reg(%d) err\n", __func__, ret); - return; + return ret; } dev_info(info->dev, "%s: STATUS1:0x%x, 2:0x%x\n", __func__, status[0], status[1]); - if ((irq == info->irq_adc) && - max8997_muic_handle_dock_vol_key(info, status[0])) - return; + if (irq == info->irq_adc) { + ret = handle_dock_vol_key(info, status[0]); + if (ret) + return ret; + } adc = status[0] & STATUS1_ADC_MASK; adcerr = status[0] & STATUS1_ADCERR_MASK; chgtyp = status[1] & STATUS2_CHGTYP_MASK; + chgdetrun = status[1] & STATUS2_CHGDETRUN_MASK; + + if (chgdetrun) { + dev_warn(info->dev, "%s: charger det run, ignore\n", __func__); + return ret; + } switch (adc) { case ADC_MHL: -#if defined(CONFIG_MACH_U1) +#if defined(CONFIG_MACH_U1) || defined(CONFIG_MACH_TRATS) break; -#endif +#endif /* CONFIG_MACH_U1 || CONFIG_MACH_TRATS */ case (ADC_MHL + 1): case (ADC_DOCK_VOL_DN - 1): case (ADC_DOCK_PLAY_PAUSE_KEY + 2) ... (ADC_CEA936ATYPE1_CHG - 1): case (ADC_CARDOCK + 1): - dev_warn(info->dev, "%s: unsupported ADC(0x%02x)\n", __func__, adc); + dev_warn(info->dev, "%s: unsupported ADC(0x%02x)\n", + __func__, adc); intr = INT_DETACH; break; case ADC_OPEN: @@ -1376,10 +1839,22 @@ static void max8997_muic_detect_dev(struct max8997_muic_info *info, int irq) chgtyp == CHGTYP_DEDICATED_CHGR || chgtyp == CHGTYP_500MA || chgtyp == CHGTYP_1A) { - if (info->cable_type == CABLE_TYPE_OTG || - info->cable_type == CABLE_TYPE_DESKDOCK || - info->cable_type == CABLE_TYPE_CARDOCK) + switch (info->acc_type) { + case MUIC_ACC_TYPE_OTG: + case MUIC_ACC_TYPE_STATION: + case MUIC_ACC_TYPE_JIG_USB_OFF: + case MUIC_ACC_TYPE_JIG_USB_ON: + case MUIC_ACC_TYPE_DESKDOCK: + case MUIC_ACC_TYPE_JIG_UART_OFF: + case MUIC_ACC_TYPE_JIG_UART_ON: + case MUIC_ACC_TYPE_CARDOCK: + dev_info(info->dev, "%s: chgtyp accur but detach\n", + __func__); intr = INT_DETACH; + break; + default: + break; + } } } break; @@ -1391,20 +1866,20 @@ static void max8997_muic_detect_dev(struct max8997_muic_info *info, int irq) if (intr == INT_ATTACH) { if (irq == info->irq_chgins) { if (info->is_ovp_state) { - max8997_muic_handle_attach(info, status[0], + ret = handle_attach(info, status[0], status[1]); info->is_ovp_state = false; dev_info(info->dev, "OVP recovered\n"); - return; + return ret; } else { dev_info(info->dev, "Just inserted TA/USB\n"); - return; + return ret; } } else if (irq == info->irq_chgrm) { - max8997_muic_handle_detach(info); + ret = handle_detach(info); info->is_ovp_state = true; dev_info(info->dev, "OVP occured\n"); - return; + return ret; } } else { @@ -1412,28 +1887,32 @@ static void max8997_muic_detect_dev(struct max8997_muic_info *info, int irq) if (irq == info->irq_chgrm) { dev_info(info->dev, "Just removed TA/USB\n"); - return; + return ret; } } -#endif +#endif /* CONFIG_MUIC_MAX8997_OVPUI */ if (intr == INT_ATTACH) { dev_info(info->dev, "%s: ATTACHED\n", __func__); - max8997_muic_handle_attach(info, status[0], status[1]); + ret = handle_attach(info, status[0], status[1]); } else { dev_info(info->dev, "%s: DETACHED\n", __func__); - max8997_muic_handle_detach(info); + ret = handle_detach(info); } - return; + return ret; } static irqreturn_t max8997_muic_irq(int irq, void *data) { struct max8997_muic_info *info = data; + int ret = 0; + dev_info(info->dev, "%s: irq:%d\n", __func__, irq); mutex_lock(&info->mutex); - max8997_muic_detect_dev(info, irq); + ret = detect_dev(info, irq); + if (ret) + dev_err(info->dev, "%s: error returned.\n", __func__); mutex_unlock(&info->mutex); return IRQ_HANDLED; @@ -1451,19 +1930,6 @@ do { \ static int max8997_muic_irq_init(struct max8997_muic_info *info) { int ret; -#if 0 -#if !defined(CONFIG_MACH_U1_REV00) - dev_info(info->dev, "%s: system_rev=%d\n", __func__, system_rev); -#if !defined(CONFIG_MACH_P6_REV02) && !defined(CONFIG_MACH_U1_C210) \ - && !defined(CONFIG_MACH_U1HD_C210) - if (system_rev < 0x3) { - dev_info(info->dev, - "Caution !!! This system_rev does not support ALL irq\n"); - return 0; - } -#endif -#endif -#endif REQUEST_IRQ(info->irq_adc, "muic-adc"); REQUEST_IRQ(info->irq_chgtype, "muic-chgtype"); @@ -1472,7 +1938,7 @@ static int max8997_muic_irq_init(struct max8997_muic_info *info) #if defined(CONFIG_MUIC_MAX8997_OVPUI) REQUEST_IRQ(info->irq_chgins, "chg-insert"); REQUEST_IRQ(info->irq_chgrm, "chg-remove"); -#endif +#endif /* CONFIG_MUIC_MAX8997_OVPUI */ return 0; } @@ -1496,7 +1962,7 @@ static void max8997_muic_init_detect(struct work_struct *work) return; mutex_lock(&info->mutex); - max8997_muic_detect_dev(info, -1); + detect_dev(info, -1); mutex_unlock(&info->mutex); } @@ -1513,15 +1979,19 @@ static void max8997_muic_usb_detect(struct work_struct *work) mutex_lock(&info->mutex); info->is_usb_ready = true; - if (info->muic_data->sw_path != CP_USB_MODE) { + if (info->muic_data->usb_path != CP_USB_MODE) { if (mdata->usb_cb) { - switch (info->cable_type) { - case CABLE_TYPE_USB: - case CABLE_TYPE_JIG_USB_OFF: - case CABLE_TYPE_JIG_USB_ON: + switch (info->acc_type) { + case MUIC_ACC_TYPE_USB: + case MUIC_ACC_TYPE_JIG_USB_OFF: + case MUIC_ACC_TYPE_JIG_USB_ON: + dev_info(info->dev, "%s: usb attach\n", + __func__); mdata->usb_cb(USB_CABLE_ATTACHED); break; - case CABLE_TYPE_OTG: + case MUIC_ACC_TYPE_OTG: + dev_info(info->dev, "%s: otg attach\n", + __func__); mdata->usb_cb(USB_OTGHOST_ATTACHED); break; default: @@ -1544,20 +2014,26 @@ static void max8997_muic_mhl_detect(struct work_struct *work) mutex_lock(&info->mutex); info->is_mhl_ready = true; -#ifndef CONFIG_MACH_U1 +#if !defined(CONFIG_MACH_U1) && !defined(CONFIG_MACH_TRATS) if (mdata->is_mhl_attached) { if (!mdata->is_mhl_attached()) goto out; } -#endif - if (info->cable_type == CABLE_TYPE_MHL || \ - info->cable_type == CABLE_TYPE_MHL_VB) { +#endif /* !CONFIG_MACH_U1 */ + if (info->acc_type == MUIC_ACC_TYPE_MHL) { + dev_info(info->dev, "%s: mhl attach\n", __func__); +#ifdef CONFIG_EXTCON + if (info->edev) + extcon_set_cable_state(info->edev, "MHL", true); +#else if (mdata->mhl_cb) mdata->mhl_cb(MAX8997_MUIC_ATTACHED); +#endif } out: mutex_unlock(&info->mutex); } + extern struct device *switch_dev; static int __devinit max8997_muic_probe(struct platform_device *pdev) @@ -1587,13 +2063,13 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev) #if defined(CONFIG_MUIC_MAX8997_OVPUI) info->irq_chgins = max8997->irq_base + MAX8997_IRQ_CHGINS; info->irq_chgrm = max8997->irq_base + MAX8997_IRQ_CHGRM; -#endif +#endif /* CONFIG_MUIC_MAX8997_OVPUI */ if (pdata->muic) { info->muic_data = pdata->muic; - info->muic_data->sw_path = AP_USB_MODE; + info->muic_data->usb_path = AP_USB_MODE; } - info->cable_type = CABLE_TYPE_UNKNOWN; - + info->acc_type = MUIC_ACC_TYPE_UNKNOWN; + info->chg_type = MUIC_CHG_TYPE_UNKNOWN; platform_set_drvdata(pdev, info); @@ -1621,8 +2097,8 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev) "error: %d\n", __func__, ret); goto err_input; } +#if !defined(CONFIG_MACH_U1_NA_USCC) -#if !defined(CONFIG_MACH_U1CAMERA_BD) if (info->muic_data && gpio_is_valid(info->muic_data->gpio_usb_sel)) { CHECK_GPIO(info->muic_data->gpio_usb_sel, "USB_SEL"); @@ -1630,7 +2106,7 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev) info->muic_data->uart_path = info->muic_data->cfg_uart_gpio(); -#ifndef CONFIG_TARGET_LOCALE_NA +#if !defined(CONFIG_TARGET_LOCALE_NA) ret = gpio_request(info->muic_data->gpio_usb_sel, "USB_SEL"); if (ret) { dev_info(info->dev, "%s: fail to request gpio(%d)\n", @@ -1639,22 +2115,39 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev) } if (gpio_get_value(info->muic_data->gpio_usb_sel)) { dev_info(info->dev, "%s: CP USB\n", __func__); - info->muic_data->sw_path = CP_USB_MODE; + info->muic_data->usb_path = CP_USB_MODE; } -#endif /* CONFIG_TARGET_LOCALE_NA */ +#endif /* !CONFIG_TARGET_LOCALE_NA */ } -#endif /* CONFIG_MACH_U1CAMERA_BD */ - +#endif /* create sysfs group*/ ret = sysfs_create_group(&switch_dev->kobj, &max8997_muic_group); dev_set_drvdata(switch_dev, info); if (ret) { dev_err(&pdev->dev, - "failed to create max8997 muic attribute group\n"); + "failed to create max8997 muic attribute group\n"); goto fail; } +#ifdef CONFIG_EXTCON + /* External connector */ + info->edev = kzalloc(sizeof(struct extcon_dev), GFP_KERNEL); + if (!info->edev) { + pr_err("Failed to allocate memory for extcon device\n"); + ret = -ENOMEM; + goto fail; + } + info->edev->name = DEV_NAME; + info->edev->supported_cable = extcon_cable_name; + ret = extcon_dev_register(info->edev, NULL); + if (ret) { + pr_err("Failed to register extcon device\n"); + kfree(info->edev); + goto fail; + } +#endif + if (info->muic_data && info->muic_data->init_cb) info->muic_data->init_cb(); @@ -1663,9 +2156,12 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev) /* Set ADC debounce time: 25ms */ max8997_muic_set_adcdbset(info, 2); + mutex_lock(&info->mutex); + ret = max8997_muic_irq_init(info); if (ret < 0) { dev_err(&pdev->dev, "Failed to initialize MUIC irq:%d\n", ret); + mutex_unlock(&info->mutex); goto fail; } @@ -1679,6 +2175,8 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev) INIT_DELAYED_WORK(&info->mhl_work, max8997_muic_mhl_detect); schedule_delayed_work(&info->mhl_work, msecs_to_jiffies(25000)); + mutex_unlock(&info->mutex); + return 0; fail: @@ -1714,9 +2212,9 @@ static int __devexit max8997_muic_remove(struct platform_device *pdev) free_irq(info->irq_chgtype, info); free_irq(info->irq_vbvolt, info); free_irq(info->irq_adcerr, info); -#if !defined(CONFIG_TARGET_LOCALE_NA) && !defined(CONFIG_MACH_U1CAMERA_BD) +#if !defined(CONFIG_TARGET_LOCALE_NA) gpio_free(info->muic_data->gpio_usb_sel); -#endif /* CONFIG_TARGET_LOCALE_NA && CONFIG_MACH_U1CAMERA_BD */ +#endif /* !CONFIG_TARGET_LOCALE_NA */ mutex_destroy(&info->mutex); kfree(info); } @@ -1730,7 +2228,7 @@ static u8 max8997_dumpaddr_muic[] = { MAX8997_MUIC_REG_CTRL2, }; -#ifdef CONFIG_PM +#if defined(CONFIG_PM) static int max8997_muic_freeze(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); @@ -1749,7 +2247,7 @@ static int max8997_muic_freeze(struct device *dev) /* hibernation state, disconnect usb state*/ dev_info(info->dev, "%s: DETACHED\n", __func__); mutex_lock(&info->mutex); - max8997_muic_handle_detach(info); + handle_detach(info); mutex_unlock(&info->mutex); return 0; @@ -1767,7 +2265,7 @@ static int max8997_muic_restore(struct device *dev) info->max8997->reg_dump[i + MAX8997_REG_PMIC_END]); mutex_lock(&info->mutex); - max8997_muic_detect_dev(info, -1); + detect_dev(info, -1); mutex_unlock(&info->mutex); return 0; @@ -1781,7 +2279,7 @@ static const struct dev_pm_ops max8997_dev_pm_ops = { #define MAX8997_DEV_PM_OPS (&max8997_dev_pm_ops) #else #define MAX8997_DEV_PM_OPS NULL -#endif +#endif /* CONFIG_PM */ void max8997_muic_shutdown(struct device *dev) { |