From: Tan Jui Nee <jui.nee....@intel.com>

This is to cater the need for non-ACPI system whereby
a platform device has to be created in order to bind
with the Apollo Lake Pinctrl GPIO platform driver.

Signed-off-by: Tan Jui Nee <jui.nee....@intel.com>
Signed-off-by: Yong, Jonathan <jonathan.y...@intel.com>
---
 MAINTAINERS                             |   6 +
 drivers/pinctrl/intel/Kconfig           |  12 +-
 drivers/pinctrl/intel/Makefile          |   1 +
 drivers/pinctrl/intel/pinctrl-apl-dev.c | 201 ++++++++++++++++++++++++++++++++
 drivers/pinctrl/intel/pinctrl-broxton.c |  29 ++++-
 include/linux/pinctrl/pinctrl-apl.h     |  18 +++
 6 files changed, 262 insertions(+), 5 deletions(-)
 create mode 100644 drivers/pinctrl/intel/pinctrl-apl-dev.c
 create mode 100644 include/linux/pinctrl/pinctrl-apl.h

diff --git a/MAINTAINERS b/MAINTAINERS
index dcfa127..5e13b56 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2294,6 +2294,12 @@ L:       net...@vger.kernel.org
 S:     Supported
 F:     drivers/net/ethernet/brocade/bna/
 
+BROXTON PLATFORM Pin Controller
+M:     Tan, Jui Nee <jui.nee....@intel.com>
+S:     Supported
+F:     drivers/pinctrl/intel/pinctrl-apl-dev.c
+F:     include/linux/pinctrl/pinctrl-apl.h
+
 BSG (block layer generic sg v4 driver)
 M:     FUJITA Tomonori <fujita.tomon...@lab.ntt.co.jp>
 L:     linux-s...@vger.kernel.org
diff --git a/drivers/pinctrl/intel/Kconfig b/drivers/pinctrl/intel/Kconfig
index 4d2efad..bab8823 100644
--- a/drivers/pinctrl/intel/Kconfig
+++ b/drivers/pinctrl/intel/Kconfig
@@ -36,12 +36,22 @@ config PINCTRL_INTEL
 
 config PINCTRL_BROXTON
        tristate "Intel Broxton pinctrl and GPIO driver"
-       depends on ACPI
        select PINCTRL_INTEL
        help
          Broxton pinctrl driver provides an interface that allows
          configuring of SoC pins and using them as GPIOs.
 
+config PINCTRL_APL_DEVICE
+       tristate "Intel Apollo Lake GPIO pin control Platform Device Emulation"
+       depends on PINCTRL_BROXTON
+       help
+         This driver is to set up platform device in the absent of ACPI
+         enumeration.
+
+         Say yes for non-ACPI platform. This will enable the platform devices
+         to be created and bind with the Apollo Lake GPIO pin control platform
+         driver.
+
 config PINCTRL_SUNRISEPOINT
        tristate "Intel Sunrisepoint pinctrl and GPIO driver"
        depends on ACPI
diff --git a/drivers/pinctrl/intel/Makefile b/drivers/pinctrl/intel/Makefile
index 03bc68e..2df696b 100644
--- a/drivers/pinctrl/intel/Makefile
+++ b/drivers/pinctrl/intel/Makefile
@@ -4,4 +4,5 @@ obj-$(CONFIG_PINCTRL_BAYTRAIL)          += pinctrl-baytrail.o
 obj-$(CONFIG_PINCTRL_CHERRYVIEW)       += pinctrl-cherryview.o
 obj-$(CONFIG_PINCTRL_INTEL)            += pinctrl-intel.o
 obj-$(CONFIG_PINCTRL_BROXTON)          += pinctrl-broxton.o
+obj-$(CONFIG_PINCTRL_APL_DEVICE)       += pinctrl-apl-dev.o
 obj-$(CONFIG_PINCTRL_SUNRISEPOINT)     += pinctrl-sunrisepoint.o
