Commit d108aeb3 authored by Hiroshi DOYU's avatar Hiroshi DOYU

omap mailbox: fix empty struct device for omap_mbox

Since "mbox->dev" doesn't exist and isn't created either at
registration, this patch will create "struct device", which belongs to
"omap-mailbox" class and set this pointer for the member of
"struct omap_mbox".
Signed-off-by: default avatarHiroshi DOYU <Hiroshi.DOYU@nokia.com>
parent da9fc4b9
...@@ -53,7 +53,7 @@ struct omap_mbox { ...@@ -53,7 +53,7 @@ struct omap_mbox {
mbox_msg_t seq_snd, seq_rcv; mbox_msg_t seq_snd, seq_rcv;
struct device dev; struct device *dev;
struct omap_mbox *next; struct omap_mbox *next;
void *priv; void *priv;
...@@ -67,7 +67,7 @@ void omap_mbox_init_seq(struct omap_mbox *); ...@@ -67,7 +67,7 @@ void omap_mbox_init_seq(struct omap_mbox *);
struct omap_mbox *omap_mbox_get(const char *); struct omap_mbox *omap_mbox_get(const char *);
void omap_mbox_put(struct omap_mbox *); void omap_mbox_put(struct omap_mbox *);
int omap_mbox_register(struct omap_mbox *); int omap_mbox_register(struct device *parent, struct omap_mbox *);
int omap_mbox_unregister(struct omap_mbox *); int omap_mbox_unregister(struct omap_mbox *);
#endif /* MAILBOX_H */ #endif /* MAILBOX_H */
/* /*
* OMAP mailbox driver * OMAP mailbox driver
* *
* Copyright (C) 2006 Nokia Corporation. All rights reserved. * Copyright (C) 2006-2008 Nokia Corporation. All rights reserved.
* *
* Contact: Toshihiro Kobayashi <toshihiro.kobayashi@nokia.com> * Contact: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
* Restructured by 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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 write_unlock(&mboxes_lock);
goto err_find;
}
*tmp = mbox; *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) ...@@ -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) ...@@ -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");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment