Commit 190d7cfc8632c10bfbfe756f882b6d9cfddfdf6a
1 parent
810d601f07
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
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; |