Blame view

arch/arm/mach-omap2/mailbox.c 10.1 KB
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
1
  /*
733ecc5c0   Hiroshi DOYU   omap mailbox: cle...
2
   * Mailbox reservation modules for OMAP2/3
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
3
   *
733ecc5c0   Hiroshi DOYU   omap mailbox: cle...
4
   * Copyright (C) 2006-2009 Nokia Corporation
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
5
   * Written by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
733ecc5c0   Hiroshi DOYU   omap mailbox: cle...
6
   *        and  Paul Mundt
340a614ac   Hiroshi DOYU   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   Tony Lindgren   ARM: OMAP: Fix ex...
12
  #include <linux/module.h>
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
13
14
15
  #include <linux/clk.h>
  #include <linux/err.h>
  #include <linux/platform_device.h>
fced80c73   Russell King   [ARM] Convert asm...
16
  #include <linux/io.h>
82d2a5db5   Omar Ramirez Luna   OMAP: mailbox: us...
17
  #include <linux/pm_runtime.h>
ce491cf85   Tony Lindgren   omap: headers: Mo...
18
  #include <plat/mailbox.h>
a09e64fbc   Russell King   [ARM] Move includ...
19
  #include <mach/irqs.h>
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
20

733ecc5c0   Hiroshi DOYU   omap mailbox: cle...
21
  #define MAILBOX_REVISION		0x000
733ecc5c0   Hiroshi DOYU   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   Hiroshi DOYU   ARM: OMAP: Add ma...
27

5f00ec64a   C A Subramaniam   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   Hiroshi DOYU   ARM: OMAP: Add ma...
34

c75ee7520   Hiroshi DOYU   omap mailbox: add...
35
  #define MBOX_REG_SIZE			0x120
5f00ec64a   C A Subramaniam   omap: mailbox: Ad...
36
37
  
  #define OMAP4_MBOX_REG_SIZE		0x130
c75ee7520   Hiroshi DOYU   omap mailbox: add...
38
  #define MBOX_NR_REGS			(MBOX_REG_SIZE / sizeof(u32))
5f00ec64a   C A Subramaniam   omap: mailbox: Ad...
39
  #define OMAP4_MBOX_NR_REGS		(OMAP4_MBOX_REG_SIZE / sizeof(u32))
c75ee7520   Hiroshi DOYU   omap mailbox: add...
40

6c20a6837   Hiroshi DOYU   omap mailbox: add...
41
  static void __iomem *mbox_base;
340a614ac   Hiroshi DOYU   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   C A Subramaniam   omap: mailbox: Ad...
56
57
  	u32 ctx[OMAP4_MBOX_NR_REGS];
  	unsigned long irqdisable;
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
58
  };
bfbdcf8a1   Hiroshi DOYU   ARM: OMAP: Fix Un...
59
60
  static void omap2_mbox_enable_irq(struct omap_mbox *mbox,
  				  omap_mbox_type_t irq);
6c20a6837   Hiroshi DOYU   omap mailbox: add...
61
  static inline unsigned int mbox_read_reg(size_t ofs)
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
62
  {
6c20a6837   Hiroshi DOYU   omap mailbox: add...
63
  	return __raw_readl(mbox_base + ofs);
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
64
  }
6c20a6837   Hiroshi DOYU   omap mailbox: add...
65
  static inline void mbox_write_reg(u32 val, size_t ofs)
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
66
  {
6c20a6837   Hiroshi DOYU   omap mailbox: add...
67
  	__raw_writel(val, mbox_base + ofs);
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
68
69
70
  }
  
  /* Mailbox H/W preparations */
