@@ -142,7 +142,7 @@ int acpi_indirectio_set_logicio_res(struct device *child,
return ret;
}
-int
+static int
acpi_indirectio_pre_setup(struct acpi_device *adev,
struct acpi_indirectio_host_data *pdata)
{
@@ -239,8 +239,17 @@ int acpi_indirectio_set_logicio_res(struct device *child,
return ret;
}
+const struct acpi_indirectio_device_desc hisi_lpc_host_desc = {
+ .pdata = {
+ .io_size = PIO_INDIRECT_SIZE,
+ .io_start = 0,
+ },
+ .pre_setup = acpi_indirectio_pre_setup,
+};
+
/* All the host devices which apply indirect-IO can be listed here. */
static const struct acpi_device_id acpi_indirect_host_id[] = {
+ {"HISI0191", INDIRECT_IO_INFO(hisi_lpc_host_desc)},
{""},
};
@@ -457,7 +457,13 @@ static int hisilpc_probe(struct platform_device *pdev)
}
/* register the LPC host PIO resources */
- {
+ if (has_acpi_companion(dev)) {
+ lpcdev->io_host = find_io_range_by_fwnode(dev->fwnode);
+ if (!lpcdev->io_host) {
+ dev_err(dev, "range not registered!\n");
+ return -EFAULT;
+ }
+ } else {
struct logic_pio_hwaddr *range;
range = devm_kzalloc(dev, sizeof(*range), GFP_KERNEL);
@@ -515,10 +521,19 @@ static int hisilpc_probe(struct platform_device *pdev)
{},
};
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id hisilpc_acpi_match[] = {
+ {"HISI0191", },
+ {},
+};
+
+#endif
+
static struct platform_driver hisilpc_driver = {
.driver = {
.name = "hisi_lpc",
.of_match_table = hisilpc_of_match,
+ .acpi_match_table = ACPI_PTR(hisilpc_acpi_match),
},
.probe = hisilpc_probe,
};