Commit 190d7cfc8632c10bfbfe756f882b6d9cfddfdf6a

Authored by Chanwoo Choi
1 parent 810d601f07

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>

Showing 1 changed file with 52 additions and 38 deletions Side-by-side Diff

drivers/extcon/extcon-max77693.c
... ... @@ -1045,7 +1045,6 @@
1045 1045 {
1046 1046 struct max77693_dev *max77693 = dev_get_drvdata(pdev->dev.parent);
1047 1047 struct max77693_platform_data *pdata = dev_get_platdata(max77693->dev);
1048   - struct max77693_muic_platform_data *muic_pdata = pdata->muic_data;
1049 1048 struct max77693_muic_info *info;
1050 1049 int delay_jiffies;
1051 1050 int ret;
1052 1051  
1053 1052  
1054 1053  
1055 1054  
1056 1055  
1057 1056  
... ... @@ -1145,44 +1144,63 @@
1145 1144 goto err_irq;
1146 1145 }
1147 1146  
1148   - /* Initialize MUIC register by using platform data */
1149   - for (i = 0 ; i < muic_pdata->num_init_data ; i++) {
1150   - enum max77693_irq_source irq_src = MAX77693_IRQ_GROUP_NR;
  1147 + if (pdata->muic_data) {
  1148 + struct max77693_muic_platform_data *muic_pdata = pdata->muic_data;
1151 1149  
1152   - max77693_write_reg(info->max77693->regmap_muic,
1153   - muic_pdata->init_data[i].addr,
1154   - muic_pdata->init_data[i].data);
  1150 + /* Initialize MUIC register by using platform data */
  1151 + for (i = 0 ; i < muic_pdata->num_init_data ; i++) {
  1152 + enum max77693_irq_source irq_src
  1153 + = MAX77693_IRQ_GROUP_NR;
1155 1154  
1156   - switch (muic_pdata->init_data[i].addr) {
1157   - case MAX77693_MUIC_REG_INTMASK1:
1158   - irq_src = MUIC_INT1;
1159   - break;
1160   - case MAX77693_MUIC_REG_INTMASK2:
1161   - irq_src = MUIC_INT2;
1162   - break;
1163   - case MAX77693_MUIC_REG_INTMASK3:
1164   - irq_src = MUIC_INT3;
1165   - break;
  1155 + max77693_write_reg(info->max77693->regmap_muic,
  1156 + muic_pdata->init_data[i].addr,
  1157 + muic_pdata->init_data[i].data);
  1158 +
  1159 + switch (muic_pdata->init_data[i].addr) {
  1160 + case MAX77693_MUIC_REG_INTMASK1:
  1161 + irq_src = MUIC_INT1;
  1162 + break;
  1163 + case MAX77693_MUIC_REG_INTMASK2:
  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)
1169   - info->max77693->irq_masks_cur[irq_src]
1170   - = muic_pdata->init_data[i].data;
1171   - }
  1176 + /*
  1177 + * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB
  1178 + * h/w path of COMP2/COMN1 on CONTROL1 register.
  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   - /*
1174   - * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB
1175   - * h/w path of COMP2/COMN1 on CONTROL1 register.
1176   - */
1177   - if (muic_pdata->path_uart)
1178   - info->path_uart = muic_pdata->path_uart;
1179   - else
1180   - info->path_uart = CONTROL1_SW_UART;
  1185 + if (muic_pdata->path_usb)
  1186 + info->path_usb = muic_pdata->path_usb;
  1187 + else
  1188 + info->path_usb = CONTROL1_SW_USB;
1181 1189  
1182   - if (muic_pdata->path_usb)
1183   - info->path_usb = muic_pdata->path_usb;
1184   - else
  1190 + /*
  1191 + * Default delay time for detecting cable state
  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 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 1205 /* Set initial path for UART */
1188 1206 max77693_muic_set_path(info, info->path_uart, true);
... ... @@ -1208,10 +1226,6 @@
1208 1226 * driver should notify cable state to upper layer.
1209 1227 */
1210 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 1229 schedule_delayed_work(&info->wq_detcable, delay_jiffies);
1216 1230  
1217 1231 return ret;