As a replacement of /prco/acpi/event, all ACPI events are exported to user
space either via netlink or via input layer.
Events that go into input layer should not be sent to netlink at the same time.

This patch introduces a new interface acpi_bus_generate_netlink_event which is
called by devices that want to export events via netlink rather than input 
layer.

events that are sent via netlink:
        ac/battery/sbs events
        thermal events
        processor events
        thinkpad_acpi dock/bay events

events that are sent via input layer:
        video hotkey events
        thinkpad_acpi hotkey events
        button events
        asus_acpi/asus-laptop hotkey events
        sonypi/sonylaptop events

Signed-off-by: Zhang Rui <[EMAIL PROTECTED]>
---
 drivers/acpi/ac.c                 |    3 +++
 drivers/acpi/battery.c            |    3 +++
 drivers/acpi/bus.c                |    4 ----
 drivers/acpi/event.c              |   13 +++++++++----
 drivers/acpi/processor_core.c     |    7 +++++++
 drivers/acpi/sbs.c                |    1 +
 drivers/acpi/thermal.c            |   12 ++++++++++++
 drivers/misc/thinkpad_acpi.c      |   20 ++++++++++++++------
 drivers/pci/hotplug/acpiphp_ibm.c |    3 +++
 include/acpi/acpi_bus.h           |    3 +--
 10 files changed, 53 insertions(+), 16 deletions(-)