bfbdcf8a1   Hiroshi DOYU   ARM: OMAP: Fix Un...
71
  static int omap2_mbox_startup(struct omap_mbox *mbox)
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
72
  {
1ffe627dc   Hiroshi DOYU   omap: mailbox: Ex...
73
  	u32 l;
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
74

82d2a5db5   Omar Ramirez Luna   OMAP: mailbox: us...
75
76
  	pm_runtime_enable(mbox->dev->parent);
  	pm_runtime_get_sync(mbox->dev->parent);
1ffe627dc   Hiroshi DOYU   omap: mailbox: Ex...
77

94fc58c6d   Hiroshi DOYU   omap mailbox: pri...
78
  	l = mbox_read_reg(MAILBOX_REVISION);
909f9dc71   Felipe Contreras   omap: mailbox: tr...
79
80
  	pr_debug("omap mailbox rev %d.%d
  ", (l & 0xf0) >> 4, (l & 0x0f));
94fc58c6d   Hiroshi DOYU   omap mailbox: pri...
81

bfbdcf8a1   Hiroshi DOYU   ARM: OMAP: Fix Un...
82
  	omap2_mbox_enable_irq(mbox, IRQ_RX);
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
83
84
  	return 0;
  }
bfbdcf8a1   Hiroshi DOYU   ARM: OMAP: Fix Un...
85
  static void omap2_mbox_shutdown(struct omap_mbox *mbox)
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
86
  {
82d2a5db5   Omar Ramirez Luna   OMAP: mailbox: us...
87
88
  	pm_runtime_put_sync(mbox->dev->parent);
  	pm_runtime_disable(mbox->dev->parent);
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
89
90
91
  }
  
  /* Mailbox FIFO handle functions */
bfbdcf8a1   Hiroshi DOYU   ARM: OMAP: Fix Un...
92
  static mbox_msg_t omap2_mbox_fifo_read(struct omap_mbox *mbox)
340a614ac   Hiroshi DOYU   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   Hiroshi DOYU   ARM: OMAP: Fix Un...
98
  static void omap2_mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg)
340a614ac   Hiroshi DOYU   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   Hiroshi DOYU   ARM: OMAP: Fix Un...
104
  static int omap2_mbox_fifo_empty(struct omap_mbox *mbox)
340a614ac   Hiroshi DOYU   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   Hiroshi DOYU   ARM: OMAP: Fix Un...
110
  static int omap2_mbox_fifo_full(struct omap_mbox *mbox)
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
111
112
113
  {
  	struct omap_mbox2_fifo *fifo =
  		&((struct omap_mbox2_priv *)mbox->priv)->tx_fifo;
5f00ec64a   C A Subramaniam   omap: mailbox: Ad...
114
  	return mbox_read_reg(fifo->fifo_stat);
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
115
116
117
  }
  
  /* Mailbox IRQ handle functions */
