1*4035Sphitran /*************************************************************************** 2*4035Sphitran * 3*4035Sphitran * devinfo_acpi : acpi devices 4*4035Sphitran * 5*4035Sphitran * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 6*4035Sphitran * Use is subject to license terms. 7*4035Sphitran * 8*4035Sphitran * Licensed under the Academic Free License version 2.1 9*4035Sphitran * 10*4035Sphitran **************************************************************************/ 11*4035Sphitran 12*4035Sphitran #pragma ident "%Z%%M% %I% %E% SMI" 13*4035Sphitran 14*4035Sphitran #ifdef HAVE_CONFIG_H 15*4035Sphitran #include <config.h> 16*4035Sphitran #endif 17*4035Sphitran 18*4035Sphitran #include <stdio.h> 19*4035Sphitran #include <string.h> 20*4035Sphitran #include <sys/utsname.h> 21*4035Sphitran #include <libdevinfo.h> 22*4035Sphitran #include <sys/mkdev.h> 23*4035Sphitran #include <sys/stat.h> 24*4035Sphitran #include <unistd.h> 25*4035Sphitran 26*4035Sphitran #include "../osspec.h" 27*4035Sphitran #include "../logger.h" 28*4035Sphitran #include "../hald.h" 29*4035Sphitran #include "../hald_dbus.h" 30*4035Sphitran #include "../device_info.h" 31*4035Sphitran #include "../util.h" 32*4035Sphitran #include "../hald_runner.h" 33*4035Sphitran #include "devinfo_acpi.h" 34*4035Sphitran 35*4035Sphitran #define DEVINFO_PROBE_BATTERY_TIMEOUT 30000 36*4035Sphitran 37*4035Sphitran static HalDevice *devinfo_acpi_add(HalDevice *, di_node_t, char *, char *); 38*4035Sphitran static HalDevice *devinfo_battery_add(HalDevice *, di_node_t, char *, char *); 39*4035Sphitran 40*4035Sphitran DevinfoDevHandler devinfo_acpi_handler = { 41*4035Sphitran devinfo_acpi_add, 42*4035Sphitran NULL, 43*4035Sphitran NULL, 44*4035Sphitran NULL, 45*4035Sphitran NULL, 46*4035Sphitran NULL 47*4035Sphitran }; 48*4035Sphitran 49*4035Sphitran DevinfoDevHandler devinfo_battery_handler = { 50*4035Sphitran devinfo_battery_add, 51*4035Sphitran NULL, 52*4035Sphitran NULL, 53*4035Sphitran NULL, 54*4035Sphitran NULL, 55*4035Sphitran devinfo_battery_get_prober 56*4035Sphitran }; 57*4035Sphitran 58*4035Sphitran static HalDevice * 59*4035Sphitran devinfo_acpi_add(HalDevice *parent, di_node_t node, char *devfs_path, 60*4035Sphitran char *device_type) 61*4035Sphitran { 62*4035Sphitran HalDevice *d, *computer; 63*4035Sphitran 64*4035Sphitran if (strcmp(devfs_path, "/acpi") != 0) { 65*4035Sphitran return (NULL); 66*4035Sphitran } 67*4035Sphitran 68*4035Sphitran d = hal_device_new(); 69*4035Sphitran 70*4035Sphitran if ((computer = hal_device_store_find(hald_get_gdl(), 71*4035Sphitran "/org/freedesktop/Hal/devices/computer")) || 72*4035Sphitran (computer = hal_device_store_find(hald_get_tdl(), 73*4035Sphitran "/org/freedesktop/Hal/devices/computer"))) { 74*4035Sphitran hal_device_property_set_string(computer, 75*4035Sphitran "power_management.type", "acpi"); 76*4035Sphitran } 77*4035Sphitran devinfo_set_default_properties(d, parent, node, devfs_path); 78*4035Sphitran devinfo_add_enqueue(d, devfs_path, &devinfo_acpi_handler); 79*4035Sphitran 80*4035Sphitran return (d); 81*4035Sphitran } 82*4035Sphitran 83*4035Sphitran static HalDevice * 84*4035Sphitran devinfo_battery_add(HalDevice *parent, di_node_t node, char *devfs_path, 85*4035Sphitran char *device_type) 86*4035Sphitran { 87*4035Sphitran HalDevice *d, *computer; 88*4035Sphitran char *driver_name; 89*4035Sphitran di_devlink_handle_t devlink_hdl; 90*4035Sphitran int major; 91*4035Sphitran di_minor_t minor; 92*4035Sphitran dev_t dev; 93*4035Sphitran char *minor_path = NULL; 94*4035Sphitran char *devpath; 95*4035Sphitran 96*4035Sphitran driver_name = di_driver_name(node); 97*4035Sphitran if ((driver_name == NULL) || (strcmp(driver_name, "battery") != 0)) { 98*4035Sphitran return (NULL); 99*4035Sphitran } 100*4035Sphitran 101*4035Sphitran d = hal_device_new(); 102*4035Sphitran 103*4035Sphitran if ((computer = hal_device_store_find(hald_get_gdl(), 104*4035Sphitran "/org/freedesktop/Hal/devices/computer")) || 105*4035Sphitran (computer = hal_device_store_find(hald_get_tdl(), 106*4035Sphitran "/org/freedesktop/Hal/devices/computer"))) { 107*4035Sphitran hal_device_property_set_string(computer, 108*4035Sphitran "system.formfactor", "laptop"); 109*4035Sphitran } 110*4035Sphitran devinfo_set_default_properties(d, parent, node, devfs_path); 111*4035Sphitran devinfo_add_enqueue(d, devfs_path, &devinfo_battery_handler); 112*4035Sphitran 113*4035Sphitran major = di_driver_major(node); 114*4035Sphitran if ((devlink_hdl = di_devlink_init(NULL, 0)) == NULL) { 115*4035Sphitran return (d); 116*4035Sphitran } 117*4035Sphitran minor = DI_MINOR_NIL; 118*4035Sphitran while ((minor = di_minor_next(node, minor)) != DI_MINOR_NIL) { 119*4035Sphitran dev = di_minor_devt(minor); 120*4035Sphitran if ((major != major(dev)) || 121*4035Sphitran (di_minor_type(minor) != DDM_MINOR) || 122*4035Sphitran (di_minor_spectype(minor) != S_IFCHR) || 123*4035Sphitran ((minor_path = di_devfs_minor_path(minor)) == NULL)) { 124*4035Sphitran continue; 125*4035Sphitran } 126*4035Sphitran 127*4035Sphitran if (hal_device_store_match_key_value_string(hald_get_gdl(), 128*4035Sphitran "solaris.devfs_path", minor_path) == NULL) { 129*4035Sphitran devinfo_battery_add_minor(d, node, minor_path, dev); 130*4035Sphitran } 131*4035Sphitran 132*4035Sphitran di_devfs_path_free(minor_path); 133*4035Sphitran } 134*4035Sphitran di_devlink_fini(&devlink_hdl); 135*4035Sphitran 136*4035Sphitran return (d); 137*4035Sphitran } 138*4035Sphitran 139*4035Sphitran void 140*4035Sphitran devinfo_battery_add_minor(HalDevice *parent, di_node_t node, char *minor_path, 141*4035Sphitran dev_t dev) 142*4035Sphitran { 143*4035Sphitran HalDevice *d; 144*4035Sphitran 145*4035Sphitran d = hal_device_new(); 146*4035Sphitran devinfo_set_default_properties(d, parent, node, minor_path); 147*4035Sphitran devinfo_add_enqueue(d, minor_path, &devinfo_battery_handler); 148*4035Sphitran } 149*4035Sphitran 150*4035Sphitran void 151*4035Sphitran devinfo_battery_device_rescan(char *parent_devfs_path, gchar *udi) 152*4035Sphitran { 153*4035Sphitran HalDevice *d = NULL; 154*4035Sphitran 155*4035Sphitran d = hal_device_store_find(hald_get_gdl(), udi); 156*4035Sphitran if (d == NULL) { 157*4035Sphitran HAL_INFO(("device not found %s", udi)); 158*4035Sphitran return; 159*4035Sphitran } 160*4035Sphitran 161*4035Sphitran hald_runner_run(d, "hald-probe-battery", NULL, 162*4035Sphitran DEVINFO_PROBE_BATTERY_TIMEOUT, devinfo_battery_rescan_probing_done, 163*4035Sphitran NULL, NULL); 164*4035Sphitran } 165*4035Sphitran 166*4035Sphitran static void 167*4035Sphitran devinfo_battery_rescan_probing_done(HalDevice *d, guint32 exit_type, 168*4035Sphitran gint return_code, char **error, gpointer userdata1, gpointer userdata2) 169*4035Sphitran { 170*4035Sphitran /* hald_runner_run() requires this function since cannot pass NULL */ 171*4035Sphitran } 172*4035Sphitran 173*4035Sphitran const gchar * 174*4035Sphitran devinfo_battery_get_prober(HalDevice *d, int *timeout) 175*4035Sphitran { 176*4035Sphitran *timeout = DEVINFO_PROBE_BATTERY_TIMEOUT; /* 30 second timeout */ 177*4035Sphitran return ("hald-probe-battery"); 178*4035Sphitran } 179