mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
ACPI / bus: Make ACPI_HANDLE() work for non-GPL code again
Due to commitdb3e50f323
(device property: Get rid of struct fwnode_handle type field), ACPI_HANDLE() inadvertently became a GPL-only call. The call path that led to that was: ACPI_HANDLE() ACPI_COMPANION() to_acpi_device_node() is_acpi_device_node() acpi_device_fwnode_ops DECLARE_ACPI_FWNODE_OPS(acpi_device_fwnode_ops); ...and the new DECLARE_ACPI_FWNODE_OPS() includes EXPORT_SYMBOL_GPL, whereas previously it was a static struct. In order to avoid changing any of that, let's instead provide ever so slightly better encapsulation of those struct fwnode_operations instances. Those do not really need to be directly used in inline function calls in header files. Simply moving two small functions (is_acpi_device_node and is_acpi_data_node) out of acpi_bus.h, and into a .c file, does that. That leaves the internals of struct fwnode_operations as GPL-only (which I think was the intent all along), but un-breaks any driver code out there that relies on the ACPI subsystem's being (historically) an EXPORT_SYMBOL-usable system. By that, I mean, ACPI_HANDLE() and other basic ACPI calls were non-GPL-protected. Also, while I'm there, remove a tiny bit of redundancy that was missed in the earlier commit, by having is_acpi_node() use the other two routines, instead of checking fwnode directly. Fixes:db3e50f323
(device property: Get rid of struct fwnode_handle type field) Signed-off-by: John Hubbard <jhubbard@nvidia.com> Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com> Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
2bd6bf03f4
commit
9e987b70ad
@ -1293,3 +1293,16 @@ static int acpi_fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
|
||||
DECLARE_ACPI_FWNODE_OPS(acpi_device_fwnode_ops);
|
||||
DECLARE_ACPI_FWNODE_OPS(acpi_data_fwnode_ops);
|
||||
const struct fwnode_operations acpi_static_fwnode_ops;
|
||||
|
||||
bool is_acpi_device_node(const struct fwnode_handle *fwnode)
|
||||
{
|
||||
return !IS_ERR_OR_NULL(fwnode) &&
|
||||
fwnode->ops == &acpi_device_fwnode_ops;
|
||||
}
|
||||
EXPORT_SYMBOL(is_acpi_device_node);
|
||||
|
||||
bool is_acpi_data_node(const struct fwnode_handle *fwnode)
|
||||
{
|
||||
return !IS_ERR_OR_NULL(fwnode) && fwnode->ops == &acpi_data_fwnode_ops;
|
||||
}
|
||||
EXPORT_SYMBOL(is_acpi_data_node);
|
||||
|
@ -399,17 +399,12 @@ extern const struct fwnode_operations acpi_device_fwnode_ops;
|
||||
extern const struct fwnode_operations acpi_data_fwnode_ops;
|
||||
extern const struct fwnode_operations acpi_static_fwnode_ops;
|
||||
|
||||
bool is_acpi_device_node(const struct fwnode_handle *fwnode);
|
||||
bool is_acpi_data_node(const struct fwnode_handle *fwnode);
|
||||
|
||||
static inline bool is_acpi_node(const struct fwnode_handle *fwnode)
|
||||
{
|
||||
return !IS_ERR_OR_NULL(fwnode) &&
|
||||
(fwnode->ops == &acpi_device_fwnode_ops
|
||||
|| fwnode->ops == &acpi_data_fwnode_ops);
|
||||
}
|
||||
|
||||
static inline bool is_acpi_device_node(const struct fwnode_handle *fwnode)
|
||||
{
|
||||
return !IS_ERR_OR_NULL(fwnode) &&
|
||||
fwnode->ops == &acpi_device_fwnode_ops;
|
||||
return (is_acpi_device_node(fwnode) || is_acpi_data_node(fwnode));
|
||||
}
|
||||
|
||||
#define to_acpi_device_node(__fwnode) \
|
||||
@ -422,11 +417,6 @@ static inline bool is_acpi_device_node(const struct fwnode_handle *fwnode)
|
||||
NULL; \
|
||||
})
|
||||
|
||||
static inline bool is_acpi_data_node(const struct fwnode_handle *fwnode)
|
||||
{
|
||||
return !IS_ERR_OR_NULL(fwnode) && fwnode->ops == &acpi_data_fwnode_ops;
|
||||
}
|
||||
|
||||
#define to_acpi_data_node(__fwnode) \
|
||||
({ \
|
||||
typeof(__fwnode) __to_acpi_data_node_fwnode = __fwnode; \
|
||||
|
Loading…
Reference in New Issue
Block a user