apple-mailbox: add support for atomc mailbox operations
cover apple-mailbox: add support for atomc mailbox operations
Hi,
This series adds support for atomic mailbox operations to the Apple mailbox driver.
drivers/mailbox/apple-mailbox.c | 64 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 3 deletions(-)
Signature · 2 lines
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!
PATCH 1/2 mailbox: apple: Implement flush() operation
From: Hector Martin <[email protected]>
This allows clients to use the atomic-safe mailbox API style.
--- drivers/mailbox/apple-mailbox.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
drivers/mailbox/apple-mailbox.c +27 -0
@@ -17,6 +17,7 @@*/ #include <linux/apple-mailbox.h> +#include <linux/delay.h> #include <linux/device.h> #include <linux/gfp.h> #include <linux/interrupt.h>
@@ -112,6 +113,14 @@ static bool apple_mbox_hw_can_send(struct apple_mbox *apple_mbox)return !(mbox_ctrl & apple_mbox->hw->control_full); } +static bool apple_mbox_hw_send_empty (struct apple_mbox *apple_mbox) +{ +u32 mbox_ctrl = +readl_relaxed (apple_mbox->regs + apple_mbox->hw->a2i_control); + +return mbox_ctrl & apple_mbox->hw->control_empty; +} +static int apple_mbox_hw_send (struct apple_mbox *apple_mbox,struct apple_mbox_msg *msg) {
@@ -219,6 +228,23 @@ static irqreturn_t apple_mbox_recv_irq(int irq, void *data)return IRQ_HANDLED ; } +static int apple_mbox_chan_flush (struct mbox_chan *chan,unsigned long timeout) +{ +struct apple_mbox *apple_mbox = chan->con_priv; +unsigned long deadline = jiffies +msecs_to_jiffies (timeout); + +while (time_before (jiffies, deadline)) { +if (apple_mbox_hw_send_empty (apple_mbox)) { +mbox_chan_txdone (&apple_mbox->chan,0 ); +return 0 ; + } + +udelay (1 ); + } + +return -ETIME ; +} +static int apple_mbox_chan_startup (struct mbox_chan *chan) {struct apple_mbox *apple_mbox = chan->con_priv;
@@ -250,6 +276,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, + .flush = apple_mbox_chan_flush, .startup = apple_mbox_chan_startup, .shutdown = apple_mbox_chan_shutdown, };
Signature · 1 line
2.30.2
Re: [PATCH 1/2] mailbox: apple: Implement flush() operation
Quoted 7 lines · Russell King
From: Hector Martin <[email protected]>
This allows clients to use the atomic-safe mailbox API style.
Signed-off-by Hector Martin <[email protected]>Signed-off-by Russell King (Oracle) <[email protected]>---
PATCH 2/2 mailbox: apple: Implement poll_data() operation
In reply to Russell King (Oracle)From: Hector Martin <[email protected]>
This allows clients running in atomic context to poll for messages to arrive.
--- drivers/mailbox/apple-mailbox.c | 37 ++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-)
drivers/mailbox/apple-mailbox.c +34 -3
@@ -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; +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)
Signature · 1 line
2.30.2
Re: [PATCH 2/2] mailbox: apple: Implement poll_data() operation
Quoted 7 lines · Russell King
From: Hector Martin <[email protected]>
This allows clients running in atomic context to poll for messages to arrive.
Signed-off-by Hector Martin <[email protected]>Signed-off-by Russell King (Oracle) <[email protected]>
with one small comment below:
Quoted 25 lines
--- drivers/mailbox/apple-mailbox.c | 37 ++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-)drivers/mailbox/apple-mailbox.c +2
-0@@ -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[];
drivers/mailbox/apple-mailbox.c static irqreturn_t apple_mbox_send_empty_irq(int · line 212
Quoted 9 lines
drivers/mailbox/apple-mailbox.c +2
-2@@ -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
Quoted 63 lines
drivers/mailbox/apple-mailbox.c +4
-1struct 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++; + }/* drivers/mailbox/apple-mailbox.c +26
-0* 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)Signature · 1 line
2.30.2
Re: [PATCH 2/2] mailbox: apple: Implement poll_data() operation
Quoted 44 lines · Sven Peter
Quoted 7 lines · Russell King
From: Hector Martin <[email protected]>
This allows clients running in atomic context to poll for messages to arrive.
Signed-off-by Hector Martin <[email protected]>Signed-off-by Russell King (Oracle) <[email protected]>Reviewed-by Sven Peter <[email protected]>with one small comment below:
Quoted 29 lines
--- drivers/mailbox/apple-mailbox.c | 37 ++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-)drivers/mailbox/apple-mailbox.c +2
-0@@ -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 ; }
Quoted 7 lines
drivers/mailbox/apple-mailbox.c static irqreturn_t apple_mbox_send_empty_irq(int irq, void *data) · line 211
Quoted 5 lines
drivers/mailbox/apple-mailbox.c +2
-2-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
Thanks, well spotted. Will fix.
Signature · 2 lines
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!