linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/3] pinctrl/broxton: enable platform device in the absent of ACPI enumeration
@ 2016-06-21  5:10 Tan Jui Nee
  2016-06-21  5:10 ` [PATCH v4 1/3] " Tan Jui Nee
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Tan Jui Nee @ 2016-06-21  5:10 UTC (permalink / raw)
  To: mika.westerberg, heikki.krogerus, andriy.shevchenko, tglx, mingo,
	hpa, x86, ptyser, lee.jones, linus.walleij
  Cc: linux-gpio, linux-kernel, jui.nee.tan, jonathan.yong,
	ong.hock.yu, weifeng.voon, wan.ahmad.zainie.wan.mohamad

Hi,
The patches are to cater the need for non-ACPI system whereby
a platform device has to be created in order to bind with
Apollo Lake Pinctrl GPIO platform driver.

The MMIO BAR is accessed over the Primary to Sideband bridge
(P2SB). Since the BIOS prevents the P2SB device from being
enumerated by the PCI subsystem, so we need to hide/unhide P2SB
to lookup the P2SB BAR and pass the PCI BAR address to the gpio
platform driver.

All these three patches have dependencies on each other.

Changes in V4:
	- Move Kconfig option CONFIG_X86_INTEL_NON_ACPI from
	  [PATCH 2/3] x86/platform/p2sb: New Primary to Sideband bridge support driver for Intel SOC's
	  to
	  [PATCH 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system
	  since the config is used in latter patch.
	- Select CONFIG_P2SB when CONFIG_LPC_ICH is enabled.
	- Remove #ifdef CONFIG_X86_INTEL_NON_ACPI and use
	  #if defined(CONFIG_X86_INTEL_NON_ACPI) when lpc_ich_misc is called
	  as suggested by Lee Jones.
	- Use single dimensional array instead of 2D array for apl_gpio_io_res
	  structure and use DEFINE_RES_IRQ for its IRQ resource.

Changes in V3:
	- Simplify register addresses calculation and use DEFINE_RES_MEM_NAMED
	  defines for apl_gpio_io_res structure
	- Define magic number for P2SB PCI ID
	- Replace switch-case with if-else since currently we have only one
	  use case
	- Only call mfd_add_devices() once for all gpio communities

Changes in V2:
	- Add new config option CONFIG_X86_INTEL_NON_ACPI and "select PINCTRL"
	  to fix kbuildbot error

Andy Shevchenko (1):
  x86/platform/p2sb: New Primary to Sideband bridge support driver for
    Intel SOC's

Tan Jui Nee (2):
  pinctrl/broxton: enable platform device in the absent of ACPI
    enumeration
  mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in
    non-ACPI system

 arch/x86/Kconfig                        |  14 ++++
 arch/x86/include/asm/p2sb.h             |  27 +++++++
 arch/x86/platform/intel/Makefile        |   1 +
 arch/x86/platform/intel/p2sb.c          |  99 +++++++++++++++++++++++++
 drivers/mfd/Kconfig                     |   3 +-
 drivers/mfd/lpc_ich.c                   | 126 ++++++++++++++++++++++++++++++++
 drivers/pinctrl/intel/pinctrl-broxton.c |  43 ++++++++---
 7 files changed, 300 insertions(+), 13 deletions(-)
 create mode 100644 arch/x86/include/asm/p2sb.h
 create mode 100644 arch/x86/platform/intel/p2sb.c

-- 
1.9.1

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v4 1/3] pinctrl/broxton: enable platform device in the absent of ACPI enumeration
  2016-06-21  5:10 [PATCH v4 0/3] pinctrl/broxton: enable platform device in the absent of ACPI enumeration Tan Jui Nee
@ 2016-06-21  5:10 ` Tan Jui Nee
  2016-06-23  8:42   ` Linus Walleij
  2016-06-21  5:10 ` [PATCH v4 2/3] x86/platform/p2sb: New Primary to Sideband bridge support driver for Intel SOC's Tan Jui Nee
  2016-06-21  5:10 ` [PATCH v4 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system Tan Jui Nee
  2 siblings, 1 reply; 9+ messages in thread
From: Tan Jui Nee @ 2016-06-21  5:10 UTC (permalink / raw)
  To: mika.westerberg, heikki.krogerus, andriy.shevchenko, tglx, mingo,
	hpa, x86, ptyser, lee.jones, linus.walleij
  Cc: linux-gpio, linux-kernel, jui.nee.tan, jonathan.yong,
	ong.hock.yu, weifeng.voon, wan.ahmad.zainie.wan.mohamad

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.tan@intel.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
---
Changes in V4:
	- added Mika's ACK

Changes in V3:
	- No change

Changes in V2:
	- No change

 drivers/pinctrl/intel/pinctrl-broxton.c | 43 ++++++++++++++++++++++++---------
 1 file changed, 31 insertions(+), 12 deletions(-)

diff --git a/drivers/pinctrl/intel/pinctrl-broxton.c b/drivers/pinctrl/intel/pinctrl-broxton.c
index 5979d38..59cb7a6 100644
--- a/drivers/pinctrl/intel/pinctrl-broxton.c
+++ b/drivers/pinctrl/intel/pinctrl-broxton.c
@@ -1,7 +1,7 @@
 /*
  * Intel Broxton SoC pinctrl/GPIO driver
  *
- * Copyright (C) 2015, Intel Corporation
+ * Copyright (C) 2015, 2016 Intel Corporation
  * Author: Mika Westerberg <mika.westerberg@linux.intel.com>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -1003,29 +1003,46 @@ static const struct acpi_device_id bxt_pinctrl_acpi_match[] = {
 };
 MODULE_DEVICE_TABLE(acpi, bxt_pinctrl_acpi_match);
 
+static const struct platform_device_id bxt_pinctrl_platform_ids[] = {
+	{ "apl-pinctrl", (kernel_ulong_t)&apl_pinctrl_soc_data },
+	{ "broxton-pinctrl", (kernel_ulong_t)&bxt_pinctrl_soc_data },
+	{ },
+};
+
 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;
 
 	adev = ACPI_COMPANION(&pdev->dev);
-	if (!adev)
-		return -ENODEV;
+	if (adev) {
+		const struct acpi_device_id *id;
 
-	id = acpi_match_device(bxt_pinctrl_acpi_match, &pdev->dev);
-	if (!id)
-		return -ENODEV;
+		id = acpi_match_device(bxt_pinctrl_acpi_match, &pdev->dev);
+		if (!id)
+			return -ENODEV;
 
-	soc_table = (const struct intel_pinctrl_soc_data **)id->driver_data;
+		soc_table = (const struct intel_pinctrl_soc_data **)
+			id->driver_data;
 
-	for (i = 0; soc_table[i]; i++) {
-		if (!strcmp(adev->pnp.unique_id, soc_table[i]->uid)) {
-			soc_data = soc_table[i];
-			break;
+		for (i = 0; soc_table[i]; i++) {
+			if (!strcmp(adev->pnp.unique_id, soc_table[i]->uid)) {
+				soc_data = soc_table[i];
+				break;
+			}
 		}
+	} else {
+		const struct platform_device_id *pid;
+
+		pid = platform_get_device_id(pdev);
+		if (!pid)
+			return -ENODEV;
+
+		soc_table = (const struct intel_pinctrl_soc_data **)
+			pid->driver_data;
+		soc_data = soc_table[pdev->id];
 	}
 
 	if (!soc_data)
@@ -1047,6 +1064,7 @@ static struct platform_driver bxt_pinctrl_driver = {
 		.acpi_match_table = bxt_pinctrl_acpi_match,
 		.pm = &bxt_pinctrl_pm_ops,
 	},
+	.id_table = bxt_pinctrl_platform_ids,
 };
 
 static int __init bxt_pinctrl_init(void)
@@ -1064,3 +1082,4 @@ module_exit(bxt_pinctrl_exit);
 MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
 MODULE_DESCRIPTION("Intel Broxton SoC pinctrl/GPIO driver");
 MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:broxton-pinctrl");
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v4 2/3] x86/platform/p2sb: New Primary to Sideband bridge support driver for Intel SOC's
  2016-06-21  5:10 [PATCH v4 0/3] pinctrl/broxton: enable platform device in the absent of ACPI enumeration Tan Jui Nee
  2016-06-21  5:10 ` [PATCH v4 1/3] " Tan Jui Nee
