diff options
-rw-r--r-- | arch/arm/mach-omap2/mailbox.c | 32 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/mailbox.h | 23 |
2 files changed, 55 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 | /* |
diff --git a/arch/arm/plat-omap/include/mach/mailbox.h b/arch/arm/plat-omap/include/mach/mailbox.h index 577db6852f43..b7a6991814ec 100644 --- a/arch/arm/plat-omap/include/mach/mailbox.h +++ b/arch/arm/plat-omap/include/mach/mailbox.h | |||
@@ -33,6 +33,9 @@ struct omap_mbox_ops { | |||
33 | void (*disable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); | 33 | void (*disable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); |
34 | void (*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); | 34 | void (*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); |
35 | int (*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); | 35 | int (*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); |
36 | /* ctx */ | ||
37 | void (*save_ctx)(struct omap_mbox *mbox); | ||
38 | void (*restore_ctx)(struct omap_mbox *mbox); | ||
36 | }; | 39 | }; |
37 | 40 | ||
38 | struct omap_mbox_queue { | 41 | struct omap_mbox_queue { |
@@ -70,4 +73,24 @@ void omap_mbox_put(struct omap_mbox *); | |||
70 | int omap_mbox_register(struct device *parent, struct omap_mbox *); | 73 | int omap_mbox_register(struct device *parent, struct omap_mbox *); |
71 | int omap_mbox_unregister(struct omap_mbox *); | 74 | int omap_mbox_unregister(struct omap_mbox *); |
72 | 75 | ||
76 | static inline void omap_mbox_save_ctx(struct omap_mbox *mbox) | ||
77 | { | ||
78 | if (!mbox->ops->save_ctx) { | ||
79 | dev_err(mbox->dev, "%s:\tno save\n", __func__); | ||
80 | return; | ||
81 | } | ||
82 | |||
83 | mbox->ops->save_ctx(mbox); | ||
84 | } | ||
85 | |||
86 | static inline void omap_mbox_restore_ctx(struct omap_mbox *mbox) | ||
87 | { | ||
88 | if (!mbox->ops->restore_ctx) { | ||
89 | dev_err(mbox->dev, "%s:\tno restore\n", __func__); | ||
90 | return; | ||
91 | } | ||
92 | |||
93 | mbox->ops->restore_ctx(mbox); | ||
94 | } | ||
95 | |||
73 | #endif /* MAILBOX_H */ | 96 | #endif /* MAILBOX_H */ |