author | Dan Murphy <dmurphy@ti.com> | |
Thu, 14 Mar 2013 12:24:00 +0000 (07:24 -0500) | ||
committer | Dan Murphy <dmurphy@ti.com> | |
Thu, 14 Mar 2013 12:24:00 +0000 (07:24 -0500) |
TI-Feature: mailbox_ipc_base
TI-Tree: git://gitorious.ti.com/rpmsg/mailbox
TI-Branch: mailbox-linux-3.8.y
* mailbox-linux-3.8.y:
mailbox: omap2+: fix kernel memory corruption in driver remove
mailbox: mark mailbox structure name fields as const
mailbox: convert intermediate spaces to tabs
Signed-off-by: Dan Murphy <dmurphy@ti.com>
TI-Tree: git://gitorious.ti.com/rpmsg/mailbox
TI-Branch: mailbox-linux-3.8.y
* mailbox-linux-3.8.y:
mailbox: omap2+: fix kernel memory corruption in driver remove
mailbox: mark mailbox structure name fields as const
mailbox: convert intermediate spaces to tabs
Signed-off-by: Dan Murphy <dmurphy@ti.com>
index 37209ae01148105e34e912b77882dea41ee70bc9..2d4f9c02dccf29cae8b5e322f046fed2ca252cb4 100644 (file)
struct omap_hwmod *oh;
struct platform_device *pdev;
struct omap_mbox_pdata *pdata;
- u32 pdata_len;
oh = omap_hwmod_lookup("mailbox");
if (!oh) {
}
pdata = (struct omap_mbox_pdata *)oh->dev_attr;
- pdata_len = (pdata->info_cnt * (sizeof(struct omap_mbox_dev_info))) +
- (2 * sizeof(u32));
- pdev = omap_device_build("omap-mailbox", -1, oh, pdata, pdata_len,
+ pdev = omap_device_build("omap-mailbox", -1, oh, pdata, sizeof(*pdata),
NULL, 0, 0);
WARN(IS_ERR(pdev), "%s: could not build device, err %ld\n",
__func__, PTR_ERR(pdev));
index 5b0f2c174791d25532181fe7f1eaa2c4429f6faf..44418726d23db6222e910fcb35ddde3a10f4f4de 100644 (file)
#include "mailbox_internal.h"
-#define MAILBOX_ARM2DSP1 0x00
-#define MAILBOX_ARM2DSP1b 0x04
-#define MAILBOX_DSP2ARM1 0x08
-#define MAILBOX_DSP2ARM1b 0x0c
-#define MAILBOX_DSP2ARM2 0x10
-#define MAILBOX_DSP2ARM2b 0x14
-#define MAILBOX_ARM2DSP1_Flag 0x18
-#define MAILBOX_DSP2ARM1_Flag 0x1c
-#define MAILBOX_DSP2ARM2_Flag 0x20
+#define MAILBOX_ARM2DSP1 0x00
+#define MAILBOX_ARM2DSP1b 0x04
+#define MAILBOX_DSP2ARM1 0x08
+#define MAILBOX_DSP2ARM1b 0x0c
+#define MAILBOX_DSP2ARM2 0x10
+#define MAILBOX_DSP2ARM2b 0x14
+#define MAILBOX_ARM2DSP1_Flag 0x18
+#define MAILBOX_DSP2ARM1_Flag 0x1c
+#define MAILBOX_DSP2ARM2_Flag 0x20
static void __iomem *mbox_base;
return mbox_read_reg(fifo->flag);
}
-static int ompa1_mbox_poll_for_space(struct mailbox *mbox)
+static int omap1_mbox_poll_for_space(struct mailbox *mbox)
{
int ret = 0, i = 1000;
}
static struct mailbox_ops omap1_mbox_ops = {
- .type = MBOX_HW_FIFO1_TYPE,
- .read = omap1_mbox_fifo_read,
- .write = omap1_mbox_fifo_write,
- .empty = omap1_mbox_fifo_empty,
- .poll_for_space = ompa1_mbox_poll_for_space,
- .enable_irq = omap1_mbox_enable_irq,
- .disable_irq = omap1_mbox_disable_irq,
- .is_irq = omap1_mbox_is_irq,
+ .type = MBOX_HW_FIFO1_TYPE,
+ .read = omap1_mbox_fifo_read,
+ .write = omap1_mbox_fifo_write,
+ .empty = omap1_mbox_fifo_empty,
+ .poll_for_space = omap1_mbox_poll_for_space,
+ .enable_irq = omap1_mbox_enable_irq,
+ .disable_irq = omap1_mbox_disable_irq,
+ .is_irq = omap1_mbox_is_irq,
};
/* FIXME: the following struct should be created automatically by the user id */
/* DSP */
static struct omap_mbox1_priv omap1_mbox_dsp_priv = {
.tx_fifo = {
- .cmd = MAILBOX_ARM2DSP1b,
- .data = MAILBOX_ARM2DSP1,
- .flag = MAILBOX_ARM2DSP1_Flag,
+ .cmd = MAILBOX_ARM2DSP1b,
+ .data = MAILBOX_ARM2DSP1,
+ .flag = MAILBOX_ARM2DSP1_Flag,
},
.rx_fifo = {
- .cmd = MAILBOX_DSP2ARM1b,
- .data = MAILBOX_DSP2ARM1,
- .flag = MAILBOX_DSP2ARM1_Flag,
+ .cmd = MAILBOX_DSP2ARM1b,
+ .data = MAILBOX_DSP2ARM1,
+ .flag = MAILBOX_DSP2ARM1_Flag,
},
};
static struct mailbox mbox_dsp_info = {
- .name = "dsp",
- .ops = &omap1_mbox_ops,
- .priv = &omap1_mbox_dsp_priv,
+ .name = "dsp",
+ .ops = &omap1_mbox_ops,
+ .priv = &omap1_mbox_dsp_priv,
};
static struct mailbox *omap1_mboxes[] = { &mbox_dsp_info, NULL };
index 89281377f687769da07a57d0141b60d7fb97eee0..4409d02e498a5d6b5624075494f6a35b4a037b6c 100644 (file)
MAILBOX_FILL_MSG((*msg), 0, priv->data, 0);
}
-static int ompa2_mbox_poll_for_space(struct mailbox *mbox)
+static int omap2_mbox_poll_for_space(struct mailbox *mbox)
{
if (omap2_mbox_fifo_full(mbox))
return -1;
}
static struct mailbox_ops omap2_mbox_ops = {
- .type = MBOX_HW_FIFO2_TYPE,
- .startup = omap2_mbox_startup,
- .shutdown = omap2_mbox_shutdown,
- .read = omap2_mbox_fifo_read,
- .write = omap2_mbox_fifo_write,
- .empty = omap2_mbox_fifo_empty,
+ .type = MBOX_HW_FIFO2_TYPE,
+ .startup = omap2_mbox_startup,
+ .shutdown = omap2_mbox_shutdown,
+ .read = omap2_mbox_fifo_read,
+ .write = omap2_mbox_fifo_write,
+ .empty = omap2_mbox_fifo_empty,
.needs_flush = omap2_mbox_needs_flush,
.readback = omap2_mbox_fifo_readback,
- .poll_for_space = ompa2_mbox_poll_for_space,
- .enable_irq = omap2_mbox_enable_irq,
- .disable_irq = omap2_mbox_disable_irq,
- .ack_irq = omap2_mbox_ack_irq,
- .is_irq = omap2_mbox_is_irq,
- .save_ctx = omap2_mbox_save_ctx,
- .restore_ctx = omap2_mbox_restore_ctx,
+ .poll_for_space = omap2_mbox_poll_for_space,
+ .enable_irq = omap2_mbox_enable_irq,
+ .disable_irq = omap2_mbox_disable_irq,
+ .ack_irq = omap2_mbox_ack_irq,
+ .is_irq = omap2_mbox_is_irq,
+ .save_ctx = omap2_mbox_save_ctx,
+ .restore_ctx = omap2_mbox_restore_ctx,
};
static int omap2_mbox_probe(struct platform_device *pdev)
{
struct resource *mem;
int ret;
- struct mailbox **list, *mbox;
+ struct mailbox **list, *mbox, *mboxblk;
+ struct omap_mbox2_priv *priv, *privblk;
struct omap_mbox_pdata *pdata = pdev->dev.platform_data;
struct omap_mbox_dev_info *info;
- struct omap_mbox2_priv *priv;
int i;
- if (!pdata || !pdata->info_cnt) {
+ if (!pdata || !pdata->info_cnt || !pdata->info) {
pr_err("%s: platform not supported\n", __func__);
return -ENODEV;
}
+ /* allocate one extra for marking end of list */
list = kzalloc((pdata->info_cnt + 1) * sizeof(*list), GFP_KERNEL);
if (!list)
return -ENOMEM;
- mbox = kzalloc((pdata->info_cnt) * sizeof(*mbox), GFP_KERNEL);
- if (!mbox) {
- kfree(list);
- return -ENOMEM;
+ mboxblk = mbox = kzalloc(pdata->info_cnt * sizeof(*mbox), GFP_KERNEL);
+ if (!mboxblk) {
+ ret = -ENOMEM;
+ goto free_list;
+ }
+
+ privblk = priv = kzalloc(pdata->info_cnt * sizeof(*priv), GFP_KERNEL);
+ if (!privblk) {
+ ret = -ENOMEM;
+ goto free_mboxblk;
}
info = pdata->info;
- for (i = 0; i < pdata->info_cnt; i++, info++) {
- priv = mbox->priv = kzalloc(sizeof(*priv), GFP_KERNEL);
- if (!priv) {
- ret = -ENOMEM;
- goto free;
- }
+ for (i = 0; i < pdata->info_cnt; i++, info++, priv++) {
priv->tx_fifo.msg = MAILBOX_MESSAGE(info->tx_id);
priv->tx_fifo.fifo_stat = MAILBOX_FIFOSTATUS(info->tx_id);
priv->tx_fifo.msg_stat = MAILBOX_MSGSTATUS(info->tx_id);
}
priv->intr_type = pdata->intr_type;
+ mbox->priv = priv;
mbox->name = info->name;
mbox->ops = &omap2_mbox_ops;
mbox->irq = platform_get_irq(pdev, info->irq_id);
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mem) {
ret = -ENOMEM;
- goto free;
+ goto free_privblk;
}
mbox_base = ioremap(mem->start, resource_size(mem));
if (!mbox_base) {
ret = -ENOMEM;
- goto free;
+ goto free_privblk;
}
ret = mailbox_register(&pdev->dev, list);
- if (ret) {
- iounmap(mbox_base);
- goto free;
- }
+ if (ret)
+ goto unmap_mbox;
platform_set_drvdata(pdev, list);
return 0;
-free:
- for (; i > 0; i--)
- kfree(list[i-1]->priv);
- kfree(mbox);
+unmap_mbox:
+ iounmap(mbox_base);
+free_privblk:
+ kfree(privblk);
+free_mboxblk:
+ kfree(mboxblk);
+free_list:
kfree(list);
return ret;
}
static int omap2_mbox_remove(struct platform_device *pdev)
{
- int i;
+ struct omap_mbox2_priv *privblk;
struct mailbox **list = platform_get_drvdata(pdev);
+ struct mailbox *mboxblk = list[0];
+ privblk = mboxblk->priv;
mailbox_unregister();
iounmap(mbox_base);
-
- for (i = 0; list[i]; i++) {
- struct mailbox *mbox = list[i];
- kfree(mbox->priv);
- kfree(mbox);
- }
+ kfree(privblk);
+ kfree(mboxblk);
kfree(list);
platform_set_drvdata(pdev, NULL);
index 667bbaf0cdf2bf263704f456e1cf5039903553a6..45c4de5c2e253e713d48c61e9829da6d3128c5b9 100644 (file)
#define MBOX_SHARED_MEM_TYPE ((__force mailbox_type_t) 3)
struct mailbox_ops {
- mailbox_type_t type;
- int (*startup)(struct mailbox *mbox);
- void (*shutdown)(struct mailbox *mbox);
+ mailbox_type_t type;
+ int (*startup)(struct mailbox *mbox);
+ void (*shutdown)(struct mailbox *mbox);
/* mailbox access */
- void (*read)(struct mailbox *mbox, struct mailbox_msg *msg);
- int (*write)(struct mailbox *mbox, struct mailbox_msg *msg);
- int (*empty)(struct mailbox *mbox);
- int (*poll_for_space)(struct mailbox *mbox);
+ void (*read)(struct mailbox *mbox, struct mailbox_msg *msg);
+ int (*write)(struct mailbox *mbox, struct mailbox_msg *msg);
+ int (*empty)(struct mailbox *mbox);
+ int (*poll_for_space)(struct mailbox *mbox);
int (*needs_flush)(struct mailbox *mbox);
void (*readback)(struct mailbox *mbox,
struct mailbox_msg *msg);
/* irq */
- void (*enable_irq)(struct mailbox *mbox,
- mailbox_irq_t irq);
- void (*disable_irq)(struct mailbox *mbox,
- mailbox_irq_t irq);
- void (*ack_irq)(struct mailbox *mbox, mailbox_irq_t irq);
- int (*is_irq)(struct mailbox *mbox, mailbox_irq_t irq);
+ void (*enable_irq)(struct mailbox *mbox, mailbox_irq_t irq);
+ void (*disable_irq)(struct mailbox *mbox, mailbox_irq_t irq);
+ void (*ack_irq)(struct mailbox *mbox, mailbox_irq_t irq);
+ int (*is_irq)(struct mailbox *mbox, mailbox_irq_t irq);
/* ctx */
- void (*save_ctx)(struct mailbox *mbox);
- void (*restore_ctx)(struct mailbox *mbox);
+ void (*save_ctx)(struct mailbox *mbox);
+ void (*restore_ctx)(struct mailbox *mbox);
};
struct mailbox_queue {
- spinlock_t lock;
+ spinlock_t lock;
struct mutex mlock;
- struct kfifo fifo;
- struct work_struct work;
- struct tasklet_struct tasklet;
- struct mailbox *mbox;
+ struct kfifo fifo;
+ struct work_struct work;
+ struct tasklet_struct tasklet;
+ struct mailbox *mbox;
bool full;
};
struct mailbox {
- char *name;
- unsigned int id;
- unsigned int irq;
- struct mailbox_queue *txq, *rxq;
- struct mailbox_ops *ops;
- struct device *dev;
- void *priv;
- int use_count;
- struct blocking_notifier_head notifier;
+ const char *name;
+ unsigned int id;
+ unsigned int irq;
+ struct mailbox_queue *txq, *rxq;
+ struct mailbox_ops *ops;
+ struct device *dev;
+ void *priv;
+ int use_count;
+ struct blocking_notifier_head notifier;
};
void mailbox_init_seq(struct mailbox *);
diff --git a/include/linux/platform_data/mailbox-omap.h b/include/linux/platform_data/mailbox-omap.h
index 2b80bad656f4a43f3ddbd7f2d58bbd802466d355..676cd642bb3f6184e0d36157de17ee73b858d1f8 100644 (file)
* the MPU interrupt controller.
*/
struct omap_mbox_dev_info {
- char name[16];
+ const char *name;
u32 tx_id;
u32 rx_id;
u32 irq_id;