ACPI: don't duplicate input events on netlink
The previous events patch added a netlink event for every user of the legacy /proc/acpi/event interface. However, some users of /proc/acpi/event are really input events, and they already report their events via the input layer. Introduce a new interface, acpi_bus_generate_netlink_event(), which is explicitly called by devices that want to repoprt events via netlink. This allows the input-like events to opt-out of generating netlink events. In summary: events that are sent via netlink: ac/battery/sbs thermal processor thinkpad_acpi dock/bay events that are sent via input layer: button video hotkey thinkpad_acpi hotkey asus_acpi/asus-laptop hotkey sonypi/sonylaptop Signed-off-by: Zhang Rui <rui.zhang@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
@@ -205,6 +205,9 @@ static void acpi_ac_notify(acpi_handle handle, u32 event, void *data)
|
|||||||
case ACPI_NOTIFY_DEVICE_CHECK:
|
case ACPI_NOTIFY_DEVICE_CHECK:
|
||||||
acpi_ac_get_state(ac);
|
acpi_ac_get_state(ac);
|
||||||
acpi_bus_generate_event(device, event, (u32) ac->state);
|
acpi_bus_generate_event(device, event, (u32) ac->state);
|
||||||
|
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||||
|
device->dev.bus_id, event,
|
||||||
|
(u32) ac->state);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||||
|
@@ -869,6 +869,9 @@ static void acpi_battery_notify(acpi_handle handle, u32 event, void *data)
|
|||||||
acpi_battery_notify_update(battery);
|
acpi_battery_notify_update(battery);
|
||||||
acpi_bus_generate_event(device, event,
|
acpi_bus_generate_event(device, event,
|
||||||
acpi_battery_present(battery));
|
acpi_battery_present(battery));
|
||||||
|
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||||
|
device->dev.bus_id, event,
|
||||||
|
acpi_battery_present(battery));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||||
|
@@ -292,10 +292,6 @@ int acpi_bus_generate_event(struct acpi_device *device, u8 type, int data)
|
|||||||
if (!device)
|
if (!device)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (acpi_bus_generate_genetlink_event(device, type, data))
|
|
||||||
printk(KERN_WARNING PREFIX
|
|
||||||
"Failed to generate an ACPI event via genetlink!\n");
|
|
||||||
|
|
||||||
/* drop event on the floor if no one's listening */
|
/* drop event on the floor if no one's listening */
|
||||||
if (!event_is_open)
|
if (!event_is_open)
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -147,7 +147,8 @@ static struct genl_multicast_group acpi_event_mcgrp = {
|
|||||||
.name = ACPI_GENL_MCAST_GROUP_NAME,
|
.name = ACPI_GENL_MCAST_GROUP_NAME,
|
||||||
};
|
};
|
||||||
|
|
||||||
int acpi_bus_generate_genetlink_event(struct acpi_device *device,
|
int acpi_bus_generate_netlink_event(const char *device_class,
|
||||||
|
const char *bus_id,
|
||||||
u8 type, int data)
|
u8 type, int data)
|
||||||
{
|
{
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
@@ -191,8 +192,8 @@ int acpi_bus_generate_genetlink_event(struct acpi_device *device,
|
|||||||
|
|
||||||
memset(event, 0, sizeof(struct acpi_genl_event));
|
memset(event, 0, sizeof(struct acpi_genl_event));
|
||||||
|
|
||||||
strcpy(event->device_class, device->pnp.device_class);
|
strcpy(event->device_class, device_class);
|
||||||
strcpy(event->bus_id, device->dev.bus_id);
|
strcpy(event->bus_id, bus_id);
|
||||||
event->type = type;
|
event->type = type;
|
||||||
event->data = data;
|
event->data = data;
|
||||||
|
|
||||||
@@ -211,6 +212,8 @@ int acpi_bus_generate_genetlink_event(struct acpi_device *device,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(acpi_bus_generate_netlink_event);
|
||||||
|
|
||||||
static int acpi_event_genetlink_init(void)
|
static int acpi_event_genetlink_init(void)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
@@ -228,12 +231,14 @@ static int acpi_event_genetlink_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
int acpi_bus_generate_genetlink_event(struct acpi_device *device, u8 type,
|
int acpi_bus_generate_netlink_event(struct acpi_device *device, u8 type,
|
||||||
int data)
|
int data)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(acpi_generate_netlink_event);
|
||||||
|
|
||||||
static int acpi_event_genetlink_init(void)
|
static int acpi_event_genetlink_init(void)
|
||||||
{
|
{
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
@@ -700,14 +700,21 @@ static void acpi_processor_notify(acpi_handle handle, u32 event, void *data)
|
|||||||
acpi_processor_ppc_has_changed(pr);
|
acpi_processor_ppc_has_changed(pr);
|
||||||
acpi_bus_generate_event(device, event,
|
acpi_bus_generate_event(device, event,
|
||||||
pr->performance_platform_limit);
|
pr->performance_platform_limit);
|
||||||
|
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||||
|
device->dev.bus_id, event,
|
||||||
|
pr->performance_platform_limit);
|
||||||
break;
|
break;
|
||||||
case ACPI_PROCESSOR_NOTIFY_POWER:
|
case ACPI_PROCESSOR_NOTIFY_POWER:
|
||||||
acpi_processor_cst_has_changed(pr);
|
acpi_processor_cst_has_changed(pr);
|
||||||
acpi_bus_generate_event(device, event, 0);
|
acpi_bus_generate_event(device, event, 0);
|
||||||
|
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||||
|
device->dev.bus_id, event, 0);
|
||||||
break;
|
break;
|
||||||
case ACPI_PROCESSOR_NOTIFY_THROTTLING:
|
case ACPI_PROCESSOR_NOTIFY_THROTTLING:
|
||||||
acpi_processor_tstate_has_changed(pr);
|
acpi_processor_tstate_has_changed(pr);
|
||||||
acpi_bus_generate_event(device, event, 0);
|
acpi_bus_generate_event(device, event, 0);
|
||||||
|
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||||
|
device->dev.bus_id, event, 0);
|
||||||
default:
|
default:
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||||
"Unsupported event [0x%x]\n", event));
|
"Unsupported event [0x%x]\n", event));
|
||||||
|
@@ -445,6 +445,7 @@ static int acpi_sbs_generate_event(struct acpi_device *device,
|
|||||||
strcpy(acpi_device_bid(device), bid_saved);
|
strcpy(acpi_device_bid(device), bid_saved);
|
||||||
strcpy(acpi_device_class(device), class_saved);
|
strcpy(acpi_device_class(device), class_saved);
|
||||||
|
|
||||||
|
acpi_bus_generate_netlink_event(class, bid, event, state);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -487,6 +487,10 @@ static int acpi_thermal_critical(struct acpi_thermal *tz)
|
|||||||
KELVIN_TO_CELSIUS(tz->temperature));
|
KELVIN_TO_CELSIUS(tz->temperature));
|
||||||
acpi_bus_generate_event(tz->device, ACPI_THERMAL_NOTIFY_CRITICAL,
|
acpi_bus_generate_event(tz->device, ACPI_THERMAL_NOTIFY_CRITICAL,
|
||||||
tz->trips.critical.flags.enabled);
|
tz->trips.critical.flags.enabled);
|
||||||
|
acpi_bus_generate_netlink_event(tz->device->pnp.device_class,
|
||||||
|
tz->device->dev.bus_id,
|
||||||
|
ACPI_THERMAL_NOTIFY_CRITICAL,
|
||||||
|
tz->trips.critical.flags.enabled);
|
||||||
|
|
||||||
orderly_poweroff(true);
|
orderly_poweroff(true);
|
||||||
|
|
||||||
@@ -506,6 +510,10 @@ static int acpi_thermal_hot(struct acpi_thermal *tz)
|
|||||||
|
|
||||||
acpi_bus_generate_event(tz->device, ACPI_THERMAL_NOTIFY_HOT,
|
acpi_bus_generate_event(tz->device, ACPI_THERMAL_NOTIFY_HOT,
|
||||||
tz->trips.hot.flags.enabled);
|
tz->trips.hot.flags.enabled);
|
||||||
|
acpi_bus_generate_netlink_event(tz->device->pnp.device_class,
|
||||||
|
tz->device->dev.bus_id,
|
||||||
|
ACPI_THERMAL_NOTIFY_HOT,
|
||||||
|
tz->trips.hot.flags.enabled);
|
||||||
|
|
||||||
/* TBD: Call user-mode "sleep(S4)" function */
|
/* TBD: Call user-mode "sleep(S4)" function */
|
||||||
|
|
||||||
@@ -1150,11 +1158,15 @@ static void acpi_thermal_notify(acpi_handle handle, u32 event, void *data)
|
|||||||
acpi_thermal_get_trip_points(tz);
|
acpi_thermal_get_trip_points(tz);
|
||||||
acpi_thermal_check(tz);
|
acpi_thermal_check(tz);
|
||||||
acpi_bus_generate_event(device, event, 0);
|
acpi_bus_generate_event(device, event, 0);
|
||||||
|
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||||
|
device->dev.bus_id, event, 0);
|
||||||
break;
|
break;
|
||||||
case ACPI_THERMAL_NOTIFY_DEVICES:
|
case ACPI_THERMAL_NOTIFY_DEVICES:
|
||||||
if (tz->flags.devices)
|
if (tz->flags.devices)
|
||||||
acpi_thermal_get_devices(tz);
|
acpi_thermal_get_devices(tz);
|
||||||
acpi_bus_generate_event(device, event, 0);
|
acpi_bus_generate_event(device, event, 0);
|
||||||
|
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||||
|
device->dev.bus_id, event, 0);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||||
|
@@ -2162,22 +2162,27 @@ static void dock_notify(struct ibm_struct *ibm, u32 event)
|
|||||||
int docked = dock_docked();
|
int docked = dock_docked();
|
||||||
int pci = ibm->acpi->hid && ibm->acpi->device &&
|
int pci = ibm->acpi->hid && ibm->acpi->device &&
|
||||||
acpi_match_device_ids(ibm->acpi->device, ibm_pci_device_ids);
|
acpi_match_device_ids(ibm->acpi->device, ibm_pci_device_ids);
|
||||||
|
int data;
|
||||||
|
|
||||||
if (event == 1 && !pci) /* 570 */
|
if (event == 1 && !pci) /* 570 */
|
||||||
acpi_bus_generate_event(ibm->acpi->device, event, 1); /* button */
|
data = 1; /* button */
|
||||||
else if (event == 1 && pci) /* 570 */
|
else if (event == 1 && pci) /* 570 */
|
||||||
acpi_bus_generate_event(ibm->acpi->device, event, 3); /* dock */
|
data = 3; /* dock */
|
||||||
else if (event == 3 && docked)
|
else if (event == 3 && docked)
|
||||||
acpi_bus_generate_event(ibm->acpi->device, event, 1); /* button */
|
data = 1; /* button */
|
||||||
else if (event == 3 && !docked)
|
else if (event == 3 && !docked)
|
||||||
acpi_bus_generate_event(ibm->acpi->device, event, 2); /* undock */
|
data = 2; /* undock */
|
||||||
else if (event == 0 && docked)
|
else if (event == 0 && docked)
|
||||||
acpi_bus_generate_event(ibm->acpi->device, event, 3); /* dock */
|
data = 3; /* dock */
|
||||||
else {
|
else {
|
||||||
printk(IBM_ERR "unknown dock event %d, status %d\n",
|
printk(IBM_ERR "unknown dock event %d, status %d\n",
|
||||||
event, _sta(dock_handle));
|
event, _sta(dock_handle));
|
||||||
acpi_bus_generate_event(ibm->acpi->device, event, 0); /* unknown */
|
data = 0; /* unknown */
|
||||||
}
|
}
|
||||||
|
acpi_bus_generate_event(ibm->acpi->device, event, data);
|
||||||
|
acpi_bus_generate_netlink_event(ibm->acpi->device->pnp.device_class,
|
||||||
|
ibm->acpi->device->dev.bus_id,
|
||||||
|
event, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dock_read(char *p)
|
static int dock_read(char *p)
|
||||||
@@ -2276,6 +2281,9 @@ static int __init bay_init(struct ibm_init_struct *iibm)
|
|||||||
static void bay_notify(struct ibm_struct *ibm, u32 event)
|
static void bay_notify(struct ibm_struct *ibm, u32 event)
|
||||||
{
|
{
|
||||||
acpi_bus_generate_event(ibm->acpi->device, event, 0);
|
acpi_bus_generate_event(ibm->acpi->device, event, 0);
|
||||||
|
acpi_bus_generate_netlink_event(ibm->acpi->device->pnp.device_class,
|
||||||
|
ibm->acpi->device->dev.bus_id,
|
||||||
|
event, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define bay_occupied(b) (_sta(b##_handle) & 1)
|
#define bay_occupied(b) (_sta(b##_handle) & 1)
|
||||||
|
@@ -268,6 +268,9 @@ static void ibm_handle_events(acpi_handle handle, u32 event, void *context)
|
|||||||
if (subevent == 0x80) {
|
if (subevent == 0x80) {
|
||||||
dbg("%s: generationg bus event\n", __FUNCTION__);
|
dbg("%s: generationg bus event\n", __FUNCTION__);
|
||||||
acpi_bus_generate_event(note->device, note->event, detail);
|
acpi_bus_generate_event(note->device, note->event, detail);
|
||||||
|
acpi_bus_generate_netlink_event(note->device->pnp.device_class,
|
||||||
|
note->device->dev.bus_id,
|
||||||
|
note->event, detail);
|
||||||
} else
|
} else
|
||||||
note->event = event;
|
note->event = event;
|
||||||
}
|
}
|
||||||
|
@@ -321,8 +321,7 @@ struct acpi_bus_event {
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern struct kset acpi_subsys;
|
extern struct kset acpi_subsys;
|
||||||
extern int acpi_bus_generate_genetlink_event(struct acpi_device *device,
|
extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
|
||||||
u8 type, int data);
|
|
||||||
/*
|
/*
|
||||||
* External Functions
|
* External Functions
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user