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