diff mbox series

[v2] spi: spi-nxp-fspi: Add ACPI support

Message ID 20200911082806.115-1-kuldip.dwivedi@puresoftware.com
State New
Headers show
Series [v2] spi: spi-nxp-fspi: Add ACPI support | expand

Commit Message

kuldip dwivedi Sept. 11, 2020, 8:28 a.m. UTC
Currently NXP fspi  driver has support of DT only. Adding ACPI
support to the driver so that it can be used by UEFI firmware
booting in ACPI mode. This driver will be probed if any firmware
will expose HID "NXP0009" in DSDT table.

Signed-off-by: kuldip dwivedi <kuldip.dwivedi@puresoftware.com>
---

Notes:
    1. Add ACPI match table, NXP members are added to confirm HID for FSPI
    2. Change the DT specific APIs to device property APIs
           so that same API can be used in DT and ACPi mode.
    3. Omit clock configuration part - in ACPI world, the firmware
           is responsible for clock maintenance.
    4. This patch is tested on LX2160A platform

 drivers/spi/spi-nxp-fspi.c | 61 +++++++++++++++++++++++++++-----------
 1 file changed, 44 insertions(+), 17 deletions(-)

Comments

Mark Brown Sept. 11, 2020, 11 a.m. UTC | #1
On Fri, Sep 11, 2020 at 01:58:06PM +0530, kuldip dwivedi wrote:

>  	/* find the resources - configuration register address space */
>  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fspi_base");
> +#ifdef CONFIG_ACPI
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +#endif

This is buggy, it is equivalent to just removing the name based lookup
since we'll do the name based lookup then unconditionally overwrite the
results with an index based lookup.
Mark Brown Sept. 11, 2020, 12:17 p.m. UTC | #2
On Fri, Sep 11, 2020 at 05:32:24PM +0530, Kuldip Dwivedi wrote:

> Here I can think two possible approaches
> 1. Changes in DT to use indexed based lookup

This is not going to be OK, it will break existing users relying on the
naming and makes the DTs less usable.

> 2. We Can check for ACPI fw node to distinguish between DT and ACPI like
> below..
> if (is_acpi_node(f->dev->fwnode))
> 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> else
> 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
> "fspi_base");

Yes, this should be good.
Ashish Kumar Sept. 11, 2020, 12:28 p.m. UTC | #3
Hi Kuldeep,

> -----Original Message-----
> From: kuldip dwivedi <kuldip.dwivedi@puresoftware.com>
> Sent: Friday, September 11, 2020 1:58 PM
> To: Ashish Kumar <ashish.kumar@nxp.com>; Yogesh Gaur
> <yogeshgaur.83@gmail.com>; Mark Brown <broonie@kernel.org>; linux-
> spi@vger.kernel.org; linux-kernel@vger.kernel.org
> Cc: Varun Sethi <V.Sethi@nxp.com>; Arokia Samy <arokia.samy@nxp.com>;
> Ard Biesheuvel <Ard.Biesheuvel@arm.com>; Samer El-Haj-Mahmoud
> <Samer.El-Haj-Mahmoud@arm.com>; Paul Yang <Paul.Yang@arm.com>;
> kuldip dwivedi <kuldip.dwivedi@puresoftware.com>
> Subject: [EXT] [PATCH v2] spi: spi-nxp-fspi: Add ACPI support
> 
> Caution: EXT Email
> 
> Currently NXP fspi  driver has support of DT only. Adding ACPI
> support to the driver so that it can be used by UEFI firmware
> booting in ACPI mode. This driver will be probed if any firmware
> will expose HID "NXP0009" in DSDT table.
> 
> Signed-off-by: kuldip dwivedi <kuldip.dwivedi@puresoftware.com>
> ---
Please capture version change summary.

