Merge branch 'acpi-video' into acpi-driver

Merge a recent ACPI video bus driver fix to satisfy dependencies.
This commit is contained in:
Rafael J. Wysocki 2026-03-13 14:16:59 +01:00
commit 6b3f2475a0
4 changed files with 69 additions and 24 deletions

View File

@ -9,6 +9,7 @@ config ARCH_SUPPORTS_ACPI
menuconfig ACPI
bool "ACPI (Advanced Configuration and Power Interface) Support"
depends on ARCH_SUPPORTS_ACPI
select AUXILIARY_BUS
select PNP
select NLS
select CRC32

View File

@ -135,7 +135,7 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
}
}
if (adev->device_type == ACPI_BUS_TYPE_DEVICE && !adev->pnp.type.backlight) {
if (adev->device_type == ACPI_BUS_TYPE_DEVICE) {
LIST_HEAD(resource_list);
count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL);

View File

@ -9,6 +9,7 @@
#define pr_fmt(fmt) "ACPI: video: " fmt
#include <linux/auxiliary_bus.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
@ -21,7 +22,6 @@
#include <linux/sort.h>
#include <linux/pci.h>
#include <linux/pci_ids.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/dmi.h>
#include <linux/suspend.h>
@ -77,8 +77,9 @@ static int register_count;
static DEFINE_MUTEX(register_count_mutex);
static DEFINE_MUTEX(video_list_lock);
static LIST_HEAD(video_bus_head);
static int acpi_video_bus_probe(struct platform_device *pdev);
static void acpi_video_bus_remove(struct platform_device *pdev);
static int acpi_video_bus_probe(struct auxiliary_device *aux_dev,
const struct auxiliary_device_id *id);
static void acpi_video_bus_remove(struct auxiliary_device *aux);
static void acpi_video_bus_notify(acpi_handle handle, u32 event, void *data);
/*
@ -93,19 +94,16 @@ enum acpi_video_level_idx {
ACPI_VIDEO_FIRST_LEVEL, /* actual supported levels begin here */
};
static const struct acpi_device_id video_device_ids[] = {
{ACPI_VIDEO_HID, 0},
{"", 0},
static const struct auxiliary_device_id video_bus_auxiliary_id_table[] = {
{ .name = "acpi.video_bus" },
{},
};
MODULE_DEVICE_TABLE(acpi, video_device_ids);
MODULE_DEVICE_TABLE(auxiliary, video_bus_auxiliary_id_table);
static struct platform_driver acpi_video_bus = {
static struct auxiliary_driver acpi_video_bus = {
.probe = acpi_video_bus_probe,
.remove = acpi_video_bus_remove,
.driver = {
.name = "acpi-video",
.acpi_match_table = video_device_ids,
},
.id_table = video_bus_auxiliary_id_table,
};
struct acpi_video_bus_flags {
@ -1885,7 +1883,7 @@ static void acpi_video_dev_add_notify_handler(struct acpi_video_device *device)
}
static int acpi_video_bus_add_notify_handler(struct acpi_video_bus *video,
struct platform_device *pdev)
struct device *parent)
{
struct input_dev *input;
struct acpi_video_device *dev;
@ -1908,7 +1906,7 @@ static int acpi_video_bus_add_notify_handler(struct acpi_video_bus *video,
input->phys = video->phys;
input->id.bustype = BUS_HOST;
input->id.product = 0x06;
input->dev.parent = &pdev->dev;
input->dev.parent = parent;
input->evbit[0] = BIT(EV_KEY);
set_bit(KEY_SWITCHVIDEOMODE, input->keybit);
set_bit(KEY_VIDEO_NEXT, input->keybit);
@ -1980,9 +1978,10 @@ static int acpi_video_bus_put_devices(struct acpi_video_bus *video)
static int instance;
static int acpi_video_bus_probe(struct platform_device *pdev)
static int acpi_video_bus_probe(struct auxiliary_device *aux_dev,
const struct auxiliary_device_id *id_unused)
{
struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
struct acpi_device *device = ACPI_COMPANION(&aux_dev->dev);
struct acpi_video_bus *video;
bool auto_detect;
int error;
@ -2019,7 +2018,7 @@ static int acpi_video_bus_probe(struct platform_device *pdev)
instance++;
}
platform_set_drvdata(pdev, video);
auxiliary_set_drvdata(aux_dev, video);
video->device = device;
strscpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME);
@ -2068,7 +2067,7 @@ static int acpi_video_bus_probe(struct platform_device *pdev)
!auto_detect)
acpi_video_bus_register_backlight(video);
error = acpi_video_bus_add_notify_handler(video, pdev);
error = acpi_video_bus_add_notify_handler(video, &aux_dev->dev);
if (error)
goto err_del;
@ -2096,10 +2095,10 @@ static int acpi_video_bus_probe(struct platform_device *pdev)
return error;
}
static void acpi_video_bus_remove(struct platform_device *pdev)
static void acpi_video_bus_remove(struct auxiliary_device *aux_dev)
{
struct acpi_video_bus *video = platform_get_drvdata(pdev);
struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
struct acpi_video_bus *video = auxiliary_get_drvdata(aux_dev);
struct acpi_device *device = ACPI_COMPANION(&aux_dev->dev);
acpi_dev_remove_notify_handler(device, ACPI_DEVICE_NOTIFY,
acpi_video_bus_notify);
@ -2163,7 +2162,7 @@ int acpi_video_register(void)
dmi_check_system(video_dmi_table);
ret = platform_driver_register(&acpi_video_bus);
ret = auxiliary_driver_register(&acpi_video_bus);
if (ret)
goto leave;
@ -2183,7 +2182,7 @@ void acpi_video_unregister(void)
{
mutex_lock(&register_count_mutex);
if (register_count) {
platform_driver_unregister(&acpi_video_bus);
auxiliary_driver_unregister(&acpi_video_bus);
register_count = 0;
may_report_brightness_keys = false;
}

View File

@ -6,6 +6,7 @@
#define pr_fmt(fmt) "ACPI: " fmt
#include <linux/async.h>
#include <linux/auxiliary_bus.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
@ -2192,6 +2193,44 @@ static acpi_status acpi_bus_check_add_2(acpi_handle handle, u32 lvl_not_used,
return acpi_bus_check_add(handle, false, (struct acpi_device **)ret_p);
}
static void acpi_video_bus_device_release(struct device *dev)
{
struct auxiliary_device *aux_dev = to_auxiliary_dev(dev);
kfree(aux_dev);
}
static void acpi_create_video_bus_device(struct acpi_device *adev,
struct acpi_device *parent)
{
struct auxiliary_device *aux_dev;
static unsigned int aux_dev_id;
aux_dev = kzalloc_obj(*aux_dev);
if (!aux_dev)
return;
aux_dev->id = aux_dev_id++;
aux_dev->name = "video_bus";
aux_dev->dev.parent = acpi_get_first_physical_node(parent);
if (!aux_dev->dev.parent)
goto err;
aux_dev->dev.release = acpi_video_bus_device_release;
if (auxiliary_device_init(aux_dev))
goto err;
ACPI_COMPANION_SET(&aux_dev->dev, adev);
if (__auxiliary_device_add(aux_dev, "acpi"))
auxiliary_device_uninit(aux_dev);
return;
err:
kfree(aux_dev);
}
struct acpi_scan_system_dev {
struct list_head node;
struct acpi_device *adev;
@ -2229,6 +2268,12 @@ static void acpi_default_enumeration(struct acpi_device *device)
sd->adev = device;
list_add_tail(&sd->node, &acpi_scan_system_dev_list);
}
} else if (device->pnp.type.backlight) {
struct acpi_device *parent;
parent = acpi_dev_parent(device);
if (parent)
acpi_create_video_bus_device(device, parent);
} else {
/* For a regular device object, create a platform device. */
acpi_create_platform_device(device, NULL);