From: Peter Tyser <ptyser@xes-inc.com>
To: linux-kernel@vger.kernel.org
Cc: Peter Tyser <ptyser@xes-inc.com>,
Guenter Roeck <linux@roeck-us.net>,
James Ralston <james.d.ralston@intel.com>,
Samuel Ortiz <sameo@linux.intel.com>,
Lee Jones <lee.jones@linaro.org>,
Wim Van Sebroeck <wim@iguana.be>,
linux-watchdog@vger.kernel.org
Subject: [PATCH 4/8] mfd: lpc_ich: Add support for iTCO v3
Date: Mon, 10 Mar 2014 16:34:54 -0500 [thread overview]
Message-ID: <1394487298-14459-4-git-send-email-ptyser@xes-inc.com> (raw)
In-Reply-To: <1394487298-14459-1-git-send-email-ptyser@xes-inc.com>
Some newer Atom CPUs, eg Avoton and Bay Trail, use slightly different
register layouts for the iTCO than the current v1 and v2 iTCO.
Differences from previous iTCO versions include:
- The ACPI space is enabled in the "ACPI base address" register instead
of the "ACPI control register"
- The "no reboot" functionality is set in the "Power Management
Configuration" register instead of the "General Control and Status"
(GCS) register or PCI configuration space.
- The "ACPI Control Register" is not present on v3. The "Power
Management Configuration Base Address" register resides at the same
address is Avoton/Bay Trail.
To differentiate these newer chipsets create a new v3 iTCO version and
update the MFD driver to support them.
Signed-off-by: Peter Tyser <ptyser@xes-inc.com>
Tested-by: Rajat Jain <rajatjain@juniper.net>
Cc: Guenter Roeck <linux@roeck-us.net>
Cc: James Ralston <james.d.ralston@intel.com>
Cc: Samuel Ortiz <sameo@linux.intel.com>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Wim Van Sebroeck <wim@iguana.be>
Cc: linux-watchdog@vger.kernel.org
---
drivers/mfd/lpc_ich.c | 81 +++++++++++++++++++++++++++++++++++-------
include/linux/mfd/lpc_ich.h | 8 ++--
2 files changed, 71 insertions(+), 18 deletions(-)
diff --git a/drivers/mfd/lpc_ich.c b/drivers/mfd/lpc_ich.c
index 2cc052a..b4bfc58 100644
--- a/drivers/mfd/lpc_ich.c
+++ b/drivers/mfd/lpc_ich.c
@@ -72,9 +72,11 @@
#define ACPIBASE_GPE_END 0x2f
#define ACPIBASE_SMI_OFF 0x30
#define ACPIBASE_SMI_END 0x33
+#define ACPIBASE_PMC_OFF 0x08
+#define ACPIBASE_PMC_END 0x0c
#define ACPIBASE_TCO_OFF 0x60
#define ACPIBASE_TCO_END 0x7f
-#define ACPICTRL 0x44
+#define ACPICTRL_PMCBASE 0x44
#define ACPIBASE_GCS_OFF 0x3410
#define ACPIBASE_GCS_END 0x3414
@@ -94,11 +96,12 @@ struct lpc_ich_priv {
int chipset;
int abase; /* ACPI base */
- int actrl; /* ACPI control or PMC base */
+ int actrl_pbase; /* ACPI control or PMC base */
int gbase; /* GPIO base */
int gctrl; /* GPIO control */
- int actrl_save; /* Cached ACPI control base value */
+ int abase_save; /* Cached ACPI base value */
+ int actrl_pbase_save; /* Cached ACPI control or PMC base value */
int gctrl_save; /* Cached GPIO control value */
};
@@ -111,7 +114,7 @@ static struct resource wdt_ich_res[] = {
{
.flags = IORESOURCE_IO,
},
- /* GCS */
+ /* GCS or PMC */
{
.flags = IORESOURCE_MEM,
},
@@ -742,9 +745,15 @@ static void lpc_ich_restore_config_space(struct pci_dev *dev)
{
struct lpc_ich_priv *priv = pci_get_drvdata(dev);
- if (priv->actrl_save >= 0) {
- pci_write_config_byte(dev, priv->actrl, priv->actrl_save);
- priv->actrl_save = -1;
+ if (priv->abase_save >= 0) {
+ pci_write_config_byte(dev, priv->abase, priv->abase_save);
+ priv->abase_save = -1;
+ }
+
+ if (priv->actrl_pbase_save >= 0) {
+ pci_write_config_byte(dev, priv->actrl_pbase,
+ priv->actrl_pbase_save);
+ priv->actrl_pbase_save = -1;
}
if (priv->gctrl_save >= 0) {
@@ -758,9 +767,26 @@ static void lpc_ich_enable_acpi_space(struct pci_dev *dev)
struct lpc_ich_priv *priv = pci_get_drvdata(dev);
u8 reg_save;
- pci_read_config_byte(dev, priv->actrl, ®_save);
- pci_write_config_byte(dev, priv->actrl, reg_save | 0x80);
- priv->actrl_save = reg_save;
+ switch (lpc_chipset_info[priv->chipset].iTCO_version) {
+ case 3:
+ /*
+ * Some chipsets (eg Avoton) enable the ACPI space in the
+ * ACPI BASE register.
+ */
+ pci_read_config_byte(dev, priv->abase, ®_save);
+ pci_write_config_byte(dev, priv->abase, reg_save | 0x2);
+ priv->abase_save = reg_save;
+ break;
+ default:
+ /*
+ * Most chipsets enable the ACPI space in the ACPI control
+ * register.
+ */
+ pci_read_config_byte(dev, priv->actrl_pbase, ®_save);
+ pci_write_config_byte(dev, priv->actrl_pbase, reg_save | 0x80);
+ priv->actrl_pbase_save = reg_save;
+ break;
+ }
}
static void lpc_ich_enable_gpio_space(struct pci_dev *dev)
@@ -773,6 +799,17 @@ static void lpc_ich_enable_gpio_space(struct pci_dev *dev)
priv->gctrl_save = reg_save;
}
+static void lpc_ich_enable_pmc_space(struct pci_dev *dev)
+{
+ struct lpc_ich_priv *priv = pci_get_drvdata(dev);
+ u8 reg_save;
+
+ pci_read_config_byte(dev, priv->actrl_pbase, ®_save);
+ pci_write_config_byte(dev, priv->actrl_pbase, reg_save | 0x2);
+
+ priv->actrl_pbase_save = reg_save;
+}
+
static void lpc_ich_finalize_cell(struct pci_dev *dev, struct mfd_cell *cell)
{
struct lpc_ich_priv *priv = pci_get_drvdata(dev);
@@ -910,14 +947,20 @@ static int lpc_ich_init_wdt(struct pci_dev *dev)
lpc_ich_enable_acpi_space(dev);
/*
+ * iTCO v2:
* Get the Memory-Mapped GCS register. To get access to it
* we have to read RCBA from PCI Config space 0xf0 and use
* it as base. GCS = RCBA + ICH6_GCS(0x3410).
+ *
+ * iTCO v3:
+ * Get the Power Management Configuration register. To get access
+ * to it we have to read the PMC BASE from config space and address
+ * the register at offset 0x8.
*/
if (lpc_chipset_info[priv->chipset].iTCO_version == 1) {
/* Don't register iomem for TCO ver 1 */
lpc_ich_cells[LPC_WDT].num_resources--;
- } else {
+ } else if (lpc_chipset_info[priv->chipset].iTCO_version == 2) {
pci_read_config_dword(dev, RCBABASE, &base_addr_cfg);
base_addr = base_addr_cfg & 0xffffc000;
if (!(base_addr_cfg & 1)) {
@@ -926,9 +969,17 @@ static int lpc_ich_init_wdt(struct pci_dev *dev)
ret = -ENODEV;
goto wdt_done;
}
- res = wdt_mem_res(ICH_RES_MEM_GCS);
+ res = wdt_mem_res(ICH_RES_MEM_GCS_PMC);
res->start = base_addr + ACPIBASE_GCS_OFF;
res->end = base_addr + ACPIBASE_GCS_END;
+ } else if (lpc_chipset_info[priv->chipset].iTCO_version == 3) {
+ lpc_ich_enable_pmc_space(dev);
+ pci_read_config_dword(dev, ACPICTRL_PMCBASE, &base_addr_cfg);
+ base_addr = base_addr_cfg & 0xfffffe00;
+
+ res = wdt_mem_res(ICH_RES_MEM_GCS_PMC);
+ res->start = base_addr + ACPIBASE_PMC_OFF;
+ res->end = base_addr + ACPIBASE_PMC_END;
}
lpc_ich_finalize_cell(dev, &lpc_ich_cells[LPC_WDT]);
@@ -953,9 +1004,11 @@ static int lpc_ich_probe(struct pci_dev *dev,
priv->chipset = id->driver_data;
- priv->actrl_save = -1;
+ priv->actrl_pbase_save = -1;
+ priv->abase_save = -1;
+
priv->abase = ACPIBASE;
- priv->actrl = ACPICTRL;
+ priv->actrl_pbase = ACPICTRL_PMCBASE;
priv->gctrl_save = -1;
if (priv->chipset <= LPC_ICH5) {
diff --git a/include/linux/mfd/lpc_ich.h b/include/linux/mfd/lpc_ich.h
index 3e1df64..9b29d65 100644
--- a/include/linux/mfd/lpc_ich.h
+++ b/include/linux/mfd/lpc_ich.h
@@ -21,10 +21,10 @@
#define LPC_ICH_H
/* Watchdog resources */
-#define ICH_RES_IO_TCO 0
-#define ICH_RES_IO_SMI 1
-#define ICH_RES_MEM_OFF 2
-#define ICH_RES_MEM_GCS 0
+#define ICH_RES_IO_TCO 0
+#define ICH_RES_IO_SMI 1
+#define ICH_RES_MEM_OFF 2
+#define ICH_RES_MEM_GCS_PMC 0
/* GPIO resources */
#define ICH_RES_GPIO 0
--
1.7.7.GIT
next prev parent reply other threads:[~2014-03-10 21:35 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-10 21:34 [PATCH 1/8] mfd: lpc_ich: Fix ACPI enable bitmask Peter Tyser
2014-03-10 21:34 ` [PATCH 2/8] mfd: lpc_ich: Only configure watchdog or GPIO when present Peter Tyser
2014-03-11 0:59 ` Guenter Roeck
2014-03-13 22:46 ` Lee Jones
2014-03-10 21:34 ` [PATCH 3/8] mfd: lpc_ich: Remove lpc_ich_cfg struct use Peter Tyser
2014-03-11 0:59 ` Guenter Roeck
2014-03-13 22:46 ` Lee Jones
2014-03-10 21:34 ` Peter Tyser [this message]
2014-03-11 1:02 ` [PATCH 4/8] mfd: lpc_ich: Add support for iTCO v3 Guenter Roeck
2014-03-13 22:47 ` Lee Jones
2014-03-15 20:04 ` Wim Van Sebroeck
2014-03-10 21:34 ` [PATCH 5/8] watchdog: iTCO_wdt: Add support for v3 silicon Peter Tyser
2014-03-11 1:06 ` Guenter Roeck
2014-03-13 22:47 ` Lee Jones
2014-03-15 20:03 ` Wim Van Sebroeck
2014-03-18 8:28 ` Lee Jones
2014-03-18 13:59 ` Wim Van Sebroeck
2014-03-18 20:36 ` Lee Jones
2014-03-10 21:34 ` [PATCH 6/8] mfd: lpc_ich: Change Avoton to iTCO v3 Peter Tyser
2014-03-11 1:07 ` Guenter Roeck
2014-03-13 22:48 ` Lee Jones
2014-03-15 20:04 ` Wim Van Sebroeck
2014-03-18 8:27 ` Lee Jones
2014-03-18 14:00 ` Wim Van Sebroeck
2014-03-10 21:34 ` [PATCH 7/8] mfd: lpc_ich: Add support for NM10 GPIO Peter Tyser
2014-03-11 1:08 ` Guenter Roeck
2014-03-13 22:48 ` Lee Jones
2014-03-10 21:34 ` [PATCH 8/8] mfd: lpc_ich: Add support for Intel Bay Trail SoC Peter Tyser
2014-03-11 1:09 ` Guenter Roeck
2014-03-13 22:49 ` Lee Jones
2014-03-11 0:59 ` [PATCH 1/8] mfd: lpc_ich: Fix ACPI enable bitmask Guenter Roeck
2014-03-13 15:16 ` Guenter Roeck
2014-03-13 15:25 ` Lee Jones
2014-03-13 22:50 ` Lee Jones
2014-03-13 23:04 ` Guenter Roeck
2014-03-14 10:29 ` Lee Jones
2014-03-19 17:17 ` Guenter Roeck
2014-03-19 21:47 ` Lee Jones
2014-03-13 22:45 ` Lee Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1394487298-14459-4-git-send-email-ptyser@xes-inc.com \
--to=ptyser@xes-inc.com \
--cc=james.d.ralston@intel.com \
--cc=lee.jones@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-watchdog@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=sameo@linux.intel.com \
--cc=wim@iguana.be \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®