瀏覽代碼

ACPI / LPSS: override SDIO private register space size from ACPI tables

The SDIO device in Lynxpoint has its LTR registers reserved for a
WiFi device (a child of the SDIO device) in the ACPI namespace even
though those registers physically belong to the SDIO device itself.
In order to be able to access the SDIO LTR registers from the ACPI
LPSS driver for diagnostic purposes we need to use a size override
for the SDIO private register space.

Add a possibility to override the size of the private register space
of an LPSS device provided by the ACPI tables in the ACPI LPSS driver
and set the correct size for the SDIO device in there.

[rjw: Changelog]
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Mika Westerberg 12 年之前
父節點
當前提交
958c4eb2aa
共有 1 個文件被更改,包括 6 次插入1 次删除
  1. 6 1
      drivers/acpi/acpi_lpss.c

+ 6 - 1
drivers/acpi/acpi_lpss.c

@@ -48,6 +48,7 @@ struct lpss_device_desc {
 	const char *clkdev_name;
 	const char *clkdev_name;
 	bool ltr_required;
 	bool ltr_required;
 	unsigned int prv_offset;
 	unsigned int prv_offset;
+	size_t prv_size_override;
 	bool clk_gate;
 	bool clk_gate;
 	struct lpss_shared_clock *shared_clock;
 	struct lpss_shared_clock *shared_clock;
 	void (*setup)(struct lpss_private_data *pdata);
 	void (*setup)(struct lpss_private_data *pdata);
@@ -91,6 +92,7 @@ static struct lpss_device_desc lpt_uart_dev_desc = {
 
 
 static struct lpss_device_desc lpt_sdio_dev_desc = {
 static struct lpss_device_desc lpt_sdio_dev_desc = {
 	.prv_offset = 0x1000,
 	.prv_offset = 0x1000,
+	.prv_size_override = 0x1018,
 	.ltr_required = true,
 	.ltr_required = true,
 };
 };
 
 
@@ -249,7 +251,10 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
 
 
 	list_for_each_entry(rentry, &resource_list, node)
 	list_for_each_entry(rentry, &resource_list, node)
 		if (resource_type(&rentry->res) == IORESOURCE_MEM) {
 		if (resource_type(&rentry->res) == IORESOURCE_MEM) {
-			pdata->mmio_size = resource_size(&rentry->res);
+			if (dev_desc->prv_size_override)
+				pdata->mmio_size = dev_desc->prv_size_override;
+			else
+				pdata->mmio_size = resource_size(&rentry->res);
 			pdata->mmio_base = ioremap(rentry->res.start,
 			pdata->mmio_base = ioremap(rentry->res.start,
 						   pdata->mmio_size);
 						   pdata->mmio_size);
 			pdata->dev_desc = dev_desc;
 			pdata->dev_desc = dev_desc;