aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/4121-mp2-i2c-error-handling-in-read-write-operation.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/4121-mp2-i2c-error-handling-in-read-write-operation.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/4121-mp2-i2c-error-handling-in-read-write-operation.patch130
1 files changed, 130 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/4121-mp2-i2c-error-handling-in-read-write-operation.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/4121-mp2-i2c-error-handling-in-read-write-operation.patch
new file mode 100644
index 00000000..55a56dde
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/4121-mp2-i2c-error-handling-in-read-write-operation.patch
@@ -0,0 +1,130 @@
+From 7363ed0c57b235e95e07d7c9bff6eeeee671203a Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Sun, 19 Aug 2018 10:45:25 +0530
+Subject: [PATCH 4121/4131] mp2-i2c error handling in read/write operation
+
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/i2c/busses/i2c-amd-pci-mp2.c | 13 +++++++++++++
+ drivers/i2c/busses/i2c-amd-platdrv.c | 37 ++++++++++++++++++++++++++++++++----
+ 2 files changed, 46 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/i2c/busses/i2c-amd-pci-mp2.c b/drivers/i2c/busses/i2c-amd-pci-mp2.c
+index 15d671a..1804141 100644
+--- a/drivers/i2c/busses/i2c-amd-pci-mp2.c
++++ b/drivers/i2c/busses/i2c-amd-pci-mp2.c
+@@ -270,6 +270,19 @@ static void amd_mp2_pci_work(struct work_struct *work)
+ privdata->ops->connect_complete(privdata->eventval,
+ privdata->i2c_dev_ctx);
+ } else {
++ if (sts == i2c_busenable_failed) {
++ if (privdata->ops->connect_complete)
++ privdata->ops->connect_complete(privdata->eventval,
++ privdata->i2c_dev_ctx);
++ }else if (sts == i2c_writefail_event) {
++ if (privdata->ops->write_complete)
++ privdata->ops->write_complete(privdata->eventval,
++ privdata->i2c_dev_ctx);
++ }else if (sts == i2c_readfail_event) {
++ if (privdata->ops->read_complete)
++ privdata->ops->read_complete(privdata->eventval,
++ privdata->i2c_dev_ctx);
++ } else
+ dev_err(ndev_dev(privdata), "ERROR!!nothing to be handled !\n");
+ }
+ }
+diff --git a/drivers/i2c/busses/i2c-amd-platdrv.c b/drivers/i2c/busses/i2c-amd-platdrv.c
+index 090f087..2f3d2ad 100644
+--- a/drivers/i2c/busses/i2c-amd-platdrv.c
++++ b/drivers/i2c/busses/i2c-amd-platdrv.c
+@@ -67,6 +67,7 @@ struct amd_i2c_dev {
+ struct i2c_msg *msg_buf;
+ bool is_configured;
+ u8 bus_id;
++ u16 err;
+
+ };
+
+@@ -102,7 +103,10 @@ static int i2c_amd_read_completion(struct i2c_event event, void *dev_ctx)
+ DRIVER_NAME, __func__, ((unsigned int *)
+ commond->read_cfg.buf)[i]);
+ }
+-
++ i2c_dev->err = i2c_readcomplete_event;
++ complete(&i2c_dev->msg_complete);
++ } else {
++ i2c_dev->err = i2c_readfail_event;
+ complete(&i2c_dev->msg_complete);
+ }
+
+@@ -113,8 +117,13 @@ static int i2c_amd_write_completion(struct i2c_event event, void *dev_ctx)
+ {
+ struct amd_i2c_dev *i2c_dev = (struct amd_i2c_dev *)dev_ctx;
+
+- if (event.base.r.status == i2c_writecomplete_event)
++ if (event.base.r.status == i2c_writecomplete_event) {
++ i2c_dev->err = i2c_writecomplete_event;
++ complete(&i2c_dev->msg_complete);
++ } else {
++ i2c_dev->err = i2c_writefail_event;
+ complete(&i2c_dev->msg_complete);
++ }
+
+ return 0;
+ }
+@@ -123,9 +132,13 @@ static int i2c_amd_connect_completion(struct i2c_event event, void *dev_ctx)
+ {
+ struct amd_i2c_dev *i2c_dev = (struct amd_i2c_dev *)dev_ctx;
+
+- if (event.base.r.status == i2c_busenable_complete)
++ if (event.base.r.status == i2c_busenable_complete) {
++ i2c_dev->err = i2c_busenable_complete;
+ complete(&i2c_dev->msg_complete);
+-
++ } else {
++ i2c_dev->err = i2c_busenable_failed;
++ complete(&i2c_dev->msg_complete);
++ }
+ return 0;
+ }
+
+@@ -211,6 +224,13 @@ static int i2c_amd_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
+ else
+ dma_free_coherent(&i2c_common->pdev->dev,
+ pmsg->len, buf, phys);
++
++ if((timeout == 0)||(dev->err != i2c_readcomplete_event)) {
++ if(dev->err != i2c_readcomplete_event)
++ return -EIO;
++ else
++ return -ETIMEDOUT;
++ }
+ } else {
+ i2c_common->write_cfg.buf = (unsigned int *)pmsg->buf;
+ i2c_common->write_cfg.length = pmsg->len;
+@@ -219,6 +239,12 @@ static int i2c_amd_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
+
+ timeout = wait_for_completion_timeout
+ (&dev->msg_complete, 50);
++ if((timeout == 0)||(dev->err != i2c_writecomplete_event)) {
++ if(dev->err != i2c_writecomplete_event)
++ return -EIO;
++ else
++ return -ETIMEDOUT;
++ }
+ }
+ }
+ return num;
+@@ -281,6 +307,9 @@ static int i2c_amd_probe(struct platform_device *pdev)
+ pr_err("%s Could not find pdev in i2c\n", __func__);
+ return -EINVAL;
+ }
++
++ i2c_dev->err = i2C_bus_notinitialized;
++
+ platform_set_drvdata(pdev, i2c_dev);
+
+ i2c_set_adapdata(&i2c_dev->adapter, i2c_dev);
+--
+2.7.4
+