diff --git a/drivers/pinctrl/intel/pinctrl-apl-dev.c 
b/drivers/pinctrl/intel/pinctrl-apl-dev.c
new file mode 100644
index 0000000..226ec6a
--- /dev/null
+++ b/drivers/pinctrl/intel/pinctrl-apl-dev.c
@@ -0,0 +1,201 @@
+/*
+ * pinctrl-apl-dev.c: APL pinctrl GPIO Platform Device
+ *
+ * (C) Copyright 2015 Intel Corporation
+ * Author: Kean Ho, Chew (kean.ho.c...@intel.com)
+ * Modified: Tan, Jui Nee (jui.nee....@intel.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; version 2
+ * of the License.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/bitops.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/seq_file.h>
+#include <linux/pci.h>
+#include <linux/pinctrl/pinctrl-apl.h>
+
+/* PCI Memory Base Access */
+#define PCI_DEVICE_ID_INTEL_APL_PCU    0x5A92
+#define NO_REGISTER_SETTINGS   (BIT(0) | BIT(1) | BIT(2))
+
+/* Offsets */
+#define NORTH_OFFSET           0xC5
+#define NORTHWEST_OFFSET               0xC4
+#define WEST_OFFSET            0xC7
+#define SOUTHWEST_OFFSET               0xC0
+
+#define NORTH_END              (90 * 0x8)
+#define NORTHWEST_END          (77 * 0x8)
+#define WEST_END               (47 * 0x8)
+#define SOUTHWEST_END          (43 * 0x8)
+
+static struct apl_pinctrl_port apl_gpio_north_platform_data = {
+       .unique_id = "1",
+};
+
+static struct resource apl_gpio_north_resources[] = {
+       {
+               .start  = 0x0,
+               .end    = 0x0,
+               .flags  = IORESOURCE_MEM,
+               .name   = "io-memory",
+       },
+       {
+               .start  = 14,
+               .end    = 14,
+               .flags  = IORESOURCE_IRQ,
+               .name   = "irq",
+       }
+};
+
+static struct apl_pinctrl_port apl_gpio_northwest_platform_data = {
+       .unique_id = "2",
+};
+
+static struct resource apl_gpio_northwest_resources[] = {
+       {
+               .start  = 0x0,
+               .end    = 0x0,
+               .flags  = IORESOURCE_MEM,
+               .name   = "io-memory",
+       },
+       {
+               .start  = 14,
+               .end    = 14,
+               .flags  = IORESOURCE_IRQ,
+               .name   = "irq",
+       }
+};
+
+static struct apl_pinctrl_port apl_gpio_west_platform_data = {
+       .unique_id = "3",
+};
+
+static struct resource apl_gpio_west_resources[] = {
+       {
+               .start  = 0x0,
+               .end    = 0x0,
+               .flags  = IORESOURCE_MEM,
+               .name   = "io-memory",
+       },
+       {
+               .start  = 14,
+               .end    = 14,
+               .flags  = IORESOURCE_IRQ,
+               .name   = "irq",
+       }
+};
+
+static struct apl_pinctrl_port apl_gpio_southwest_platform_data = {
+       .unique_id = "4",
+};
+
+static struct resource apl_gpio_southwest_resources[] = {
+       {
+               .start  = 0x0,
+               .end    = 0x0,
+               .flags  = IORESOURCE_MEM,
+               .name   = "io-memory",
+       },
+       {
+               .start  = 14,
+               .end    = 14,
+               .flags  = IORESOURCE_IRQ,
+               .name   = "irq",
+       }
+};
+
+static struct platform_device apl_gpio_north_device = {
+       .name                   = "apl_gpio",
+       .id                     = 0,
+       .num_resources          = ARRAY_SIZE(apl_gpio_north_resources),
+       .resource               = apl_gpio_north_resources,
+       .dev                    = {
+               .platform_data  = &apl_gpio_north_platform_data,
+       }
+};
+
+static struct platform_device apl_gpio_northwest_device = {
+       .name                   = "apl_gpio",
+       .id                     = 1,
+       .num_resources          = ARRAY_SIZE(apl_gpio_northwest_resources),
+       .resource               = apl_gpio_northwest_resources,
+       .dev                    = {
+               .platform_data  = &apl_gpio_northwest_platform_data,
+       }
+};
+
+static struct platform_device apl_gpio_west_device = {
+       .name                   = "apl_gpio",
+       .id                     = 2,
+       .num_resources          = ARRAY_SIZE(apl_gpio_west_resources),
+       .resource               = apl_gpio_west_resources,
+       .dev                    = {
+               .platform_data  = &apl_gpio_west_platform_data,
+       }
+};
+
+static struct platform_device apl_gpio_southwest_device = {
+       .name                   = "apl_gpio",
+       .id                     = 3,
+       .num_resources          = ARRAY_SIZE(apl_gpio_southwest_resources),
+       .resource               = apl_gpio_southwest_resources,
+       .dev                    = {
+               .platform_data  = &apl_gpio_southwest_platform_data,
+       }
+};
+
+static struct platform_device *devices[] __initdata = {
+       &apl_gpio_north_device,
+       &apl_gpio_northwest_device,
+       &apl_gpio_west_device,
+       &apl_gpio_southwest_device,
+};
+
+static int __init get_pci_memory_init(void)
+{
+       u32 io_base_add;
+       struct pci_dev *pci_dev;
+
+       pci_dev = pci_get_device(PCI_VENDOR_ID_INTEL,
+                               PCI_DEVICE_ID_INTEL_APL_PCU,
+                               NULL);
+
+       if (pci_dev == NULL)
+               return -EFAULT;
+
+       pci_read_config_dword(pci_dev, 0x10, &io_base_add);
+       io_base_add &= ~NO_REGISTER_SETTINGS;
+       apl_gpio_north_resources[0].start =
+               io_base_add + (NORTH_OFFSET << 16);
+       apl_gpio_north_resources[0].end =
+               io_base_add + (NORTH_OFFSET << 16) + NORTH_END;
+       apl_gpio_northwest_resources[0].start =
+               io_base_add + (NORTHWEST_OFFSET << 16);
+       apl_gpio_northwest_resources[0].end =
+               io_base_add + (NORTHWEST_OFFSET << 16) + NORTHWEST_END;
+       apl_gpio_west_resources[0].start =
+               io_base_add + (WEST_OFFSET << 16);
+       apl_gpio_west_resources[0].end =
+               io_base_add + (WEST_OFFSET << 16) + WEST_END;
+       apl_gpio_southwest_resources[0].start =
+               io_base_add + (SOUTHWEST_OFFSET << 16);
+       apl_gpio_southwest_resources[0].end =
+               io_base_add + (SOUTHWEST_OFFSET << 16) + SOUTHWEST_END;
+       return 0;
+};
+rootfs_initcall(get_pci_memory_init);
+
+static int __init apl_gpio_device_init(void)
+{
+       return platform_add_devices(devices, ARRAY_SIZE(devices));
+};
+device_initcall(apl_gpio_device_init);
diff --git a/drivers/pinctrl/intel/pinctrl-broxton.c 
b/drivers/pinctrl/intel/pinctrl-broxton.c
index 5979d38..27855a5 100644
--- a/drivers/pinctrl/intel/pinctrl-broxton.c
+++ b/drivers/pinctrl/intel/pinctrl-broxton.c
@@ -14,6 +14,7 @@
 #include <linux/platform_device.h>
 #include <linux/pm.h>
 #include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinctrl-apl.h>
 
 #include "pinctrl-intel.h"
 
