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

Commit 14ba9a2e authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull mailbox framework updates from Jassi Brar.

* 'mailbox-devel' of git://git.linaro.org/landing-teams/working/fujitsu/integration:
  Mailbox: Add support for Platform Communication Channel
  mailbox/omap: adapt to the new mailbox framework
  mailbox: add tx_prepare client callback
  mailbox: Don't unnecessarily re-arm the polling timer
parents b859e7d1 86c22f8c
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -43,6 +43,9 @@ Required properties:
			device. The format is dependent on which interrupt
			controller the OMAP device uses
- ti,hwmods:		Name of the hwmod associated with the mailbox
- #mbox-cells:		Common mailbox binding property to identify the number
			of cells required for the mailbox specifier. Should be
			1
- ti,mbox-num-users:	Number of targets (processor devices) that the mailbox
			device can interrupt
- ti,mbox-num-fifos:	Number of h/w fifo queues within the mailbox IP block
@@ -72,6 +75,18 @@ data that represent the following:
    Cell #3 (usr_id)  - mailbox user id for identifying the interrupt line
                        associated with generating a tx/rx fifo interrupt.

Mailbox Users:
==============
A device needing to communicate with a target processor device should specify
them using the common mailbox binding properties, "mboxes" and the optional
"mbox-names" (please see Documentation/devicetree/bindings/mailbox/mailbox.txt
for details). Each value of the mboxes property should contain a phandle to the
mailbox controller device node and an args specifier that will be the phandle to
the intended sub-mailbox child node to be used for communication. The equivalent
"mbox-names" property value can be used to give a name to the communication channel
to be used by the client user.


Example:
--------

@@ -81,6 +96,7 @@ mailbox: mailbox@4a0f4000 {
	reg = <0x4a0f4000 0x200>;
	interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
	ti,hwmods = "mailbox";
	#mbox-cells = <1>;
	ti,mbox-num-users = <3>;
	ti,mbox-num-fifos = <8>;
	mbox_ipu: mbox_ipu {
@@ -93,12 +109,19 @@ mailbox: mailbox@4a0f4000 {
	};
};

dsp {
	...
	mboxes = <&mailbox &mbox_dsp>;
	...
};

/* AM33xx */
mailbox: mailbox@480C8000 {
	compatible = "ti,omap4-mailbox";
	reg = <0x480C8000 0x200>;
	interrupts = <77>;
	ti,hwmods = "mailbox";
	#mbox-cells = <1>;
	ti,mbox-num-users = <4>;
	ti,mbox-num-fifos = <8>;
	mbox_wkupm3: wkup_m3 {
+12 −0
Original line number Diff line number Diff line
@@ -33,4 +33,16 @@ config OMAP_MBOX_KFIFO_SIZE
	  Specify the default size of mailbox's kfifo buffers (bytes).
	  This can also be changed at runtime (via the mbox_kfifo_size
	  module parameter).

config PCC
	bool "Platform Communication Channel Driver"
	depends on ACPI
	help
	  ACPI 5.0+ spec defines a generic mode of communication
	  between the OS and a platform such as the BMC. This medium
	  (PCC) is typically used by CPPC (ACPI CPU Performance management),
	  RAS (ACPI reliability protocol) and MPST (ACPI Memory power
	  states). Select this driver if your platform implements the
	  PCC clients mentioned above.

endif
+2 −0
Original line number Diff line number Diff line
@@ -5,3 +5,5 @@ obj-$(CONFIG_MAILBOX) += mailbox.o
obj-$(CONFIG_PL320_MBOX)	+= pl320-ipc.o

obj-$(CONFIG_OMAP2PLUS_MBOX)	+= omap-mailbox.o

obj-$(CONFIG_PCC)		+= pcc.o
+11 −8
Original line number Diff line number Diff line
@@ -21,13 +21,13 @@
#include <linux/mailbox_client.h>
#include <linux/mailbox_controller.h>

#define TXDONE_BY_IRQ	BIT(0) /* controller has remote RTR irq */
#define TXDONE_BY_POLL	BIT(1) /* controller can read status of last TX */
#define TXDONE_BY_ACK	BIT(2) /* S/W ACK recevied by Client ticks the TX */
#include "mailbox.h"

static LIST_HEAD(mbox_cons);
static DEFINE_MUTEX(con_mutex);

static void poll_txdone(unsigned long data);

static int add_to_rbuf(struct mbox_chan *chan, void *mssg)
{
	int idx;
@@ -60,7 +60,7 @@ static void msg_submit(struct mbox_chan *chan)
	unsigned count, idx;
	unsigned long flags;
	void *data;
	int err;
	int err = -EBUSY;

	spin_lock_irqsave(&chan->lock, flags);

@@ -76,6 +76,8 @@ static void msg_submit(struct mbox_chan *chan)

	data = chan->msg_data[idx];

	if (chan->cl->tx_prepare)
		chan->cl->tx_prepare(chan->cl, data);
	/* Try to submit a message to the MBOX controller */
	err = chan->mbox->ops->send_data(chan, data);
	if (!err) {
@@ -84,6 +86,9 @@ static void msg_submit(struct mbox_chan *chan)
	}
exit:
	spin_unlock_irqrestore(&chan->lock, flags);

	if (!err && chan->txdone_method == TXDONE_BY_POLL)
		poll_txdone((unsigned long)chan->mbox);
}

static void tx_tick(struct mbox_chan *chan, int r)
@@ -117,10 +122,11 @@ static void poll_txdone(unsigned long data)
		struct mbox_chan *chan = &mbox->chans[i];

		if (chan->active_req && chan->cl) {
			resched = true;
			txdone = chan->mbox->ops->last_tx_done(chan);
			if (txdone)
				tx_tick(chan, 0);
			else
				resched = true;
		}
	}

@@ -252,9 +258,6 @@ int mbox_send_message(struct mbox_chan *chan, void *mssg)

	msg_submit(chan);

	if (chan->txdone_method	== TXDONE_BY_POLL)
		poll_txdone((unsigned long)chan->mbox);

	if (chan->cl->tx_block && chan->active_req) {
		unsigned long wait;
		int ret;
+14 −0
Original line number Diff line number Diff line
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#ifndef __MAILBOX_H
#define __MAILBOX_H

#define TXDONE_BY_IRQ	BIT(0) /* controller has remote RTR irq */
#define TXDONE_BY_POLL	BIT(1) /* controller can read status of last TX */
#define TXDONE_BY_ACK	BIT(2) /* S/W ACK recevied by Client ticks the TX */

#endif /* __MAILBOX_H */
Loading