Message ID | 20190905102247.27583-1-lee.jones@linaro.org |
---|---|
State | New |
Headers | show |
Series | [v3,1/1] i2c: qcom-geni: Provide an option to disable DMA processing | expand |
Hi Lee, I understand you are in a hurry, but please double check before sending... On Thu, Sep 05, 2019 at 11:22:47AM +0100, Lee Jones wrote: > 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. > > The beautiful thing about this approach is that, *if* the Geni SE DMA > ever starts working, we can remove the C code and any old properties > left in older DTs just become NOOP. Older kernels with newer DTs (less > of a priority) *still* will not work - but they do not work now anyway. ... becasue this paragraph doesn't fit anymore. Needs to be reworded. > > Fixes: 8bc529b25354 ("soc: qcom: geni: Add support for ACPI") As said in the other thread, I don't get it, but this is not a show stopper for me. > Signed-off-by: Lee Jones <lee.jones@linaro.org> > Reviewed-by: Vinod Koul <vkoul@kernel.org> I'd like Vinod to resend his review. Because IMO the change since v2 was not trivial, so the old rev-by has to be dropped. Other than that, the code looks good to me! Regards, Wolfram
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, { 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 @@ -394,11 +396,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