Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c75ee752 authored by Hiroshi DOYU's avatar Hiroshi DOYU Committed by Tony Lindgren
Browse files

omap mailbox: add save_/restore_ctx() for PM



To preserve the registers during off-mode

Signed-off-by: default avatarHiroshi DOYU <Hiroshi.DOYU@nokia.com>
parent da8cfe03
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -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,
};

/*
+23 −0
Original line number Diff line number Diff line
@@ -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 */