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

Commit e3a98ac4 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull mailbox updates from Jassi Brar:
 "Mainly we move from jiffy based timer to HRTIMER for finer control
  over polling.  Then a controller reduces its polling period from 10 to
  1ms"

* 'mailbox-for-next' of git://git.linaro.org/landing-teams/working/fujitsu/integration:
  mailbox: arm_mhu: reduce txpoll_period from 10ms to 1 ms
  mailbox: switch to hrtimer for tx_complete polling
  mailbox: Drop owner assignment from platform_driver
parents 2a013e37 86e488ad
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -148,7 +148,7 @@ static int mhu_probe(struct amba_device *adev, const struct amba_id *id)
	mhu->mbox.ops = &mhu_ops;
	mhu->mbox.txdone_irq = false;
	mhu->mbox.txdone_poll = true;
	mhu->mbox.txpoll_period = 10;
	mhu->mbox.txpoll_period = 1;

	amba_set_drvdata(adev, mhu);

+0 −1
Original line number Diff line number Diff line
@@ -204,7 +204,6 @@ MODULE_DEVICE_TABLE(of, bcm2835_mbox_of_match);
static struct platform_driver bcm2835_mbox_driver = {
	.driver = {
		.name = "bcm2835-mbox",
		.owner = THIS_MODULE,
		.of_match_table = bcm2835_mbox_of_match,
	},
	.probe		= bcm2835_mbox_probe,
+15 −12
Original line number Diff line number Diff line
@@ -26,8 +26,6 @@
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;
@@ -88,7 +86,9 @@ static void msg_submit(struct mbox_chan *chan)
	spin_unlock_irqrestore(&chan->lock, flags);

	if (!err && (chan->txdone_method & TXDONE_BY_POLL))
		poll_txdone((unsigned long)chan->mbox);
		/* kick start the timer immediately to avoid delays */
		hrtimer_start(&chan->mbox->poll_hrt, ktime_set(0, 0),
			      HRTIMER_MODE_REL);
}

static void tx_tick(struct mbox_chan *chan, int r)
@@ -112,9 +112,10 @@ static void tx_tick(struct mbox_chan *chan, int r)
		complete(&chan->tx_complete);
}

static void poll_txdone(unsigned long data)
static enum hrtimer_restart txdone_hrtimer(struct hrtimer *hrtimer)
{
	struct mbox_controller *mbox = (struct mbox_controller *)data;
	struct mbox_controller *mbox =
		container_of(hrtimer, struct mbox_controller, poll_hrt);
	bool txdone, resched = false;
	int i;

@@ -130,9 +131,11 @@ static void poll_txdone(unsigned long data)
		}
	}

	if (resched)
		mod_timer(&mbox->poll, jiffies +
				msecs_to_jiffies(mbox->txpoll_period));
	if (resched) {
		hrtimer_forward_now(hrtimer, ms_to_ktime(mbox->txpoll_period));
		return HRTIMER_RESTART;
	}
	return HRTIMER_NORESTART;
}

/**
@@ -451,9 +454,9 @@ int mbox_controller_register(struct mbox_controller *mbox)
		txdone = TXDONE_BY_ACK;

	if (txdone == TXDONE_BY_POLL) {
		mbox->poll.function = &poll_txdone;
		mbox->poll.data = (unsigned long)mbox;
		init_timer(&mbox->poll);
		hrtimer_init(&mbox->poll_hrt, CLOCK_MONOTONIC,
			     HRTIMER_MODE_REL);
		mbox->poll_hrt.function = txdone_hrtimer;
	}

	for (i = 0; i < mbox->num_chans; i++) {
@@ -495,7 +498,7 @@ void mbox_controller_unregister(struct mbox_controller *mbox)
		mbox_free_channel(&mbox->chans[i]);

	if (mbox->txdone_poll)
		del_timer_sync(&mbox->poll);
		hrtimer_cancel(&mbox->poll_hrt);

	mutex_unlock(&con_mutex);
}
+4 −3
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@

#include <linux/of.h>
#include <linux/types.h>
#include <linux/timer.h>
#include <linux/hrtimer.h>
#include <linux/device.h>
#include <linux/completion.h>

@@ -67,7 +67,8 @@ struct mbox_chan_ops {
 * @txpoll_period:	If 'txdone_poll' is in effect, the API polls for
 *			last TX's status after these many millisecs
 * @of_xlate:		Controller driver specific mapping of channel via DT
 * @poll:		API private. Used to poll for TXDONE on all channels.
 * @poll_hrt:		API private. hrtimer used to poll for TXDONE on all
 *			channels.
 * @node:		API private. To hook into list of controllers.
 */
struct mbox_controller {
@@ -81,7 +82,7 @@ struct mbox_controller {
	struct mbox_chan *(*of_xlate)(struct mbox_controller *mbox,
				      const struct of_phandle_args *sp);
	/* Internal to API */
	struct timer_list poll;
	struct hrtimer poll_hrt;
	struct list_head node;
};