HSI: core: switch port event notifier from atomic to blocking
port events should be sent from process context after irq_safe runtime pm flag is removed in omap-ssi. Signed-off-By: Sebastian Reichel <sre@kernel.org> Tested-by: Pavel Machek <pavel@ucw.cz>
This commit is contained in:
parent
2083057aac
commit
de5a3774dd
@ -507,7 +507,7 @@ struct hsi_controller *hsi_alloc_controller(unsigned int n_ports, gfp_t flags)
|
|||||||
port[i]->stop_tx = hsi_dummy_cl;
|
port[i]->stop_tx = hsi_dummy_cl;
|
||||||
port[i]->release = hsi_dummy_cl;
|
port[i]->release = hsi_dummy_cl;
|
||||||
mutex_init(&port[i]->lock);
|
mutex_init(&port[i]->lock);
|
||||||
ATOMIC_INIT_NOTIFIER_HEAD(&port[i]->n_head);
|
BLOCKING_INIT_NOTIFIER_HEAD(&port[i]->n_head);
|
||||||
dev_set_name(&port[i]->device, "port%d", i);
|
dev_set_name(&port[i]->device, "port%d", i);
|
||||||
hsi->port[i]->device.release = hsi_port_release;
|
hsi->port[i]->device.release = hsi_port_release;
|
||||||
device_initialize(&hsi->port[i]->device);
|
device_initialize(&hsi->port[i]->device);
|
||||||
@ -689,7 +689,7 @@ int hsi_register_port_event(struct hsi_client *cl,
|
|||||||
cl->ehandler = handler;
|
cl->ehandler = handler;
|
||||||
cl->nb.notifier_call = hsi_event_notifier_call;
|
cl->nb.notifier_call = hsi_event_notifier_call;
|
||||||
|
|
||||||
return atomic_notifier_chain_register(&port->n_head, &cl->nb);
|
return blocking_notifier_chain_register(&port->n_head, &cl->nb);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(hsi_register_port_event);
|
EXPORT_SYMBOL_GPL(hsi_register_port_event);
|
||||||
|
|
||||||
@ -709,7 +709,7 @@ int hsi_unregister_port_event(struct hsi_client *cl)
|
|||||||
|
|
||||||
WARN_ON(!hsi_port_claimed(cl));
|
WARN_ON(!hsi_port_claimed(cl));
|
||||||
|
|
||||||
err = atomic_notifier_chain_unregister(&port->n_head, &cl->nb);
|
err = blocking_notifier_chain_unregister(&port->n_head, &cl->nb);
|
||||||
if (!err)
|
if (!err)
|
||||||
cl->ehandler = NULL;
|
cl->ehandler = NULL;
|
||||||
|
|
||||||
@ -734,7 +734,7 @@ EXPORT_SYMBOL_GPL(hsi_unregister_port_event);
|
|||||||
*/
|
*/
|
||||||
int hsi_event(struct hsi_port *port, unsigned long event)
|
int hsi_event(struct hsi_port *port, unsigned long event)
|
||||||
{
|
{
|
||||||
return atomic_notifier_call_chain(&port->n_head, event, NULL);
|
return blocking_notifier_call_chain(&port->n_head, event, NULL);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(hsi_event);
|
EXPORT_SYMBOL_GPL(hsi_event);
|
||||||
|
|
||||||
|
@ -246,7 +246,7 @@ struct hsi_port {
|
|||||||
int (*stop_tx)(struct hsi_client *cl);
|
int (*stop_tx)(struct hsi_client *cl);
|
||||||
int (*release)(struct hsi_client *cl);
|
int (*release)(struct hsi_client *cl);
|
||||||
/* private */
|
/* private */
|
||||||
struct atomic_notifier_head n_head;
|
struct blocking_notifier_head n_head;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define to_hsi_port(dev) container_of(dev, struct hsi_port, device)
|
#define to_hsi_port(dev) container_of(dev, struct hsi_port, device)
|
||||||
|
Loading…
Reference in New Issue
Block a user