|
@@ -1,10 +1,9 @@
|
|
/*
|
|
/*
|
|
* OMAP mailbox driver
|
|
* OMAP mailbox driver
|
|
*
|
|
*
|
|
- * Copyright (C) 2006 Nokia Corporation. All rights reserved.
|
|
|
|
|
|
+ * Copyright (C) 2006-2009 Nokia Corporation. All rights reserved.
|
|
*
|
|
*
|
|
- * Contact: Toshihiro Kobayashi <toshihiro.kobayashi@nokia.com>
|
|
|
|
- * Restructured by Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
|
|
|
|
|
|
+ * Contact: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
|
|
*
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* modify it under the terms of the GNU General Public License
|
|
@@ -136,7 +135,7 @@ static void mbox_rx_work(struct work_struct *work)
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
|
|
if (mbox->rxq->callback == NULL) {
|
|
if (mbox->rxq->callback == NULL) {
|
|
- sysfs_notify(&mbox->dev.kobj, NULL, "mbox");
|
|
|
|
|
|
+ sysfs_notify(&mbox->dev->kobj, NULL, "mbox");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -204,7 +203,7 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
|
|
/* no more messages in the fifo. clear IRQ source. */
|
|
/* no more messages in the fifo. clear IRQ source. */
|
|
ack_mbox_irq(mbox, IRQ_RX);
|
|
ack_mbox_irq(mbox, IRQ_RX);
|
|
enable_mbox_irq(mbox, IRQ_RX);
|
|
enable_mbox_irq(mbox, IRQ_RX);
|
|
- nomem:
|
|
|
|
|
|
+nomem:
|
|
schedule_work(&mbox->rxq->work);
|
|
schedule_work(&mbox->rxq->work);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -286,7 +285,7 @@ static ssize_t mbox_show(struct class *class, char *buf)
|
|
static CLASS_ATTR(mbox, S_IRUGO, mbox_show, NULL);
|
|
static CLASS_ATTR(mbox, S_IRUGO, mbox_show, NULL);
|
|
|
|
|
|
static struct class omap_mbox_class = {
|
|
static struct class omap_mbox_class = {
|
|
- .name = "omap_mbox",
|
|
|
|
|
|
+ .name = "omap-mailbox",
|
|
};
|
|
};
|
|
|
|
|
|
static struct omap_mbox_queue *mbox_queue_alloc(struct omap_mbox *mbox,
|
|
static struct omap_mbox_queue *mbox_queue_alloc(struct omap_mbox *mbox,
|
|
@@ -333,21 +332,6 @@ static int omap_mbox_init(struct omap_mbox *mbox)
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
- mbox->dev.class = &omap_mbox_class;
|
|
|
|
- dev_set_name(&mbox->dev, "%s", mbox->name);
|
|
|
|
- dev_set_drvdata(&mbox->dev, mbox);
|
|
|
|
-
|
|
|
|
- ret = device_register(&mbox->dev);
|
|
|
|
- if (unlikely(ret))
|
|
|
|
- goto fail_device_reg;
|
|
|
|
-
|
|
|
|
- ret = device_create_file(&mbox->dev, &dev_attr_mbox);
|
|
|
|
- if (unlikely(ret)) {
|
|
|
|
- printk(KERN_ERR
|
|
|
|
- "device_create_file failed: %d\n", ret);
|
|
|
|
- goto fail_create_mbox;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
ret = request_irq(mbox->irq, mbox_interrupt, IRQF_DISABLED,
|
|
ret = request_irq(mbox->irq, mbox_interrupt, IRQF_DISABLED,
|
|
mbox->name, mbox);
|
|
mbox->name, mbox);
|
|
if (unlikely(ret)) {
|
|
if (unlikely(ret)) {
|
|
@@ -377,10 +361,6 @@ static int omap_mbox_init(struct omap_mbox *mbox)
|
|
fail_alloc_txq:
|
|
fail_alloc_txq:
|
|
free_irq(mbox->irq, mbox);
|
|
free_irq(mbox->irq, mbox);
|
|
fail_request_irq:
|
|
fail_request_irq:
|
|
- device_remove_file(&mbox->dev, &dev_attr_mbox);
|
|
|
|
- fail_create_mbox:
|
|
|
|
- device_unregister(&mbox->dev);
|
|
|
|
- fail_device_reg:
|
|
|
|
if (unlikely(mbox->ops->shutdown))
|
|
if (unlikely(mbox->ops->shutdown))
|
|
mbox->ops->shutdown(mbox);
|
|
mbox->ops->shutdown(mbox);
|
|
|
|
|
|
@@ -393,8 +373,6 @@ static void omap_mbox_fini(struct omap_mbox *mbox)
|
|
mbox_queue_free(mbox->rxq);
|
|
mbox_queue_free(mbox->rxq);
|
|
|
|
|
|
free_irq(mbox->irq, mbox);
|
|
free_irq(mbox->irq, mbox);
|
|
- device_remove_file(&mbox->dev, &dev_attr_mbox);
|
|
|
|
- class_unregister(&omap_mbox_class);
|
|
|
|
|
|
|
|
if (unlikely(mbox->ops->shutdown))
|
|
if (unlikely(mbox->ops->shutdown))
|
|
mbox->ops->shutdown(mbox);
|
|
mbox->ops->shutdown(mbox);
|
|
@@ -440,7 +418,7 @@ void omap_mbox_put(struct omap_mbox *mbox)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(omap_mbox_put);
|
|
EXPORT_SYMBOL(omap_mbox_put);
|
|
|
|
|
|
-int omap_mbox_register(struct omap_mbox *mbox)
|
|
|
|
|
|
+int omap_mbox_register(struct device *parent, struct omap_mbox *mbox)
|
|
{
|
|
{
|
|
int ret = 0;
|
|
int ret = 0;
|
|
struct omap_mbox **tmp;
|
|
struct omap_mbox **tmp;
|
|
@@ -450,14 +428,31 @@ int omap_mbox_register(struct omap_mbox *mbox)
|
|
if (mbox->next)
|
|
if (mbox->next)
|
|
return -EBUSY;
|
|
return -EBUSY;
|
|
|
|
|
|
|
|
+ mbox->dev = device_create(&omap_mbox_class,
|
|
|
|
+ parent, 0, mbox, "%s", mbox->name);
|
|
|
|
+ if (IS_ERR(mbox->dev))
|
|
|
|
+ return PTR_ERR(mbox->dev);
|
|
|
|
+
|
|
|
|
+ ret = device_create_file(mbox->dev, &dev_attr_mbox);
|
|
|
|
+ if (ret)
|
|
|
|
+ goto err_sysfs;
|
|
|
|
+
|
|
write_lock(&mboxes_lock);
|
|
write_lock(&mboxes_lock);
|
|
tmp = find_mboxes(mbox->name);
|
|
tmp = find_mboxes(mbox->name);
|
|
- if (*tmp)
|
|
|
|
|
|
+ if (*tmp) {
|
|
ret = -EBUSY;
|
|
ret = -EBUSY;
|
|
- else
|
|
|
|
- *tmp = mbox;
|
|
|
|
|
|
+ write_unlock(&mboxes_lock);
|
|
|
|
+ goto err_find;
|
|
|
|
+ }
|
|
|
|
+ *tmp = mbox;
|
|
write_unlock(&mboxes_lock);
|
|
write_unlock(&mboxes_lock);
|
|
|
|
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+err_find:
|
|
|
|
+ device_remove_file(mbox->dev, &dev_attr_mbox);
|
|
|
|
+err_sysfs:
|
|
|
|
+ device_unregister(mbox->dev);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(omap_mbox_register);
|
|
EXPORT_SYMBOL(omap_mbox_register);
|
|
@@ -473,6 +468,8 @@ int omap_mbox_unregister(struct omap_mbox *mbox)
|
|
*tmp = mbox->next;
|
|
*tmp = mbox->next;
|
|
mbox->next = NULL;
|
|
mbox->next = NULL;
|
|
write_unlock(&mboxes_lock);
|
|
write_unlock(&mboxes_lock);
|
|
|
|
+ device_remove_file(mbox->dev, &dev_attr_mbox);
|
|
|
|
+ device_unregister(mbox->dev);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
tmp = &(*tmp)->next;
|
|
tmp = &(*tmp)->next;
|
|
@@ -501,4 +498,6 @@ static void __exit omap_mbox_class_exit(void)
|
|
subsys_initcall(omap_mbox_class_init);
|
|
subsys_initcall(omap_mbox_class_init);
|
|
module_exit(omap_mbox_class_exit);
|
|
module_exit(omap_mbox_class_exit);
|
|
|
|
|
|
-MODULE_LICENSE("GPL");
|
|
|
|
|
|
+MODULE_LICENSE("GPL v2");
|
|
|
|
+MODULE_DESCRIPTION("omap mailbox: interrupt driven messaging");
|
|
|
|
+MODULE_AUTHOR("Toshihiro Kobayashi and Hiroshi DOYU");
|