| From 2db82f3755d50d6b723e283b6f92a3b9f51cb195 Mon Sep 17 00:00:00 2001 |
| From: Lee Jones <lee.jones@linaro.org> |
| Date: Thu, 5 Sep 2019 20:24:12 +0100 |
| Subject: [PATCH] i2c: qcom-geni: Disable DMA processing on the Lenovo Yoga |
| C630 |
| |
| commit 127068abe85bf3dee50df51cb039a5a987a4a666 upstream. |
| |
| 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> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c |
| index db075bc0d952..715ddc5d0eac 100644 |
| --- a/drivers/i2c/busses/i2c-qcom-geni.c |
| +++ b/drivers/i2c/busses/i2c-qcom-geni.c |
| @@ -354,11 +354,13 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, |
| { |
| dma_addr_t rx_dma; |
| unsigned long time_left; |
| - void *dma_buf; |
| + void *dma_buf = NULL; |
| struct geni_se *se = &gi2c->se; |
| size_t len = msg->len; |
| |
| - dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); |
| + if (!of_machine_is_compatible("lenovo,yoga-c630")) |
| + dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); |
| + |
| if (dma_buf) |
| geni_se_select_mode(se, GENI_SE_DMA); |
| else |
| @@ -393,11 +395,13 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, |
| { |
| dma_addr_t tx_dma; |
| unsigned long time_left; |
| - void *dma_buf; |
| + void *dma_buf = NULL; |
| struct geni_se *se = &gi2c->se; |
| size_t len = msg->len; |
| |
| - dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); |
| + if (!of_machine_is_compatible("lenovo,yoga-c630")) |
| + dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); |
| + |
| if (dma_buf) |
| geni_se_select_mode(se, GENI_SE_DMA); |
| else |
| -- |
| 2.7.4 |
| |