113 lines
3.2 KiB
Diff
113 lines
3.2 KiB
Diff
|
From e15ad2154b6166804fc04487e0398c9aef9e7c97 Mon Sep 17 00:00:00 2001
|
||
|
From: Mika Westerberg <mika.westerberg@linux.intel.com>
|
||
|
Date: Mon, 30 Nov 2015 17:11:41 +0200
|
||
|
Subject: [PATCH 13/16] mfd: intel-lpss: Add support for passing device
|
||
|
properties
|
||
|
|
||
|
If the boot firmware does not support ACPI we need a way to pass device
|
||
|
configuration information to the drivers. The unified device properties API
|
||
|
already supports passing platform data via properties so let's take
|
||
|
advantage of that and allow probe drivers to pass set of properties to the
|
||
|
host controller driver.
|
||
|
|
||
|
In order to do that we need to be able to modify the MFD cell corresponding
|
||
|
the host controller, so make the core driver to take copy of the cell
|
||
|
instead of using it directly. Then we can assign info->pset to the
|
||
|
resulting copy of a cell and let the MFD core to assign that to the
|
||
|
resulting device.
|
||
|
|
||
|
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
|
||
|
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||
|
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||
|
---
|
||
|
drivers/mfd/intel-lpss.c | 16 ++++++++++++----
|
||
|
drivers/mfd/intel-lpss.h | 2 ++
|
||
|
2 files changed, 14 insertions(+), 4 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/mfd/intel-lpss.c b/drivers/mfd/intel-lpss.c
|
||
|
index 6255513..1743788 100644
|
||
|
--- a/drivers/mfd/intel-lpss.c
|
||
|
+++ b/drivers/mfd/intel-lpss.c
|
||
|
@@ -24,6 +24,7 @@
|
||
|
#include <linux/mfd/core.h>
|
||
|
#include <linux/pm_qos.h>
|
||
|
#include <linux/pm_runtime.h>
|
||
|
+#include <linux/property.h>
|
||
|
#include <linux/seq_file.h>
|
||
|
#include <linux/io-64-nonatomic-lo-hi.h>
|
||
|
|
||
|
@@ -72,7 +73,7 @@ struct intel_lpss {
|
||
|
enum intel_lpss_dev_type type;
|
||
|
struct clk *clk;
|
||
|
struct clk_lookup *clock;
|
||
|
- const struct mfd_cell *cell;
|
||
|
+ struct mfd_cell *cell;
|
||
|
struct device *dev;
|
||
|
void __iomem *priv;
|
||
|
int devid;
|
||
|
@@ -217,6 +218,7 @@ static void intel_lpss_ltr_hide(struct intel_lpss *lpss)
|
||
|
|
||
|
static int intel_lpss_assign_devs(struct intel_lpss *lpss)
|
||
|
{
|
||
|
+ const struct mfd_cell *cell;
|
||
|
unsigned int type;
|
||
|
|
||
|
type = lpss->caps & LPSS_PRIV_CAPS_TYPE_MASK;
|
||
|
@@ -224,18 +226,22 @@ static int intel_lpss_assign_devs(struct intel_lpss *lpss)
|
||
|
|
||
|
switch (type) {
|
||
|
case LPSS_DEV_I2C:
|
||
|
- lpss->cell = &intel_lpss_i2c_cell;
|
||
|
+ cell = &intel_lpss_i2c_cell;
|
||
|
break;
|
||
|
case LPSS_DEV_UART:
|
||
|
- lpss->cell = &intel_lpss_uart_cell;
|
||
|
+ cell = &intel_lpss_uart_cell;
|
||
|
break;
|
||
|
case LPSS_DEV_SPI:
|
||
|
- lpss->cell = &intel_lpss_spi_cell;
|
||
|
+ cell = &intel_lpss_spi_cell;
|
||
|
break;
|
||
|
default:
|
||
|
return -ENODEV;
|
||
|
}
|
||
|
|
||
|
+ lpss->cell = devm_kmemdup(lpss->dev, cell, sizeof(*cell), GFP_KERNEL);
|
||
|
+ if (!lpss->cell)
|
||
|
+ return -ENOMEM;
|
||
|
+
|
||
|
lpss->type = type;
|
||
|
|
||
|
return 0;
|
||
|
@@ -401,6 +407,8 @@ int intel_lpss_probe(struct device *dev,
|
||
|
if (ret)
|
||
|
return ret;
|
||
|
|
||
|
+ lpss->cell->pset = info->pset;
|
||
|
+
|
||
|
intel_lpss_init_dev(lpss);
|
||
|
|
||
|
lpss->devid = ida_simple_get(&intel_lpss_devid_ida, 0, 0, GFP_KERNEL);
|
||
|
diff --git a/drivers/mfd/intel-lpss.h b/drivers/mfd/intel-lpss.h
|
||
|
index 2c7f8d7..0dcea9e 100644
|
||
|
--- a/drivers/mfd/intel-lpss.h
|
||
|
+++ b/drivers/mfd/intel-lpss.h
|
||
|
@@ -16,12 +16,14 @@
|
||
|
|
||
|
struct device;
|
||
|
struct resource;
|
||
|
+struct property_set;
|
||
|
|
||
|
struct intel_lpss_platform_info {
|
||
|
struct resource *mem;
|
||
|
int irq;
|
||
|
unsigned long clk_rate;
|
||
|
const char *clk_con_id;
|
||
|
+ struct property_set *pset;
|
||
|
};
|
||
|
|
||
|
int intel_lpss_probe(struct device *dev,
|
||
|
--
|
||
|
2.5.0
|
||
|
|