@ 2016-06-21  5:10 ` Tan Jui Nee
  2016-06-23  8:45   ` Linus Walleij
  2016-06-21  5:10 ` [PATCH v4 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system Tan Jui Nee
  2 siblings, 1 reply; 9+ messages in thread
From: Tan Jui Nee @ 2016-06-21  5:10 UTC (permalink / raw)
  To: mika.westerberg, heikki.krogerus, andriy.shevchenko, tglx, mingo,
	hpa, x86, ptyser, lee.jones, linus.walleij
  Cc: linux-gpio, linux-kernel, jui.nee.tan, jonathan.yong,
	ong.hock.yu, weifeng.voon, wan.ahmad.zainie.wan.mohamad

From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

There is already one and at least one more user coming which
require an access to Primary to Sideband bridge (P2SB) in order
to get IO or MMIO bar hidden by BIOS.
Create a driver to access P2SB for x86 devices.

Signed-off-by: Yong, Jonathan <jonathan.yong@intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
Changes in V4:
	- Move Kconfig option CONFIG_X86_INTEL_NON_ACPI from
	  [PATCH 2/3] x86/platform/p2sb: New Primary to Sideband bridge support driver for Intel SOC's
	  to
	  [PATCH 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system
	  since the config is used in latter patch.

Changes in V3:
	- No change

Changes in V2:
	- Add new config option CONFIG_X86_INTEL_NON_ACPI and "select PINCTRL"
	  to fix kbuildbot error

 arch/x86/Kconfig                 |  4 ++
 arch/x86/include/asm/p2sb.h      | 27 +++++++++++
 arch/x86/platform/intel/Makefile |  1 +
 arch/x86/platform/intel/p2sb.c   | 99 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 131 insertions(+)
 create mode 100644 arch/x86/include/asm/p2sb.h
 create mode 100644 arch/x86/platform/intel/p2sb.c

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index d9a94da..d305d81 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -604,6 +604,10 @@ config IOSF_MBI_DEBUG
 
 	  If you don't require the option or are in doubt, say N.
 
+config P2SB
+	tristate
+	depends on PCI
+
 config X86_RDC321X
 	bool "RDC R-321x SoC"
 	depends on X86_32
diff --git a/arch/x86/include/asm/p2sb.h b/arch/x86/include/asm/p2sb.h
new file mode 100644
index 0000000..686e07b
--- /dev/null
+++ b/arch/x86/include/asm/p2sb.h
@@ -0,0 +1,27 @@
+/*
+ * Primary to Sideband bridge (P2SB) access support
+ */
+
+#ifndef P2SB_SYMS_H
+#define P2SB_SYMS_H
+
+#include <linux/ioport.h>
+#include <linux/pci.h>
+
+#if IS_ENABLED(CONFIG_P2SB)
+
+int p2sb_bar(struct pci_dev *pdev, unsigned int devfn,
+	struct resource *res);
+
+#else /* CONFIG_P2SB is not set */
+
+static inline
+int p2sb_bar(struct pci_dev *pdev, unsigned int devfn,
+	struct resource *res)
+{
+	return -ENODEV;
+}
+
+#endif /* CONFIG_P2SB */
+
+#endif /* P2SB_SYMS_H */
diff --git a/arch/x86/platform/intel/Makefile b/arch/x86/platform/intel/Makefile
index b878032..dbf9f10 100644
--- a/arch/x86/platform/intel/Makefile
+++ b/arch/x86/platform/intel/Makefile
@@ -1 +1,2 @@
 obj-$(CONFIG_IOSF_MBI)			+= iosf_mbi.o
+obj-$(CONFIG_P2SB)			+= p2sb.o
diff --git a/arch/x86/platform/intel/p2sb.c b/arch/x86/platform/intel/p2sb.c
new file mode 100644
index 0000000..8be47a4
--- /dev/null
+++ b/arch/x86/platform/intel/p2sb.c
@@ -0,0 +1,99 @@
+/*
+ * Primary to Sideband bridge (P2SB) driver
+ *
+ * Copyright (c) 2016, Intel Corporation.
+ *
+ * Authors: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+ *			Jonathan Yong <jonathan.yong@intel.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ */
+
+#include <linux/ioport.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/spinlock.h>
+
+#include <asm/p2sb.h>
+
+#define SBREG_BAR	0x10
+#define SBREG_HIDE	0xe1
+
+static DEFINE_SPINLOCK(p2sb_spinlock);
+
+/*
+ * p2sb_bar - Get Primary to Sideband bridge (P2SB) BAR
+ * @pdev:	PCI device to get PCI bus to communicate with
+ * @devfn:	PCI device and function to communicate with
+ * @res:	resources to be filled in
+ *
+ * The BIOS prevents the P2SB device from being enumerated by the PCI
+ * subsystem, so we need to unhide and hide it back to lookup the P2SB BAR.
+ *
+ * Locking is handled by spinlock - cannot sleep.
+ *
+ * Return:
+ * 0 on success or appropriate errno value on error.
+ */
+int p2sb_bar(struct pci_dev *pdev, unsigned int devfn,
+	struct resource *res)
+{
+	u32 base_addr;
+	u64 base64_addr;
+	unsigned long flags;
+
+	if (!res)
+		return -EINVAL;
+
+	spin_lock(&p2sb_spinlock);
+
+	/* Unhide the P2SB device */
+	pci_bus_write_config_byte(pdev->bus, devfn, SBREG_HIDE, 0x00);
+
+	/* Check if device present */
+	pci_bus_read_config_dword(pdev->bus, devfn, 0, &base_addr);
+	if (base_addr == 0xffffffff || base_addr == 0x00000000) {
+		spin_unlock(&p2sb_spinlock);
+		dev_warn(&pdev->dev, "P2SB device access disabled by BIOS?\n");
+		return -ENODEV;
+	}
+
+	/* Get IO or MMIO BAR */
+	pci_bus_read_config_dword(pdev->bus, devfn, SBREG_BAR, &base_addr);
+	if ((base_addr & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) {
+		flags = IORESOURCE_IO;
+		base64_addr = base_addr & PCI_BASE_ADDRESS_IO_MASK;
+	} else {
+		flags = IORESOURCE_MEM;
+		base64_addr = base_addr & PCI_BASE_ADDRESS_MEM_MASK;
+		if (base_addr & PCI_BASE_ADDRESS_MEM_TYPE_64) {
+			flags |= IORESOURCE_MEM_64;
+			pci_bus_read_config_dword(pdev->bus, devfn,
+				SBREG_BAR + 4, &base_addr);
+			base64_addr |= (u64)base_addr << 32;
+		}
+	}
+
+	/* Hide the P2SB device */
+	pci_bus_write_config_byte(pdev->bus, devfn, SBREG_HIDE, 0x01);
+
+	spin_unlock(&p2sb_spinlock);
+
+	/* User provides prefilled resources */
+	res->start += (resource_size_t)base64_addr;
+	res->end += (resource_size_t)base64_addr;
+	res->flags = flags;
+
+	return 0;
+}
+EXPORT_SYMBOL(p2sb_bar);
+
+MODULE_LICENSE("GPL");
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v4 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system
  2016-06-21  5:10 [PATCH v4 0/3] pinctrl/broxton: enable platform device in the absent of ACPI enumeration Tan Jui Nee
  2016-06-21  5:10 ` [PATCH v4 1/3] " Tan Jui Nee
  2016-06-21  5:10 ` [PATCH v4 2/3] x86/platform/p2sb: New Primary to Sideband bridge support driver for Intel SOC's Tan Jui Nee
@ 2016-06-21  5:10 ` Tan Jui Nee
  2016-06-21  5:51   ` kbuild test robot
                     ` (2 more replies)
  2 siblings, 3 replies; 9+ messages in thread
