aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/extcon
diff options
context:
space:
mode:
authorChanwoo Choi <cw00.choi@samsung.com>2013-02-17 20:03:32 -0500
committerChanwoo Choi <cw00.choi@samsung.com>2013-03-13 04:32:35 -0400
commit190d7cfc8632c10bfbfe756f882b6d9cfddfdf6a (patch)
tree50c2dd3b8735464bc03e1676493011ae33b1db67 /drivers/extcon
parent810d601f07ce2481ff776e049c0733ded2abbcc1 (diff)
extcon: max77693: Fix bug of wrong pointer when platform data is not used
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>
Diffstat (limited to 'drivers/extcon')
-rw-r--r--drivers/extcon/extcon-max77693.c90
1 files changed, 52 insertions, 38 deletions
diff --git a/drivers/extcon/extcon-max77693.c b/drivers/extcon/extcon-max77693.c
index b70e3815c459..fea10624f3e5 100644
--- a/drivers/extcon/extcon-max77693.c
+++ b/drivers/extcon/extcon-max77693.c
@@ -1045,7 +1045,6 @@ static int max77693_muic_probe(struct platform_device *pdev)
1045{ 1045{
1046 struct max77693_dev *max77693 = dev_get_drvdata(pdev->dev.parent); 1046 struct max77693_dev *max77693 = dev_get_drvdata(pdev->dev.parent);
1047 struct max77693_platform_data *pdata = dev_get_platdata(max77693->dev); 1047 struct max77693_platform_data *pdata = dev_get_platdata(max77693->dev);
1048 struct max77693_muic_platform_data *muic_pdata = pdata->muic_data;
1049 struct max77693_muic_info *info; 1048 struct max77693_muic_info *info;
1050 int delay_jiffies; 1049 int delay_jiffies;
1051 int ret; 1050 int ret;
@@ -1145,44 +1144,63 @@ static int max77693_muic_probe(struct platform_device *pdev)
1145 goto err_irq; 1144 goto err_irq;
1146 } 1145 }
1147 1146
1148 /* Initialize MUIC register by using platform data */ 1147 if (pdata->muic_data) {
1149 for (i = 0 ; i < muic_pdata->num_init_data ; i++) { 1148 struct max77693_muic_platform_data *muic_pdata = pdata->muic_data;
1150 enum max77693_irq_source irq_src = MAX77693_IRQ_GROUP_NR; 1149
1151 1150 /* Initialize MUIC register by using platform data */
1152 max77693_write_reg(info->max77693->regmap_muic, 1151 for (i = 0 ; i < muic_pdata->num_init_data ; i++) {
1153 muic_pdata->init_data[i].addr, 1152 enum max77693_irq_source irq_src
1154 muic_pdata->init_data[i].data); 1153 = MAX77693_IRQ_GROUP_NR;
1155 1154
1156 switch (muic_pdata->init_data[i].addr) { 1155 max77693_write_reg(info->max77693->regmap_muic,
1157 case MAX77693_MUIC_REG_INTMASK1: 1156 muic_pdata->init_data[i].addr,
1158 irq_src = MUIC_INT1; 1157 muic_pdata->init_data[i].data);
1159 break; 1158
1160 case MAX77693_MUIC_REG_INTMASK2: 1159 switch (muic_pdata->init_data[i].addr) {
1161 irq_src = MUIC_INT2; 1160 case MAX77693_MUIC_REG_INTMASK1:
1162 break; 1161 irq_src = MUIC_INT1;
1163 case MAX77693_MUIC_REG_INTMASK3: 1162 break;
1164 irq_src = MUIC_INT3; 1163 case MAX77693_MUIC_REG_INTMASK2:
1165 break; 1164 irq_src = MUIC_INT2;
1165 break;
1166 case MAX77693_MUIC_REG_INTMASK3:
1167 irq_src = MUIC_INT3;
1168 break;
1169 }
1170
1171 if (irq_src < MAX77693_IRQ_GROUP_NR)
1172 info->max77693->irq_masks_cur[irq_src]
1173 = muic_pdata->init_data[i].data;
1166 } 1174 }
1167 1175
1168 if (irq_src < MAX77693_IRQ_GROUP_NR) 1176 /*
1169 info->max77693->irq_masks_cur[irq_src] 1177 * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB
1170 = muic_pdata->init_data[i].data; 1178 * h/w path of COMP2/COMN1 on CONTROL1 register.
1171 } 1179 */
1180 if (muic_pdata->path_uart)
1181 info->path_uart = muic_pdata->path_uart;
1182 else
1183 info->path_uart = CONTROL1_SW_UART;
1172 1184
1173 /* 1185 if (muic_pdata->path_usb)
1174 * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB 1186 info->path_usb = muic_pdata->path_usb;
1175 * h/w path of COMP2/COMN1 on CONTROL1 register. 1187 else
1176 */ 1188 info->path_usb = CONTROL1_SW_USB;
1177 if (muic_pdata->path_uart)
1178 info->path_uart = muic_pdata->path_uart;
1179 else
1180 info->path_uart = CONTROL1_SW_UART;
1181 1189
1182 if (muic_pdata->path_usb) 1190 /*
1183 info->path_usb = muic_pdata->path_usb; 1191 * Default delay time for detecting cable state
1184 else 1192 * after certain time.
1193 */
1194 if (muic_pdata->detcable_delay_ms)
1195 delay_jiffies =
1196 msecs_to_jiffies(muic_pdata->detcable_delay_ms);
1197 else
1198 delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
1199 } else {
1185 info->path_usb = CONTROL1_SW_USB; 1200 info->path_usb = CONTROL1_SW_USB;
1201 info->path_uart = CONTROL1_SW_UART;
1202 delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
1203 }
1186 1204
1187 /* Set initial path for UART */ 1205 /* Set initial path for UART */
1188 max77693_muic_set_path(info, info->path_uart, true); 1206 max77693_muic_set_path(info, info->path_uart, true);
@@ -1208,10 +1226,6 @@ static int max77693_muic_probe(struct platform_device *pdev)
1208 * driver should notify cable state to upper layer. 1226 * driver should notify cable state to upper layer.
1209 */ 1227 */
1210 INIT_DELAYED_WORK(&info->wq_detcable, max77693_muic_detect_cable_wq); 1228 INIT_DELAYED_WORK(&info->wq_detcable, max77693_muic_detect_cable_wq);
1211 if (muic_pdata->detcable_delay_ms)
1212 delay_jiffies = msecs_to_jiffies(muic_pdata->detcable_delay_ms);
1213 else
1214 delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
1215 schedule_delayed_work(&info->wq_detcable, delay_jiffies); 1229 schedule_delayed_work(&info->wq_detcable, delay_jiffies);
1216 1230
1217 return ret; 1231 return ret;