diff options
author | Hiroshi DOYU <Hiroshi.DOYU@nokia.com> | 2009-03-23 21:07:26 -0400 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2009-03-23 21:07:26 -0400 |
commit | c75ee7520b4ad48a6948f51ca43b2e46ebd3696a (patch) | |
tree | b3807d91e6bb892db8f35c4e18fd78293926df88 /arch/arm/mach-omap2/mailbox.c | |
parent | da8cfe03a461fe759041e7f130f96913b262aa6b (diff) |
omap mailbox: add save_/restore_ctx() for PM
To preserve the registers during off-mode
Signed-off-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
Diffstat (limited to 'arch/arm/mach-omap2/mailbox.c')
-rw-r--r-- | arch/arm/mach-omap2/mailbox.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 0b8476ba95fd..fd5b8a5925cc 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c | |||
@@ -30,6 +30,9 @@ | |||
30 | #define MAILBOX_IRQ_NEWMSG(u) (1 << (2 * (u))) | 30 | #define MAILBOX_IRQ_NEWMSG(u) (1 << (2 * (u))) |
31 | #define MAILBOX_IRQ_NOTFULL(u) (1 << (2 * (u) + 1)) | 31 | #define MAILBOX_IRQ_NOTFULL(u) (1 << (2 * (u) + 1)) |
32 | 32 | ||
33 | #define MBOX_REG_SIZE 0x120 | ||
34 | #define MBOX_NR_REGS (MBOX_REG_SIZE / sizeof(u32)) | ||
35 | |||
33 | static void __iomem *mbox_base; | 36 | static void __iomem *mbox_base; |
34 | 37 | ||
35 | struct omap_mbox2_fifo { | 38 | struct omap_mbox2_fifo { |
@@ -45,6 +48,7 @@ struct omap_mbox2_priv { | |||
45 | unsigned long irqstatus; | 48 | unsigned long irqstatus; |
46 | u32 newmsg_bit; | 49 | u32 newmsg_bit; |
47 | u32 notfull_bit; | 50 | u32 notfull_bit; |
51 | u32 ctx[MBOX_NR_REGS]; | ||
48 | }; | 52 | }; |
49 | 53 | ||
50 | static struct clk *mbox_ick_handle; | 54 | static struct clk *mbox_ick_handle; |
@@ -165,6 +169,32 @@ static int omap2_mbox_is_irq(struct omap_mbox *mbox, | |||
165 | return (enable & status & bit); | 169 | return (enable & status & bit); |
166 | } | 170 | } |
167 | 171 | ||
172 | static void omap2_mbox_save_ctx(struct omap_mbox *mbox) | ||
173 | { | ||
174 | int i; | ||
175 | struct omap_mbox2_priv *p = mbox->priv; | ||
176 | |||
177 | for (i = 0; i < MBOX_NR_REGS; i++) { | ||
178 | p->ctx[i] = mbox_read_reg(i * sizeof(u32)); | ||
179 | |||
180 | dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__, | ||
181 | i, p->ctx[i]); | ||
182 | } | ||
183 | } | ||
184 | |||
185 | static void omap2_mbox_restore_ctx(struct omap_mbox *mbox) | ||
186 | { | ||
187 | int i; | ||
188 | struct omap_mbox2_priv *p = mbox->priv; | ||
189 | |||
190 | for (i = 0; i < MBOX_NR_REGS; i++) { | ||
191 | mbox_write_reg(p->ctx[i], i * sizeof(u32)); | ||
192 | |||
193 | dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__, | ||
194 | i, p->ctx[i]); | ||
195 | } | ||
196 | } | ||
197 | |||
168 | static struct omap_mbox_ops omap2_mbox_ops = { | 198 | static struct omap_mbox_ops omap2_mbox_ops = { |
169 | .type = OMAP_MBOX_TYPE2, | 199 | .type = OMAP_MBOX_TYPE2, |
170 | .startup = omap2_mbox_startup, | 200 | .startup = omap2_mbox_startup, |
@@ -177,6 +207,8 @@ static struct omap_mbox_ops omap2_mbox_ops = { | |||
177 | .disable_irq = omap2_mbox_disable_irq, | 207 | .disable_irq = omap2_mbox_disable_irq, |
178 | .ack_irq = omap2_mbox_ack_irq, | 208 | .ack_irq = omap2_mbox_ack_irq, |
179 | .is_irq = omap2_mbox_is_irq, | 209 | .is_irq = omap2_mbox_is_irq, |
210 | .save_ctx = omap2_mbox_save_ctx, | ||
211 | .restore_ctx = omap2_mbox_restore_ctx, | ||
180 | }; | 212 | }; |
181 | 213 | ||
182 | /* | 214 | /* |