summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLee Jones <lee.jones@linaro.org>2019-09-05 15:24:12 -0400
committerWolfram Sang <wsa@the-dreams.de>2019-09-28 13:47:04 -0400
commit127068abe85bf3dee50df51cb039a5a987a4a666 (patch)
tree65c5b3adc3cdd995e5a2e7d02f1aba6c5eda7bba
parentaefcf2f4b58155d27340ba5f9ddbe9513da8286d (diff)
i2c: qcom-geni: Disable DMA processing on the Lenovo Yoga C630
We have a production-level laptop (Lenovo Yoga C630) which is exhibiting a rather horrific bug. When I2C HID devices are being scanned for at boot-time the QCom Geni based I2C (Serial Engine) attempts to use DMA. When it does, the laptop reboots and the user never sees the OS. Attempts are being made to debug the reason for the spontaneous reboot. No luck so far, hence the requirement for this hot-fix. This workaround will be removed once we have a viable fix. Signed-off-by: Lee Jones <lee.jones@linaro.org> Tested-by: Bjorn Andersson <bjorn.andersson@linaro.org> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
-rw-r--r--drivers/i2c/busses/i2c-qcom-geni.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c
index a89bfce5388e..17abf60c94ae 100644
--- a/drivers/i2c/busses/i2c-qcom-geni.c
+++ b/drivers/i2c/busses/i2c-qcom-geni.c
@@ -355,11 +355,13 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
355{ 355{
356 dma_addr_t rx_dma; 356 dma_addr_t rx_dma;
357 unsigned long time_left; 357 unsigned long time_left;
358 void *dma_buf; 358 void *dma_buf = NULL;
359 struct geni_se *se = &gi2c->se; 359 struct geni_se *se = &gi2c->se;
360 size_t len = msg->len; 360 size_t len = msg->len;
361 361
362 dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); 362 if (!of_machine_is_compatible("lenovo,yoga-c630"))
363 dma_buf = i2c_get_dma_safe_msg_buf(msg, 32);
364
363 if (dma_buf) 365 if (dma_buf)
364 geni_se_select_mode(se, GENI_SE_DMA); 366 geni_se_select_mode(se, GENI_SE_DMA);
365 else 367 else
@@ -394,11 +396,13 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
394{ 396{
395 dma_addr_t tx_dma; 397 dma_addr_t tx_dma;
396 unsigned long time_left; 398 unsigned long time_left;
397 void *dma_buf; 399 void *dma_buf = NULL;
398 struct geni_se *se = &gi2c->se; 400 struct geni_se *se = &gi2c->se;
399 size_t len = msg->len; 401 size_t len = msg->len;
400 402
401 dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); 403 if (!of_machine_is_compatible("lenovo,yoga-c630"))
404 dma_buf = i2c_get_dma_safe_msg_buf(msg, 32);
405
402 if (dma_buf) 406 if (dma_buf)
403 geni_se_select_mode(se, GENI_SE_DMA); 407 geni_se_select_mode(se, GENI_SE_DMA);
404 else 408 else