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 0b8476ba95f..fd5b8a5925c 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c @@ -30,6 +30,9 @@  #define MAILBOX_IRQ_NEWMSG(u)		(1 << (2 * (u)))  #define MAILBOX_IRQ_NOTFULL(u)		(1 << (2 * (u) + 1)) +#define MBOX_REG_SIZE			0x120 +#define MBOX_NR_REGS			(MBOX_REG_SIZE / sizeof(u32)) +  static void __iomem *mbox_base;  struct omap_mbox2_fifo { @@ -45,6 +48,7 @@ struct omap_mbox2_priv {  	unsigned long irqstatus;  	u32 newmsg_bit;  	u32 notfull_bit; +	u32 ctx[MBOX_NR_REGS];  };  static struct clk *mbox_ick_handle; @@ -165,6 +169,32 @@ static int omap2_mbox_is_irq(struct omap_mbox *mbox,  	return (enable & status & bit);  } +static void omap2_mbox_save_ctx(struct omap_mbox *mbox) +{ +	int i; +	struct omap_mbox2_priv *p = mbox->priv; + +	for (i = 0; i < MBOX_NR_REGS; i++) { +		p->ctx[i] = mbox_read_reg(i * sizeof(u32)); + +		dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__, +			i, p->ctx[i]); +	} +} + +static void omap2_mbox_restore_ctx(struct omap_mbox *mbox) +{ +	int i; +	struct omap_mbox2_priv *p = mbox->priv; + +	for (i = 0; i < MBOX_NR_REGS; i++) { +		mbox_write_reg(p->ctx[i], i * sizeof(u32)); + +		dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__, +			i, p->ctx[i]); +	} +} +  static struct omap_mbox_ops omap2_mbox_ops = {  	.type		= OMAP_MBOX_TYPE2,  	.startup	= omap2_mbox_startup, @@ -177,6 +207,8 @@ static struct omap_mbox_ops omap2_mbox_ops = {  	.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,  };  /* diff --git a/arch/arm/plat-omap/include/mach/mailbox.h b/arch/arm/plat-omap/include/mach/mailbox.h index 577db6852f4..b7a6991814e 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 {  	void		(*disable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);  	void		(*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);  	int		(*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); +	/* ctx */ +	void		(*save_ctx)(struct omap_mbox *mbox); +	void		(*restore_ctx)(struct omap_mbox *mbox);  };  struct omap_mbox_queue { @@ -70,4 +73,24 @@ void omap_mbox_put(struct omap_mbox *);  int omap_mbox_register(struct device *parent, struct omap_mbox *);  int omap_mbox_unregister(struct omap_mbox *); +static inline void omap_mbox_save_ctx(struct omap_mbox *mbox) +{ +	if (!mbox->ops->save_ctx) { +		dev_err(mbox->dev, "%s:\tno save\n", __func__); +		return; +	} + +	mbox->ops->save_ctx(mbox); +} + +static inline void omap_mbox_restore_ctx(struct omap_mbox *mbox) +{ +	if (!mbox->ops->restore_ctx) { +		dev_err(mbox->dev, "%s:\tno restore\n", __func__); +		return; +	} + +	mbox->ops->restore_ctx(mbox); +} +  #endif /* MAILBOX_H */  |