From 63548344322af50d8dfd0871431499dbca4e17c9 Mon Sep 17 00:00:00 2001 From: nns779 Date: Mon, 19 Aug 2019 01:42:08 +0900 Subject: [PATCH] =?UTF-8?q?driver/isdb2056:=2010=E7=A7=92=E6=AF=8E?= =?UTF-8?q?=E3=81=AB=E3=83=87=E3=83=90=E3=82=A4=E3=82=B9=E3=81=AB=E3=82=A2?= =?UTF-8?q?=E3=82=AF=E3=82=BB=E3=82=B9=E3=81=97=E7=B6=9A=E3=81=91=E3=82=8B?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- driver/isdb2056.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/driver/isdb2056.c b/driver/isdb2056.c index a31bbea..ffa0219 100644 --- a/driver/isdb2056.c +++ b/driver/isdb2056.c @@ -87,6 +87,8 @@ struct isdb2056_device { struct isdb2056_tsdev tsdev[TSDEV_NUM]; struct isdb2056_stream_context *stream_context; struct cdev cdev; + struct workqueue_struct *dev_wq; + struct delayed_work dev_work; #ifdef PSB_DEBUG struct workqueue_struct *psb_wq; struct delayed_work psb_work; @@ -1432,6 +1434,23 @@ static struct file_operations isdb2056_tsdev_fops = { .unlocked_ioctl = isdb2056_tsdev_unlocked_ioctl }; +static void isdb2056_dev_workqueue_handler(struct work_struct *w) +{ + int ret = 0; + struct isdb2056_device *isdb2056 = container_of(to_delayed_work(w), struct isdb2056_device, dev_work); + struct it930x_bridge *it930x = &isdb2056->it930x; + u8 val; + + ret = it930x_read_reg(it930x, 0x1222, &val); + if (ret) + return; + + if (atomic_read(&isdb2056->avail)) + queue_delayed_work(isdb2056->dev_wq, to_delayed_work(w), msecs_to_jiffies(10000)); + + return; +} + static int isdb2056_probe(struct usb_interface *intf, const struct usb_device_id *id) { struct device *dev = &intf->dev; @@ -1604,6 +1623,12 @@ static int isdb2056_probe(struct usb_interface *intf, const struct usb_device_id usb_set_intfdata(intf, isdb2056); + INIT_DELAYED_WORK(&isdb2056->dev_work, isdb2056_dev_workqueue_handler); + + isdb2056->dev_wq = create_singlethread_workqueue("isdb2056_dev_workqueue"); + if (isdb2056->dev_wq) + queue_delayed_work(isdb2056->dev_wq, &isdb2056->dev_work, msecs_to_jiffies(10000)); + return 0; fail: @@ -1670,6 +1695,13 @@ static void isdb2056_disconnect(struct usb_interface *intf) ref = atomic_read(&isdb2056->ref); } + if (isdb2056->dev_wq) { + cancel_delayed_work_sync(&isdb2056->dev_work); + flush_workqueue(isdb2056->dev_wq); + destroy_workqueue(isdb2056->dev_wq); + isdb2056->dev_wq = NULL; + } + put_device(isdb2056->dev); // uninitialize