diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-03-26 19:09:30 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-03-26 19:09:30 -0400 |
| commit | 8c876be81a1f2f0ab33ffb2b00871e65c7a658b3 (patch) | |
| tree | 60426265759ab14b00c94a791520f140062bb57c /drivers | |
| parent | 02dbd0ff5448d4da0c6e9d59c897f3e31a16d51a (diff) | |
| parent | 347e0899b1c75d907f01ac883ca38d37fe9bfa42 (diff) | |
Merge branch 'char-misc-linus' into char-misc-next
This picks up the MEI fixes that we need in this branch now.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/extcon/extcon-max77693.c | 103 | ||||
| -rw-r--r-- | drivers/extcon/extcon-max8997.c | 56 | ||||
| -rw-r--r-- | drivers/misc/mei/hw-me.c | 29 | ||||
| -rw-r--r-- | drivers/misc/mei/init.c | 18 | ||||
| -rw-r--r-- | drivers/misc/mei/mei_dev.h | 1 | ||||
| -rw-r--r-- | drivers/misc/mei/pci-me.c | 52 | ||||
| -rw-r--r-- | drivers/misc/vmw_vmci/vmci_datagram.c | 4 |
7 files changed, 163 insertions, 100 deletions
diff --git a/drivers/extcon/extcon-max77693.c b/drivers/extcon/extcon-max77693.c index b70e3815c459..8f3c947b0029 100644 --- a/drivers/extcon/extcon-max77693.c +++ b/drivers/extcon/extcon-max77693.c | |||
| @@ -32,6 +32,38 @@ | |||
| 32 | #define DEV_NAME "max77693-muic" | 32 | #define DEV_NAME "max77693-muic" |
| 33 | #define DELAY_MS_DEFAULT 20000 /* unit: millisecond */ | 33 | #define DELAY_MS_DEFAULT 20000 /* unit: millisecond */ |
| 34 | 34 | ||
| 35 | /* | ||
| 36 | * Default value of MAX77693 register to bring up MUIC device. | ||
| 37 | * If user don't set some initial value for MUIC device through platform data, | ||
| 38 | * extcon-max77693 driver use 'default_init_data' to bring up base operation | ||
| 39 | * of MAX77693 MUIC device. | ||
| 40 | */ | ||
| 41 | struct max77693_reg_data default_init_data[] = { | ||
| 42 | { | ||
| 43 | /* STATUS2 - [3]ChgDetRun */ | ||
| 44 | .addr = MAX77693_MUIC_REG_STATUS2, | ||
| 45 | .data = STATUS2_CHGDETRUN_MASK, | ||
| 46 | }, { | ||
| 47 | /* INTMASK1 - Unmask [3]ADC1KM,[0]ADCM */ | ||
| 48 | .addr = MAX77693_MUIC_REG_INTMASK1, | ||
| 49 | .data = INTMASK1_ADC1K_MASK | ||
| 50 | | INTMASK1_ADC_MASK, | ||
| 51 | }, { | ||
| 52 | /* INTMASK2 - Unmask [0]ChgTypM */ | ||
| 53 | .addr = MAX77693_MUIC_REG_INTMASK2, | ||
| 54 | .data = INTMASK2_CHGTYP_MASK, | ||
| 55 | }, { | ||
| 56 | /* INTMASK3 - Mask all of interrupts */ | ||
| 57 | .addr = MAX77693_MUIC_REG_INTMASK3, | ||
| 58 | .data = 0x0, | ||
| 59 | }, { | ||
| 60 | /* CDETCTRL2 */ | ||
| 61 | .addr = MAX77693_MUIC_REG_CDETCTRL2, | ||
| 62 | .data = CDETCTRL2_VIDRMEN_MASK | ||
| 63 | | CDETCTRL2_DXOVPEN_MASK, | ||
| 64 | }, | ||
| 65 | }; | ||
| 66 | |||
| 35 | enum max77693_muic_adc_debounce_time { | 67 | enum max77693_muic_adc_debounce_time { |
| 36 | ADC_DEBOUNCE_TIME_5MS = 0, | 68 | ADC_DEBOUNCE_TIME_5MS = 0, |
| 37 | ADC_DEBOUNCE_TIME_10MS, | 69 | ADC_DEBOUNCE_TIME_10MS, |
| @@ -1045,8 +1077,9 @@ static int max77693_muic_probe(struct platform_device *pdev) | |||
| 1045 | { | 1077 | { |
| 1046 | struct max77693_dev *max77693 = dev_get_drvdata(pdev->dev.parent); | 1078 | struct max77693_dev *max77693 = dev_get_drvdata(pdev->dev.parent); |
| 1047 | struct max77693_platform_data *pdata = dev_get_platdata(max77693->dev); | 1079 | 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; | 1080 | struct max77693_muic_info *info; |
| 1081 | struct max77693_reg_data *init_data; | ||
| 1082 | int num_init_data; | ||
| 1050 | int delay_jiffies; | 1083 | int delay_jiffies; |
| 1051 | int ret; | 1084 | int ret; |
| 1052 | int i; | 1085 | int i; |
| @@ -1145,15 +1178,25 @@ static int max77693_muic_probe(struct platform_device *pdev) | |||
| 1145 | goto err_irq; | 1178 | goto err_irq; |
| 1146 | } | 1179 | } |
| 1147 | 1180 | ||
| 1148 | /* Initialize MUIC register by using platform data */ | 1181 | |
| 1149 | for (i = 0 ; i < muic_pdata->num_init_data ; i++) { | 1182 | /* Initialize MUIC register by using platform data or default data */ |
| 1150 | enum max77693_irq_source irq_src = MAX77693_IRQ_GROUP_NR; | 1183 | if (pdata->muic_data) { |
| 1184 | init_data = pdata->muic_data->init_data; | ||
| 1185 | num_init_data = pdata->muic_data->num_init_data; | ||
| 1186 | } else { | ||
| 1187 | init_data = default_init_data; | ||
| 1188 | num_init_data = ARRAY_SIZE(default_init_data); | ||
| 1189 | } | ||
| 1190 | |||
| 1191 | for (i = 0 ; i < num_init_data ; i++) { | ||
| 1192 | enum max77693_irq_source irq_src | ||
| 1193 | = MAX77693_IRQ_GROUP_NR; | ||
| 1151 | 1194 | ||
| 1152 | max77693_write_reg(info->max77693->regmap_muic, | 1195 | max77693_write_reg(info->max77693->regmap_muic, |
| 1153 | muic_pdata->init_data[i].addr, | 1196 | init_data[i].addr, |
| 1154 | muic_pdata->init_data[i].data); | 1197 | init_data[i].data); |
| 1155 | 1198 | ||
| 1156 | switch (muic_pdata->init_data[i].addr) { | 1199 | switch (init_data[i].addr) { |
| 1157 | case MAX77693_MUIC_REG_INTMASK1: | 1200 | case MAX77693_MUIC_REG_INTMASK1: |
| 1158 | irq_src = MUIC_INT1; | 1201 | irq_src = MUIC_INT1; |
| 1159 | break; | 1202 | break; |
| @@ -1167,22 +1210,40 @@ static int max77693_muic_probe(struct platform_device *pdev) | |||
| 1167 | 1210 | ||
| 1168 | if (irq_src < MAX77693_IRQ_GROUP_NR) | 1211 | if (irq_src < MAX77693_IRQ_GROUP_NR) |
| 1169 | info->max77693->irq_masks_cur[irq_src] | 1212 | info->max77693->irq_masks_cur[irq_src] |
| 1170 | = muic_pdata->init_data[i].data; | 1213 | = init_data[i].data; |
| 1171 | } | 1214 | } |
| 1172 | 1215 | ||
| 1173 | /* | 1216 | if (pdata->muic_data) { |
| 1174 | * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB | 1217 | struct max77693_muic_platform_data *muic_pdata = pdata->muic_data; |
| 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; | ||
| 1181 | 1218 | ||
| 1182 | if (muic_pdata->path_usb) | 1219 | /* |
| 1183 | info->path_usb = muic_pdata->path_usb; | 1220 | * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB |
| 1184 | else | 1221 | * h/w path of COMP2/COMN1 on CONTROL1 register. |
| 1222 | */ | ||
| 1223 | if (muic_pdata->path_uart) | ||
| 1224 | info->path_uart = muic_pdata->path_uart; | ||
| 1225 | else | ||
| 1226 | info->path_uart = CONTROL1_SW_UART; | ||
| 1227 | |||
| 1228 | if (muic_pdata->path_usb) | ||
| 1229 | info->path_usb = muic_pdata->path_usb; | ||
| 1230 | else | ||
| 1231 | info->path_usb = CONTROL1_SW_USB; | ||
| 1232 | |||
| 1233 | /* | ||
| 1234 | * Default delay time for detecting cable state | ||
| 1235 | * after certain time. | ||
| 1236 | */ | ||
| 1237 | if (muic_pdata->detcable_delay_ms) | ||
| 1238 | delay_jiffies = | ||
| 1239 | msecs_to_jiffies(muic_pdata->detcable_delay_ms); | ||
| 1240 | else | ||
| 1241 | delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT); | ||
| 1242 | } else { | ||
| 1185 | info->path_usb = CONTROL1_SW_USB; | 1243 | info->path_usb = CONTROL1_SW_USB; |
| 1244 | info->path_uart = CONTROL1_SW_UART; | ||
| 1245 | delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT); | ||
| 1246 | } | ||
| 1186 | 1247 | ||
| 1187 | /* Set initial path for UART */ | 1248 | /* Set initial path for UART */ |
| 1188 | max77693_muic_set_path(info, info->path_uart, true); | 1249 | max77693_muic_set_path(info, info->path_uart, true); |
| @@ -1208,10 +1269,6 @@ static int max77693_muic_probe(struct platform_device *pdev) | |||
| 1208 | * driver should notify cable state to upper layer. | 1269 | * driver should notify cable state to upper layer. |
| 1209 | */ | 1270 | */ |
| 1210 | INIT_DELAYED_WORK(&info->wq_detcable, max77693_muic_detect_cable_wq); | 1271 | 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); | 1272 | schedule_delayed_work(&info->wq_detcable, delay_jiffies); |
| 1216 | 1273 | ||
| 1217 | return ret; | 1274 | return ret; |
diff --git a/drivers/extcon/extcon-max8997.c b/drivers/extcon/extcon-max8997.c index e636d950ad6c..69641bcae325 100644 --- a/drivers/extcon/extcon-max8997.c +++ b/drivers/extcon/extcon-max8997.c | |||
| @@ -712,29 +712,45 @@ static int max8997_muic_probe(struct platform_device *pdev) | |||
| 712 | goto err_irq; | 712 | goto err_irq; |
| 713 | } | 713 | } |
| 714 | 714 | ||
| 715 | /* Initialize registers according to platform data */ | ||
| 716 | if (pdata->muic_pdata) { | 715 | if (pdata->muic_pdata) { |
| 717 | struct max8997_muic_platform_data *mdata = info->muic_pdata; | 716 | struct max8997_muic_platform_data *muic_pdata |
| 718 | 717 | = pdata->muic_pdata; | |
| 719 | for (i = 0; i < mdata->num_init_data; i++) { | 718 | |
| 720 | max8997_write_reg(info->muic, mdata->init_data[i].addr, | 719 | /* Initialize registers according to platform data */ |
| 721 | mdata->init_data[i].data); | 720 | for (i = 0; i < muic_pdata->num_init_data; i++) { |
| 721 | max8997_write_reg(info->muic, | ||
| 722 | muic_pdata->init_data[i].addr, | ||
| 723 | muic_pdata->init_data[i].data); | ||
| 722 | } | 724 | } |
| 723 | } | ||
| 724 | 725 | ||
| 725 | /* | 726 | /* |
| 726 | * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB | 727 | * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB |
| 727 | * h/w path of COMP2/COMN1 on CONTROL1 register. | 728 | * h/w path of COMP2/COMN1 on CONTROL1 register. |
| 728 | */ | 729 | */ |
| 729 | if (pdata->muic_pdata->path_uart) | 730 | if (muic_pdata->path_uart) |
| 730 | info->path_uart = pdata->muic_pdata->path_uart; | 731 | info->path_uart = muic_pdata->path_uart; |
| 731 | else | 732 | else |
| 732 | info->path_uart = CONTROL1_SW_UART; | 733 | info->path_uart = CONTROL1_SW_UART; |
| 733 | 734 | ||
| 734 | if (pdata->muic_pdata->path_usb) | 735 | if (muic_pdata->path_usb) |
| 735 | info->path_usb = pdata->muic_pdata->path_usb; | 736 | info->path_usb = muic_pdata->path_usb; |
| 736 | else | 737 | else |
| 738 | info->path_usb = CONTROL1_SW_USB; | ||
| 739 | |||
| 740 | /* | ||
| 741 | * Default delay time for detecting cable state | ||
| 742 | * after certain time. | ||
| 743 | */ | ||
| 744 | if (muic_pdata->detcable_delay_ms) | ||
| 745 | delay_jiffies = | ||
| 746 | msecs_to_jiffies(muic_pdata->detcable_delay_ms); | ||
| 747 | else | ||
| 748 | delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT); | ||
| 749 | } else { | ||
| 750 | info->path_uart = CONTROL1_SW_UART; | ||
| 737 | info->path_usb = CONTROL1_SW_USB; | 751 | info->path_usb = CONTROL1_SW_USB; |
| 752 | delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT); | ||
| 753 | } | ||
| 738 | 754 | ||
| 739 | /* Set initial path for UART */ | 755 | /* Set initial path for UART */ |
| 740 | max8997_muic_set_path(info, info->path_uart, true); | 756 | max8997_muic_set_path(info, info->path_uart, true); |
| @@ -751,10 +767,6 @@ static int max8997_muic_probe(struct platform_device *pdev) | |||
| 751 | * driver should notify cable state to upper layer. | 767 | * driver should notify cable state to upper layer. |
| 752 | */ | 768 | */ |
| 753 | INIT_DELAYED_WORK(&info->wq_detcable, max8997_muic_detect_cable_wq); | 769 | INIT_DELAYED_WORK(&info->wq_detcable, max8997_muic_detect_cable_wq); |
| 754 | if (pdata->muic_pdata->detcable_delay_ms) | ||
| 755 | delay_jiffies = msecs_to_jiffies(pdata->muic_pdata->detcable_delay_ms); | ||
| 756 | else | ||
| 757 | delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT); | ||
| 758 | schedule_delayed_work(&info->wq_detcable, delay_jiffies); | 770 | schedule_delayed_work(&info->wq_detcable, delay_jiffies); |
| 759 | 771 | ||
| 760 | return 0; | 772 | return 0; |
diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c index 11a2a6538c0b..7c2b14d714b9 100644 --- a/drivers/misc/mei/hw-me.c +++ b/drivers/misc/mei/hw-me.c | |||
| @@ -152,6 +152,20 @@ static void mei_me_intr_disable(struct mei_device *dev) | |||
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | /** | 154 | /** |
| 155 | * mei_me_hw_reset_release - release device from the reset | ||
| 156 | * | ||
| 157 | * @dev: the device structure | ||
| 158 | */ | ||
| 159 | static void mei_me_hw_reset_release(struct mei_device *dev) | ||
| 160 | { | ||
| 161 | struct mei_me_hw *hw = to_me_hw(dev); | ||
| 162 | u32 hcsr = mei_hcsr_read(hw); | ||
| 163 | |||
| 164 | hcsr |= H_IG; | ||
| 165 | hcsr &= ~H_RST; | ||
| 166 | mei_hcsr_set(hw, hcsr); | ||
| 167 | } | ||
| 168 | /** | ||
| 155 | * mei_me_hw_reset - resets fw via mei csr register. | 169 | * mei_me_hw_reset - resets fw via mei csr register. |
| 156 | * | 170 | * |
| 157 | * @dev: the device structure | 171 | * @dev: the device structure |
| @@ -169,18 +183,14 @@ static void mei_me_hw_reset(struct mei_device *dev, bool intr_enable) | |||
| 169 | if (intr_enable) | 183 | if (intr_enable) |
| 170 | hcsr |= H_IE; | 184 | hcsr |= H_IE; |
| 171 | else | 185 | else |
| 172 | hcsr &= ~H_IE; | 186 | hcsr |= ~H_IE; |
| 173 | |||
| 174 | mei_hcsr_set(hw, hcsr); | ||
| 175 | |||
| 176 | hcsr = mei_hcsr_read(hw) | H_IG; | ||
| 177 | hcsr &= ~H_RST; | ||
| 178 | 187 | ||
| 179 | mei_hcsr_set(hw, hcsr); | 188 | mei_hcsr_set(hw, hcsr); |
| 180 | 189 | ||
| 181 | hcsr = mei_hcsr_read(hw); | 190 | if (dev->dev_state == MEI_DEV_POWER_DOWN) |
| 191 | mei_me_hw_reset_release(dev); | ||
| 182 | 192 | ||
| 183 | dev_dbg(&dev->pdev->dev, "current HCSR = 0x%08x.\n", hcsr); | 193 | dev_dbg(&dev->pdev->dev, "current HCSR = 0x%08x.\n", mei_hcsr_read(hw)); |
| 184 | } | 194 | } |
| 185 | 195 | ||
| 186 | /** | 196 | /** |
| @@ -492,7 +502,8 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id) | |||
| 492 | mutex_unlock(&dev->device_lock); | 502 | mutex_unlock(&dev->device_lock); |
| 493 | return IRQ_HANDLED; | 503 | return IRQ_HANDLED; |
| 494 | } else { | 504 | } else { |
| 495 | dev_dbg(&dev->pdev->dev, "FW not ready.\n"); | 505 | dev_dbg(&dev->pdev->dev, "Reset Completed.\n"); |
| 506 | mei_me_hw_reset_release(dev); | ||
| 496 | mutex_unlock(&dev->device_lock); | 507 | mutex_unlock(&dev->device_lock); |
| 497 | return IRQ_HANDLED; | 508 | return IRQ_HANDLED; |
| 498 | } | 509 | } |
diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c index fc3d97ce8300..1ab1fb1db07b 100644 --- a/drivers/misc/mei/init.c +++ b/drivers/misc/mei/init.c | |||
| @@ -199,6 +199,24 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled) | |||
| 199 | mei_cl_all_write_clear(dev); | 199 | mei_cl_all_write_clear(dev); |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | void mei_stop(struct mei_device *dev) | ||
| 203 | { | ||
| 204 | dev_dbg(&dev->pdev->dev, "stopping the device.\n"); | ||
| 205 | |||
| 206 | mutex_lock(&dev->device_lock); | ||
| 207 | |||
| 208 | cancel_delayed_work(&dev->timer_work); | ||
| 209 | |||
| 210 | mei_wd_stop(dev); | ||
| 211 | |||
| 212 | dev->dev_state = MEI_DEV_POWER_DOWN; | ||
| 213 | mei_reset(dev, 0); | ||
| 214 | |||
| 215 | mutex_unlock(&dev->device_lock); | ||
| 216 | |||
| 217 | flush_scheduled_work(); | ||
| 218 | } | ||
| 219 | |||
| 202 | 220 | ||
| 203 | 221 | ||
| 204 | 222 | ||
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h index 1a4b50ca4b3b..d6fd3d6410d6 100644 --- a/drivers/misc/mei/mei_dev.h +++ b/drivers/misc/mei/mei_dev.h | |||
| @@ -395,6 +395,7 @@ static inline u32 mei_data2slots(size_t length) | |||
| 395 | void mei_device_init(struct mei_device *dev); | 395 | void mei_device_init(struct mei_device *dev); |
| 396 | void mei_reset(struct mei_device *dev, int interrupts); | 396 | void mei_reset(struct mei_device *dev, int interrupts); |
| 397 | int mei_hw_init(struct mei_device *dev); | 397 | int mei_hw_init(struct mei_device *dev); |
| 398 | void mei_stop(struct mei_device *dev); | ||
| 398 | 399 | ||
| 399 | /* | 400 | /* |
| 400 | * MEI interrupt functions prototype | 401 | * MEI interrupt functions prototype |
diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c index b40ec0601ab0..b8b5c9c3ad03 100644 --- a/drivers/misc/mei/pci-me.c +++ b/drivers/misc/mei/pci-me.c | |||
| @@ -247,44 +247,14 @@ static void mei_remove(struct pci_dev *pdev) | |||
| 247 | 247 | ||
| 248 | hw = to_me_hw(dev); | 248 | hw = to_me_hw(dev); |
| 249 | 249 | ||
| 250 | mutex_lock(&dev->device_lock); | ||
| 251 | |||
| 252 | cancel_delayed_work(&dev->timer_work); | ||
| 253 | 250 | ||
| 254 | mei_wd_stop(dev); | 251 | dev_err(&pdev->dev, "stop\n"); |
| 252 | mei_stop(dev); | ||
| 255 | 253 | ||
| 256 | mei_pdev = NULL; | 254 | mei_pdev = NULL; |
| 257 | 255 | ||
| 258 | if (dev->iamthif_cl.state == MEI_FILE_CONNECTED) { | ||
| 259 | dev->iamthif_cl.state = MEI_FILE_DISCONNECTING; | ||
| 260 | mei_cl_disconnect(&dev->iamthif_cl); | ||
| 261 | } | ||
| 262 | if (dev->wd_cl.state == MEI_FILE_CONNECTED) { | ||
| 263 | dev->wd_cl.state = MEI_FILE_DISCONNECTING; | ||
| 264 | mei_cl_disconnect(&dev->wd_cl); | ||
| 265 | } | ||
| 266 | |||
| 267 | /* Unregistering watchdog device */ | ||
| 268 | mei_watchdog_unregister(dev); | 256 | mei_watchdog_unregister(dev); |
| 269 | 257 | ||
| 270 | /* remove entry if already in list */ | ||
| 271 | dev_dbg(&pdev->dev, "list del iamthif and wd file list.\n"); | ||
| 272 | |||
| 273 | if (dev->open_handle_count > 0) | ||
| 274 | dev->open_handle_count--; | ||
| 275 | mei_cl_unlink(&dev->wd_cl); | ||
| 276 | |||
| 277 | if (dev->open_handle_count > 0) | ||
| 278 | dev->open_handle_count--; | ||
| 279 | mei_cl_unlink(&dev->iamthif_cl); | ||
| 280 | |||
| 281 | dev->iamthif_current_cb = NULL; | ||
| 282 | dev->me_clients_num = 0; | ||
| 283 | |||
| 284 | mutex_unlock(&dev->device_lock); | ||
| 285 | |||
| 286 | flush_scheduled_work(); | ||
| 287 | |||
| 288 | /* disable interrupts */ | 258 | /* disable interrupts */ |
| 289 | mei_disable_interrupts(dev); | 259 | mei_disable_interrupts(dev); |
| 290 | 260 | ||
| @@ -308,28 +278,20 @@ static int mei_pci_suspend(struct device *device) | |||
| 308 | { | 278 | { |
| 309 | struct pci_dev *pdev = to_pci_dev(device); | 279 | struct pci_dev *pdev = to_pci_dev(device); |
| 310 | struct mei_device *dev = pci_get_drvdata(pdev); | 280 | struct mei_device *dev = pci_get_drvdata(pdev); |
| 311 | int err; | ||
| 312 | 281 | ||
| 313 | if (!dev) | 282 | if (!dev) |
| 314 | return -ENODEV; | 283 | return -ENODEV; |
| 315 | mutex_lock(&dev->device_lock); | ||
| 316 | 284 | ||
| 317 | cancel_delayed_work(&dev->timer_work); | 285 | dev_err(&pdev->dev, "suspend\n"); |
| 318 | 286 | ||
| 319 | /* Stop watchdog if exists */ | 287 | mei_stop(dev); |
| 320 | err = mei_wd_stop(dev); | 288 | |
| 321 | /* Set new mei state */ | 289 | mei_disable_interrupts(dev); |
| 322 | if (dev->dev_state == MEI_DEV_ENABLED || | ||
| 323 | dev->dev_state == MEI_DEV_RECOVERING_FROM_RESET) { | ||
| 324 | dev->dev_state = MEI_DEV_POWER_DOWN; | ||
| 325 | mei_reset(dev, 0); | ||
| 326 | } | ||
| 327 | mutex_unlock(&dev->device_lock); | ||
| 328 | 290 | ||
| 329 | free_irq(pdev->irq, dev); | 291 | free_irq(pdev->irq, dev); |
| 330 | pci_disable_msi(pdev); | 292 | pci_disable_msi(pdev); |
| 331 | 293 | ||
| 332 | return err; | 294 | return 0; |
| 333 | } | 295 | } |
| 334 | 296 | ||
| 335 | static int mei_pci_resume(struct device *device) | 297 | static int mei_pci_resume(struct device *device) |
diff --git a/drivers/misc/vmw_vmci/vmci_datagram.c b/drivers/misc/vmw_vmci/vmci_datagram.c index ed5c433cd493..f3cdd904fe4d 100644 --- a/drivers/misc/vmw_vmci/vmci_datagram.c +++ b/drivers/misc/vmw_vmci/vmci_datagram.c | |||
| @@ -42,9 +42,11 @@ struct datagram_entry { | |||
| 42 | 42 | ||
| 43 | struct delayed_datagram_info { | 43 | struct delayed_datagram_info { |
| 44 | struct datagram_entry *entry; | 44 | struct datagram_entry *entry; |
| 45 | struct vmci_datagram msg; | ||
| 46 | struct work_struct work; | 45 | struct work_struct work; |
| 47 | bool in_dg_host_queue; | 46 | bool in_dg_host_queue; |
| 47 | /* msg and msg_payload must be together. */ | ||
| 48 | struct vmci_datagram msg; | ||
| 49 | u8 msg_payload[]; | ||
| 48 | }; | 50 | }; |
| 49 | 51 | ||
| 50 | /* Number of in-flight host->host datagrams */ | 52 | /* Number of in-flight host->host datagrams */ |
