[PATCH 2/2] mailbox: apple: Implement poll_data() operation

Sven Peter sven at svenpeter.dev
Mon Sep 5 10:03:39 PDT 2022



On Mon, Sep 5, 2022, at 18:48, Russell King wrote:
> From: Hector Martin <marcan at marcan.st>
>
> This allows clients running in atomic context to poll for messages to
> arrive.
>
> Signed-off-by: Hector Martin <marcan at marcan.st>
> Signed-off-by: Russell King (Oracle) <rmk+kernel at armlinux.org.uk>

Reviewed-by: Sven Peter <sven at svenpeter.dev>

with one small comment below:

> ---
>  drivers/mailbox/apple-mailbox.c | 37 ++++++++++++++++++++++++++++++---
>  1 file changed, 34 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/mailbox/apple-mailbox.c b/drivers/mailbox/apple-mailbox.c
> index 33e7acf71e3e..1c14ff63f3d3 100644
> --- a/drivers/mailbox/apple-mailbox.c
> +++ b/drivers/mailbox/apple-mailbox.c
> @@ -26,6 +26,7 @@
>  #include <linux/module.h>
>  #include <linux/of.h>
>  #include <linux/platform_device.h>
> +#include <linux/spinlock.h>
>  #include <linux/types.h>
> 
>  #define APPLE_ASC_MBOX_CONTROL_FULL  BIT(16)
> @@ -101,6 +102,7 @@ struct apple_mbox {
> 
>  	struct device *dev;
>  	struct mbox_controller controller;
> +	spinlock_t rx_lock;
>  };
> 
>  static const struct of_device_id apple_mbox_of_match[];
> @@ -204,13 +206,16 @@ static irqreturn_t apple_mbox_send_empty_irq(int 
> irq, void *data)
>  	return IRQ_HANDLED;
>  }
> 
> -static irqreturn_t apple_mbox_recv_irq(int irq, void *data)
> +static int apple_mbox_poll(struct apple_mbox *apple_mbox)
>  {
> -	struct apple_mbox *apple_mbox = data;
> +

small nit: there's a spurious white line here

>  	struct apple_mbox_msg msg;
> +	int ret = 0;
> 
> -	while (apple_mbox_hw_recv(apple_mbox, &msg) == 0)
> +	while (apple_mbox_hw_recv(apple_mbox, &msg) == 0) {
>  		mbox_chan_received_data(&apple_mbox->chan, (void *)&msg);
> +		ret++;
> +	}
> 
>  	/*
>  	 * The interrupt will keep firing even if there are no more messages
> @@ -225,9 +230,33 @@ static irqreturn_t apple_mbox_recv_irq(int irq, void *data)
>  			       apple_mbox->regs + apple_mbox->hw->irq_ack);
>  	}
> 
> +	return ret;
> +}
> +
> +static irqreturn_t apple_mbox_recv_irq(int irq, void *data)
> +{
> +	struct apple_mbox *apple_mbox = data;
> +
> +	spin_lock(&apple_mbox->rx_lock);
> +	apple_mbox_poll(apple_mbox);
> +	spin_unlock(&apple_mbox->rx_lock);
> +
>  	return IRQ_HANDLED;
>  }
> 
> +static bool apple_mbox_chan_peek_data(struct mbox_chan *chan)
> +{
> +	struct apple_mbox *apple_mbox = chan->con_priv;
> +	unsigned long flags;
> +	int ret;
> +
> +	spin_lock_irqsave(&apple_mbox->rx_lock, flags);
> +	ret = apple_mbox_poll(apple_mbox);
> +	spin_unlock_irqrestore(&apple_mbox->rx_lock, flags);
> +
> +	return ret > 0;
> +}
> +
>  static int apple_mbox_chan_flush(struct mbox_chan *chan, unsigned long timeout)
>  {
>  	struct apple_mbox *apple_mbox = chan->con_priv;
> @@ -276,6 +305,7 @@ static void apple_mbox_chan_shutdown(struct mbox_chan *chan)
> 
>  static const struct mbox_chan_ops apple_mbox_ops = {
>  	.send_data = apple_mbox_chan_send_data,
> +	.peek_data = apple_mbox_chan_peek_data,
>  	.flush = apple_mbox_chan_flush,
>  	.startup = apple_mbox_chan_startup,
>  	.shutdown = apple_mbox_chan_shutdown,
> @@ -331,6 +361,7 @@ static int apple_mbox_probe(struct platform_device *pdev)
>  	mbox->controller.txdone_irq = true;
>  	mbox->controller.of_xlate = apple_mbox_of_xlate;
>  	mbox->chan.con_priv = mbox;
> +	spin_lock_init(&mbox->rx_lock);
> 
>  	irqname = devm_kasprintf(dev, GFP_KERNEL, "%s-recv", dev_name(dev));
>  	if (!irqname)
> -- 
> 2.30.2



More information about the linux-arm-kernel mailing list