/*
  * 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
  *     Frieder Schrempf <frieder.schrempf@kontron.de>
  */
 
+#include <linux/acpi.h>
 #include <linux/bitops.h>
 #include <linux/clk.h>
 #include <linux/completion.h>
 {
        int ret;
 
+       if (is_acpi_node(f->dev->fwnode))
+               return 0;
+
        ret = clk_prepare_enable(f->clk_en);
        if (ret)
                return ret;
        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;
 }
 
 /*
 
        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;
        platform_set_drvdata(pdev, f);
 
        /* find the resources - configuration register address space */
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fspi_base");
+       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");
+
        f->iobase = devm_ioremap_resource(dev, res);
        if (IS_ERR(f->iobase)) {
                ret = PTR_ERR(f->iobase);
        }
 
        /* find the resources - controller memory mapped space */
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fspi_mmap");
+       if (is_acpi_node(f->dev->fwnode))
+               res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+       else
+               res = platform_get_resource_byname(pdev,
+                               IORESOURCE_MEM, "fspi_mmap");
+
        if (!res) {
                ret = -ENODEV;
                goto err_put_ctrl;
        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 */
 };
 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,
        .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,