bfbdcf8a1   Hiroshi DOYU   ARM: OMAP: Fix Un...
118
  static void omap2_mbox_enable_irq(struct omap_mbox *mbox,
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
119
120
  		omap_mbox_type_t irq)
  {
b45b501c3   matt mooney   arm: remove cast ...
121
  	struct omap_mbox2_priv *p = mbox->priv;
340a614ac   Hiroshi DOYU   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   Hiroshi DOYU   ARM: OMAP: Fix Un...
128
  static void omap2_mbox_disable_irq(struct omap_mbox *mbox,
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
129
130
  		omap_mbox_type_t irq)
  {
b45b501c3   matt mooney   arm: remove cast ...
131
  	struct omap_mbox2_priv *p = mbox->priv;
525a11381   Hari Kanigeri   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   Hiroshi DOYU   ARM: OMAP: Add ma...
138
  }
bfbdcf8a1   Hiroshi DOYU   ARM: OMAP: Fix Un...
139
  static void omap2_mbox_ack_irq(struct omap_mbox *mbox,
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
140
141
  		omap_mbox_type_t irq)
  {
b45b501c3   matt mooney   arm: remove cast ...
142
  	struct omap_mbox2_priv *p = mbox->priv;
340a614ac   Hiroshi DOYU   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   Hiroshi DOYU   omap: mailbox: Fl...
146
147
148
  
  	/* Flush posted write for irq status to avoid spurious interrupts */
  	mbox_read_reg(p->irqstatus);
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
149
  }
bfbdcf8a1   Hiroshi DOYU   ARM: OMAP: Fix Un...
150
  static int omap2_mbox_is_irq(struct omap_mbox *mbox,
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
151
152
  		omap_mbox_type_t irq)
  {
b45b501c3   matt mooney   arm: remove cast ...
153
  	struct omap_mbox2_priv *p = mbox->priv;
340a614ac   Hiroshi DOYU   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   C A Subramaniam   omap: mailbox: Ad...
157
  	return (int)(enable & status & bit);
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
158
  }
c75ee7520   Hiroshi DOYU   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   C A Subramaniam   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   Hiroshi DOYU   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   C A Subramaniam   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   Hiroshi DOYU   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   Hiroshi DOYU   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   Hiroshi DOYU   omap mailbox: add...
206
207
  	.save_ctx	= omap2_mbox_save_ctx,
  	.restore_ctx	= omap2_mbox_restore_ctx,
340a614ac   Hiroshi DOYU   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   Felipe Contreras   omap: mailbox: re...
218

ff0fba0bc   Omar Ramirez Luna   OMAP: mailbox: fi...
219
  #if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP2)
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
220
221
222
  /* DSP */
  static struct omap_mbox2_priv omap2_mbox_dsp_priv = {
  	.tx_fifo = {
733ecc5c0   Hiroshi DOYU   omap mailbox: cle...
223
224
  		.msg		= MAILBOX_MESSAGE(0),
  		.fifo_stat	= MAILBOX_FIFOSTATUS(0),
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
225
226
  	},
  	.rx_fifo = {
733ecc5c0   Hiroshi DOYU   omap mailbox: cle...
227
228
  		.msg		= MAILBOX_MESSAGE(1),
  		.msg_stat	= MAILBOX_MSGSTATUS(1),
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
229
  	},
733ecc5c0   Hiroshi DOYU   omap mailbox: cle...
230
231
  	.irqenable	= MAILBOX_IRQENABLE(0),
  	.irqstatus	= MAILBOX_IRQSTATUS(0),
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
232
233
  	.notfull_bit	= MAILBOX_IRQ_NOTFULL(0),
  	.newmsg_bit	= MAILBOX_IRQ_NEWMSG(1),
5f00ec64a   C A Subramaniam   omap: mailbox: Ad...
234
235
  	.irqdisable	= MAILBOX_IRQENABLE(0),
  };
07d65d8b9   Felipe Contreras   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   Felipe Contreras   omap: mailbox: on...
241
  #endif
07d65d8b9   Felipe Contreras   omap: mailbox: re...
242

ff0fba0bc   Omar Ramirez Luna   OMAP: mailbox: fi...
243
  #if defined(CONFIG_ARCH_OMAP3)
898ee7562   Felipe Contreras   omap: mailbox: re...
244
  struct omap_mbox *omap3_mboxes[] = { &mbox_dsp_info, NULL };
14476bd93   Felipe Contreras   omap: mailbox: on...
245
  #endif
898ee7562   Felipe Contreras   omap: mailbox: re...
246

59b479e09   Tony Lindgren   omap: Start using...
247
  #if defined(CONFIG_SOC_OMAP2420)
07d65d8b9   Felipe Contreras   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   Felipe Contreras   omap: mailbox: re...
270

eca83258f   Kevin Hilman   OMAP2420: mailbox...
271
  struct omap_mbox *omap2_mboxes[] = { &mbox_dsp_info, &mbox_iva_info, NULL };
07d65d8b9   Felipe Contreras   omap: mailbox: re...
272
  #endif
14476bd93   Felipe Contreras   omap: mailbox: on...
273
  #if defined(CONFIG_ARCH_OMAP4)
07d65d8b9   Felipe Contreras   omap: mailbox: re...
274
  /* OMAP4 */
5f00ec64a   C A Subramaniam   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   Hiroshi DOYU   ARM: OMAP: Add ma...
289
  };
5f00ec64a   C A Subramaniam   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   C A Subramaniam   omap: mailbox: Ad...
295

5f00ec64a   C A Subramaniam   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   C A Subramaniam   omap: mailbox: Ad...
317

898ee7562   Felipe Contreras   omap: mailbox: re...
318
  struct omap_mbox *omap4_mboxes[] = { &mbox_1_info, &mbox_2_info, NULL };
14476bd93   Felipe Contreras   omap: mailbox: on...
319
  #endif
898ee7562   Felipe Contreras   omap: mailbox: re...
320

