From: Mika Westerberg <mika.westerberg@linux.intel.com>
To: Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Darren Hart <dvhart@infradead.org>,
Lee Jones <lee.jones@linaro.org>,
x86@kernel.org
Cc: Zha Qipeng <qipeng.zha@intel.com>,
Rajneesh Bhardwaj <rajneesh.bhardwaj@linux.intel.com>,
"David E . Box" <david.e.box@linux.intel.com>,
Guenter Roeck <linux@roeck-us.net>,
Heikki Krogerus <heikki.krogerus@linux.intel.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Wim Van Sebroeck <wim@linux-watchdog.org>,
Mika Westerberg <mika.westerberg@linux.intel.com>,
platform-driver-x86@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: [PATCH 34/37] mfd: intel_pmc_bxt: Convert to use MFD APIs
Date: Mon, 23 Dec 2019 17:17:13 +0300 [thread overview]
Message-ID: <20191223141716.13727-35-mika.westerberg@linux.intel.com> (raw)
In-Reply-To: <20191223141716.13727-1-mika.westerberg@linux.intel.com>
Instead of creating platform devices manually we can take advantage of
MFD APIs that are designed exactly for this. Unfortunately the ACPI
device includes separate resources for most of the subdevices so we
cannot simply call mfd_add_devices() to create all of them but instead
we need to call it separately for each device.
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
---
drivers/mfd/Kconfig | 1 +
drivers/mfd/intel_pmc_bxt.c | 254 +++++++++++-------------------------
2 files changed, 75 insertions(+), 180 deletions(-)
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 93ab1b6a9733..04542feffe25 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -636,6 +636,7 @@ config MFD_INTEL_PMC_BXT
tristate "Intel PMC Driver for Broxton"
depends on X86 && X86_PLATFORM_DEVICES && ACPI
select INTEL_SCU_IPC
+ select MFD_CORE
help
This driver provides support for PMC (Power Management
Controller) on Intel Broxton and Apollo Lake. PMC is a
diff --git a/drivers/mfd/intel_pmc_bxt.c b/drivers/mfd/intel_pmc_bxt.c
index 8974fe46d6b5..850ed55deef0 100644
--- a/drivers/mfd/intel_pmc_bxt.c
+++ b/drivers/mfd/intel_pmc_bxt.c
@@ -16,6 +16,7 @@
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/io-64-nonatomic-lo-hi.h>
+#include <linux/mfd/core.h>
#include <linux/mfd/intel_pmc_bxt.h>
#include <linux/module.h>
#include <linux/platform_device.h>
@@ -62,8 +63,6 @@
#define TELEM_SSRAM_SIZE 240
#define TELEM_PMC_SSRAM_OFFSET 0x1B00
#define TELEM_PUNIT_SSRAM_OFFSET 0x1A00
-#define TCO_PMC_OFFSET 0x08
-#define TCO_PMC_SIZE 0x04
/* PMC register bit definitions */
@@ -75,27 +74,19 @@
static struct intel_pmc_dev {
struct device *dev;
- /* The following PMC BARs share the same ACPI device with the IPC */
- resource_size_t acpi_io_base;
- int acpi_io_size;
- struct platform_device *tco_dev;
+ /* iTCO */
+ struct resource tco_res[2];
/* gcr */
void __iomem *gcr_mem_base;
- bool has_gcr_regs;
spinlock_t gcr_lock;
/* punit */
- struct platform_device *punit_dev;
+ struct resource punit_res[6];
unsigned int punit_res_count;
/* Telemetry */
- resource_size_t telem_pmc_ssram_base;
- resource_size_t telem_punit_ssram_base;
- int telem_pmc_ssram_size;
- int telem_punit_ssram_size;
- u8 telem_res_inval;
- struct platform_device *telemetry_dev;
+ struct resource *telem_base;
} pmcdev;
static inline u64 gcr_data_readq(u32 offset)
@@ -105,7 +96,7 @@ static inline u64 gcr_data_readq(u32 offset)
static inline int is_gcr_valid(u32 offset)
{
- if (!pmcdev.has_gcr_regs)
+ if (!pmcdev.gcr_mem_base)
return -EACCES;
if (offset > PLAT_RESOURCE_GCR_SIZE)
@@ -254,141 +245,62 @@ static const struct attribute_group intel_pmc_group = {
.attrs = intel_pmc_attrs,
};
-static struct resource punit_res_array[] = {
- /* Punit BIOS */
- {
- .flags = IORESOURCE_MEM,
- },
- {
- .flags = IORESOURCE_MEM,
- },
- /* Punit ISP */
- {
- .flags = IORESOURCE_MEM,
- },
- {
- .flags = IORESOURCE_MEM,
- },
- /* Punit GTD */
- {
- .flags = IORESOURCE_MEM,
- },
- {
- .flags = IORESOURCE_MEM,
- },
-};
-
-#define TCO_RESOURCE_ACPI_IO 0
-#define TCO_RESOURCE_SMI_EN_IO 1
-#define TCO_RESOURCE_GCR_MEM 2
-static struct resource tco_res[] = {
- /* ACPI - TCO */
- {
- .flags = IORESOURCE_IO,
- },
- /* ACPI - SMI */
- {
- .flags = IORESOURCE_IO,
- },
-};
-
-static struct itco_wdt_platform_data tco_info = {
- .name = "Apollo Lake SoC",
- .version = 5,
- .no_reboot_priv = &pmcdev,
- .update_no_reboot_bit = update_no_reboot_bit,
-};
-
-#define TELEMETRY_RESOURCE_PUNIT_SSRAM 0
-#define TELEMETRY_RESOURCE_PMC_SSRAM 1
-static struct resource telemetry_res[] = {
- /*Telemetry*/
- {
- .flags = IORESOURCE_MEM,
- },
- {
- .flags = IORESOURCE_MEM,
- },
-};
-
static int pmc_create_punit_device(void)
{
- struct platform_device *pdev;
- const struct platform_device_info pdevinfo = {
- .parent = pmcdev.dev,
+ struct mfd_cell punit = {
.name = PUNIT_DEVICE_NAME,
- .id = -1,
- .res = punit_res_array,
- .num_res = pmcdev.punit_res_count,
- };
+ .resources = pmcdev.punit_res,
+ .num_resources = pmcdev.punit_res_count,
+ };
- pdev = platform_device_register_full(&pdevinfo);
- if (IS_ERR(pdev))
- return PTR_ERR(pdev);
+ if (!pmcdev.punit_res_count)
+ return 0;
- pmcdev.punit_dev = pdev;
-
- return 0;
+ return devm_mfd_add_devices(pmcdev.dev, PLATFORM_DEVID_AUTO, &punit, 1,
+ NULL, 0, NULL);
}
static int pmc_create_tco_device(void)
{
- struct platform_device *pdev;
- struct resource *res;
- const struct platform_device_info pdevinfo = {
- .parent = pmcdev.dev,
+ struct itco_wdt_platform_data tco_info = {
+ .name = "Apollo Lake SoC",
+ .version = 5,
+ .no_reboot_priv = &pmcdev,
+ .update_no_reboot_bit = update_no_reboot_bit,
+ };
+ struct mfd_cell tco = {
.name = TCO_DEVICE_NAME,
- .id = -1,
- .res = tco_res,
- .num_res = ARRAY_SIZE(tco_res),
- .data = &tco_info,
- .size_data = sizeof(tco_info),
- };
-
- res = tco_res + TCO_RESOURCE_ACPI_IO;
- res->start = pmcdev.acpi_io_base + TCO_BASE_OFFSET;
- res->end = res->start + TCO_REGS_SIZE - 1;
-
- res = tco_res + TCO_RESOURCE_SMI_EN_IO;
- res->start = pmcdev.acpi_io_base + SMI_EN_OFFSET;
- res->end = res->start + SMI_EN_SIZE - 1;
-
- pdev = platform_device_register_full(&pdevinfo);
- if (IS_ERR(pdev))
- return PTR_ERR(pdev);
-
- pmcdev.tco_dev = pdev;
-
- return 0;
+ .ignore_resource_conflicts = true,
+ .platform_data = &tco_info,
+ .pdata_size = sizeof(tco_info),
+ .resources = pmcdev.tco_res,
+ .num_resources = ARRAY_SIZE(pmcdev.tco_res),
+ };
+
+ if (!pmcdev.tco_res[0].start)
+ return 0;
+
+ return devm_mfd_add_devices(pmcdev.dev, PLATFORM_DEVID_AUTO, &tco, 1,
+ NULL, 0, NULL);
}
static int pmc_create_telemetry_device(void)
{
- struct platform_device *pdev;
- struct resource *res;
- const struct platform_device_info pdevinfo = {
- .parent = pmcdev.dev,
+ struct resource telem_res[] = {
+ DEFINE_RES_MEM(TELEM_PUNIT_SSRAM_OFFSET, TELEM_SSRAM_SIZE),
+ DEFINE_RES_MEM(TELEM_PMC_SSRAM_OFFSET, TELEM_SSRAM_SIZE),
+ };
+ struct mfd_cell telem = {
.name = TELEMETRY_DEVICE_NAME,
- .id = -1,
- .res = telemetry_res,
- .num_res = ARRAY_SIZE(telemetry_res),
- };
-
- res = telemetry_res + TELEMETRY_RESOURCE_PUNIT_SSRAM;
- res->start = pmcdev.telem_punit_ssram_base;
- res->end = res->start + pmcdev.telem_punit_ssram_size - 1;
+ .resources = telem_res,
+ .num_resources = ARRAY_SIZE(telem_res),
+ };
- res = telemetry_res + TELEMETRY_RESOURCE_PMC_SSRAM;
- res->start = pmcdev.telem_pmc_ssram_base;
- res->end = res->start + pmcdev.telem_pmc_ssram_size - 1;
+ if (!pmcdev.telem_base)
+ return 0;
- pdev = platform_device_register_full(&pdevinfo);
- if (IS_ERR(pdev))
- return PTR_ERR(pdev);
-
- pmcdev.telemetry_dev = pdev;
-
- return 0;
+ return devm_mfd_add_devices(pmcdev.dev, PLATFORM_DEVID_AUTO, &telem, 1,
+ pmcdev.telem_base, 0, NULL);
}
static int pmc_create_devices(void)
@@ -407,19 +319,12 @@ static int pmc_create_devices(void)
ret = pmc_create_punit_device();
if (ret) {
dev_err(pmcdev.dev, "Failed to add punit platform device\n");
- platform_device_unregister(pmcdev.tco_dev);
return ret;
}
- if (!pmcdev.telem_res_inval) {
- ret = pmc_create_telemetry_device();
- if (ret) {
- dev_warn(pmcdev.dev,
- "Failed to add telemetry platform device\n");
- platform_device_unregister(pmcdev.punit_dev);
- platform_device_unregister(pmcdev.tco_dev);
- }
- }
+ ret = pmc_create_telemetry_device();
+ if (ret)
+ dev_warn(pmcdev.dev, "Failed to add telemetry platform device\n");
return ret;
}
@@ -427,20 +332,25 @@ static int pmc_create_devices(void)
static int pmc_plat_get_res(struct platform_device *pdev,
struct intel_scu_ipc_pdata *pdata)
{
- struct resource *res, *punit_res = punit_res_array;
+ struct resource *res, *punit_res = pmcdev.punit_res;
+ struct resource *tco_res = pmcdev.tco_res;
void __iomem *addr;
int size;
res = platform_get_resource(pdev, IORESOURCE_IO,
PLAT_RESOURCE_ACPI_IO_INDEX);
if (!res) {
- dev_err(&pdev->dev, "Failed to get io resource\n");
+ dev_err(&pdev->dev, "Failed to get IO resource\n");
return -ENXIO;
+
}
- size = resource_size(res);
- pmcdev.acpi_io_base = res->start;
- pmcdev.acpi_io_size = size;
- dev_info(&pdev->dev, "io res: %pR\n", res);
+ tco_res[0].flags = IORESOURCE_IO;
+ tco_res[0].start = res->start + TCO_BASE_OFFSET;
+ tco_res[0].end = tco_res[0].start + TCO_REGS_SIZE - 1;
+ tco_res[1].flags = IORESOURCE_IO;
+ tco_res[1].start = res->start + SMI_EN_OFFSET;
+ tco_res[1].end = tco_res[1].start + SMI_EN_SIZE - 1;
+ dev_dbg(&pdev->dev, "IO: %pR\n", res);
pmcdev.punit_res_count = 0;
@@ -448,28 +358,28 @@ static int pmc_plat_get_res(struct platform_device *pdev,
res = platform_get_resource(pdev, IORESOURCE_MEM,
PLAT_RESOURCE_BIOS_DATA_INDEX);
if (!res) {
- dev_err(&pdev->dev, "Failed to get res of punit BIOS data\n");
+ dev_err(&pdev->dev, "Failed to get res of P-unit BIOS data\n");
return -ENXIO;
}
punit_res[pmcdev.punit_res_count++] = *res;
- dev_info(&pdev->dev, "punit BIOS data res: %pR\n", res);
+ dev_dbg(&pdev->dev, "P-unit BIOS data: %pR\n", res);
/* This is index 1 to cover BIOS interface register */
res = platform_get_resource(pdev, IORESOURCE_MEM,
PLAT_RESOURCE_BIOS_IFACE_INDEX);
if (!res) {
- dev_err(&pdev->dev, "Failed to get res of punit BIOS iface\n");
+ dev_err(&pdev->dev, "Failed to get res of P-unit BIOS iface\n");
return -ENXIO;
}
punit_res[pmcdev.punit_res_count++] = *res;
- dev_info(&pdev->dev, "punit BIOS interface res: %pR\n", res);
+ dev_dbg(&pdev->dev, "P-unit BIOS interface: %pR\n", res);
/* This is index 2 to cover ISP data register, optional */
res = platform_get_resource(pdev, IORESOURCE_MEM,
PLAT_RESOURCE_ISP_DATA_INDEX);
if (res) {
punit_res[pmcdev.punit_res_count++] = *res;
- dev_info(&pdev->dev, "punit ISP data res: %pR\n", res);
+ dev_dbg(&pdev->dev, "P-unit ISP data: %pR\n", res);
}
/* This is index 3 to cover ISP interface register, optional */
@@ -477,7 +387,7 @@ static int pmc_plat_get_res(struct platform_device *pdev,
PLAT_RESOURCE_ISP_IFACE_INDEX);
if (res) {
punit_res[pmcdev.punit_res_count++] = *res;
- dev_info(&pdev->dev, "punit ISP interface res: %pR\n", res);
+ dev_dbg(&pdev->dev, "P-unit ISP interface: %pR\n", res);
}
/* This is index 4 to cover GTD data register, optional */
@@ -485,7 +395,7 @@ static int pmc_plat_get_res(struct platform_device *pdev,
PLAT_RESOURCE_GTD_DATA_INDEX);
if (res) {
punit_res[pmcdev.punit_res_count++] = *res;
- dev_info(&pdev->dev, "punit GTD data res: %pR\n", res);
+ dev_dbg(&pdev->dev, "P-unit GTD data: %pR\n", res);
}
/* This is index 5 to cover GTD interface register, optional */
@@ -493,13 +403,13 @@ static int pmc_plat_get_res(struct platform_device *pdev,
PLAT_RESOURCE_GTD_IFACE_INDEX);
if (res) {
punit_res[pmcdev.punit_res_count++] = *res;
- dev_info(&pdev->dev, "punit GTD interface res: %pR\n", res);
+ dev_dbg(&pdev->dev, "P-unit GTD interface: %pR\n", res);
}
res = platform_get_resource(pdev, IORESOURCE_MEM,
PLAT_RESOURCE_IPC_INDEX);
if (!res) {
- dev_err(&pdev->dev, "Failed to get ipc resource\n");
+ dev_err(&pdev->dev, "Failed to get IPC resource\n");
return -ENXIO;
}
size = PLAT_RESOURCE_IPC_SIZE + PLAT_RESOURCE_GCR_SIZE;
@@ -512,22 +422,15 @@ static int pmc_plat_get_res(struct platform_device *pdev,
pdata->ipc_regs = addr;
pmcdev.gcr_mem_base = addr + PLAT_RESOURCE_GCR_OFFSET;
- dev_info(&pdev->dev, "ipc res: %pR\n", res);
+ dev_dbg(&pdev->dev, "IPC: %pR\n", res);
- pmcdev.telem_res_inval = 0;
res = platform_get_resource(pdev, IORESOURCE_MEM,
PLAT_RESOURCE_TELEM_SSRAM_INDEX);
if (!res) {
- dev_err(&pdev->dev, "Failed to get telemetry ssram resource\n");
- pmcdev.telem_res_inval = 1;
+ dev_err(&pdev->dev, "Failed to get telemetry SSRAM resource\n");
} else {
- pmcdev.telem_punit_ssram_base = res->start +
- TELEM_PUNIT_SSRAM_OFFSET;
- pmcdev.telem_punit_ssram_size = TELEM_SSRAM_SIZE;
- pmcdev.telem_pmc_ssram_base = res->start +
- TELEM_PMC_SSRAM_OFFSET;
- pmcdev.telem_pmc_ssram_size = TELEM_SSRAM_SIZE;
- dev_info(&pdev->dev, "telemetry ssram res: %pR\n", res);
+ dev_dbg(&pdev->dev, "Telemetry SSRAM: %pR\n", res);
+ pmcdev.telem_base = res;
}
return 0;
@@ -543,7 +446,7 @@ int intel_pmc_s0ix_counter_read(u64 *data)
{
u64 deep, shlw;
- if (!pmcdev.has_gcr_regs)
+ if (!pmcdev.gcr_mem_base)
return -EACCES;
deep = gcr_data_readq(PMC_GCR_TELEM_DEEP_S0IX_REG);
@@ -597,19 +500,13 @@ static int intel_pmc_probe(struct platform_device *pdev)
if (ret) {
dev_err(&pdev->dev, "Failed to create sysfs group %d\n",
ret);
- goto err_devs;
+ goto err_ipc;
}
- pmcdev.has_gcr_regs = true;
-
return 0;
err_ipc:
intel_scu_ipc_remove(scu);
-err_devs:
- platform_device_unregister(pmcdev.tco_dev);
- platform_device_unregister(pmcdev.punit_dev);
- platform_device_unregister(pmcdev.telemetry_dev);
return ret;
}
@@ -617,9 +514,6 @@ static int intel_pmc_probe(struct platform_device *pdev)
static int intel_pmc_remove(struct platform_device *pdev)
{
sysfs_remove_group(&pdev->dev.kobj, &intel_pmc_group);
- platform_device_unregister(pmcdev.tco_dev);
- platform_device_unregister(pmcdev.punit_dev);
- platform_device_unregister(pmcdev.telemetry_dev);
intel_scu_ipc_remove(platform_get_drvdata(pdev));
pmcdev.dev = NULL;
return 0;
--
2.24.0
next prev parent reply other threads:[~2019-12-23 14:17 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-23 14:16 [PATCH 00/37] platform/x86: Rework intel_scu_ipc and intel_pmc_ipc drivers Mika Westerberg
2019-12-23 14:16 ` [PATCH 01/37] platform/x86: intel_mid_powerbtn: Take a copy of ddata Mika Westerberg
2019-12-23 14:16 ` [PATCH 02/37] platform/x86: intel_scu_ipcutil: Remove default y from Kconfig Mika Westerberg
2019-12-23 14:16 ` [PATCH 03/37] platform/x86: intel_scu_ipc: Add constants for register offsets Mika Westerberg
2019-12-23 14:16 ` [PATCH 04/37] platform/x86: intel_scu_ipc: Remove Lincroft support Mika Westerberg
2019-12-23 14:16 ` [PATCH 05/37] platform/x86: intel_scu_ipc: Drop intel_scu_ipc_i2c_cntrl() Mika Westerberg
2019-12-23 14:16 ` [PATCH 06/37] platform/x86: intel_scu_ipc: Fix interrupt support Mika Westerberg
2019-12-23 14:16 ` [PATCH 07/37] platform/x86: intel_scu_ipc: Sleeping is fine when polling Mika Westerberg
2019-12-23 14:16 ` [PATCH 08/37] platform/x86: intel_scu_ipc: Drop unused prototype intel_scu_ipc_fw_update() Mika Westerberg
2019-12-23 14:16 ` [PATCH 09/37] platform/x86: intel_scu_ipc: Drop unused macros Mika Westerberg
2019-12-23 14:16 ` [PATCH 10/37] platform/x86: intel_scu_ipc: Drop intel_scu_ipc_io[read|write][8|16]() Mika Westerberg
2019-12-23 14:16 ` [PATCH 11/37] platform/x86: intel_scu_ipc: Drop intel_scu_ipc_raw_command() Mika Westerberg
2019-12-23 14:16 ` [PATCH 12/37] platform/x86: intel_scu_ipc: Split out SCU IPC functionality from the SCU driver Mika Westerberg
2020-01-02 8:58 ` Lee Jones
2019-12-23 14:16 ` [PATCH 13/37] platform/x86: intel_scu_ipc: Reformat kernel-doc comments of exported functions Mika Westerberg
2019-12-23 14:16 ` [PATCH 14/37] platform/x86: intel_scu_ipc: Introduce new SCU IPC API Mika Westerberg
2019-12-23 14:16 ` [PATCH 15/37] platform/x86: intel_mid_powerbtn: Convert to use " Mika Westerberg
2019-12-23 14:16 ` [PATCH 16/37] watchdog: intel-mid_wdt: " Mika Westerberg
2019-12-23 15:46 ` Guenter Roeck
2019-12-27 9:59 ` Mika Westerberg
2019-12-23 14:16 ` [PATCH 17/37] platform/x86: intel_scu_ipcutil: " Mika Westerberg
2019-12-23 14:16 ` [PATCH 18/37] platform/x86: intel_pmc_ipc: Make intel_pmc_gcr_update() static Mika Westerberg
2019-12-23 14:16 ` [PATCH 19/37] platform/x86: intel_pmc_ipc: Make intel_pmc_ipc_simple_command() static Mika Westerberg
2019-12-23 14:16 ` [PATCH 20/37] platform/x86: intel_pmc_ipc: Make intel_pmc_ipc_raw_cmd() static Mika Westerberg
2019-12-23 14:17 ` [PATCH 21/37] platform/x86: intel_pmc_ipc: Drop intel_pmc_gcr_read() and intel_pmc_gcr_write() Mika Westerberg
2019-12-23 14:17 ` [PATCH 22/37] platform/x86: intel_pmc_ipc: Drop ipc_data_readb() Mika Westerberg
2019-12-23 14:17 ` [PATCH 23/37] platform/x86: intel_pmc_ipc: Get rid of unnecessary includes Mika Westerberg
2019-12-23 14:17 ` [PATCH 24/37] platform/x86: intel_scu_ipc: Add function to remove SCU IPC Mika Westerberg
2019-12-23 14:17 ` [PATCH 25/37] platform/x86: intel_pmc_ipc: Start using " Mika Westerberg
2019-12-23 14:17 ` [PATCH 26/37] mfd: intel_soc_pmic: Add SCU IPC member to struct intel_soc_pmic Mika Westerberg
2020-01-02 9:01 ` Lee Jones
2020-01-02 9:45 ` Mika Westerberg
2019-12-23 14:17 ` [PATCH 27/37] mfd: intel_soc_pmic_bxtwc: Convert to use new SCU IPC API Mika Westerberg
2020-01-02 9:16 ` Lee Jones
2019-12-23 14:17 ` [PATCH 28/37] mfd: intel_soc_pmic_mrfld: " Mika Westerberg
2020-01-02 9:17 ` Lee Jones
2019-12-23 14:17 ` [PATCH 29/37] platform/x86: intel_telemetry: " Mika Westerberg
2019-12-23 14:17 ` [PATCH 30/37] platform/x86: intel_pmc_ipc: Drop intel_pmc_ipc_command() Mika Westerberg
2019-12-23 14:17 ` [PATCH 31/37] x86/platform/intel-mid: Add empty stubs for intel_scu_devices_[create|destroy]() Mika Westerberg
2019-12-23 14:17 ` [PATCH 32/37] platform/x86: intel_pmc_ipc: Move PCI IDs to intel_scu_pcidrv.c Mika Westerberg
2019-12-23 14:17 ` [PATCH 33/37] platform/x86: intel_pmc_ipc: Move under MFD Mika Westerberg
2020-01-02 9:41 ` Lee Jones
2020-01-02 9:50 ` Mika Westerberg
2019-12-23 14:17 ` Mika Westerberg [this message]
2019-12-23 14:17 ` [PATCH 35/37] mfd: intel_pmc_bxt: Use octal permissions in sysfs attributes Mika Westerberg
2019-12-23 14:17 ` [PATCH 36/37] mfd: intel_pmc_bxt: Switch to use driver->dev_groups Mika Westerberg
2019-12-23 14:17 ` [PATCH 37/37] MAINTAINERS: Update entry for Intel Broxton PMC driver Mika Westerberg
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=20191223141716.13727-35-mika.westerberg@linux.intel.com \
--to=mika.westerberg@linux.intel.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=david.e.box@linux.intel.com \
--cc=dvhart@infradead.org \
--cc=gregkh@linuxfoundation.org \
--cc=heikki.krogerus@linux.intel.com \
--cc=lee.jones@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=platform-driver-x86@vger.kernel.org \
--cc=qipeng.zha@intel.com \
--cc=rajneesh.bhardwaj@linux.intel.com \
--cc=wim@linux-watchdog.org \
--cc=x86@kernel.org \
/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