extcon: max77693: Fix bug of wrong pointer when platform data is not used
authorChanwoo Choi <cw00.choi@samsung.com>
Mon, 18 Feb 2013 01:03:32 +0000 (10:03 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Wed, 13 Mar 2013 08:32:35 +0000 (17:32 +0900)
This patch fix wrong pointer of platform data. If each machine set
platform data for h/w path or delay time of workqueue, this driver
happen kernel panic related to null pointer.

Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
drivers/extcon/extcon-max77693.c

index b70e3815c45932a3b76f7f30fff98d69907a8483..fea10624f3e5580f53735f25e11b9278056a4a63 100644 (file)
@@ -1045,7 +1045,6 @@ static int max77693_muic_probe(struct platform_device *pdev)
 {
        struct max77693_dev *max77693 = dev_get_drvdata(pdev->dev.parent);
        struct max77693_platform_data *pdata = dev_get_platdata(max77693->dev);
-       struct max77693_muic_platform_data *muic_pdata = pdata->muic_data;
        struct max77693_muic_info *info;
        int delay_jiffies;
        int ret;
@@ -1145,44 +1144,63 @@ static int max77693_muic_probe(struct platform_device *pdev)
                goto err_irq;
        }
 
-       /* Initialize MUIC register by using platform data */
-       for (i = 0 ; i < muic_pdata->num_init_data ; i++) {
-               enum max77693_irq_source irq_src = MAX77693_IRQ_GROUP_NR;
-
-               max77693_write_reg(info->max77693->regmap_muic,
-                               muic_pdata->init_data[i].addr,
-                               muic_pdata->init_data[i].data);
-
-               switch (muic_pdata->init_data[i].addr) {
-               case MAX77693_MUIC_REG_INTMASK1:
-                       irq_src = MUIC_INT1;
-                       break;
-               case MAX77693_MUIC_REG_INTMASK2:
-                       irq_src = MUIC_INT2;
-                       break;
-               case MAX77693_MUIC_REG_INTMASK3:
-                       irq_src = MUIC_INT3;
-                       break;
+       if (pdata->muic_data) {
+               struct max77693_muic_platform_data *muic_pdata = pdata->muic_data;
+
+               /* Initialize MUIC register by using platform data */
+               for (i = 0 ; i < muic_pdata->num_init_data ; i++) {
+                       enum max77693_irq_source irq_src
+                                       = MAX77693_IRQ_GROUP_NR;
+
+                       max77693_write_reg(info->max77693->regmap_muic,
+                                       muic_pdata->init_data[i].addr,
+                                       muic_pdata->init_data[i].data);
+
+                       switch (muic_pdata->init_data[i].addr) {
+                       case MAX77693_MUIC_REG_INTMASK1:
+                               irq_src = MUIC_INT1;
+                               break;
+                       case MAX77693_MUIC_REG_INTMASK2:
+                               irq_src = MUIC_INT2;
+                               break;
+                       case MAX77693_MUIC_REG_INTMASK3:
+                               irq_src = MUIC_INT3;
+                               break;
+                       }
+
+                       if (irq_src < MAX77693_IRQ_GROUP_NR)
+                               info->max77693->irq_masks_cur[irq_src]
+                                       = muic_pdata->init_data[i].data;
                }
 
-               if (irq_src < MAX77693_IRQ_GROUP_NR)
-                       info->max77693->irq_masks_cur[irq_src]
-                               = muic_pdata->init_data[i].data;
-       }
+               /*
+                * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB
+                * h/w path of COMP2/COMN1 on CONTROL1 register.
+                */
+               if (muic_pdata->path_uart)
+                       info->path_uart = muic_pdata->path_uart;
+               else
+                       info->path_uart = CONTROL1_SW_UART;
 
-       /*
-        * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB
-        * h/w path of COMP2/COMN1 on CONTROL1 register.
-        */
-       if (muic_pdata->path_uart)
-               info->path_uart = muic_pdata->path_uart;
-       else
-               info->path_uart = CONTROL1_SW_UART;
+               if (muic_pdata->path_usb)
+                       info->path_usb = muic_pdata->path_usb;
+               else
+                       info->path_usb = CONTROL1_SW_USB;
 
-       if (muic_pdata->path_usb)
-               info->path_usb = muic_pdata->path_usb;
-       else
+               /*
+                * Default delay time for detecting cable state
+                * after certain time.
+                */
+               if (muic_pdata->detcable_delay_ms)
+                       delay_jiffies =
+                               msecs_to_jiffies(muic_pdata->detcable_delay_ms);
+               else
+                       delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
+       } else {
                info->path_usb = CONTROL1_SW_USB;
+               info->path_uart = CONTROL1_SW_UART;
+               delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
+       }
 
        /* Set initial path for UART */
         max77693_muic_set_path(info, info->path_uart, true);
@@ -1208,10 +1226,6 @@ static int max77693_muic_probe(struct platform_device *pdev)
         * driver should notify cable state to upper layer.
         */
        INIT_DELAYED_WORK(&info->wq_detcable, max77693_muic_detect_cable_wq);
-       if (muic_pdata->detcable_delay_ms)
-               delay_jiffies = msecs_to_jiffies(muic_pdata->detcable_delay_ms);
-       else
-               delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
        schedule_delayed_work(&info->wq_detcable, delay_jiffies);
 
        return ret;