Commit 962ce8ca authored by Zhang Rui's avatar Zhang Rui Committed by Len Brown

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: default avatarZhang Rui <rui.zhang@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent b377fd39
...@@ -205,6 +205,9 @@ static void acpi_ac_notify(acpi_handle handle, u32 event, void *data) ...@@ -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) ...@@ -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) ...@@ -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 = { ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 { ...@@ -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
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment