diff options
author | Chanwoo Choi <cw00.choi@samsung.com> | 2013-02-17 20:03:32 -0500 |
---|---|---|
committer | Chanwoo Choi <cw00.choi@samsung.com> | 2013-03-13 04:32:35 -0400 |
commit | 190d7cfc8632c10bfbfe756f882b6d9cfddfdf6a (patch) | |
tree | 50c2dd3b8735464bc03e1676493011ae33b1db67 /drivers/extcon | |
parent | 810d601f07ce2481ff776e049c0733ded2abbcc1 (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.c | 90 |
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; |