diff mbox series

[V2,4/4] mailbox: imx: support i.MX93 S401 MU

Message ID 20220208063046.2265537-5-peng.fan@oss.nxp.com (mailing list archive)
State New, archived
Headers show
Series mailbox: imx: support i.MX93 | expand

Commit Message

Peng Fan (OSS) Feb. 8, 2022, 6:30 a.m. UTC
From: Peng Fan <peng.fan@nxp.com>

i.MX93 S401 MU support two interrupts: tx empty and rx full.

 - Introduce a new flag IMX_MU_V2_IRQ for the dual interrupt case
 - Add i.MX93 S401 MU cfg
 - Update author and Copyright

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/mailbox/imx-mailbox.c | 49 ++++++++++++++++++++++++++++-------
 1 file changed, 40 insertions(+), 9 deletions(-)

Comments

Daniel Baluta Feb. 9, 2022, 12:46 p.m. UTC | #1
Peng,

This patch is doing 3 things in one patch.

Please split this with one patch per functional change.

On Wed, Feb 9, 2022 at 1:20 PM Peng Fan (OSS) <peng.fan@oss.nxp.com> wrote:
>
> From: Peng Fan <peng.fan@nxp.com>
>
> i.MX93 S401 MU support two interrupts: tx empty and rx full.
>
>  - Introduce a new flag IMX_MU_V2_IRQ for the dual interrupt case
>  - Add i.MX93 S401 MU cfg
>  - Update author and Copyright
>
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>  drivers/mailbox/imx-mailbox.c | 49 ++++++++++++++++++++++++++++-------
>  1 file changed, 40 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/mailbox/imx-mailbox.c b/drivers/mailbox/imx-mailbox.c
> index 03699843a6fd..094dc84291fc 100644
> --- a/drivers/mailbox/imx-mailbox.c
> +++ b/drivers/mailbox/imx-mailbox.c
> @@ -1,6 +1,7 @@
>  // SPDX-License-Identifier: GPL-2.0
>  /*
>   * Copyright (c) 2018 Pengutronix, Oleksij Rempel <o.rempel@pengutronix.de>
> + * Copyright 2022 NXP, Peng Fan <peng.fan@nxp.com>
>   */
>
>  #include <linux/clk.h>
> @@ -28,6 +29,7 @@
>  #define IMX_MU_SECO_TX_TOUT (msecs_to_jiffies(3000))
>  #define IMX_MU_SECO_RX_TOUT (msecs_to_jiffies(3000))
>
> +/* Please not change TX & RX */
>  enum imx_mu_chan_type {
>         IMX_MU_TYPE_TX,         /* Tx */
>         IMX_MU_TYPE_RX,         /* Rx */
> @@ -92,6 +94,7 @@ enum imx_mu_type {
>         IMX_MU_V1,
>         IMX_MU_V2 = BIT(1),
>         IMX_MU_V2_S4 = BIT(15),
> +       IMX_MU_V2_IRQ = BIT(16),
>  };
>
>  struct imx_mu_dcfg {
> @@ -536,7 +539,8 @@ static int imx_mu_startup(struct mbox_chan *chan)
>  {
>         struct imx_mu_priv *priv = to_imx_mu_priv(chan->mbox);
>         struct imx_mu_con_priv *cp = chan->con_priv;
> -       unsigned long irq_flag = IRQF_SHARED;
> +       unsigned long irq_flag = 0;
> +       int irq;
>         int ret;
>
>         pm_runtime_get_sync(priv->dev);
> @@ -551,11 +555,16 @@ static int imx_mu_startup(struct mbox_chan *chan)
>         if (!priv->dev->pm_domain)
>                 irq_flag |= IRQF_NO_SUSPEND;
>
> -       ret = request_irq(priv->irq[0], imx_mu_isr, irq_flag,
> -                         cp->irq_desc, chan);
> +       if (priv->dcfg->type & IMX_MU_V2_IRQ) {
> +               irq = priv->irq[cp->type];
> +       } else {
> +               irq = priv->irq[0];
> +               irq_flag |= IRQF_SHARED;
> +       }
> +
> +       ret = request_irq(irq, imx_mu_isr, irq_flag, cp->irq_desc, chan);
>         if (ret) {
> -               dev_err(priv->dev,
> -                       "Unable to acquire IRQ %d\n", priv->irq[0]);
> +               dev_err(priv->dev, "Unable to acquire IRQ %d\n", irq);
>                 return ret;
>         }
>
> @@ -762,14 +771,23 @@ static int imx_mu_probe(struct platform_device *pdev)
>         if (IS_ERR(priv->base))
>                 return PTR_ERR(priv->base);
>
> -       priv->irq[0] = platform_get_irq(pdev, 0);
> -       if (priv->irq[0] < 0)
> -               return priv->irq[0];
> -
>         dcfg = of_device_get_match_data(dev);
>         if (!dcfg)
>                 return -EINVAL;
>         priv->dcfg = dcfg;
> +       if (priv->dcfg->type & IMX_MU_V2_IRQ) {
> +               priv->irq[IMX_MU_TYPE_TX] = platform_get_irq_byname(pdev, "txirq");
> +               if (priv->irq[IMX_MU_TYPE_TX] < 0)
> +                       return priv->irq[IMX_MU_TYPE_TX];
> +               priv->irq[IMX_MU_TYPE_RX] = platform_get_irq_byname(pdev, "rxirq");
> +               if (priv->irq[IMX_MU_TYPE_RX] < 0)
> +                       return priv->irq[IMX_MU_TYPE_RX];
> +       } else {
> +               priv->irq[0] = platform_get_irq(pdev, 0);
> +               if (priv->irq[0] < 0)
> +                       return priv->irq[0];
> +
> +       }
>
>         if (priv->dcfg->type & IMX_MU_V2_S4)
>                 size = sizeof(struct imx_s4_rpc_msg_max);
> @@ -890,6 +908,17 @@ static const struct imx_mu_dcfg imx_mu_cfg_imx8ulp_s4 = {
>         .xCR    = {0x110, 0x114, 0x120, 0x128},
>  };
>
> +static const struct imx_mu_dcfg imx_mu_cfg_imx93_s4 = {
> +       .tx     = imx_mu_specific_tx,
> +       .rx     = imx_mu_specific_rx,
> +       .init   = imx_mu_init_specific,
> +       .type   = IMX_MU_V2 | IMX_MU_V2_S4 | IMX_MU_V2_IRQ,
> +       .xTR    = 0x200,
> +       .xRR    = 0x280,
> +       .xSR    = {0xC, 0x118, 0x124, 0x12C},
> +       .xCR    = {0x110, 0x114, 0x120, 0x128},
> +};
> +
>  static const struct imx_mu_dcfg imx_mu_cfg_imx8_scu = {
>         .tx     = imx_mu_specific_tx,
>         .rx     = imx_mu_specific_rx,
> @@ -917,6 +946,7 @@ static const struct of_device_id imx_mu_dt_ids[] = {
>         { .compatible = "fsl,imx6sx-mu", .data = &imx_mu_cfg_imx6sx },
>         { .compatible = "fsl,imx8ulp-mu", .data = &imx_mu_cfg_imx8ulp },
>         { .compatible = "fsl,imx8ulp-mu-s4", .data = &imx_mu_cfg_imx8ulp_s4 },
> +       { .compatible = "fsl,imx93-mu-s4", .data = &imx_mu_cfg_imx93_s4 },
>         { .compatible = "fsl,imx8-mu-scu", .data = &imx_mu_cfg_imx8_scu },
>         { .compatible = "fsl,imx8-mu-seco", .data = &imx_mu_cfg_imx8_seco },
>         { },
> @@ -1001,5 +1031,6 @@ static struct platform_driver imx_mu_driver = {
>  module_platform_driver(imx_mu_driver);
>
>  MODULE_AUTHOR("Oleksij Rempel <o.rempel@pengutronix.de>");
> +MODULE_AUTHOR("Peng Fan <peng.fan@nxp.com>");
>  MODULE_DESCRIPTION("Message Unit driver for i.MX");
>  MODULE_LICENSE("GPL v2");
> --
> 2.25.1
>
Krzysztof Kozlowski Feb. 9, 2022, 1:48 p.m. UTC | #2
On 09/02/2022 13:46, Daniel Baluta wrote:
> Peng,
> 
> This patch is doing 3 things in one patch.
> 
> Please split this with one patch per functional change.

The third task - updating author - I just asked to squash with previous
patch because it really does not have sense on its own. Authorship and
copyright update are direct effect of new code. Therefore they are
usually squashed with the actual change.

> 
> On Wed, Feb 9, 2022 at 1:20 PM Peng Fan (OSS) <peng.fan@oss.nxp.com> wrote:
>>
>> From: Peng Fan <peng.fan@nxp.com>
>>
>> i.MX93 S401 MU support two interrupts: tx empty and rx full.
>>
>>  - Introduce a new flag IMX_MU_V2_IRQ for the dual interrupt case
>>  - Add i.MX93 S401 MU cfg
>>  - Update author and Copyright

Best regards,
Krzysztof
Peng Fan Feb. 10, 2022, 7:13 a.m. UTC | #3
Daniel

> Subject: Re: [PATCH V2 4/4] mailbox: imx: support i.MX93 S401 MU
> 
> Peng,
> 
> This patch is doing 3 things in one patch.

I could split the new flag and i.mx93 support

Thanks,
Peng.

> 
> Please split this with one patch per functional change.
> 
> On Wed, Feb 9, 2022 at 1:20 PM Peng Fan (OSS) <peng.fan@oss.nxp.com>
> wrote:
> >
> > From: Peng Fan <peng.fan@nxp.com>
> >
> > i.MX93 S401 MU support two interrupts: tx empty and rx full.
> >
> >  - Introduce a new flag IMX_MU_V2_IRQ for the dual interrupt case
> >  - Add i.MX93 S401 MU cfg
> >  - Update author and Copyright
> >
> > Signed-off-by: Peng Fan <peng.fan@nxp.com>
> > ---
> >  drivers/mailbox/imx-mailbox.c | 49
> > ++++++++++++++++++++++++++++-------
> >  1 file changed, 40 insertions(+), 9 deletions(-)
> >
> > diff --git a/drivers/mailbox/imx-mailbox.c
> > b/drivers/mailbox/imx-mailbox.c index 03699843a6fd..094dc84291fc
> > 100644
> > --- a/drivers/mailbox/imx-mailbox.c
> > +++ b/drivers/mailbox/imx-mailbox.c
> > @@ -1,6 +1,7 @@
> >  // SPDX-License-Identifier: GPL-2.0
> >  /*
> >   * Copyright (c) 2018 Pengutronix, Oleksij Rempel
> > <o.rempel@pengutronix.de>
> > + * Copyright 2022 NXP, Peng Fan <peng.fan@nxp.com>
> >   */
> >
> >  #include <linux/clk.h>
> > @@ -28,6 +29,7 @@
> >  #define IMX_MU_SECO_TX_TOUT (msecs_to_jiffies(3000))  #define
> > IMX_MU_SECO_RX_TOUT (msecs_to_jiffies(3000))
> >
> > +/* Please not change TX & RX */
> >  enum imx_mu_chan_type {
> >         IMX_MU_TYPE_TX,         /* Tx */
> >         IMX_MU_TYPE_RX,         /* Rx */
> > @@ -92,6 +94,7 @@ enum imx_mu_type {
> >         IMX_MU_V1,
> >         IMX_MU_V2 = BIT(1),
> >         IMX_MU_V2_S4 = BIT(15),
> > +       IMX_MU_V2_IRQ = BIT(16),
> >  };
> >
> >  struct imx_mu_dcfg {
> > @@ -536,7 +539,8 @@ static int imx_mu_startup(struct mbox_chan *chan)
> > {
> >         struct imx_mu_priv *priv = to_imx_mu_priv(chan->mbox);
> >         struct imx_mu_con_priv *cp = chan->con_priv;
> > -       unsigned long irq_flag = IRQF_SHARED;
> > +       unsigned long irq_flag = 0;
> > +       int irq;
> >         int ret;
> >
> >         pm_runtime_get_sync(priv->dev); @@ -551,11 +555,16 @@
> static
> > int imx_mu_startup(struct mbox_chan *chan)
> >         if (!priv->dev->pm_domain)
> >                 irq_flag |= IRQF_NO_SUSPEND;
> >
> > -       ret = request_irq(priv->irq[0], imx_mu_isr, irq_flag,
> > -                         cp->irq_desc, chan);
> > +       if (priv->dcfg->type & IMX_MU_V2_IRQ) {
> > +               irq = priv->irq[cp->type];
> > +       } else {
> > +               irq = priv->irq[0];
> > +               irq_flag |= IRQF_SHARED;
> > +       }
> > +
> > +       ret = request_irq(irq, imx_mu_isr, irq_flag, cp->irq_desc,
> > + chan);
> >         if (ret) {
> > -               dev_err(priv->dev,
> > -                       "Unable to acquire IRQ %d\n", priv->irq[0]);
> > +               dev_err(priv->dev, "Unable to acquire IRQ %d\n", irq);
> >                 return ret;
> >         }
> >
> > @@ -762,14 +771,23 @@ static int imx_mu_probe(struct platform_device
> *pdev)
> >         if (IS_ERR(priv->base))
> >                 return PTR_ERR(priv->base);
> >
> > -       priv->irq[0] = platform_get_irq(pdev, 0);
> > -       if (priv->irq[0] < 0)
> > -               return priv->irq[0];
> > -
> >         dcfg = of_device_get_match_data(dev);
> >         if (!dcfg)
> >                 return -EINVAL;
> >         priv->dcfg = dcfg;
> > +       if (priv->dcfg->type & IMX_MU_V2_IRQ) {
> > +               priv->irq[IMX_MU_TYPE_TX] =
> platform_get_irq_byname(pdev, "txirq");
> > +               if (priv->irq[IMX_MU_TYPE_TX] < 0)
> > +                       return priv->irq[IMX_MU_TYPE_TX];
> > +               priv->irq[IMX_MU_TYPE_RX] =
> platform_get_irq_byname(pdev, "rxirq");
> > +               if (priv->irq[IMX_MU_TYPE_RX] < 0)
> > +                       return priv->irq[IMX_MU_TYPE_RX];
> > +       } else {
> > +               priv->irq[0] = platform_get_irq(pdev, 0);
> > +               if (priv->irq[0] < 0)
> > +                       return priv->irq[0];
> > +
> > +       }
> >
> >         if (priv->dcfg->type & IMX_MU_V2_S4)
> >                 size = sizeof(struct imx_s4_rpc_msg_max); @@ -890,6
> > +908,17 @@ static const struct imx_mu_dcfg imx_mu_cfg_imx8ulp_s4 = {
> >         .xCR    = {0x110, 0x114, 0x120, 0x128},
> >  };
> >
> > +static const struct imx_mu_dcfg imx_mu_cfg_imx93_s4 = {
> > +       .tx     = imx_mu_specific_tx,
> > +       .rx     = imx_mu_specific_rx,
> > +       .init   = imx_mu_init_specific,
> > +       .type   = IMX_MU_V2 | IMX_MU_V2_S4 | IMX_MU_V2_IRQ,
> > +       .xTR    = 0x200,
> > +       .xRR    = 0x280,
> > +       .xSR    = {0xC, 0x118, 0x124, 0x12C},
> > +       .xCR    = {0x110, 0x114, 0x120, 0x128},
> > +};
> > +
> >  static const struct imx_mu_dcfg imx_mu_cfg_imx8_scu = {
> >         .tx     = imx_mu_specific_tx,
> >         .rx     = imx_mu_specific_rx,
> > @@ -917,6 +946,7 @@ static const struct of_device_id imx_mu_dt_ids[] = {
> >         { .compatible = "fsl,imx6sx-mu", .data = &imx_mu_cfg_imx6sx },
> >         { .compatible = "fsl,imx8ulp-mu", .data =
> &imx_mu_cfg_imx8ulp },
> >         { .compatible = "fsl,imx8ulp-mu-s4", .data =
> > &imx_mu_cfg_imx8ulp_s4 },
> > +       { .compatible = "fsl,imx93-mu-s4", .data =
> > + &imx_mu_cfg_imx93_s4 },
> >         { .compatible = "fsl,imx8-mu-scu", .data =
> &imx_mu_cfg_imx8_scu },
> >         { .compatible = "fsl,imx8-mu-seco", .data =
> &imx_mu_cfg_imx8_seco },
> >         { },
> > @@ -1001,5 +1031,6 @@ static struct platform_driver imx_mu_driver = {
> > module_platform_driver(imx_mu_driver);
> >
> >  MODULE_AUTHOR("Oleksij Rempel <o.rempel@pengutronix.de>");
> > +MODULE_AUTHOR("Peng Fan <peng.fan@nxp.com>");
> >  MODULE_DESCRIPTION("Message Unit driver for i.MX");
> > MODULE_LICENSE("GPL v2");
> > --
> > 2.25.1
> >
diff mbox series

Patch

diff --git a/drivers/mailbox/imx-mailbox.c b/drivers/mailbox/imx-mailbox.c
index 03699843a6fd..094dc84291fc 100644
--- a/drivers/mailbox/imx-mailbox.c
+++ b/drivers/mailbox/imx-mailbox.c
@@ -1,6 +1,7 @@ 
 // SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (c) 2018 Pengutronix, Oleksij Rempel <o.rempel@pengutronix.de>
+ * Copyright 2022 NXP, Peng Fan <peng.fan@nxp.com>
  */
 
 #include <linux/clk.h>
@@ -28,6 +29,7 @@ 
 #define IMX_MU_SECO_TX_TOUT (msecs_to_jiffies(3000))
 #define IMX_MU_SECO_RX_TOUT (msecs_to_jiffies(3000))
 
+/* Please not change TX & RX */
 enum imx_mu_chan_type {
 	IMX_MU_TYPE_TX,		/* Tx */
 	IMX_MU_TYPE_RX,		/* Rx */
@@ -92,6 +94,7 @@  enum imx_mu_type {
 	IMX_MU_V1,
 	IMX_MU_V2 = BIT(1),
 	IMX_MU_V2_S4 = BIT(15),
+	IMX_MU_V2_IRQ = BIT(16),
 };
 
 struct imx_mu_dcfg {
@@ -536,7 +539,8 @@  static int imx_mu_startup(struct mbox_chan *chan)
 {
 	struct imx_mu_priv *priv = to_imx_mu_priv(chan->mbox);
 	struct imx_mu_con_priv *cp = chan->con_priv;
-	unsigned long irq_flag = IRQF_SHARED;
+	unsigned long irq_flag = 0;
+	int irq;
 	int ret;
 
 	pm_runtime_get_sync(priv->dev);
@@ -551,11 +555,16 @@  static int imx_mu_startup(struct mbox_chan *chan)
 	if (!priv->dev->pm_domain)
 		irq_flag |= IRQF_NO_SUSPEND;
 
-	ret = request_irq(priv->irq[0], imx_mu_isr, irq_flag,
-			  cp->irq_desc, chan);
+	if (priv->dcfg->type & IMX_MU_V2_IRQ) {
+		irq = priv->irq[cp->type];
+	} else {
+		irq = priv->irq[0];
+		irq_flag |= IRQF_SHARED;
+	}
+
+	ret = request_irq(irq, imx_mu_isr, irq_flag, cp->irq_desc, chan);
 	if (ret) {
-		dev_err(priv->dev,
-			"Unable to acquire IRQ %d\n", priv->irq[0]);
+		dev_err(priv->dev, "Unable to acquire IRQ %d\n", irq);
 		return ret;
 	}
 
@@ -762,14 +771,23 @@  static int imx_mu_probe(struct platform_device *pdev)
 	if (IS_ERR(priv->base))
 		return PTR_ERR(priv->base);
 
-	priv->irq[0] = platform_get_irq(pdev, 0);
-	if (priv->irq[0] < 0)
-		return priv->irq[0];
-
 	dcfg = of_device_get_match_data(dev);
 	if (!dcfg)
 		return -EINVAL;
 	priv->dcfg = dcfg;
+	if (priv->dcfg->type & IMX_MU_V2_IRQ) {
+		priv->irq[IMX_MU_TYPE_TX] = platform_get_irq_byname(pdev, "txirq");
+		if (priv->irq[IMX_MU_TYPE_TX] < 0)
+			return priv->irq[IMX_MU_TYPE_TX];
+		priv->irq[IMX_MU_TYPE_RX] = platform_get_irq_byname(pdev, "rxirq");
+		if (priv->irq[IMX_MU_TYPE_RX] < 0)
+			return priv->irq[IMX_MU_TYPE_RX];
+	} else {
+		priv->irq[0] = platform_get_irq(pdev, 0);
+		if (priv->irq[0] < 0)
+			return priv->irq[0];
+
+	}
 
 	if (priv->dcfg->type & IMX_MU_V2_S4)
 		size = sizeof(struct imx_s4_rpc_msg_max);
@@ -890,6 +908,17 @@  static const struct imx_mu_dcfg imx_mu_cfg_imx8ulp_s4 = {
 	.xCR	= {0x110, 0x114, 0x120, 0x128},
 };
 
+static const struct imx_mu_dcfg imx_mu_cfg_imx93_s4 = {
+	.tx	= imx_mu_specific_tx,
+	.rx	= imx_mu_specific_rx,
+	.init	= imx_mu_init_specific,
+	.type	= IMX_MU_V2 | IMX_MU_V2_S4 | IMX_MU_V2_IRQ,
+	.xTR	= 0x200,
+	.xRR	= 0x280,
+	.xSR	= {0xC, 0x118, 0x124, 0x12C},
+	.xCR	= {0x110, 0x114, 0x120, 0x128},
+};
+
 static const struct imx_mu_dcfg imx_mu_cfg_imx8_scu = {
 	.tx	= imx_mu_specific_tx,
 	.rx	= imx_mu_specific_rx,
@@ -917,6 +946,7 @@  static const struct of_device_id imx_mu_dt_ids[] = {
 	{ .compatible = "fsl,imx6sx-mu", .data = &imx_mu_cfg_imx6sx },
 	{ .compatible = "fsl,imx8ulp-mu", .data = &imx_mu_cfg_imx8ulp },
 	{ .compatible = "fsl,imx8ulp-mu-s4", .data = &imx_mu_cfg_imx8ulp_s4 },
+	{ .compatible = "fsl,imx93-mu-s4", .data = &imx_mu_cfg_imx93_s4 },
 	{ .compatible = "fsl,imx8-mu-scu", .data = &imx_mu_cfg_imx8_scu },
 	{ .compatible = "fsl,imx8-mu-seco", .data = &imx_mu_cfg_imx8_seco },
 	{ },
@@ -1001,5 +1031,6 @@  static struct platform_driver imx_mu_driver = {
 module_platform_driver(imx_mu_driver);
 
 MODULE_AUTHOR("Oleksij Rempel <o.rempel@pengutronix.de>");
+MODULE_AUTHOR("Peng Fan <peng.fan@nxp.com>");
 MODULE_DESCRIPTION("Message Unit driver for i.MX");
 MODULE_LICENSE("GPL v2");