Index: linux-2.6.23-rc3/drivers/acpi/bus.c
===================================================================
--- linux-2.6.23-rc3.orig/drivers/acpi/bus.c
+++ linux-2.6.23-rc3/drivers/acpi/bus.c
@@ -292,10 +292,6 @@ int acpi_bus_generate_event(struct acpi_
        if (!device)
                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 */
        if (!event_is_open)
                return 0;
Index: linux-2.6.23-rc3/drivers/acpi/event.c
===================================================================
--- linux-2.6.23-rc3.orig/drivers/acpi/event.c
+++ linux-2.6.23-rc3/drivers/acpi/event.c
@@ -147,7 +147,8 @@ static struct genl_multicast_group acpi_
        .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)
 {
        struct sk_buff *skb;
@@ -191,8 +192,8 @@ int acpi_bus_generate_genetlink_event(st
 
        memset(event, 0, sizeof(struct acpi_genl_event));
 
-       strcpy(event->device_class, device->pnp.device_class);
-       strcpy(event->bus_id, device->dev.bus_id);
+       strcpy(event->device_class, device_class);
+       strcpy(event->bus_id, bus_id);
        event->type = type;
        event->data = data;
 
@@ -211,6 +212,8 @@ int acpi_bus_generate_genetlink_event(st
        return 0;
 }
 
+EXPORT_SYMBOL(acpi_bus_generate_netlink_event);
+
 static int acpi_event_genetlink_init(void)
 {
        int result;
@@ -228,12 +231,14 @@ static int acpi_event_genetlink_init(voi
 }
 
 #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)
 {
        return 0;
 }
 
+EXPORT_SYMBOL(acpi_generate_netlink_event);
+
 static int acpi_event_genetlink_init(void)
 {
        return -ENODEV;
Index: linux-2.6.23-rc3/drivers/acpi/ac.c
===================================================================
--- linux-2.6.23-rc3.orig/drivers/acpi/ac.c
+++ linux-2.6.23-rc3/drivers/acpi/ac.c
@@ -205,6 +205,9 @@ static void acpi_ac_notify(acpi_handle h
        case ACPI_NOTIFY_DEVICE_CHECK:
                acpi_ac_get_state(ac);
                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;
        default:
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
Index: linux-2.6.23-rc3/include/acpi/acpi_bus.h
===================================================================
--- linux-2.6.23-rc3.orig/include/acpi/acpi_bus.h
+++ linux-2.6.23-rc3/include/acpi/acpi_bus.h
@@ -321,8 +321,7 @@ struct acpi_bus_event {
 };
 
 extern struct kset acpi_subsys;
-extern int acpi_bus_generate_genetlink_event(struct acpi_device *device,
-                                               u8 type, int data);
+extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
 /*
  * External Functions
  */
Index: linux-2.6.23-rc3/drivers/acpi/battery.c
===================================================================
--- linux-2.6.23-rc3.orig/drivers/acpi/battery.c
+++ linux-2.6.23-rc3/drivers/acpi/battery.c
@@ -869,6 +869,9 @@ static void acpi_battery_notify(acpi_han
                acpi_battery_notify_update(battery);
                acpi_bus_generate_event(device, event,
                                        acpi_battery_present(battery));
+               acpi_bus_generate_netlink_event(device->pnp.device_class,
+                                                 device->dev.bus_id, event,
+                                                 
acpi_battery_present(battery));
                break;
        default:
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
Index: linux-2.6.23-rc3/drivers/acpi/processor_core.c
===================================================================
--- linux-2.6.23-rc3.orig/drivers/acpi/processor_core.c
+++ linux-2.6.23-rc3/drivers/acpi/processor_core.c
@@ -700,14 +700,21 @@ static void acpi_processor_notify(acpi_h
                acpi_processor_ppc_has_changed(pr);
                acpi_bus_generate_event(device, event,
                                        pr->performance_platform_limit);
+               acpi_bus_generate_netlink_event(device->pnp.device_class,
+                                                 device->dev.bus_id, event,
+                                                 
pr->performance_platform_limit);
                break;
        case ACPI_PROCESSOR_NOTIFY_POWER:
                acpi_processor_cst_has_changed(pr);
                acpi_bus_generate_event(device, event, 0);
+               acpi_bus_generate_netlink_event(device->pnp.device_class,
+                                                 device->dev.bus_id, event, 0);
                break;
        case ACPI_PROCESSOR_NOTIFY_THROTTLING:
                acpi_processor_tstate_has_changed(pr);
                acpi_bus_generate_event(device, event, 0);
+               acpi_bus_generate_netlink_event(device->pnp.device_class,
+                                                 device->dev.bus_id, event, 0);
        default:
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                                  "Unsupported event [0x%x]\n", event));
Index: linux-2.6.23-rc3/drivers/acpi/thermal.c
===================================================================
--- linux-2.6.23-rc3.orig/drivers/acpi/thermal.c
+++ linux-2.6.23-rc3/drivers/acpi/thermal.c
@@ -487,6 +487,10 @@ static int acpi_thermal_critical(struct 
               KELVIN_TO_CELSIUS(tz->temperature));
        acpi_bus_generate_event(tz->device, ACPI_THERMAL_NOTIFY_CRITICAL,
                                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);
 
@@ -506,6 +510,10 @@ static int acpi_thermal_hot(struct acpi_
 
        acpi_bus_generate_event(tz->device, ACPI_THERMAL_NOTIFY_HOT,
                                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 */
 
@@ -1150,11 +1158,15 @@ static void acpi_thermal_notify(acpi_han
                acpi_thermal_get_trip_points(tz);
                acpi_thermal_check(tz);
                acpi_bus_generate_event(device, event, 0);
+               acpi_bus_generate_netlink_event(device->pnp.device_class,
+                                                 device->dev.bus_id, event, 0);
                break;
        case ACPI_THERMAL_NOTIFY_DEVICES:
                if (tz->flags.devices)
                        acpi_thermal_get_devices(tz);
                acpi_bus_generate_event(device, event, 0);
+               acpi_bus_generate_netlink_event(device->pnp.device_class,
+                                                 device->dev.bus_id, event, 0);
                break;
        default:
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
Index: linux-2.6.23-rc3/drivers/misc/thinkpad_acpi.c
===================================================================
--- linux-2.6.23-rc3.orig/drivers/misc/thinkpad_acpi.c
+++ linux-2.6.23-rc3/drivers/misc/thinkpad_acpi.c
@@ -2162,22 +2162,27 @@ static void dock_notify(struct ibm_struc
        int docked = dock_docked();
        int pci = ibm->acpi->hid && ibm->acpi->device &&
                acpi_match_device_ids(ibm->acpi->device, ibm_pci_device_ids);
+       int data;
 
        if (event == 1 && !pci) /* 570 */
-               acpi_bus_generate_event(ibm->acpi->device, event, 1);   /* 
button */
+               data = 1;       /* button */
        else if (event == 1 && pci)     /* 570 */
-               acpi_bus_generate_event(ibm->acpi->device, event, 3);   /* dock 
*/
+               data = 3;       /* dock */
        else if (event == 3 && docked)
-               acpi_bus_generate_event(ibm->acpi->device, event, 1);   /* 
button */
+               data = 1;       /* button */
        else if (event == 3 && !docked)
-               acpi_bus_generate_event(ibm->acpi->device, event, 2);   /* 
undock */
+               data = 2;       /* undock */
        else if (event == 0 && docked)
-               acpi_bus_generate_event(ibm->acpi->device, event, 3);   /* dock 
*/
+               data = 3;       /* dock */
        else {
                printk(IBM_ERR "unknown dock event %d, status %d\n",
                       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)
@@ -2276,6 +2281,9 @@ static int __init bay_init(struct ibm_in
 static void bay_notify(struct ibm_struct *ibm, u32 event)
 {
        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)
Index: linux-2.6.23-rc3/drivers/pci/hotplug/acpiphp_ibm.c
===================================================================
--- linux-2.6.23-rc3.orig/drivers/pci/hotplug/acpiphp_ibm.c
+++ linux-2.6.23-rc3/drivers/pci/hotplug/acpiphp_ibm.c
@@ -268,6 +268,9 @@ static void ibm_handle_events(acpi_handl
        if (subevent == 0x80) {
                dbg("%s: generationg bus event\n", __FUNCTION__);
                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
                note->event = event;
 }
Index: linux-2.6.23-rc3/drivers/acpi/sbs.c
===================================================================
--- linux-2.6.23-rc3.orig/drivers/acpi/sbs.c
+++ linux-2.6.23-rc3/drivers/acpi/sbs.c
@@ -445,6 +445,7 @@ static int acpi_sbs_generate_event(struc
        strcpy(acpi_device_bid(device), bid_saved);
        strcpy(acpi_device_class(device), class_saved);
 
+       acpi_bus_generate_netlink_event(class, bid, event, state);
        return result;
 }
 
-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to