From: Tan Jui Nee @ 2016-06-21  5:10 UTC (permalink / raw)
  To: mika.westerberg, heikki.krogerus, andriy.shevchenko, tglx, mingo,
	hpa, x86, ptyser, lee.jones, linus.walleij
  Cc: linux-gpio, linux-kernel, jui.nee.tan, jonathan.yong,
	ong.hock.yu, weifeng.voon, wan.ahmad.zainie.wan.mohamad

This driver uses the P2SB hide/unhide mechanism cooperatively
to pass the PCI BAR address to the gpio platform driver.

Signed-off-by: Tan Jui Nee <jui.nee.tan@intel.com>
---
Changes in V4:
	- Move Kconfig option CONFIG_X86_INTEL_NON_ACPI from
	  [PATCH 2/3] x86/platform/p2sb: New Primary to Sideband bridge support driver for Intel SOC's
	  to
	  [PATCH 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system
	  since the config is used in latter patch.
	- Select CONFIG_P2SB when CONFIG_LPC_ICH is enabled.
	- Remove #ifdef CONFIG_X86_INTEL_NON_ACPI and use
	  #if defined(CONFIG_X86_INTEL_NON_ACPI) when lpc_ich_misc is called
	  as suggested by Lee Jones.
	- Use single dimensional array instead of 2D array for apl_gpio_io_res
	  structure and use DEFINE_RES_IRQ for its IRQ resource.

Changes in V3:
	- Simplify register addresses calculation and use DEFINE_RES_MEM_NAMED
	  defines for apl_gpio_io_res structure
	- Define magic number for P2SB PCI ID
	- Replace switch-case with if-else since currently we have only one
	  use case
	- Only call mfd_add_devices() once for all gpio communities

Changes in V2:
	- Add new config option CONFIG_X86_INTEL_NON_ACPI and "select PINCTRL"
	  to fix kbuildbot error

 arch/x86/Kconfig      |  10 ++++
 drivers/mfd/Kconfig   |   3 +-
 drivers/mfd/lpc_ich.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 138 insertions(+), 1 deletion(-)

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index d305d81..520edd3 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -604,6 +604,16 @@ config IOSF_MBI_DEBUG
 
 	  If you don't require the option or are in doubt, say N.
 
+config X86_INTEL_NON_ACPI
+	bool "Enable support non-ACPI Intel platforms"
+	select PINCTRL
+	---help---
+	  Select this option to enables MMIO BAR access over the P2SB for
+	  non-ACPI Intel SoC platforms. This driver uses the P2SB hide/unhide
+	  mechanism cooperatively to pass the PCI BAR address to the platform
+	  driver, currently GPIO on the following SoC products.
+	   - Apollo Lake
+
 config P2SB
 	tristate
 	depends on PCI
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 1bcf601..dc4e543 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -369,8 +369,9 @@ config MFD_INTEL_QUARK_I2C_GPIO
 
 config LPC_ICH
 	tristate "Intel ICH LPC"
-	depends on PCI
+	depends on X86 && PCI
 	select MFD_CORE
+	select P2SB
 	help
 	  The LPC bridge function of the Intel ICH provides support for
 	  many functional units. This driver provides needed support for
diff --git a/drivers/mfd/lpc_ich.c b/drivers/mfd/lpc_ich.c
index bd3aa45..a64854d 100644
--- a/drivers/mfd/lpc_ich.c
+++ b/drivers/mfd/lpc_ich.c
@@ -68,6 +68,10 @@
 #include <linux/mfd/core.h>
 #include <linux/mfd/lpc_ich.h>
 #include <linux/platform_data/itco_wdt.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/types.h>
+
+#include <asm/p2sb.h>
 
 #define ACPIBASE		0x40
 #define ACPIBASE_GPE_OFF	0x28
@@ -94,6 +98,21 @@
 #define wdt_mem_res(i) wdt_res(ICH_RES_MEM_OFF, i)
 #define wdt_res(b, i) (&wdt_ich_res[(b) + (i)])
 
+/* Offset data for Apollo Lake GPIO communities */
+#define APL_GPIO_SOUTHWEST_OFFSET	0xc00000
+#define APL_GPIO_NORTHWEST_OFFSET	0xc40000
+#define APL_GPIO_NORTH_OFFSET		0xc50000
+#define APL_GPIO_WEST_OFFSET		0xc70000
+
+#define APL_GPIO_SOUTHWEST_NPIN		43
+#define APL_GPIO_NORTHWEST_NPIN		77
+#define APL_GPIO_NORTH_NPIN		78
+#define APL_GPIO_WEST_NPIN		47
+
+#define APL_GPIO_IRQ 14
+
+#define PCI_IDSEL_P2SB	0x0d
+
 struct lpc_ich_priv {
 	int chipset;
 
@@ -133,6 +152,59 @@ static struct resource gpio_ich_res[] = {
 	},
 };
 
+static struct resource apl_gpio_io_res[] = {
+	DEFINE_RES_MEM_NAMED(APL_GPIO_NORTH_OFFSET,
+		APL_GPIO_NORTH_NPIN * SZ_8, "apl_pinctrl_n"),
+	DEFINE_RES_MEM_NAMED(APL_GPIO_NORTHWEST_OFFSET,
+		APL_GPIO_NORTHWEST_NPIN * SZ_8, "apl_pinctrl_nw"),
+	DEFINE_RES_MEM_NAMED(APL_GPIO_WEST_OFFSET,
+		APL_GPIO_WEST_NPIN * SZ_8, "apl_pinctrl_w"),
+	DEFINE_RES_MEM_NAMED(APL_GPIO_SOUTHWEST_OFFSET,
+		APL_GPIO_SOUTHWEST_NPIN * SZ_8, "apl_pinctrl_sw"),
+	DEFINE_RES_IRQ(APL_GPIO_IRQ),
+};
+
+static struct pinctrl_pin_desc apl_pinctrl_pdata;
+
+static struct mfd_cell apl_gpio_devices[] = {
+	{
+		.name = "apl-pinctrl",
+		.id = 0,
+		.num_resources = ARRAY_SIZE(apl_gpio_io_res),
+		.resources = apl_gpio_io_res,
+		.pdata_size = sizeof(apl_pinctrl_pdata),
+		.platform_data = &apl_pinctrl_pdata,
+		.ignore_resource_conflicts = true,
+	},
+	{
+		.name = "apl-pinctrl",
+		.id = 1,
+		.num_resources = ARRAY_SIZE(apl_gpio_io_res),
+		.resources = apl_gpio_io_res,
+		.pdata_size = sizeof(apl_pinctrl_pdata),
+		.platform_data = &apl_pinctrl_pdata,
+		.ignore_resource_conflicts = true,
+	},
+	{
+		.name = "apl-pinctrl",
+		.id = 2,
+		.num_resources = ARRAY_SIZE(apl_gpio_io_res),
+		.resources = apl_gpio_io_res,
+		.pdata_size = sizeof(apl_pinctrl_pdata),
+		.platform_data = &apl_pinctrl_pdata,
+		.ignore_resource_conflicts = true,
+	},
+	{
+		.name = "apl-pinctrl",
+		.id = 3,
+		.num_resources = ARRAY_SIZE(apl_gpio_io_res),
+		.resources = apl_gpio_io_res,
+		.pdata_size = sizeof(apl_pinctrl_pdata),
+		.platform_data = &apl_pinctrl_pdata,
+		.ignore_resource_conflicts = true,
+	},
+};
+
 static struct mfd_cell lpc_ich_wdt_cell = {
 	.name = "iTCO_wdt",
 	.num_resources = ARRAY_SIZE(wdt_ich_res),
@@ -216,6 +288,7 @@ enum lpc_chipsets {
 	LPC_BRASWELL,	/* Braswell SoC */
 	LPC_LEWISBURG,	/* Lewisburg */
 	LPC_9S,		/* 9 Series */
+	LPC_APL,	/* Apollo Lake SoC */
 };
 
 static struct lpc_ich_info lpc_chipset_info[] = {
@@ -531,6 +604,10 @@ static struct lpc_ich_info lpc_chipset_info[] = {
 		.name = "9 Series",
 		.iTCO_version = 2,
 	},
+	[LPC_APL]  = {
+		.name = "Apollo Lake SoC",
+		.iTCO_version = 5,
+	},
 };
 
 /*
@@ -679,6 +756,7 @@ static const struct pci_device_id lpc_ich_ids[] = {
 	{ PCI_VDEVICE(INTEL, 0x3b14), LPC_3420},
 	{ PCI_VDEVICE(INTEL, 0x3b16), LPC_3450},
 	{ PCI_VDEVICE(INTEL, 0x5031), LPC_EP80579},
+	{ PCI_VDEVICE(INTEL, 0x5ae8), LPC_APL},
 	{ PCI_VDEVICE(INTEL, 0x8c40), LPC_LPT},
 	{ PCI_VDEVICE(INTEL, 0x8c41), LPC_LPT},
 	{ PCI_VDEVICE(INTEL, 0x8c42), LPC_LPT},
@@ -1050,6 +1128,50 @@ wdt_done:
 	return ret;
 }
 
+static int lpc_ich_misc(struct pci_dev *dev, enum lpc_chipsets chipset)
+{
+	unsigned int apl_p2sb = PCI_DEVFN(PCI_IDSEL_P2SB, 0);
+	unsigned int i;
+	int ret;
+
+	if (chipset != LPC_APL)
+		return -ENODEV;
+	/*
+	 * Apollo lake, has not 1, but 4 gpio controllers,
+	 * handle it a bit differently.
+	 */
+
+	for (i = 0; i < ARRAY_SIZE(apl_gpio_io_res)-1; i++) {
+		struct resource *res = &apl_gpio_io_res[i];
+
+		apl_gpio_devices[i].resources = res;
+
+		/* Fill MEM resource */
+		ret = p2sb_bar(dev, apl_p2sb, res++);
+		if (ret)
+			goto warn_continue;
+
+		apl_pinctrl_pdata.name = kasprintf(GFP_KERNEL, "%u",
+			i + 1);
+	}
+
+	if (apl_pinctrl_pdata.name)
+		ret = mfd_add_devices(&dev->dev, apl_gpio_devices->id,
+			apl_gpio_devices, ARRAY_SIZE(apl_gpio_devices),
+				NULL, 0, NULL);
+	else
+		ret = -ENOMEM;
+
+warn_continue:
+	if (ret)
+		dev_warn(&dev->dev,
+			"Failed to add Apollo Lake GPIO %s: %d\n",
+				apl_pinctrl_pdata.name, ret);
+
+	kfree(apl_pinctrl_pdata.name);
+	return 0;
+}
+
 static int lpc_ich_probe(struct pci_dev *dev,
 				const struct pci_device_id *id)
 {
@@ -1093,6 +1215,10 @@ static int lpc_ich_probe(struct pci_dev *dev,
 			cell_added = true;
 	}
 
+#if defined(CONFIG_X86_INTEL_NON_ACPI)
+	if (!lpc_ich_misc(dev, priv->chipset))
+		cell_added = true;
+#endif
 	/*
 	 * We only care if at least one or none of the cells registered
 	 * successfully.
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system
  2016-06-21  5:10 ` [PATCH v4 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system Tan Jui Nee
@ 2016-06-21  5:51   ` kbuild test robot
  2016-06-21  5:54   ` kbuild test robot
  2016-06-23  8:46   ` Linus Walleij
  2 siblings, 0 replies; 9+ messages in thread
From: kbuild test robot @ 2016-06-21  5:51 UTC (permalink / raw)
  To: Tan Jui Nee
  Cc: kbuild-all, mika.westerberg, heikki.krogerus, andriy.shevchenko,
	tglx, mingo, hpa, x86, ptyser, lee.jones, linus.walleij,
	linux-gpio, linux-kernel, jui.nee.tan, jonathan.yong,
	ong.hock.yu, weifeng.voon, wan.ahmad.zainie.wan.mohamad

[-- Attachment #1: Type: text/plain, Size: 3333 bytes --]

Hi,

[auto build test ERROR on tip/x86/core]
[also build test ERROR on v4.7-rc4 next-20160620]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Tan-Jui-Nee/pinctrl-broxton-enable-platform-device-in-the-absent-of-ACPI-enumeration/20160621-132027
config: x86_64-randconfig-i0-201625 (attached as .config)
compiler: gcc-6 (Debian 6.1.1-1) 6.1.1 20160430
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All errors (new ones prefixed by >>):

   drivers/mfd/lpc_ich.c:175:23: error: invalid application of 'sizeof' to incomplete type 'struct pinctrl_pin_desc'
      .pdata_size = sizeof(apl_pinctrl_pdata),
                          ^
   drivers/mfd/lpc_ich.c:184:23: error: invalid application of 'sizeof' to incomplete type 'struct pinctrl_pin_desc'
      .pdata_size = sizeof(apl_pinctrl_pdata),
                          ^
   drivers/mfd/lpc_ich.c:193:23: error: invalid application of 'sizeof' to incomplete type 'struct pinctrl_pin_desc'
      .pdata_size = sizeof(apl_pinctrl_pdata),
                          ^
   drivers/mfd/lpc_ich.c:202:23: error: invalid application of 'sizeof' to incomplete type 'struct pinctrl_pin_desc'
      .pdata_size = sizeof(apl_pinctrl_pdata),
                          ^
   drivers/mfd/lpc_ich.c: In function 'lpc_ich_misc':
   drivers/mfd/lpc_ich.c:1154:3: error: invalid use of undefined type 'struct pinctrl_pin_desc'
      apl_pinctrl_pdata.name = kasprintf(GFP_KERNEL, "%u",
      ^~~~~~~~~~~~~~~~~
   drivers/mfd/lpc_ich.c:1154:3: warning: statement with no effect [-Wunused-value]
   drivers/mfd/lpc_ich.c:1158:2: error: invalid use of undefined type 'struct pinctrl_pin_desc'
     if (apl_pinctrl_pdata.name)
     ^~
   drivers/mfd/lpc_ich.c:1169:5: error: invalid use of undefined type 'struct pinctrl_pin_desc'
        apl_pinctrl_pdata.name, ret);
        ^~~~~~~~~~~~~~~~~
   drivers/mfd/lpc_ich.c:1168:37: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'struct mfd_cell *' [-Wformat=]
       "Failed to add Apollo Lake GPIO %s: %d\n",
                                        ^
   drivers/mfd/lpc_ich.c:1171:2: error: invalid use of undefined type 'struct pinctrl_pin_desc'
     kfree(apl_pinctrl_pdata.name);
     ^~~~~
   drivers/mfd/lpc_ich.c: At top level:
>> drivers/mfd/lpc_ich.c:167:32: error: storage size of 'apl_pinctrl_pdata' isn't known
    static struct pinctrl_pin_desc apl_pinctrl_pdata;
                                   ^~~~~~~~~~~~~~~~~
   drivers/mfd/lpc_ich.c:1131:12: warning: 'lpc_ich_misc' defined but not used [-Wunused-function]
    static int lpc_ich_misc(struct pci_dev *dev, enum lpc_chipsets chipset)
               ^~~~~~~~~~~~

vim +167 drivers/mfd/lpc_ich.c

   161			APL_GPIO_WEST_NPIN * SZ_8, "apl_pinctrl_w"),
   162		DEFINE_RES_MEM_NAMED(APL_GPIO_SOUTHWEST_OFFSET,
   163			APL_GPIO_SOUTHWEST_NPIN * SZ_8, "apl_pinctrl_sw"),
   164		DEFINE_RES_IRQ(APL_GPIO_IRQ),
   165	};
   166	
 > 167	static struct pinctrl_pin_desc apl_pinctrl_pdata;
   168	
   169	static struct mfd_cell apl_gpio_devices[] = {
   170		{

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 27943 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system
  2016-06-21  5:10 ` [PATCH v4 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system Tan Jui Nee
  2016-06-21  5:51   ` kbuild test robot
@ 2016-06-21  5:54   ` kbuild test robot
  2016-06-23  8:46   ` Linus Walleij
  2 siblings, 0 replies; 9+ messages in thread
From: kbuild test robot @ 2016-06-21  5:54 UTC (permalink / raw)
  To: Tan Jui Nee
  Cc: kbuild-all, mika.westerberg, heikki.krogerus, andriy.shevchenko,
	tglx, mingo, hpa, x86, ptyser, lee.jones, linus.walleij,
	linux-gpio, linux-kernel, jui.nee.tan, jonathan.yong,
	ong.hock.yu, weifeng.voon, wan.ahmad.zainie.wan.mohamad

[-- Attachment #1: Type: text/plain, Size: 3901 bytes --]

Hi,

[auto build test ERROR on tip/x86/core]
[also build test ERROR on v4.7-rc4 next-20160620]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Tan-Jui-Nee/pinctrl-broxton-enable-platform-device-in-the-absent-of-ACPI-enumeration/20160621-132027
config: x86_64-lkp (attached as .config)
compiler: gcc-4.9 (Debian 4.9.3-14) 4.9.3
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All error/warnings (new ones prefixed by >>):

>> drivers/mfd/lpc_ich.c:175:23: error: invalid application of 'sizeof' to incomplete type 'struct pinctrl_pin_desc'
      .pdata_size = sizeof(apl_pinctrl_pdata),
                          ^
   drivers/mfd/lpc_ich.c:184:23: error: invalid application of 'sizeof' to incomplete type 'struct pinctrl_pin_desc'
      .pdata_size = sizeof(apl_pinctrl_pdata),
                          ^
   drivers/mfd/lpc_ich.c:193:23: error: invalid application of 'sizeof' to incomplete type 'struct pinctrl_pin_desc'
      .pdata_size = sizeof(apl_pinctrl_pdata),
                          ^
   drivers/mfd/lpc_ich.c:202:23: error: invalid application of 'sizeof' to incomplete type 'struct pinctrl_pin_desc'
      .pdata_size = sizeof(apl_pinctrl_pdata),
                          ^
   drivers/mfd/lpc_ich.c: In function 'lpc_ich_misc':
>> drivers/mfd/lpc_ich.c:1154:3: error: invalid use of undefined type 'struct pinctrl_pin_desc'
      apl_pinctrl_pdata.name = kasprintf(GFP_KERNEL, "%u",
      ^
>> drivers/mfd/lpc_ich.c:1154:3: warning: statement with no effect [-Wunused-value]
   drivers/mfd/lpc_ich.c:1158:2: error: invalid use of undefined type 'struct pinctrl_pin_desc'
     if (apl_pinctrl_pdata.name)
     ^
   drivers/mfd/lpc_ich.c:1169:5: error: invalid use of undefined type 'struct pinctrl_pin_desc'
        apl_pinctrl_pdata.name, ret);
        ^
>> drivers/mfd/lpc_ich.c:1169:5: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'struct mfd_cell *' [-Wformat=]
   drivers/mfd/lpc_ich.c:1171:2: error: invalid use of undefined type 'struct pinctrl_pin_desc'
     kfree(apl_pinctrl_pdata.name);
     ^
   drivers/mfd/lpc_ich.c: At top level:
   drivers/mfd/lpc_ich.c:1131:12: warning: 'lpc_ich_misc' defined but not used [-Wunused-function]
    static int lpc_ich_misc(struct pci_dev *dev, enum lpc_chipsets chipset)
               ^

vim +175 drivers/mfd/lpc_ich.c

   169	static struct mfd_cell apl_gpio_devices[] = {
   170		{
   171			.name = "apl-pinctrl",
   172			.id = 0,
   173			.num_resources = ARRAY_SIZE(apl_gpio_io_res),
   174			.resources = apl_gpio_io_res,
 > 175			.pdata_size = sizeof(apl_pinctrl_pdata),
   176			.platform_data = &apl_pinctrl_pdata,
   177			.ignore_resource_conflicts = true,
   178		},
   179		{
   180			.name = "apl-pinctrl",
   181			.id = 1,
   182			.num_resources = ARRAY_SIZE(apl_gpio_io_res),
   183			.resources = apl_gpio_io_res,
   184			.pdata_size = sizeof(apl_pinctrl_pdata),
   185			.platform_data = &apl_pinctrl_pdata,
   186			.ignore_resource_conflicts = true,
   187		},
   188		{
   189			.name = "apl-pinctrl",
   190			.id = 2,
   191			.num_resources = ARRAY_SIZE(apl_gpio_io_res),
   192			.resources = apl_gpio_io_res,
 > 193			.pdata_size = sizeof(apl_pinctrl_pdata),
   194			.platform_data = &apl_pinctrl_pdata,
   195			.ignore_resource_conflicts = true,
   196		},
   197		{
   198			.name = "apl-pinctrl",
   199			.id = 3,
   200			.num_resources = ARRAY_SIZE(apl_gpio_io_res),
   201			.resources = apl_gpio_io_res,
 > 202			.pdata_size = sizeof(apl_pinctrl_pdata),
   203			.platform_data = &apl_pinctrl_pdata,
   204			.ignore_resource_conflicts = true,
   205		},

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 22908 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 1/3] pinctrl/broxton: enable platform device in the absent of ACPI enumeration
  2016-06-21  5:10 ` [PATCH v4 1/3] " Tan Jui Nee
@ 2016-06-23  8:42   ` Linus Walleij
  0 siblings, 0 replies; 9+ messages in thread
From: Linus Walleij @ 2016-06-23  8:42 UTC (permalink / raw)
  To: Tan Jui Nee
  Cc: Mika Westerberg, Heikki Krogerus, Andy Shevchenko,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86, ptyser,
	Lee Jones, linux-gpio, linux-kernel, jonathan.yong, ong.hock.yu,
	weifeng.voon, wan.ahmad.zainie.wan.mohamad

On Tue, Jun 21, 2016 at 7:10 AM, Tan Jui Nee <jui.nee.tan@intel.com> wrote:

> 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.tan@intel.com>
> Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>

This patch is already applied in my tree.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 2/3] x86/platform/p2sb: New Primary to Sideband bridge support driver for Intel SOC's
  2016-06-21  5:10 ` [PATCH v4 2/3] x86/platform/p2sb: New Primary to Sideband bridge support driver for Intel SOC's Tan Jui Nee
@ 2016-06-23  8:45   ` Linus Walleij
  0 siblings, 0 replies; 9+ messages in thread
From: Linus Walleij @ 2016-06-23  8:45 UTC (permalink / raw)
  To: Tan Jui Nee
  Cc: Mika Westerberg, Heikki Krogerus, Andy Shevchenko,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86, ptyser,
	Lee Jones, linux-gpio, linux-kernel, jonathan.yong, ong.hock.yu,
	weifeng.voon, wan.ahmad.zainie.wan.mohamad

On Tue, Jun 21, 2016 at 7:10 AM, Tan Jui Nee <jui.nee.tan@intel.com> wrote:

> From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>
> There is already one and at least one more user coming which
> require an access to Primary to Sideband bridge (P2SB) in order
> to get IO or MMIO bar hidden by BIOS.
> Create a driver to access P2SB for x86 devices.
>
> Signed-off-by: Yong, Jonathan <jonathan.yong@intel.com>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
> Changes in V4:
>         - Move Kconfig option CONFIG_X86_INTEL_NON_ACPI from
>           [PATCH 2/3] x86/platform/p2sb: New Primary to Sideband bridge support driver for Intel SOC's
>           to
>           [PATCH 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system
>           since the config is used in latter patch.

Waiting for a respin in accordance with Mika's comments.

You don't need to resend patch 1/3 it is already applied.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system
  2016-06-21  5:10 ` [PATCH v4 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system Tan Jui Nee
  2016-06-21  5:51   ` kbuild test robot
  2016-06-21  5:54   ` kbuild test robot
@ 2016-06-23  8:46   ` Linus Walleij
  2 siblings, 0 replies; 9+ messages in thread
From: Linus Walleij @ 2016-06-23  8:46 UTC (permalink / raw)
  To: Tan Jui Nee
  Cc: Mika Westerberg, Heikki Krogerus, Andy Shevchenko,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86, ptyser,
	Lee Jones, linux-gpio, linux-kernel, jonathan.yong, ong.hock.yu,
	weifeng.voon, wan.ahmad.zainie.wan.mohamad

On Tue, Jun 21, 2016 at 7:10 AM, Tan Jui Nee <jui.nee.tan@intel.com> wrote:

> This driver uses the P2SB hide/unhide mechanism cooperatively
> to pass the PCI BAR address to the gpio platform driver.
>
> Signed-off-by: Tan Jui Nee <jui.nee.tan@intel.com>
> ---
> Changes in V4:
>         - Move Kconfig option CONFIG_X86_INTEL_NON_ACPI from
>           [PATCH 2/3] x86/platform/p2sb: New Primary to Sideband bridge support driver for Intel SOC's
>           to
>           [PATCH 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system
>           since the config is used in latter patch.
>         - Select CONFIG_P2SB when CONFIG_LPC_ICH is enabled.
>         - Remove #ifdef CONFIG_X86_INTEL_NON_ACPI and use
>           #if defined(CONFIG_X86_INTEL_NON_ACPI) when lpc_ich_misc is called
>           as suggested by Lee Jones.
>         - Use single dimensional array instead of 2D array for apl_gpio_io_res
>           structure and use DEFINE_RES_IRQ for its IRQ resource.

I guess this patch will also change, also fix the screamings from
the build robot please.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-06-23  8:46 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-21  5:10 [PATCH v4 0/3] pinctrl/broxton: enable platform device in the absent of ACPI enumeration Tan Jui Nee
2016-06-21  5:10 ` [PATCH v4 1/3] " Tan Jui Nee
2016-06-23  8:42   ` Linus Walleij
2016-06-21  5:10 ` [PATCH v4 2/3] x86/platform/p2sb: New Primary to Sideband bridge support driver for Intel SOC's Tan Jui Nee
2016-06-23  8:45   ` Linus Walleij
2016-06-21  5:10 ` [PATCH v4 3/3] mfd: lpc_ich: Add support for Intel Apollo Lake GPIO pinctrl in non-ACPI system Tan Jui Nee
2016-06-21  5:51   ` kbuild test robot
2016-06-21  5:54   ` kbuild test robot
2016-06-23  8:46   ` Linus Walleij

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).