Regards
Ashish 
> 
> Notes:
>     1. Add ACPI match table, NXP members are added to confirm HID for FSPI
>     2. Change the DT specific APIs to device property APIs
>            so that same API can be used in DT and ACPi mode.
>     3. Omit clock configuration part - in ACPI world, the firmware
>            is responsible for clock maintenance.
>     4. This patch is tested on LX2160A platform
> 
>  drivers/spi/spi-nxp-fspi.c | 61 +++++++++++++++++++++++++++-----------
>  1 file changed, 44 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/spi/spi-nxp-fspi.c b/drivers/spi/spi-nxp-fspi.c
> index 1ccda82da206..9e3991ec0dd2 100644
> --- a/drivers/spi/spi-nxp-fspi.c
> +++ b/drivers/spi/spi-nxp-fspi.c
> @@ -3,7 +3,8 @@
>  /*
>   * NXP FlexSPI(FSPI) controller driver.
>   *
> - * Copyright 2019 NXP.
> + * Copyright 2019-2020 NXP
> + * Copyright 2020 Puresoftware Ltd.
>   *
>   * FlexSPI is a flexsible SPI host controller which supports two SPI
>   * channels and up to 4 external devices. Each channel supports
> @@ -30,6 +31,7 @@
>   *     Frieder Schrempf <frieder.schrempf@kontron.de>
>   */
> 
> +#include <linux/acpi.h>
>  #include <linux/bitops.h>
>  #include <linux/clk.h>
>  #include <linux/completion.h>
> @@ -563,6 +565,9 @@ static int nxp_fspi_clk_prep_enable(struct nxp_fspi
> *f)
>  {
>         int ret;
> 
> +       if (is_acpi_node(f->dev->fwnode))
> +               return 0;
> +
>         ret = clk_prepare_enable(f->clk_en);
>         if (ret)
>                 return ret;
> @@ -576,10 +581,15 @@ static int nxp_fspi_clk_prep_enable(struct
> nxp_fspi *f)
>         return 0;
>  }
> 
> -static void nxp_fspi_clk_disable_unprep(struct nxp_fspi *f)
> +static int nxp_fspi_clk_disable_unprep(struct nxp_fspi *f)
>  {
> +       if (is_acpi_node(f->dev->fwnode))
> +               return 0;
> +
>         clk_disable_unprepare(f->clk);
>         clk_disable_unprepare(f->clk_en);
> +
> +       return 0;
>  }
> 
>  /*
> @@ -1001,7 +1011,7 @@ static int nxp_fspi_probe(struct platform_device
> *pdev)
> 
>         f = spi_controller_get_devdata(ctlr);
>         f->dev = dev;
> -       f->devtype_data = of_device_get_match_data(dev);
> +       f->devtype_data = device_get_match_data(dev);
>         if (!f->devtype_data) {
>                 ret = -ENODEV;
>                 goto err_put_ctrl;
> @@ -1011,6 +1021,9 @@ static int nxp_fspi_probe(struct platform_device
> *pdev)
> 
>         /* find the resources - configuration register address space */
>         res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
> "fspi_base");
> +#ifdef CONFIG_ACPI
> +       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +#endif
>         f->iobase = devm_ioremap_resource(dev, res);
>         if (IS_ERR(f->iobase)) {
>                 ret = PTR_ERR(f->iobase);
> @@ -1019,6 +1032,9 @@ static int nxp_fspi_probe(struct platform_device
> *pdev)
> 
>         /* find the resources - controller memory mapped space */
>         res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
> "fspi_mmap");
> +#ifdef CONFIG_ACPI
> +       res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
> +#endif
>         if (!res) {
>                 ret = -ENODEV;
>                 goto err_put_ctrl;
> @@ -1029,22 +1045,24 @@ static int nxp_fspi_probe(struct platform_device
> *pdev)
>         f->memmap_phy_size = resource_size(res);
> 
>         /* find the clocks */
> -       f->clk_en = devm_clk_get(dev, "fspi_en");
> -       if (IS_ERR(f->clk_en)) {
> -               ret = PTR_ERR(f->clk_en);
> -               goto err_put_ctrl;
> -       }
> +       if (dev_of_node(&pdev->dev)) {
> +               f->clk_en = devm_clk_get(dev, "fspi_en");
> +               if (IS_ERR(f->clk_en)) {
> +                       ret = PTR_ERR(f->clk_en);
> +                       goto err_put_ctrl;
> +               }
> 
> -       f->clk = devm_clk_get(dev, "fspi");
> -       if (IS_ERR(f->clk)) {
> -               ret = PTR_ERR(f->clk);
> -               goto err_put_ctrl;
> -       }
> +               f->clk = devm_clk_get(dev, "fspi");
> +               if (IS_ERR(f->clk)) {
> +                       ret = PTR_ERR(f->clk);
> +                       goto err_put_ctrl;
> +               }
> 
> -       ret = nxp_fspi_clk_prep_enable(f);
> -       if (ret) {
> -               dev_err(dev, "can not enable the clock\n");
> -               goto err_put_ctrl;
> +               ret = nxp_fspi_clk_prep_enable(f);
> +               if (ret) {
> +                       dev_err(dev, "can not enable the clock\n");
> +                       goto err_put_ctrl;
> +               }
>         }
> 
>         /* find the irq */
> @@ -1127,6 +1145,14 @@ static const struct of_device_id nxp_fspi_dt_ids[]
> = {
>  };
>  MODULE_DEVICE_TABLE(of, nxp_fspi_dt_ids);
> 
> +#ifdef CONFIG_ACPI
> +static const struct acpi_device_id nxp_fspi_acpi_ids[] = {
> +       { "NXP0009", .driver_data = (kernel_ulong_t)&lx2160a_data, },
> +       {}
> +};
> +MODULE_DEVICE_TABLE(acpi, nxp_fspi_acpi_ids);
> +#endif
> +
>  static const struct dev_pm_ops nxp_fspi_pm_ops = {
>         .suspend        = nxp_fspi_suspend,
>         .resume         = nxp_fspi_resume,
> @@ -1136,6 +1162,7 @@ static struct platform_driver nxp_fspi_driver = {
>         .driver = {
>                 .name   = "nxp-fspi",
>                 .of_match_table = nxp_fspi_dt_ids,
> +               .acpi_match_table = ACPI_PTR(nxp_fspi_acpi_ids),
>                 .pm =   &nxp_fspi_pm_ops,
>         },
>         .probe          = nxp_fspi_probe,
> --
> 2.17.1
kuldip dwivedi Sept. 15, 2020, 6:52 a.m. UTC | #4
> -----Original Message-----

> From: Ashish Kumar <ashish.kumar@nxp.com>

> Sent: Friday, September 11, 2020 7:03 PM

> To: Mark Brown <broonie@kernel.org>

> Cc: kuldip dwivedi <kuldip.dwivedi@puresoftware.com>; Yogesh Gaur

> <yogeshgaur.83@gmail.com>; linux-spi@vger.kernel.org; linux-

> kernel@vger.kernel.org; Varun Sethi <V.Sethi@nxp.com>; Arokia Samy

> <arokia.samy@nxp.com>; Ard Biesheuvel <Ard.Biesheuvel@arm.com>; Samer

El-
> Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com>; Paul Yang

> <Paul.Yang@arm.com>

> Subject: RE: [EXT] [PATCH v2] spi: spi-nxp-fspi: Add ACPI support

>

> Hi Mark,

>

> > -----Original Message-----

> > From: Mark Brown <broonie@kernel.org>

> > Sent: Friday, September 11, 2020 6:04 PM

> > To: Ashish Kumar <ashish.kumar@nxp.com>

> > Cc: kuldip dwivedi <kuldip.dwivedi@puresoftware.com>; Yogesh Gaur

> > <yogeshgaur.83@gmail.com>; linux-spi@vger.kernel.org; linux-

> > kernel@vger.kernel.org; Varun Sethi <V.Sethi@nxp.com>; Arokia Samy

> > <arokia.samy@nxp.com>; Ard Biesheuvel <Ard.Biesheuvel@arm.com>; Samer

> > El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com>; Paul Yang

> > <Paul.Yang@arm.com>

> > Subject: Re: [EXT] [PATCH v2] spi: spi-nxp-fspi: Add ACPI support

> >

> > On Fri, Sep 11, 2020 at 12:28:47PM +0000, Ashish Kumar wrote:

> > > > Signed-off-by: kuldip dwivedi <kuldip.dwivedi@puresoftware.com>

> >

> > > Please capture version change summary.

> > >

> > > Regards

> > > Ashish

> >

> > It's there:

> It did not mentioned about removing SWRST, which was present in v1.

> v2:Notes Looked very similar to v1.

Removed SWRST changes just to keep functionality same in ACP and DT mode,
I will post that change separately if It will be required. For tracking I
am adding this
point in notes
>

> Regards

> Ashish

> >

> > > >

> > > > Notes:

> > > >     1. Add ACPI match table, NXP members are added to confirm HID

> > > > for

> > FSPI

> > > >     2. Change the DT specific APIs to device property APIs

> > > >            so that same API can be used in DT and ACPi mode.

> > > >     3. Omit clock configuration part - in ACPI world, the firmware

> > > >            is responsible for clock maintenance.

> > > >     4. This patch is tested on LX2160A platform

5.  SWRST reset changes are removed from v1 as to keep functionality
same in ACP and DT mode, I will post that change separately if It will be
required
diff mbox series

Patch

diff --git a/drivers/spi/spi-nxp-fspi.c b/drivers/spi/spi-nxp-fspi.c
index 1ccda82da206..9e3991ec0dd2 100644
--- a/drivers/spi/spi-nxp-fspi.c
+++ b/drivers/spi/spi-nxp-fspi.c
@@ -3,7 +3,8 @@ 
 /*
  * NXP FlexSPI(FSPI) controller driver.
  *
- * Copyright 2019 NXP.
+ * Copyright 2019-2020 NXP
+ * Copyright 2020 Puresoftware Ltd.
  *
  * FlexSPI is a flexsible SPI host controller which supports two SPI
  * channels and up to 4 external devices. Each channel supports
@@ -30,6 +31,7 @@ 
  *     Frieder Schrempf <frieder.schrempf@kontron.de>
  */
 
+#include <linux/acpi.h>
 #include <linux/bitops.h>
 #include <linux/clk.h>
 #include <linux/completion.h>
@@ -563,6 +565,9 @@  static int nxp_fspi_clk_prep_enable(struct nxp_fspi *f)
 {
 	int ret;
 
+	if (is_acpi_node(f->dev->fwnode))
+		return 0;
+
 	ret = clk_prepare_enable(f->clk_en);
 	if (ret)
 		return ret;
@@ -576,10 +581,15 @@  static int nxp_fspi_clk_prep_enable(struct nxp_fspi *f)
 	return 0;
 }
 
-static void nxp_fspi_clk_disable_unprep(struct nxp_fspi *f)
+static int nxp_fspi_clk_disable_unprep(struct nxp_fspi *f)
 {
+	if (is_acpi_node(f->dev->fwnode))
+		return 0;
+
 	clk_disable_unprepare(f->clk);
 	clk_disable_unprepare(f->clk_en);
+
+	return 0;
 }
 
 /*
@@ -1001,7 +1011,7 @@  static int nxp_fspi_probe(struct platform_device *pdev)
 
 	f = spi_controller_get_devdata(ctlr);
 	f->dev = dev;
-	f->devtype_data = of_device_get_match_data(dev);
+	f->devtype_data = device_get_match_data(dev);
 	if (!f->devtype_data) {
 		ret = -ENODEV;
 		goto err_put_ctrl;
@@ -1011,6 +1021,9 @@  static int nxp_fspi_probe(struct platform_device *pdev)
 
 	/* find the resources - configuration register address space */
 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fspi_base");
+#ifdef CONFIG_ACPI
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+#endif
 	f->iobase = devm_ioremap_resource(dev, res);
 	if (IS_ERR(f->iobase)) {
 		ret = PTR_ERR(f->iobase);
@@ -1019,6 +1032,9 @@  static int nxp_fspi_probe(struct platform_device *pdev)
 
 	/* find the resources - controller memory mapped space */
 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fspi_mmap");
+#ifdef CONFIG_ACPI
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+#endif
 	if (!res) {
 		ret = -ENODEV;
 		goto err_put_ctrl;
@@ -1029,22 +1045,24 @@  static int nxp_fspi_probe(struct platform_device *pdev)
 	f->memmap_phy_size = resource_size(res);
 
 	/* find the clocks */
-	f->clk_en = devm_clk_get(dev, "fspi_en");
-	if (IS_ERR(f->clk_en)) {
-		ret = PTR_ERR(f->clk_en);
-		goto err_put_ctrl;
-	}
+	if (dev_of_node(&pdev->dev)) {
+		f->clk_en = devm_clk_get(dev, "fspi_en");
+		if (IS_ERR(f->clk_en)) {
+			ret = PTR_ERR(f->clk_en);
+			goto err_put_ctrl;
+		}
 
-	f->clk = devm_clk_get(dev, "fspi");
-	if (IS_ERR(f->clk)) {
-		ret = PTR_ERR(f->clk);
-		goto err_put_ctrl;
-	}
+		f->clk = devm_clk_get(dev, "fspi");
+		if (IS_ERR(f->clk)) {
+			ret = PTR_ERR(f->clk);
+			goto err_put_ctrl;
+		}
 
-	ret = nxp_fspi_clk_prep_enable(f);
-	if (ret) {
-		dev_err(dev, "can not enable the clock\n");
-		goto err_put_ctrl;
+		ret = nxp_fspi_clk_prep_enable(f);
+		if (ret) {
+			dev_err(dev, "can not enable the clock\n");
+			goto err_put_ctrl;
+		}
 	}
 
 	/* find the irq */
@@ -1127,6 +1145,14 @@  static const struct of_device_id nxp_fspi_dt_ids[] = {
 };
 MODULE_DEVICE_TABLE(of, nxp_fspi_dt_ids);
 
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id nxp_fspi_acpi_ids[] = {
+	{ "NXP0009", .driver_data = (kernel_ulong_t)&lx2160a_data, },
+	{}
+};
+MODULE_DEVICE_TABLE(acpi, nxp_fspi_acpi_ids);
+#endif
+
 static const struct dev_pm_ops nxp_fspi_pm_ops = {
 	.suspend	= nxp_fspi_suspend,
 	.resume		= nxp_fspi_resume,
@@ -1136,6 +1162,7 @@  static struct platform_driver nxp_fspi_driver = {
 	.driver = {
 		.name	= "nxp-fspi",
 		.of_match_table = nxp_fspi_dt_ids,
+		.acpi_match_table = ACPI_PTR(nxp_fspi_acpi_ids),
 		.pm =   &nxp_fspi_pm_ops,
 	},
 	.probe          = nxp_fspi_probe,