Blame view
arch/arm/mach-omap2/mailbox.c
10.1 KB
340a614ac ARM: OMAP: Add ma... |
1 |
/* |
733ecc5c0 omap mailbox: cle... |
2 |
* Mailbox reservation modules for OMAP2/3 |
340a614ac ARM: OMAP: Add ma... |
3 |
* |
733ecc5c0 omap mailbox: cle... |
4 |
* Copyright (C) 2006-2009 Nokia Corporation |
340a614ac ARM: OMAP: Add ma... |
5 |
* Written by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com> |
733ecc5c0 omap mailbox: cle... |
6 |
* and Paul Mundt |
340a614ac ARM: OMAP: Add ma... |
7 8 9 10 11 |
* * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. */ |
a1bcc1dce ARM: OMAP: Fix ex... |
12 |
#include <linux/module.h> |
340a614ac ARM: OMAP: Add ma... |
13 14 15 |
#include <linux/clk.h> #include <linux/err.h> #include <linux/platform_device.h> |
fced80c73 [ARM] Convert asm... |
16 |
#include <linux/io.h> |
82d2a5db5 OMAP: mailbox: us... |
17 |
#include <linux/pm_runtime.h> |
ce491cf85 omap: headers: Mo... |
18 |
#include <plat/mailbox.h> |
a09e64fbc [ARM] Move includ... |
19 |
#include <mach/irqs.h> |
340a614ac ARM: OMAP: Add ma... |
20 |
|
733ecc5c0 omap mailbox: cle... |
21 |
#define MAILBOX_REVISION 0x000 |
733ecc5c0 omap mailbox: cle... |
22 23 24 25 26 |
#define MAILBOX_MESSAGE(m) (0x040 + 4 * (m)) #define MAILBOX_FIFOSTATUS(m) (0x080 + 4 * (m)) #define MAILBOX_MSGSTATUS(m) (0x0c0 + 4 * (m)) #define MAILBOX_IRQSTATUS(u) (0x100 + 8 * (u)) #define MAILBOX_IRQENABLE(u) (0x104 + 8 * (u)) |
340a614ac ARM: OMAP: Add ma... |
27 |
|
5f00ec64a omap: mailbox: Ad... |
28 29 30 31 32 33 |
#define OMAP4_MAILBOX_IRQSTATUS(u) (0x104 + 10 * (u)) #define OMAP4_MAILBOX_IRQENABLE(u) (0x108 + 10 * (u)) #define OMAP4_MAILBOX_IRQENABLE_CLR(u) (0x10c + 10 * (u)) #define MAILBOX_IRQ_NEWMSG(m) (1 << (2 * (m))) #define MAILBOX_IRQ_NOTFULL(m) (1 << (2 * (m) + 1)) |
340a614ac ARM: OMAP: Add ma... |
34 |
|
c75ee7520 omap mailbox: add... |
35 |
#define MBOX_REG_SIZE 0x120 |
5f00ec64a omap: mailbox: Ad... |
36 37 |
#define OMAP4_MBOX_REG_SIZE 0x130 |
c75ee7520 omap mailbox: add... |
38 |
#define MBOX_NR_REGS (MBOX_REG_SIZE / sizeof(u32)) |
5f00ec64a omap: mailbox: Ad... |
39 |
#define OMAP4_MBOX_NR_REGS (OMAP4_MBOX_REG_SIZE / sizeof(u32)) |
c75ee7520 omap mailbox: add... |
40 |
|
6c20a6837 omap mailbox: add... |
41 |
static void __iomem *mbox_base; |
340a614ac ARM: OMAP: Add ma... |
42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
struct omap_mbox2_fifo { unsigned long msg; unsigned long fifo_stat; unsigned long msg_stat; }; struct omap_mbox2_priv { struct omap_mbox2_fifo tx_fifo; struct omap_mbox2_fifo rx_fifo; unsigned long irqenable; unsigned long irqstatus; u32 newmsg_bit; u32 notfull_bit; |
5f00ec64a omap: mailbox: Ad... |
56 57 |
u32 ctx[OMAP4_MBOX_NR_REGS]; unsigned long irqdisable; |
340a614ac ARM: OMAP: Add ma... |
58 |
}; |
bfbdcf8a1 ARM: OMAP: Fix Un... |
59 60 |
static void omap2_mbox_enable_irq(struct omap_mbox *mbox, omap_mbox_type_t irq); |
6c20a6837 omap mailbox: add... |
61 |
static inline unsigned int mbox_read_reg(size_t ofs) |
340a614ac ARM: OMAP: Add ma... |
62 |
{ |
6c20a6837 omap mailbox: add... |
63 |
return __raw_readl(mbox_base + ofs); |
340a614ac ARM: OMAP: Add ma... |
64 |
} |
6c20a6837 omap mailbox: add... |
65 |
static inline void mbox_write_reg(u32 val, size_t ofs) |
340a614ac ARM: OMAP: Add ma... |
66 |
{ |
6c20a6837 omap mailbox: add... |
67 |
__raw_writel(val, mbox_base + ofs); |
340a614ac ARM: OMAP: Add ma... |
68 69 70 |
} /* Mailbox H/W preparations */ |
bfbdcf8a1 ARM: OMAP: Fix Un... |
71 |
static int omap2_mbox_startup(struct omap_mbox *mbox) |
340a614ac ARM: OMAP: Add ma... |
72 |
{ |
1ffe627dc omap: mailbox: Ex... |
73 |
u32 l; |
340a614ac ARM: OMAP: Add ma... |
74 |
|
82d2a5db5 OMAP: mailbox: us... |
75 76 |
pm_runtime_enable(mbox->dev->parent); pm_runtime_get_sync(mbox->dev->parent); |
1ffe627dc omap: mailbox: Ex... |
77 |
|
94fc58c6d omap mailbox: pri... |
78 |
l = mbox_read_reg(MAILBOX_REVISION); |
909f9dc71 omap: mailbox: tr... |
79 80 |
pr_debug("omap mailbox rev %d.%d ", (l & 0xf0) >> 4, (l & 0x0f)); |
94fc58c6d omap mailbox: pri... |
81 |
|
bfbdcf8a1 ARM: OMAP: Fix Un... |
82 |
omap2_mbox_enable_irq(mbox, IRQ_RX); |
340a614ac ARM: OMAP: Add ma... |
83 84 |
return 0; } |
bfbdcf8a1 ARM: OMAP: Fix Un... |
85 |
static void omap2_mbox_shutdown(struct omap_mbox *mbox) |
340a614ac ARM: OMAP: Add ma... |
86 |
{ |
82d2a5db5 OMAP: mailbox: us... |
87 88 |
pm_runtime_put_sync(mbox->dev->parent); pm_runtime_disable(mbox->dev->parent); |
340a614ac ARM: OMAP: Add ma... |
89 90 91 |
} /* Mailbox FIFO handle functions */ |
bfbdcf8a1 ARM: OMAP: Fix Un... |
92 |
static mbox_msg_t omap2_mbox_fifo_read(struct omap_mbox *mbox) |
340a614ac ARM: OMAP: Add ma... |
93 94 95 96 97 |
{ struct omap_mbox2_fifo *fifo = &((struct omap_mbox2_priv *)mbox->priv)->rx_fifo; return (mbox_msg_t) mbox_read_reg(fifo->msg); } |
bfbdcf8a1 ARM: OMAP: Fix Un... |
98 |
static void omap2_mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg) |
340a614ac ARM: OMAP: Add ma... |
99 100 101 102 103 |
{ struct omap_mbox2_fifo *fifo = &((struct omap_mbox2_priv *)mbox->priv)->tx_fifo; mbox_write_reg(msg, fifo->msg); } |
bfbdcf8a1 ARM: OMAP: Fix Un... |
104 |
static int omap2_mbox_fifo_empty(struct omap_mbox *mbox) |
340a614ac ARM: OMAP: Add ma... |
105 106 107 108 109 |
{ struct omap_mbox2_fifo *fifo = &((struct omap_mbox2_priv *)mbox->priv)->rx_fifo; return (mbox_read_reg(fifo->msg_stat) == 0); } |
bfbdcf8a1 ARM: OMAP: Fix Un... |
110 |
static int omap2_mbox_fifo_full(struct omap_mbox *mbox) |
340a614ac ARM: OMAP: Add ma... |
111 112 113 |
{ struct omap_mbox2_fifo *fifo = &((struct omap_mbox2_priv *)mbox->priv)->tx_fifo; |
5f00ec64a omap: mailbox: Ad... |
114 |
return mbox_read_reg(fifo->fifo_stat); |
340a614ac ARM: OMAP: Add ma... |
115 116 117 |
} /* Mailbox IRQ handle functions */ |
bfbdcf8a1 ARM: OMAP: Fix Un... |
118 |
static void omap2_mbox_enable_irq(struct omap_mbox *mbox, |
340a614ac ARM: OMAP: Add ma... |
119 120 |
omap_mbox_type_t irq) { |
b45b501c3 arm: remove cast ... |
121 |
struct omap_mbox2_priv *p = mbox->priv; |
340a614ac ARM: OMAP: Add ma... |
122 123 124 125 126 127 |
u32 l, bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; l = mbox_read_reg(p->irqenable); l |= bit; mbox_write_reg(l, p->irqenable); } |
bfbdcf8a1 ARM: OMAP: Fix Un... |
128 |
static void omap2_mbox_disable_irq(struct omap_mbox *mbox, |
340a614ac ARM: OMAP: Add ma... |
129 130 |
omap_mbox_type_t irq) { |
b45b501c3 arm: remove cast ... |
131 |
struct omap_mbox2_priv *p = mbox->priv; |
525a11381 omap: mailbox: re... |
132 133 134 135 136 137 |
u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; if (!cpu_is_omap44xx()) bit = mbox_read_reg(p->irqdisable) & ~bit; mbox_write_reg(bit, p->irqdisable); |
340a614ac ARM: OMAP: Add ma... |
138 |
} |
bfbdcf8a1 ARM: OMAP: Fix Un... |
139 |
static void omap2_mbox_ack_irq(struct omap_mbox *mbox, |
340a614ac ARM: OMAP: Add ma... |
140 141 |
omap_mbox_type_t irq) { |
b45b501c3 arm: remove cast ... |
142 |
struct omap_mbox2_priv *p = mbox->priv; |
340a614ac ARM: OMAP: Add ma... |
143 144 145 |
u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; mbox_write_reg(bit, p->irqstatus); |
8828880d0 omap: mailbox: Fl... |
146 147 148 |
/* Flush posted write for irq status to avoid spurious interrupts */ mbox_read_reg(p->irqstatus); |
340a614ac ARM: OMAP: Add ma... |
149 |
} |
bfbdcf8a1 ARM: OMAP: Fix Un... |
150 |
static int omap2_mbox_is_irq(struct omap_mbox *mbox, |
340a614ac ARM: OMAP: Add ma... |
151 152 |
omap_mbox_type_t irq) { |
b45b501c3 arm: remove cast ... |
153 |
struct omap_mbox2_priv *p = mbox->priv; |
340a614ac ARM: OMAP: Add ma... |
154 155 156 |
u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; u32 enable = mbox_read_reg(p->irqenable); u32 status = mbox_read_reg(p->irqstatus); |
5f00ec64a omap: mailbox: Ad... |
157 |
return (int)(enable & status & bit); |
340a614ac ARM: OMAP: Add ma... |
158 |
} |
c75ee7520 omap mailbox: add... |
159 160 161 162 |
static void omap2_mbox_save_ctx(struct omap_mbox *mbox) { int i; struct omap_mbox2_priv *p = mbox->priv; |
5f00ec64a omap: mailbox: Ad... |
163 164 165 166 167 168 |
int nr_regs; if (cpu_is_omap44xx()) nr_regs = OMAP4_MBOX_NR_REGS; else nr_regs = MBOX_NR_REGS; for (i = 0; i < nr_regs; i++) { |
c75ee7520 omap mailbox: add... |
169 170 171 172 173 174 175 176 177 178 179 180 |
p->ctx[i] = mbox_read_reg(i * sizeof(u32)); dev_dbg(mbox->dev, "%s: [%02x] %08x ", __func__, i, p->ctx[i]); } } static void omap2_mbox_restore_ctx(struct omap_mbox *mbox) { int i; struct omap_mbox2_priv *p = mbox->priv; |
5f00ec64a omap: mailbox: Ad... |
181 182 183 184 185 186 |
int nr_regs; if (cpu_is_omap44xx()) nr_regs = OMAP4_MBOX_NR_REGS; else nr_regs = MBOX_NR_REGS; for (i = 0; i < nr_regs; i++) { |
c75ee7520 omap mailbox: add... |
187 188 189 190 191 192 193 |
mbox_write_reg(p->ctx[i], i * sizeof(u32)); dev_dbg(mbox->dev, "%s: [%02x] %08x ", __func__, i, p->ctx[i]); } } |
340a614ac ARM: OMAP: Add ma... |
194 195 196 197 198 199 200 201 202 203 204 205 |
static struct omap_mbox_ops omap2_mbox_ops = { .type = OMAP_MBOX_TYPE2, .startup = omap2_mbox_startup, .shutdown = omap2_mbox_shutdown, .fifo_read = omap2_mbox_fifo_read, .fifo_write = omap2_mbox_fifo_write, .fifo_empty = omap2_mbox_fifo_empty, .fifo_full = omap2_mbox_fifo_full, .enable_irq = omap2_mbox_enable_irq, .disable_irq = omap2_mbox_disable_irq, .ack_irq = omap2_mbox_ack_irq, .is_irq = omap2_mbox_is_irq, |
c75ee7520 omap mailbox: add... |
206 207 |
.save_ctx = omap2_mbox_save_ctx, .restore_ctx = omap2_mbox_restore_ctx, |
340a614ac ARM: OMAP: Add ma... |
208 209 210 211 212 213 214 215 216 217 |
}; /* * MAILBOX 0: ARM -> DSP, * MAILBOX 1: ARM <- DSP. * MAILBOX 2: ARM -> IVA, * MAILBOX 3: ARM <- IVA. */ /* FIXME: the following structs should be filled automatically by the user id */ |
07d65d8b9 omap: mailbox: re... |
218 |
|
ff0fba0bc OMAP: mailbox: fi... |
219 |
#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP2) |
340a614ac ARM: OMAP: Add ma... |
220 221 222 |
/* DSP */ static struct omap_mbox2_priv omap2_mbox_dsp_priv = { .tx_fifo = { |
733ecc5c0 omap mailbox: cle... |
223 224 |
.msg = MAILBOX_MESSAGE(0), .fifo_stat = MAILBOX_FIFOSTATUS(0), |
340a614ac ARM: OMAP: Add ma... |
225 226 |
}, .rx_fifo = { |
733ecc5c0 omap mailbox: cle... |
227 228 |
.msg = MAILBOX_MESSAGE(1), .msg_stat = MAILBOX_MSGSTATUS(1), |
340a614ac ARM: OMAP: Add ma... |
229 |
}, |
733ecc5c0 omap mailbox: cle... |
230 231 |
.irqenable = MAILBOX_IRQENABLE(0), .irqstatus = MAILBOX_IRQSTATUS(0), |
340a614ac ARM: OMAP: Add ma... |
232 233 |
.notfull_bit = MAILBOX_IRQ_NOTFULL(0), .newmsg_bit = MAILBOX_IRQ_NEWMSG(1), |
5f00ec64a omap: mailbox: Ad... |
234 235 |
.irqdisable = MAILBOX_IRQENABLE(0), }; |
07d65d8b9 omap: mailbox: re... |
236 237 238 239 240 |
struct omap_mbox mbox_dsp_info = { .name = "dsp", .ops = &omap2_mbox_ops, .priv = &omap2_mbox_dsp_priv, }; |
14476bd93 omap: mailbox: on... |
241 |
#endif |
07d65d8b9 omap: mailbox: re... |
242 |
|
ff0fba0bc OMAP: mailbox: fi... |
243 |
#if defined(CONFIG_ARCH_OMAP3) |
898ee7562 omap: mailbox: re... |
244 |
struct omap_mbox *omap3_mboxes[] = { &mbox_dsp_info, NULL }; |
14476bd93 omap: mailbox: on... |
245 |
#endif |
898ee7562 omap: mailbox: re... |
246 |
|
59b479e09 omap: Start using... |
247 |
#if defined(CONFIG_SOC_OMAP2420) |
07d65d8b9 omap: mailbox: re... |
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 |
/* IVA */ static struct omap_mbox2_priv omap2_mbox_iva_priv = { .tx_fifo = { .msg = MAILBOX_MESSAGE(2), .fifo_stat = MAILBOX_FIFOSTATUS(2), }, .rx_fifo = { .msg = MAILBOX_MESSAGE(3), .msg_stat = MAILBOX_MSGSTATUS(3), }, .irqenable = MAILBOX_IRQENABLE(3), .irqstatus = MAILBOX_IRQSTATUS(3), .notfull_bit = MAILBOX_IRQ_NOTFULL(2), .newmsg_bit = MAILBOX_IRQ_NEWMSG(3), .irqdisable = MAILBOX_IRQENABLE(3), }; static struct omap_mbox mbox_iva_info = { .name = "iva", .ops = &omap2_mbox_ops, .priv = &omap2_mbox_iva_priv, }; |
898ee7562 omap: mailbox: re... |
270 |
|
eca83258f OMAP2420: mailbox... |
271 |
struct omap_mbox *omap2_mboxes[] = { &mbox_dsp_info, &mbox_iva_info, NULL }; |
07d65d8b9 omap: mailbox: re... |
272 |
#endif |
14476bd93 omap: mailbox: on... |
273 |
#if defined(CONFIG_ARCH_OMAP4) |
07d65d8b9 omap: mailbox: re... |
274 |
/* OMAP4 */ |
5f00ec64a omap: mailbox: Ad... |
275 276 277 278 279 280 281 282 283 284 285 286 287 288 |
static struct omap_mbox2_priv omap2_mbox_1_priv = { .tx_fifo = { .msg = MAILBOX_MESSAGE(0), .fifo_stat = MAILBOX_FIFOSTATUS(0), }, .rx_fifo = { .msg = MAILBOX_MESSAGE(1), .msg_stat = MAILBOX_MSGSTATUS(1), }, .irqenable = OMAP4_MAILBOX_IRQENABLE(0), .irqstatus = OMAP4_MAILBOX_IRQSTATUS(0), .notfull_bit = MAILBOX_IRQ_NOTFULL(0), .newmsg_bit = MAILBOX_IRQ_NEWMSG(1), .irqdisable = OMAP4_MAILBOX_IRQENABLE_CLR(0), |
340a614ac ARM: OMAP: Add ma... |
289 |
}; |
5f00ec64a omap: mailbox: Ad... |
290 291 292 293 294 |
struct omap_mbox mbox_1_info = { .name = "mailbox-1", .ops = &omap2_mbox_ops, .priv = &omap2_mbox_1_priv, }; |
5f00ec64a omap: mailbox: Ad... |
295 |
|
5f00ec64a omap: mailbox: Ad... |
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 |
static struct omap_mbox2_priv omap2_mbox_2_priv = { .tx_fifo = { .msg = MAILBOX_MESSAGE(3), .fifo_stat = MAILBOX_FIFOSTATUS(3), }, .rx_fifo = { .msg = MAILBOX_MESSAGE(2), .msg_stat = MAILBOX_MSGSTATUS(2), }, .irqenable = OMAP4_MAILBOX_IRQENABLE(0), .irqstatus = OMAP4_MAILBOX_IRQSTATUS(0), .notfull_bit = MAILBOX_IRQ_NOTFULL(3), .newmsg_bit = MAILBOX_IRQ_NEWMSG(2), .irqdisable = OMAP4_MAILBOX_IRQENABLE_CLR(0), }; struct omap_mbox mbox_2_info = { .name = "mailbox-2", .ops = &omap2_mbox_ops, .priv = &omap2_mbox_2_priv, }; |
5f00ec64a omap: mailbox: Ad... |
317 |
|
898ee7562 omap: mailbox: re... |
318 |
struct omap_mbox *omap4_mboxes[] = { &mbox_1_info, &mbox_2_info, NULL }; |
14476bd93 omap: mailbox: on... |
319 |
#endif |
898ee7562 omap: mailbox: re... |
320 |
|
da8cfe03a omap mailbox: fix... |
321 |
static int __devinit omap2_mbox_probe(struct platform_device *pdev) |
340a614ac ARM: OMAP: Add ma... |
322 |
{ |
898ee7562 omap: mailbox: re... |
323 |
struct resource *mem; |
6c20a6837 omap mailbox: add... |
324 |
int ret; |
9c80c8cd7 omap: mailbox: si... |
325 |
struct omap_mbox **list; |
340a614ac ARM: OMAP: Add ma... |
326 |
|
14476bd93 omap: mailbox: on... |
327 328 |
if (false) ; |
ff0fba0bc OMAP: mailbox: fi... |
329 330 |
#if defined(CONFIG_ARCH_OMAP3) else if (cpu_is_omap34xx()) { |
898ee7562 omap: mailbox: re... |
331 |
list = omap3_mboxes; |
69dbf857c OMAP: mailbox: bu... |
332 |
list[0]->irq = platform_get_irq(pdev, 0); |
340a614ac ARM: OMAP: Add ma... |
333 |
} |
14476bd93 omap: mailbox: on... |
334 |
#endif |
ff0fba0bc OMAP: mailbox: fi... |
335 336 337 |
#if defined(CONFIG_ARCH_OMAP2) else if (cpu_is_omap2430()) { list = omap2_mboxes; |
69dbf857c OMAP: mailbox: bu... |
338 |
list[0]->irq = platform_get_irq(pdev, 0); |
ff0fba0bc OMAP: mailbox: fi... |
339 |
} else if (cpu_is_omap2420()) { |
898ee7562 omap: mailbox: re... |
340 |
list = omap2_mboxes; |
340a614ac ARM: OMAP: Add ma... |
341 |
|
898ee7562 omap: mailbox: re... |
342 343 344 345 |
list[0]->irq = platform_get_irq_byname(pdev, "dsp"); list[1]->irq = platform_get_irq_byname(pdev, "iva"); } #endif |
14476bd93 omap: mailbox: on... |
346 |
#if defined(CONFIG_ARCH_OMAP4) |
898ee7562 omap: mailbox: re... |
347 348 |
else if (cpu_is_omap44xx()) { list = omap4_mboxes; |
5f00ec64a omap: mailbox: Ad... |
349 |
|
69dbf857c OMAP: mailbox: bu... |
350 |
list[0]->irq = list[1]->irq = platform_get_irq(pdev, 0); |
340a614ac ARM: OMAP: Add ma... |
351 |
} |
14476bd93 omap: mailbox: on... |
352 |
#endif |
898ee7562 omap: mailbox: re... |
353 354 355 356 |
else { pr_err("%s: platform not supported ", __func__); return -ENODEV; |
5f00ec64a omap: mailbox: Ad... |
357 |
} |
6c20a6837 omap mailbox: add... |
358 |
|
898ee7562 omap: mailbox: re... |
359 360 361 362 |
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); mbox_base = ioremap(mem->start, resource_size(mem)); if (!mbox_base) return -ENOMEM; |
9c80c8cd7 omap: mailbox: si... |
363 364 365 366 |
ret = omap_mbox_register(&pdev->dev, list); if (ret) { iounmap(mbox_base); return ret; |
340a614ac ARM: OMAP: Add ma... |
367 |
} |
340a614ac ARM: OMAP: Add ma... |
368 |
|
5d783731c OMAP: mailbox: re... |
369 |
return 0; |
340a614ac ARM: OMAP: Add ma... |
370 |
} |
da8cfe03a omap mailbox: fix... |
371 |
static int __devexit omap2_mbox_remove(struct platform_device *pdev) |
340a614ac ARM: OMAP: Add ma... |
372 |
{ |
9c80c8cd7 omap: mailbox: si... |
373 |
omap_mbox_unregister(); |
6c20a6837 omap mailbox: add... |
374 |
iounmap(mbox_base); |
340a614ac ARM: OMAP: Add ma... |
375 376 377 378 379 |
return 0; } static struct platform_driver omap2_mbox_driver = { .probe = omap2_mbox_probe, |
da8cfe03a omap mailbox: fix... |
380 |
.remove = __devexit_p(omap2_mbox_remove), |
340a614ac ARM: OMAP: Add ma... |
381 |
.driver = { |
d742709ea omap: mailbox: st... |
382 |
.name = "omap-mailbox", |
340a614ac ARM: OMAP: Add ma... |
383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 |
}, }; static int __init omap2_mbox_init(void) { return platform_driver_register(&omap2_mbox_driver); } static void __exit omap2_mbox_exit(void) { platform_driver_unregister(&omap2_mbox_driver); } module_init(omap2_mbox_init); module_exit(omap2_mbox_exit); |
733ecc5c0 omap mailbox: cle... |
398 |
MODULE_LICENSE("GPL v2"); |
5f00ec64a omap: mailbox: Ad... |
399 |
MODULE_DESCRIPTION("omap mailbox: omap2/3/4 architecture specific functions"); |
f375325a0 omap: mailbox cle... |
400 401 |
MODULE_AUTHOR("Hiroshi DOYU <Hiroshi.DOYU@nokia.com>"); MODULE_AUTHOR("Paul Mundt"); |
d742709ea omap: mailbox: st... |
402 |
MODULE_ALIAS("platform:omap2-mailbox"); |