da8cfe03a   Hiroshi DOYU   omap mailbox: fix...
321
  static int __devinit omap2_mbox_probe(struct platform_device *pdev)
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
322
  {
898ee7562   Felipe Contreras   omap: mailbox: re...
323
  	struct resource *mem;
6c20a6837   Hiroshi DOYU   omap mailbox: add...
324
  	int ret;
9c80c8cd7   Felipe Contreras   omap: mailbox: si...
325
  	struct omap_mbox **list;
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
326

14476bd93   Felipe Contreras   omap: mailbox: on...
327
328
  	if (false)
  		;
ff0fba0bc   Omar Ramirez Luna   OMAP: mailbox: fi...
329
330
  #if defined(CONFIG_ARCH_OMAP3)
  	else if (cpu_is_omap34xx()) {
898ee7562   Felipe Contreras   omap: mailbox: re...
331
  		list = omap3_mboxes;
69dbf857c   Felipe Contreras   OMAP: mailbox: bu...
332
  		list[0]->irq = platform_get_irq(pdev, 0);
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
333
  	}
14476bd93   Felipe Contreras   omap: mailbox: on...
334
  #endif
ff0fba0bc   Omar Ramirez Luna   OMAP: mailbox: fi...
335
336
337
  #if defined(CONFIG_ARCH_OMAP2)
  	else if (cpu_is_omap2430()) {
  		list = omap2_mboxes;
69dbf857c   Felipe Contreras   OMAP: mailbox: bu...
338
  		list[0]->irq = platform_get_irq(pdev, 0);
ff0fba0bc   Omar Ramirez Luna   OMAP: mailbox: fi...
339
  	} else if (cpu_is_omap2420()) {
898ee7562   Felipe Contreras   omap: mailbox: re...
340
  		list = omap2_mboxes;
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
341

898ee7562   Felipe Contreras   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   Felipe Contreras   omap: mailbox: on...
346
  #if defined(CONFIG_ARCH_OMAP4)
898ee7562   Felipe Contreras   omap: mailbox: re...
347
348
  	else if (cpu_is_omap44xx()) {
  		list = omap4_mboxes;
5f00ec64a   C A Subramaniam   omap: mailbox: Ad...
349

69dbf857c   Felipe Contreras   OMAP: mailbox: bu...
350
  		list[0]->irq = list[1]->irq = platform_get_irq(pdev, 0);
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
351
  	}
14476bd93   Felipe Contreras   omap: mailbox: on...
352
  #endif
898ee7562   Felipe Contreras   omap: mailbox: re...
353
354
355
356
  	else {
  		pr_err("%s: platform not supported
  ", __func__);
  		return -ENODEV;
5f00ec64a   C A Subramaniam   omap: mailbox: Ad...
357
  	}
6c20a6837   Hiroshi DOYU   omap mailbox: add...
358

898ee7562   Felipe Contreras   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   Felipe Contreras   omap: mailbox: si...
363
364
365
366
  	ret = omap_mbox_register(&pdev->dev, list);
  	if (ret) {
  		iounmap(mbox_base);
  		return ret;
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
367
  	}
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
368

5d783731c   Omar Ramirez Luna   OMAP: mailbox: re...
369
  	return 0;
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
370
  }
da8cfe03a   Hiroshi DOYU   omap mailbox: fix...
371
  static int __devexit omap2_mbox_remove(struct platform_device *pdev)
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
372
  {
9c80c8cd7   Felipe Contreras   omap: mailbox: si...
373
  	omap_mbox_unregister();
6c20a6837   Hiroshi DOYU   omap mailbox: add...
374
  	iounmap(mbox_base);
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
375
376
377
378
379
  	return 0;
  }
  
  static struct platform_driver omap2_mbox_driver = {
  	.probe = omap2_mbox_probe,
da8cfe03a   Hiroshi DOYU   omap mailbox: fix...
380
  	.remove = __devexit_p(omap2_mbox_remove),
340a614ac   Hiroshi DOYU   ARM: OMAP: Add ma...
381
  	.driver = {
d742709ea   Felipe Contreras   omap: mailbox: st...
382
  		.name = "omap-mailbox",
340a614ac   Hiroshi DOYU   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   Hiroshi DOYU   omap mailbox: cle...
398
  MODULE_LICENSE("GPL v2");
5f00ec64a   C A Subramaniam   omap: mailbox: Ad...
399
  MODULE_DESCRIPTION("omap mailbox: omap2/3/4 architecture specific functions");
f375325a0   Ohad Ben-Cohen   omap: mailbox cle...
400
401
  MODULE_AUTHOR("Hiroshi DOYU <Hiroshi.DOYU@nokia.com>");
  MODULE_AUTHOR("Paul Mundt");
d742709ea   Felipe Contreras   omap: mailbox: st...
402
  MODULE_ALIAS("platform:omap2-mailbox");