summaryrefslogtreecommitdiff
path: root/lwis_device.c
diff options
context:
space:
mode:
Diffstat (limited to 'lwis_device.c')
-rw-r--r--lwis_device.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/lwis_device.c b/lwis_device.c
index 1ff65b2..60b5dc4 100644
--- a/lwis_device.c
+++ b/lwis_device.c
@@ -41,6 +41,7 @@
#include "lwis_util.h"
#include "lwis_version.h"
#include "lwis_trace.h"
+#include "lwis_i2c_bus_manager.h"
#ifdef CONFIG_OF
#include "lwis_dt.h"
@@ -84,6 +85,13 @@ static void transaction_work_func(struct kthread_work *work)
lwis_process_worker_queue(client);
}
+static void i2c_process_work_func(struct kthread_work *work)
+{
+ /* i2c_work stores the context of the lwis_client submitting the transfer request */
+ struct lwis_client *client = container_of(work, struct lwis_client, i2c_work);
+ lwis_i2c_bus_manager_process_worker_queue(client);
+}
+
/*
* lwis_open: Opening an instance of a LWIS device
*/
@@ -135,6 +143,7 @@ static int lwis_open(struct inode *node, struct file *fp)
lwis_allocator_init(lwis_dev);
kthread_init_work(&lwis_client->transaction_work, transaction_work_func);
+ kthread_init_work(&lwis_client->i2c_work, i2c_process_work_func);
/* Start transaction processor task */
lwis_transaction_init(lwis_client);
@@ -226,6 +235,7 @@ static int lwis_release_client(struct lwis_client *lwis_client)
spin_unlock_irqrestore(&lwis_dev->lock, flags);
kfree(lwis_client);
+
return 0;
}
@@ -1588,6 +1598,10 @@ void lwis_base_unprobe(struct lwis_device *unprobe_lwis_dev)
&lwis_dev->plat_dev->dev);
lwis_dev->irq_gpios_info.gpios = NULL;
}
+
+ /* Disconnect from the bus manager */
+ lwis_i2c_bus_manager_disconnect(lwis_dev);
+
/* Destroy device */
if (!IS_ERR_OR_NULL(lwis_dev->dev)) {
device_destroy(core.dev_class,