PERFORCE change 125329 for review

Constantine A. Murenin cnst at FreeBSD.org
Sat Aug 18 19:50:47 PDT 2007


http://perforce.freebsd.org/chv.cgi?CH=125329

Change 125329 by cnst at dale on 2007/08/19 02:50:29

	convert coretemp(4) to sysctl hw.sensors framework.
	
	Values can be monitored via sysctl(3) in systat(1) sensors display, 
	sensorsd(8) etc.

Affected files ...

.. //depot/projects/soc2007/cnst-sensors/sys.dev.coretemp/coretemp.c#4 edit

Differences ...

==== //depot/projects/soc2007/cnst-sensors/sys.dev.coretemp/coretemp.c#4 (text+ko) ====

@@ -42,7 +42,7 @@
 #include <sys/module.h>
 #include <sys/conf.h>
 #include <sys/kernel.h>
-#include <sys/sysctl.h>
+#include <sys/sensors.h>
 #include <sys/proc.h>	/* for curthread */
 #include <sys/sched.h>
 
@@ -53,9 +53,10 @@
 extern int smp_cpus;
 
 struct coretemp_softc {
-	device_t	sc_dev;
-	int		sc_tjmax;
-	struct sysctl_oid *sc_oid;
+	struct ksensordev	sc_sensordev;
+	struct ksensor		sc_sensor;
+	device_t		sc_dev;
+	int			sc_tjmax;
 };
 
 /*
@@ -67,7 +68,7 @@
 static int	coretemp_detach(device_t dev);
 
 static int	coretemp_get_temp(device_t dev);
-static int	coretemp_get_temp_sysctl(SYSCTL_HANDLER_ARGS);
+static void	coretemp_refresh(void *arg);
 
 static device_method_t coretemp_methods[] = {
 	/* Device interface */
@@ -180,14 +181,17 @@
 		sc->sc_tjmax = 100;
 		
 	/*
-	 * Add the "temperature" MIB to dev.cpu.N.
+	 * Add hw.sensors.cpuN.temp0 MIB.
 	 */
-	sc->sc_oid = SYSCTL_ADD_PROC(device_get_sysctl_ctx(pdev),
-	    SYSCTL_CHILDREN(device_get_sysctl_tree(pdev)),
-	    OID_AUTO, "temperature",
-	    CTLTYPE_INT | CTLFLAG_RD,
-	    dev, 0, coretemp_get_temp_sysctl, "I",
-	    "Current temperature in degC");
+	strlcpy(sc->sc_sensordev.xname, device_get_nameunit(pdev),
+	    sizeof(sc->sc_sensordev.xname));
+	sc->sc_sensor.type = SENSOR_TEMP;
+	sensor_attach(&sc->sc_sensordev, &sc->sc_sensor);
+	if (sensor_task_register(sc, coretemp_refresh, 2)) {
+		device_printf(dev, "unable to register update task\n");
+		return (ENXIO);
+	}
+	sensordev_install(&sc->sc_sensordev);
 
 	return (0);
 }
@@ -197,7 +201,8 @@
 {
 	struct coretemp_softc *sc = device_get_softc(dev);
 
-	sysctl_remove_oid(sc->sc_oid, 1, 0);
+	sensordev_deinstall(&sc->sc_sensordev);
+	sensor_task_unregister(sc);
 
 	return (0);
 }
@@ -268,13 +273,21 @@
 	return (-1);
 }
 
-static int
-coretemp_get_temp_sysctl(SYSCTL_HANDLER_ARGS)
+static void
+coretemp_refresh(void *arg)
 {
-	device_t dev = (device_t) arg1;
+	struct coretemp_softc *sc = arg;
+	device_t dev = sc->sc_dev;
+	struct ksensor *s = &sc->sc_sensor;
 	int temp;
 
 	temp = coretemp_get_temp(dev);
 
-	return (sysctl_handle_int(oidp, &temp, 0, req));
+	if (temp == -1) {
+		s->flags |= SENSOR_FINVALID;
+		s->value = 0;
+	} else {
+		s->flags &= ~SENSOR_FINVALID;
+		s->value = temp * 1e6 + 273.15e6;
+	}
 }


More information about the p4-projects mailing list