[RFC PATCH v4 13/20] ACPI/PNP: Initialize PNP devices skipped due to _DEP
Sunil V L
sunilvl at ventanamicro.com
Mon Apr 15 10:01:06 PDT 2024
When PNP devices have _DEP, they will not be enumerated in
pnpacpi_init() unless the dependency is met. Hence, when such PNP
device's supplier device is probed, the PNP device need to be added to
the PNP data structures. So, introduce pnpacpi_init_2() for doing this
which gets called as part of clearing the dependency.
This is currently required for RISC-V. Hence, restricted the code with a
CONFIG option enabled for RISC-V.
Since pnpacpi_add_device() can be called now even after boot,
__init attribute is removed from pnpacpi_add_device() and its dependent
functions.
Signed-off-by: Sunil V L <sunilvl at ventanamicro.com>
---
drivers/acpi/scan.c | 4 +++
drivers/pnp/pnpacpi/core.c | 24 ++++++++++---
drivers/pnp/pnpacpi/rsparser.c | 63 +++++++++++++++++-----------------
include/linux/pnp.h | 7 ++++
4 files changed, 62 insertions(+), 36 deletions(-)
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 8e23b9508716..086ae040a5ad 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -19,6 +19,7 @@
#include <linux/dma-map-ops.h>
#include <linux/platform_data/x86/apple.h>
#include <linux/pgtable.h>
+#include <linux/pnp.h>
#include <linux/crc32.h>
#include <linux/dma-direct.h>
@@ -2370,6 +2371,9 @@ static void acpi_scan_clear_dep_fn(struct work_struct *work)
acpi_bus_attach(cdw->adev, (void *)true);
acpi_scan_lock_release();
+ if (IS_ENABLED(CONFIG_ARCH_ACPI_DEFERRED_GSI) && IS_ENABLED(CONFIG_PNPACPI))
+ pnpacpi_init_2(cdw->adev);
+
acpi_dev_put(cdw->adev);
kfree(cdw);
}
diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
index a0927081a003..c81893fc1fb2 100644
--- a/drivers/pnp/pnpacpi/core.c
+++ b/drivers/pnp/pnpacpi/core.c
@@ -26,7 +26,7 @@ static int num;
#define TEST_ALPHA(c) \
if (!('A' <= (c) && (c) <= 'Z')) \
return 0
-static int __init ispnpidacpi(const char *id)
+static int ispnpidacpi(const char *id)
{
TEST_ALPHA(id[0]);
TEST_ALPHA(id[1]);
@@ -194,7 +194,7 @@ struct pnp_protocol pnpacpi_protocol = {
};
EXPORT_SYMBOL(pnpacpi_protocol);
-static const char *__init pnpacpi_get_id(struct acpi_device *device)
+static const char *pnpacpi_get_id(struct acpi_device *device)
{
struct acpi_hardware_id *id;
@@ -206,7 +206,7 @@ static const char *__init pnpacpi_get_id(struct acpi_device *device)
return NULL;
}
-static int __init pnpacpi_add_device(struct acpi_device *device)
+static int pnpacpi_add_device(struct acpi_device *device)
{
struct pnp_dev *dev;
const char *pnpid;
@@ -283,6 +283,23 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
return 0;
}
+int pnpacpi_disabled;
+
+#ifdef CONFIG_ARCH_ACPI_DEFERRED_GSI
+void pnpacpi_init_2(struct acpi_device *adev)
+{
+ if (acpi_disabled || pnpacpi_disabled)
+ return;
+
+ if (!adev)
+ return;
+
+ if (acpi_is_pnp_device(adev) && acpi_dev_ready_for_enumeration(adev))
+ pnpacpi_add_device(adev);
+}
+
+#endif
+
static acpi_status __init pnpacpi_add_device_handler(acpi_handle handle,
u32 lvl, void *context,
void **rv)
@@ -296,7 +313,6 @@ static acpi_status __init pnpacpi_add_device_handler(acpi_handle handle,
return AE_OK;
}
-int pnpacpi_disabled __initdata;
static int __init pnpacpi_init(void)
{
if (acpi_disabled || pnpacpi_disabled) {
diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c
index c02ce0834c2c..1008599901a2 100644
--- a/drivers/pnp/pnpacpi/rsparser.c
+++ b/drivers/pnp/pnpacpi/rsparser.c
@@ -289,9 +289,9 @@ int pnpacpi_parse_allocated_resource(struct pnp_dev *dev)
return 0;
}
-static __init void pnpacpi_parse_dma_option(struct pnp_dev *dev,
- unsigned int option_flags,
- struct acpi_resource_dma *p)
+static void pnpacpi_parse_dma_option(struct pnp_dev *dev,
+ unsigned int option_flags,
+ struct acpi_resource_dma *p)
{
int i;
unsigned char map = 0, flags;
@@ -303,9 +303,9 @@ static __init void pnpacpi_parse_dma_option(struct pnp_dev *dev,
pnp_register_dma_resource(dev, option_flags, map, flags);
}
-static __init void pnpacpi_parse_irq_option(struct pnp_dev *dev,
- unsigned int option_flags,
- struct acpi_resource_irq *p)
+static void pnpacpi_parse_irq_option(struct pnp_dev *dev,
+ unsigned int option_flags,
+ struct acpi_resource_irq *p)
{
int i;
pnp_irq_mask_t map;
@@ -320,9 +320,9 @@ static __init void pnpacpi_parse_irq_option(struct pnp_dev *dev,
pnp_register_irq_resource(dev, option_flags, &map, flags);
}
-static __init void pnpacpi_parse_ext_irq_option(struct pnp_dev *dev,
- unsigned int option_flags,
- struct acpi_resource_extended_irq *p)
+static void pnpacpi_parse_ext_irq_option(struct pnp_dev *dev,
+ unsigned int option_flags,
+ struct acpi_resource_extended_irq *p)
{
int i;
pnp_irq_mask_t map;
@@ -344,9 +344,9 @@ static __init void pnpacpi_parse_ext_irq_option(struct pnp_dev *dev,
pnp_register_irq_resource(dev, option_flags, &map, flags);
}
-static __init void pnpacpi_parse_port_option(struct pnp_dev *dev,
- unsigned int option_flags,
- struct acpi_resource_io *io)
+static void pnpacpi_parse_port_option(struct pnp_dev *dev,
+ unsigned int option_flags,
+ struct acpi_resource_io *io)
{
unsigned char flags = 0;
@@ -357,16 +357,16 @@ static __init void pnpacpi_parse_port_option(struct pnp_dev *dev,
}
static __init void pnpacpi_parse_fixed_port_option(struct pnp_dev *dev,
- unsigned int option_flags,
- struct acpi_resource_fixed_io *io)
+ unsigned int option_flags,
+ struct acpi_resource_fixed_io *io)
{
pnp_register_port_resource(dev, option_flags, io->address, io->address,
0, io->address_length, IORESOURCE_IO_FIXED);
}
-static __init void pnpacpi_parse_mem24_option(struct pnp_dev *dev,
- unsigned int option_flags,
- struct acpi_resource_memory24 *p)
+static void pnpacpi_parse_mem24_option(struct pnp_dev *dev,
+ unsigned int option_flags,
+ struct acpi_resource_memory24 *p)
{
unsigned char flags = 0;
@@ -376,9 +376,9 @@ static __init void pnpacpi_parse_mem24_option(struct pnp_dev *dev,
p->alignment, p->address_length, flags);
}
-static __init void pnpacpi_parse_mem32_option(struct pnp_dev *dev,
- unsigned int option_flags,
- struct acpi_resource_memory32 *p)
+static void pnpacpi_parse_mem32_option(struct pnp_dev *dev,
+ unsigned int option_flags,
+ struct acpi_resource_memory32 *p)
{
unsigned char flags = 0;
@@ -388,9 +388,9 @@ static __init void pnpacpi_parse_mem32_option(struct pnp_dev *dev,
p->alignment, p->address_length, flags);
}
-static __init void pnpacpi_parse_fixed_mem32_option(struct pnp_dev *dev,
- unsigned int option_flags,
- struct acpi_resource_fixed_memory32 *p)
+static void pnpacpi_parse_fixed_mem32_option(struct pnp_dev *dev,
+ unsigned int option_flags,
+ struct acpi_resource_fixed_memory32 *p)
{
unsigned char flags = 0;
@@ -400,9 +400,9 @@ static __init void pnpacpi_parse_fixed_mem32_option(struct pnp_dev *dev,
0, p->address_length, flags);
}
-static __init void pnpacpi_parse_address_option(struct pnp_dev *dev,
- unsigned int option_flags,
- struct acpi_resource *r)
+static void pnpacpi_parse_address_option(struct pnp_dev *dev,
+ unsigned int option_flags,
+ struct acpi_resource *r)
{
struct acpi_resource_address64 addr, *p = &addr;
acpi_status status;
@@ -427,9 +427,9 @@ static __init void pnpacpi_parse_address_option(struct pnp_dev *dev,
IORESOURCE_IO_FIXED);
}
-static __init void pnpacpi_parse_ext_address_option(struct pnp_dev *dev,
- unsigned int option_flags,
- struct acpi_resource *r)
+static void pnpacpi_parse_ext_address_option(struct pnp_dev *dev,
+ unsigned int option_flags,
+ struct acpi_resource *r)
{
struct acpi_resource_extended_address64 *p = &r->data.ext_address64;
unsigned char flags = 0;
@@ -451,8 +451,7 @@ struct acpipnp_parse_option_s {
unsigned int option_flags;
};
-static __init acpi_status pnpacpi_option_resource(struct acpi_resource *res,
- void *data)
+static acpi_status pnpacpi_option_resource(struct acpi_resource *res, void *data)
{
int priority;
struct acpipnp_parse_option_s *parse_data = data;
@@ -547,7 +546,7 @@ static __init acpi_status pnpacpi_option_resource(struct acpi_resource *res,
return AE_OK;
}
-int __init pnpacpi_parse_resource_option_data(struct pnp_dev *dev)
+int pnpacpi_parse_resource_option_data(struct pnp_dev *dev)
{
struct acpi_device *acpi_dev = dev->data;
acpi_handle handle = acpi_dev->handle;
diff --git a/include/linux/pnp.h b/include/linux/pnp.h
index ddbe7c3ca4ce..440f8c268a29 100644
--- a/include/linux/pnp.h
+++ b/include/linux/pnp.h
@@ -347,6 +347,7 @@ static inline struct acpi_device *pnp_acpi_device(struct pnp_dev *dev)
return dev->data;
return NULL;
}
+
#else
#define pnp_acpi_device(dev) 0
#endif
@@ -514,4 +515,10 @@ static inline void pnp_unregister_driver(struct pnp_driver *drv) { }
module_driver(__pnp_driver, pnp_register_driver, \
pnp_unregister_driver)
+#ifdef CONFIG_ARCH_ACPI_DEFERRED_GSI
+void pnpacpi_init_2(struct acpi_device *adev);
+#else
+static inline void pnpacpi_init_2(struct acpi_device *adev) { }
+#endif
+
#endif /* _LINUX_PNP_H */
--
2.40.1
More information about the linux-arm-kernel
mailing list