These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / extcon / extcon-max77843.c
index 8db6a92..9f9ea33 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/i2c.h>
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
+#include <linux/mfd/max77693-common.h>
 #include <linux/mfd/max77843-private.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
@@ -32,7 +33,7 @@ enum max77843_muic_status {
 
 struct max77843_muic_info {
        struct device *dev;
-       struct max77843 *max77843;
+       struct max77693_dev *max77843;
        struct extcon_dev *edev;
 
        struct mutex mutex;
@@ -118,36 +119,16 @@ enum max77843_muic_charger_type {
        MAX77843_MUIC_CHG_GND,
 };
 
-enum {
-       MAX77843_CABLE_USB = 0,
-       MAX77843_CABLE_USB_HOST,
-       MAX77843_CABLE_TA,
-       MAX77843_CABLE_CHARGE_DOWNSTREAM,
-       MAX77843_CABLE_FAST_CHARGER,
-       MAX77843_CABLE_SLOW_CHARGER,
-       MAX77843_CABLE_MHL,
-       MAX77843_CABLE_MHL_TA,
-       MAX77843_CABLE_JIG_USB_ON,
-       MAX77843_CABLE_JIG_USB_OFF,
-       MAX77843_CABLE_JIG_UART_ON,
-       MAX77843_CABLE_JIG_UART_OFF,
-
-       MAX77843_CABLE_NUM,
-};
-
-static const char *max77843_extcon_cable[] = {
-       [MAX77843_CABLE_USB]                    = "USB",
-       [MAX77843_CABLE_USB_HOST]               = "USB-HOST",
-       [MAX77843_CABLE_TA]                     = "TA",
-       [MAX77843_CABLE_CHARGE_DOWNSTREAM]      = "CHARGER-DOWNSTREAM",
-       [MAX77843_CABLE_FAST_CHARGER]           = "FAST-CHARGER",
-       [MAX77843_CABLE_SLOW_CHARGER]           = "SLOW-CHARGER",
-       [MAX77843_CABLE_MHL]                    = "MHL",
-       [MAX77843_CABLE_MHL_TA]                 = "MHL-TA",
-       [MAX77843_CABLE_JIG_USB_ON]             = "JIG-USB-ON",
-       [MAX77843_CABLE_JIG_USB_OFF]            = "JIG-USB-OFF",
-       [MAX77843_CABLE_JIG_UART_ON]            = "JIG-UART-ON",
-       [MAX77843_CABLE_JIG_UART_OFF]           = "JIG-UART-OFF",
+static const unsigned int max77843_extcon_cable[] = {
+       EXTCON_USB,
+       EXTCON_USB_HOST,
+       EXTCON_CHG_USB_DCP,
+       EXTCON_CHG_USB_CDP,
+       EXTCON_CHG_USB_FAST,
+       EXTCON_CHG_USB_SLOW,
+       EXTCON_DISP_MHL,
+       EXTCON_JIG,
+       EXTCON_NONE,
 };
 
 struct max77843_muic_irq {
@@ -218,18 +199,18 @@ static const struct regmap_irq_chip max77843_muic_irq_chip = {
 static int max77843_muic_set_path(struct max77843_muic_info *info,
                u8 val, bool attached)
 {
-       struct max77843 *max77843 = info->max77843;
+       struct max77693_dev *max77843 = info->max77843;
        int ret = 0;
        unsigned int ctrl1, ctrl2;
 
        if (attached)
                ctrl1 = val;
        else
-               ctrl1 = CONTROL1_SW_OPEN;
+               ctrl1 = MAX77843_MUIC_CONTROL1_SW_OPEN;
 
        ret = regmap_update_bits(max77843->regmap_muic,
                        MAX77843_MUIC_REG_CONTROL1,
-                       CONTROL1_COM_SW, ctrl1);
+                       MAX77843_MUIC_CONTROL1_COM_SW, ctrl1);
        if (ret < 0) {
                dev_err(info->dev, "Cannot switch MUIC port\n");
                return ret;
@@ -263,7 +244,7 @@ static int max77843_muic_get_cable_type(struct max77843_muic_info *info,
 
        adc = info->status[MAX77843_MUIC_STATUS1] &
                        MAX77843_MUIC_STATUS1_ADC_MASK;
-       adc >>= STATUS1_ADC_SHIFT;
+       adc >>= MAX77843_MUIC_STATUS1_ADC_SHIFT;
 
        switch (group) {
        case MAX77843_CABLE_GROUP_ADC:
@@ -329,7 +310,7 @@ static int max77843_muic_get_cable_type(struct max77843_muic_info *info,
                        /* Get VBVolt register bit */
                        gnd_type |= (info->status[MAX77843_MUIC_STATUS2] &
                                        MAX77843_MUIC_STATUS2_VBVOLT_MASK);
-                       gnd_type >>= STATUS2_VBVOLT_SHIFT;
+                       gnd_type >>= MAX77843_MUIC_STATUS2_VBVOLT_SHIFT;
 
                        /* Offset of GND cable */
                        gnd_type |= MAX77843_MUIC_GND_USB_HOST;
@@ -358,19 +339,23 @@ static int max77843_muic_adc_gnd_handler(struct max77843_muic_info *info)
        switch (gnd_cable_type) {
        case MAX77843_MUIC_GND_USB_HOST:
        case MAX77843_MUIC_GND_USB_HOST_VB:
-               ret = max77843_muic_set_path(info, CONTROL1_SW_USB, attached);
+               ret = max77843_muic_set_path(info,
+                                            MAX77843_MUIC_CONTROL1_SW_USB,
+                                            attached);
                if (ret < 0)
                        return ret;
 
-               extcon_set_cable_state(info->edev, "USB-HOST", attached);
+               extcon_set_cable_state_(info->edev, EXTCON_USB_HOST, attached);
                break;
        case MAX77843_MUIC_GND_MHL_VB:
        case MAX77843_MUIC_GND_MHL:
-               ret = max77843_muic_set_path(info, CONTROL1_SW_OPEN, attached);
+               ret = max77843_muic_set_path(info,
+                                            MAX77843_MUIC_CONTROL1_SW_OPEN,
+                                            attached);
                if (ret < 0)
                        return ret;
 
-               extcon_set_cable_state(info->edev, "MHL", attached);
+               extcon_set_cable_state_(info->edev, EXTCON_DISP_MHL, attached);
                break;
        default:
                dev_err(info->dev, "failed to detect %s accessory(gnd:0x%x)\n",
@@ -385,36 +370,29 @@ static int max77843_muic_jig_handler(struct max77843_muic_info *info,
                int cable_type, bool attached)
 {
        int ret;
+       u8 path = MAX77843_MUIC_CONTROL1_SW_OPEN;
 
        dev_dbg(info->dev, "external connector is %s (adc:0x%02x)\n",
                        attached ? "attached" : "detached", cable_type);
 
        switch (cable_type) {
        case MAX77843_MUIC_ADC_FACTORY_MODE_USB_OFF:
-               ret = max77843_muic_set_path(info, CONTROL1_SW_USB, attached);
-               if (ret < 0)
-                       return ret;
-               extcon_set_cable_state(info->edev, "JIG-USB-OFF", attached);
-               break;
        case MAX77843_MUIC_ADC_FACTORY_MODE_USB_ON:
-               ret = max77843_muic_set_path(info, CONTROL1_SW_USB, attached);
-               if (ret < 0)
-                       return ret;
-               extcon_set_cable_state(info->edev, "JIG-USB-ON", attached);
+               path = MAX77843_MUIC_CONTROL1_SW_USB;
                break;
        case MAX77843_MUIC_ADC_FACTORY_MODE_UART_OFF:
-               ret = max77843_muic_set_path(info, CONTROL1_SW_UART, attached);
-               if (ret < 0)
-                       return ret;
-               extcon_set_cable_state(info->edev, "JIG-UART-OFF", attached);
+               path = MAX77843_MUIC_CONTROL1_SW_UART;
                break;
        default:
-               ret = max77843_muic_set_path(info, CONTROL1_SW_OPEN, attached);
-               if (ret < 0)
-                       return ret;
-               break;
+               return -EINVAL;
        }
 
+       ret = max77843_muic_set_path(info, path, attached);
+       if (ret < 0)
+               return ret;
+
+       extcon_set_cable_state_(info->edev, EXTCON_JIG, attached);
+
        return 0;
 }
 
@@ -501,40 +479,53 @@ static int max77843_muic_chg_handler(struct max77843_muic_info *info)
 
        switch (chg_type) {
        case MAX77843_MUIC_CHG_USB:
-               ret = max77843_muic_set_path(info, CONTROL1_SW_USB, attached);
+               ret = max77843_muic_set_path(info,
+                                            MAX77843_MUIC_CONTROL1_SW_USB,
+                                            attached);
                if (ret < 0)
                        return ret;
 
-               extcon_set_cable_state(info->edev, "USB", attached);
+               extcon_set_cable_state_(info->edev, EXTCON_USB, attached);
                break;
        case MAX77843_MUIC_CHG_DOWNSTREAM:
-               ret = max77843_muic_set_path(info, CONTROL1_SW_OPEN, attached);
+               ret = max77843_muic_set_path(info,
+                                            MAX77843_MUIC_CONTROL1_SW_OPEN,
+                                            attached);
                if (ret < 0)
                        return ret;
 
-               extcon_set_cable_state(info->edev,
-                               "CHARGER-DOWNSTREAM", attached);
+               extcon_set_cable_state_(info->edev, EXTCON_CHG_USB_CDP,
+                                       attached);
                break;
        case MAX77843_MUIC_CHG_DEDICATED:
-               ret = max77843_muic_set_path(info, CONTROL1_SW_OPEN, attached);
+               ret = max77843_muic_set_path(info,
+                                            MAX77843_MUIC_CONTROL1_SW_OPEN,
+                                            attached);
                if (ret < 0)
                        return ret;
 
-               extcon_set_cable_state(info->edev, "TA", attached);
+               extcon_set_cable_state_(info->edev, EXTCON_CHG_USB_DCP,
+                                       attached);
                break;
        case MAX77843_MUIC_CHG_SPECIAL_500MA:
-               ret = max77843_muic_set_path(info, CONTROL1_SW_OPEN, attached);
+               ret = max77843_muic_set_path(info,
+                                            MAX77843_MUIC_CONTROL1_SW_OPEN,
+                                            attached);
                if (ret < 0)
                        return ret;
 
-               extcon_set_cable_state(info->edev, "SLOW-CHAREGER", attached);
+               extcon_set_cable_state_(info->edev, EXTCON_CHG_USB_SLOW,
+                                       attached);
                break;
        case MAX77843_MUIC_CHG_SPECIAL_1A:
-               ret = max77843_muic_set_path(info, CONTROL1_SW_OPEN, attached);
+               ret = max77843_muic_set_path(info,
+                                            MAX77843_MUIC_CONTROL1_SW_OPEN,
+                                            attached);
                if (ret < 0)
                        return ret;
 
-               extcon_set_cable_state(info->edev, "FAST-CHARGER", attached);
+               extcon_set_cable_state_(info->edev, EXTCON_CHG_USB_FAST,
+                                       attached);
                break;
        case MAX77843_MUIC_CHG_GND:
                gnd_type = max77843_muic_get_cable_type(info,
@@ -542,9 +533,11 @@ static int max77843_muic_chg_handler(struct max77843_muic_info *info)
 
                /* Charger cable on MHL accessory is attach or detach */
                if (gnd_type == MAX77843_MUIC_GND_MHL_VB)
-                       extcon_set_cable_state(info->edev, "MHL-TA", true);
+                       extcon_set_cable_state_(info->edev, EXTCON_CHG_USB_DCP,
+                                               true);
                else if (gnd_type == MAX77843_MUIC_GND_MHL)
-                       extcon_set_cable_state(info->edev, "MHL-TA", false);
+                       extcon_set_cable_state_(info->edev, EXTCON_CHG_USB_DCP,
+                                               false);
                break;
        case MAX77843_MUIC_CHG_NONE:
                break;
@@ -553,7 +546,8 @@ static int max77843_muic_chg_handler(struct max77843_muic_info *info)
                        "failed to detect %s accessory (chg_type:0x%x)\n",
                        attached ? "attached" : "detached", chg_type);
 
-               max77843_muic_set_path(info, CONTROL1_SW_OPEN, attached);
+               max77843_muic_set_path(info, MAX77843_MUIC_CONTROL1_SW_OPEN,
+                                      attached);
                return -EINVAL;
        }
 
@@ -564,7 +558,7 @@ static void max77843_muic_irq_work(struct work_struct *work)
 {
        struct max77843_muic_info *info = container_of(work,
                        struct max77843_muic_info, irq_work);
-       struct max77843 *max77843 = info->max77843;
+       struct max77693_dev *max77843 = info->max77843;
        int ret = 0;
 
        mutex_lock(&info->mutex);
@@ -640,7 +634,7 @@ static void max77843_muic_detect_cable_wq(struct work_struct *work)
 {
        struct max77843_muic_info *info = container_of(to_delayed_work(work),
                        struct max77843_muic_info, wq_detcable);
-       struct max77843 *max77843 = info->max77843;
+       struct max77693_dev *max77843 = info->max77843;
        int chg_type, adc, ret;
        bool attached;
 
@@ -681,7 +675,7 @@ err_cable_wq:
 static int max77843_muic_set_debounce_time(struct max77843_muic_info *info,
                enum max77843_muic_adc_debounce_time time)
 {
-       struct max77843 *max77843 = info->max77843;
+       struct max77693_dev *max77843 = info->max77843;
        int ret;
 
        switch (time) {
@@ -692,7 +686,7 @@ static int max77843_muic_set_debounce_time(struct max77843_muic_info *info,
                ret = regmap_update_bits(max77843->regmap_muic,
                                MAX77843_MUIC_REG_CONTROL4,
                                MAX77843_MUIC_CONTROL4_ADCDBSET_MASK,
-                               time << CONTROL4_ADCDBSET_SHIFT);
+                               time << MAX77843_MUIC_CONTROL4_ADCDBSET_SHIFT);
                if (ret < 0) {
                        dev_err(info->dev, "Cannot write MUIC regmap\n");
                        return ret;
@@ -706,7 +700,7 @@ static int max77843_muic_set_debounce_time(struct max77843_muic_info *info,
        return 0;
 }
 
-static int max77843_init_muic_regmap(struct max77843 *max77843)
+static int max77843_init_muic_regmap(struct max77693_dev *max77843)
 {
        int ret;
 
@@ -745,7 +739,7 @@ err_muic_i2c:
 
 static int max77843_muic_probe(struct platform_device *pdev)
 {
-       struct max77843 *max77843 = dev_get_drvdata(pdev->dev.parent);
+       struct max77693_dev *max77843 = dev_get_drvdata(pdev->dev.parent);
        struct max77843_muic_info *info;
        unsigned int id;
        int i, ret;
@@ -793,7 +787,7 @@ static int max77843_muic_probe(struct platform_device *pdev)
        max77843_muic_set_debounce_time(info, MAX77843_DEBOUNCE_TIME_25MS);
 
        /* Set initial path for UART */
-       max77843_muic_set_path(info, CONTROL1_SW_UART, true);
+       max77843_muic_set_path(info, MAX77843_MUIC_CONTROL1_SW_UART, true);
 
        /* Check revision number of MUIC device */
        ret = regmap_read(max77843->regmap_muic, MAX77843_MUIC_REG_ID, &id);
@@ -806,6 +800,15 @@ static int max77843_muic_probe(struct platform_device *pdev)
        /* Support virtual irq domain for max77843 MUIC device */
        INIT_WORK(&info->irq_work, max77843_muic_irq_work);
 
+       /* Clear IRQ bits before request IRQs */
+       ret = regmap_bulk_read(max77843->regmap_muic,
+                       MAX77843_MUIC_REG_INT1, info->status,
+                       MAX77843_MUIC_IRQ_NUM);
+       if (ret) {
+               dev_err(&pdev->dev, "Failed to Clear IRQ bits\n");
+               goto err_muic_irq;
+       }
+
        for (i = 0; i < ARRAY_SIZE(max77843_muic_irqs); i++) {
                struct max77843_muic_irq *muic_irq = &max77843_muic_irqs[i];
                unsigned int virq = 0;
@@ -846,7 +849,7 @@ err_muic_irq:
 static int max77843_muic_remove(struct platform_device *pdev)
 {
        struct max77843_muic_info *info = platform_get_drvdata(pdev);
-       struct max77843 *max77843 = info->max77843;
+       struct max77693_dev *max77843 = info->max77843;
 
        cancel_work_sync(&info->irq_work);
        regmap_del_irq_chip(max77843->irq, max77843->irq_data_muic);