mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-02-04 01:57:59 +00:00
staging: most: i2c: remove redundant list_mutex
The elements of the dev->rx.list are consumed in the pending_rx_work and populated in the function enqueue() that cancels the pending_rx_work. The function enqueue() and poison_channel() do not race anyway. Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de> Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
6471c2693f
commit
eb50842c5f
@ -46,7 +46,6 @@ struct hdm_i2c {
|
|||||||
struct rx {
|
struct rx {
|
||||||
struct delayed_work dwork;
|
struct delayed_work dwork;
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
struct mutex list_mutex;
|
|
||||||
bool int_disabled;
|
bool int_disabled;
|
||||||
unsigned int delay;
|
unsigned int delay;
|
||||||
} rx;
|
} rx;
|
||||||
@ -139,9 +138,7 @@ static int enqueue(struct most_interface *most_iface,
|
|||||||
if (!dev->polling_mode)
|
if (!dev->polling_mode)
|
||||||
disable_irq(dev->client->irq);
|
disable_irq(dev->client->irq);
|
||||||
cancel_delayed_work_sync(&dev->rx.dwork);
|
cancel_delayed_work_sync(&dev->rx.dwork);
|
||||||
mutex_lock(&dev->rx.list_mutex);
|
|
||||||
list_add_tail(&mbo->list, &dev->rx.list);
|
list_add_tail(&mbo->list, &dev->rx.list);
|
||||||
mutex_unlock(&dev->rx.list_mutex);
|
|
||||||
if (dev->rx.int_disabled || dev->polling_mode)
|
if (dev->rx.int_disabled || dev->polling_mode)
|
||||||
pending_rx_work(&dev->rx.dwork.work);
|
pending_rx_work(&dev->rx.dwork.work);
|
||||||
if (!dev->polling_mode)
|
if (!dev->polling_mode)
|
||||||
@ -186,19 +183,14 @@ static int poison_channel(struct most_interface *most_iface,
|
|||||||
free_irq(dev->client->irq, dev);
|
free_irq(dev->client->irq, dev);
|
||||||
cancel_delayed_work_sync(&dev->rx.dwork);
|
cancel_delayed_work_sync(&dev->rx.dwork);
|
||||||
|
|
||||||
mutex_lock(&dev->rx.list_mutex);
|
|
||||||
while (!list_empty(&dev->rx.list)) {
|
while (!list_empty(&dev->rx.list)) {
|
||||||
mbo = list_first_mbo(&dev->rx.list);
|
mbo = list_first_mbo(&dev->rx.list);
|
||||||
list_del(&mbo->list);
|
list_del(&mbo->list);
|
||||||
mutex_unlock(&dev->rx.list_mutex);
|
|
||||||
|
|
||||||
mbo->processed_length = 0;
|
mbo->processed_length = 0;
|
||||||
mbo->status = MBO_E_CLOSE;
|
mbo->status = MBO_E_CLOSE;
|
||||||
mbo->complete(mbo);
|
mbo->complete(mbo);
|
||||||
|
|
||||||
mutex_lock(&dev->rx.list_mutex);
|
|
||||||
}
|
}
|
||||||
mutex_unlock(&dev->rx.list_mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -231,10 +223,8 @@ static void do_rx_work(struct hdm_i2c *dev)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_lock(&dev->rx.list_mutex);
|
|
||||||
mbo = list_first_mbo(&dev->rx.list);
|
mbo = list_first_mbo(&dev->rx.list);
|
||||||
list_del(&mbo->list);
|
list_del(&mbo->list);
|
||||||
mutex_unlock(&dev->rx.list_mutex);
|
|
||||||
|
|
||||||
mbo->processed_length = min(data_size, mbo->buffer_length);
|
mbo->processed_length = min(data_size, mbo->buffer_length);
|
||||||
memcpy(mbo->virt_address, msg, mbo->processed_length);
|
memcpy(mbo->virt_address, msg, mbo->processed_length);
|
||||||
@ -251,12 +241,8 @@ static void do_rx_work(struct hdm_i2c *dev)
|
|||||||
static void pending_rx_work(struct work_struct *work)
|
static void pending_rx_work(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct hdm_i2c *dev = container_of(work, struct hdm_i2c, rx.dwork.work);
|
struct hdm_i2c *dev = container_of(work, struct hdm_i2c, rx.dwork.work);
|
||||||
bool empty;
|
|
||||||
|
|
||||||
mutex_lock(&dev->rx.list_mutex);
|
if (list_empty(&dev->rx.list))
|
||||||
empty = list_empty(&dev->rx.list);
|
|
||||||
mutex_unlock(&dev->rx.list_mutex);
|
|
||||||
if (empty)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
do_rx_work(dev);
|
do_rx_work(dev);
|
||||||
@ -340,7 +326,6 @@ static int i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|||||||
dev->most_iface.poison_channel = poison_channel;
|
dev->most_iface.poison_channel = poison_channel;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&dev->rx.list);
|
INIT_LIST_HEAD(&dev->rx.list);
|
||||||
mutex_init(&dev->rx.list_mutex);
|
|
||||||
|
|
||||||
INIT_DELAYED_WORK(&dev->rx.dwork, pending_rx_work);
|
INIT_DELAYED_WORK(&dev->rx.dwork, pending_rx_work);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user