@@ -997,8 +998,12 @@ static const struct intel_pinctrl_soc_data 
*apl_pinctrl_soc_data[] = {
 };
 
 static const struct acpi_device_id bxt_pinctrl_acpi_match[] = {
-       { "INT3452", (kernel_ulong_t)apl_pinctrl_soc_data },
-       { "INT34D1", (kernel_ulong_t)bxt_pinctrl_soc_data },
+#ifdef CONFIG_PINCTRL_APL_DEVICE
+       "apl_gpio", (kernel_ulong_t)apl_pinctrl_soc_data,
+#else
+       "INT3452", (kernel_ulong_t)apl_pinctrl_soc_data,
+       "INT34D1", (kernel_ulong_t)bxt_pinctrl_soc_data,
+#endif
        { }
 };
 MODULE_DEVICE_TABLE(acpi, bxt_pinctrl_acpi_match);
@@ -1008,21 +1013,34 @@ static int bxt_pinctrl_probe(struct platform_device 
*pdev)
        const struct intel_pinctrl_soc_data *soc_data = NULL;
        const struct intel_pinctrl_soc_data **soc_table;
        const struct acpi_device_id *id;
-       struct acpi_device *adev;
        int i;
+#ifdef CONFIG_PINCTRL_APL_DEVICE
+       struct device *dev = &pdev->dev;
+       struct apl_pinctrl_port *platform_data = dev->platform_data;
+
+       id = bxt_pinctrl_acpi_match;
+       if (strcmp(pdev->name, id->id))
+               return -ENODEV;
+#else
+       struct acpi_device *adev;
 
        adev = ACPI_COMPANION(&pdev->dev);
        if (!adev)
                return -ENODEV;
 
        id = acpi_match_device(bxt_pinctrl_acpi_match, &pdev->dev);
+#endif
        if (!id)
                return -ENODEV;
 
        soc_table = (const struct intel_pinctrl_soc_data **)id->driver_data;
 
        for (i = 0; soc_table[i]; i++) {
+#ifdef CONFIG_PINCTRL_APL_DEVICE
+               if (!strcmp(platform_data->unique_id, soc_table[i]->uid)) {
+#else
                if (!strcmp(adev->pnp.unique_id, soc_table[i]->uid)) {
+#endif
                        soc_data = soc_table[i];
                        break;
                }
@@ -1043,9 +1061,12 @@ static struct platform_driver bxt_pinctrl_driver = {
        .probe = bxt_pinctrl_probe,
        .remove = intel_pinctrl_remove,
        .driver = {
-               .name = "broxton-pinctrl",
+               .name = "apl_gpio",
+               .owner  = THIS_MODULE,
+#ifndef CONFIG_PINCTRL_APL_DEVICE
                .acpi_match_table = bxt_pinctrl_acpi_match,
                .pm = &bxt_pinctrl_pm_ops,
+#endif
        },
 };
 
diff --git a/include/linux/pinctrl/pinctrl-apl.h 
b/include/linux/pinctrl/pinctrl-apl.h
new file mode 100644
index 0000000..d414255
--- /dev/null
+++ b/include/linux/pinctrl/pinctrl-apl.h
@@ -0,0 +1,18 @@
+/*
+ * pinctrl-apl.h: Apollo Lake GPIO pinctrl header file
+ *
+ * Copyright (C) 2015 Intel Corporation
+ * Author: Chew, Kean Ho <kean.ho.c...@intel.com>
+ * Modified: Tan, Jui Nee <jui.nee....@intel.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ */
+
+#ifdef CONFIG_PINCTRL_APL_DEVICE
+struct apl_pinctrl_port {
+       char *unique_id;
+};
+#endif
+
-- 
2.7.3

-- 
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to