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

ARM: OMAP: Fix Unbalanced enable for IRQ in omap mailbox

parent 0692f05d
Loading
Loading
Loading
Loading
+15 −10
Original line number Original line Diff line number Diff line
@@ -70,6 +70,9 @@ struct omap_mbox2_priv {


static struct clk *mbox_ick_handle;
static struct clk *mbox_ick_handle;


static void omap2_mbox_enable_irq(struct omap_mbox *mbox,
				  omap_mbox_type_t irq);

static inline unsigned int mbox_read_reg(unsigned int reg)
static inline unsigned int mbox_read_reg(unsigned int reg)
{
{
	return __raw_readl(mbox_base + reg);
	return __raw_readl(mbox_base + reg);
@@ -81,7 +84,7 @@ static inline void mbox_write_reg(unsigned int val, unsigned int reg)
}
}


/* Mailbox H/W preparations */
/* Mailbox H/W preparations */
static inline int omap2_mbox_startup(struct omap_mbox *mbox)
static int omap2_mbox_startup(struct omap_mbox *mbox)
{
{
	unsigned int l;
	unsigned int l;


@@ -97,38 +100,40 @@ static inline int omap2_mbox_startup(struct omap_mbox *mbox)
	l |= 0x00000011;
	l |= 0x00000011;
	mbox_write_reg(l, MAILBOX_SYSCONFIG);
	mbox_write_reg(l, MAILBOX_SYSCONFIG);


	omap2_mbox_enable_irq(mbox, IRQ_RX);

	return 0;
	return 0;
}
}


static inline void omap2_mbox_shutdown(struct omap_mbox *mbox)
static void omap2_mbox_shutdown(struct omap_mbox *mbox)
{
{
	clk_disable(mbox_ick_handle);
	clk_disable(mbox_ick_handle);
	clk_put(mbox_ick_handle);
	clk_put(mbox_ick_handle);
}
}


/* Mailbox FIFO handle functions */
/* Mailbox FIFO handle functions */
static inline mbox_msg_t omap2_mbox_fifo_read(struct omap_mbox *mbox)
static mbox_msg_t omap2_mbox_fifo_read(struct omap_mbox *mbox)
{
{
	struct omap_mbox2_fifo *fifo =
	struct omap_mbox2_fifo *fifo =
		&((struct omap_mbox2_priv *)mbox->priv)->rx_fifo;
		&((struct omap_mbox2_priv *)mbox->priv)->rx_fifo;
	return (mbox_msg_t) mbox_read_reg(fifo->msg);
	return (mbox_msg_t) mbox_read_reg(fifo->msg);
}
}


static inline void omap2_mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg)
static void omap2_mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg)
{
{
	struct omap_mbox2_fifo *fifo =
	struct omap_mbox2_fifo *fifo =
		&((struct omap_mbox2_priv *)mbox->priv)->tx_fifo;
		&((struct omap_mbox2_priv *)mbox->priv)->tx_fifo;
	mbox_write_reg(msg, fifo->msg);
	mbox_write_reg(msg, fifo->msg);
}
}


static inline int omap2_mbox_fifo_empty(struct omap_mbox *mbox)
static int omap2_mbox_fifo_empty(struct omap_mbox *mbox)
{
{
	struct omap_mbox2_fifo *fifo =
	struct omap_mbox2_fifo *fifo =
		&((struct omap_mbox2_priv *)mbox->priv)->rx_fifo;
		&((struct omap_mbox2_priv *)mbox->priv)->rx_fifo;
	return (mbox_read_reg(fifo->msg_stat) == 0);
	return (mbox_read_reg(fifo->msg_stat) == 0);
}
}


static inline int omap2_mbox_fifo_full(struct omap_mbox *mbox)
static int omap2_mbox_fifo_full(struct omap_mbox *mbox)
{
{
	struct omap_mbox2_fifo *fifo =
	struct omap_mbox2_fifo *fifo =
		&((struct omap_mbox2_priv *)mbox->priv)->tx_fifo;
		&((struct omap_mbox2_priv *)mbox->priv)->tx_fifo;
@@ -136,7 +141,7 @@ static inline int omap2_mbox_fifo_full(struct omap_mbox *mbox)
}
}


/* Mailbox IRQ handle functions */
/* Mailbox IRQ handle functions */
static inline void omap2_mbox_enable_irq(struct omap_mbox *mbox,
static void omap2_mbox_enable_irq(struct omap_mbox *mbox,
		omap_mbox_type_t irq)
		omap_mbox_type_t irq)
{
{
	struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
	struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
@@ -147,7 +152,7 @@ static inline void omap2_mbox_enable_irq(struct omap_mbox *mbox,
	mbox_write_reg(l, p->irqenable);
	mbox_write_reg(l, p->irqenable);
}
}


static inline void omap2_mbox_disable_irq(struct omap_mbox *mbox,
static void omap2_mbox_disable_irq(struct omap_mbox *mbox,
		omap_mbox_type_t irq)
		omap_mbox_type_t irq)
{
{
	struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
	struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
@@ -158,7 +163,7 @@ static inline void omap2_mbox_disable_irq(struct omap_mbox *mbox,
	mbox_write_reg(l, p->irqenable);
	mbox_write_reg(l, p->irqenable);
}
}


static inline void omap2_mbox_ack_irq(struct omap_mbox *mbox,
static void omap2_mbox_ack_irq(struct omap_mbox *mbox,
		omap_mbox_type_t irq)
		omap_mbox_type_t irq)
{
{
	struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
	struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
@@ -167,7 +172,7 @@ static inline void omap2_mbox_ack_irq(struct omap_mbox *mbox,
	mbox_write_reg(bit, p->irqstatus);
	mbox_write_reg(bit, p->irqstatus);
}
}


static inline int omap2_mbox_is_irq(struct omap_mbox *mbox,
static int omap2_mbox_is_irq(struct omap_mbox *mbox,
		omap_mbox_type_t irq)
		omap_mbox_type_t irq)
{
{
	struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
	struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
+0 −1
Original line number Original line Diff line number Diff line
@@ -355,7 +355,6 @@ static int omap_mbox_init(struct omap_mbox *mbox)
			"failed to register mailbox interrupt:%d\n", ret);
			"failed to register mailbox interrupt:%d\n", ret);
		goto fail_request_irq;
		goto fail_request_irq;
	}
	}
	enable_mbox_irq(mbox, IRQ_RX);


	mq = mbox_queue_alloc(mbox, mbox_txq_fn, mbox_tx_work);
	mq = mbox_queue_alloc(mbox, mbox_txq_fn, mbox_tx_work);
	if (!mq) {
	if (!mq) {