Thu Jun 13 07:30:45 2013 UTC ()
Pull up following revision(s) (requested by jdp in ticket #893):
	sys/arch/sparc64/dev/tda.c			1.7-1.8
	share/man/man4/man4.sparc64/tda.4		1.1-1.3
	share/man/man4/man4.sparc64/Makefile		1.7
	distrib/sets/lists/man/mi			1.1419
Add sysmon support to display the CPU and Sytem fan speeds for the
tda driver.  Add a manual page for tda(4).  Fix a bug which caused
the system fan to always run at full speed.


(msaitoh)
diff -r1.1379.2.9 -r1.1379.2.10 src/distrib/sets/lists/man/mi
diff -r1.6 -r1.6.6.1 src/share/man/man4/man4.sparc64/Makefile
diff -r0 -r1.3.4.2 src/share/man/man4/man4.sparc64/tda.4
diff -r1.4 -r1.4.10.1 src/sys/arch/sparc64/dev/tda.c

cvs diff -r1.1379.2.9 -r1.1379.2.10 src/distrib/sets/lists/man/mi (expand / switch to context diff)
--- src/distrib/sets/lists/man/mi 2012/12/15 05:40:18 1.1379.2.9
+++ src/distrib/sets/lists/man/mi 2013/06/13 07:30:45 1.1379.2.10
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1379.2.9 2012/12/15 05:40:18 riz Exp $
+# $NetBSD: mi,v 1.1379.2.10 2013/06/13 07:30:45 msaitoh Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -1587,6 +1587,7 @@
 ./usr/share/man/cat4/sparc64/lom.0		man-sys-catman		.cat
 ./usr/share/man/cat4/sparc64/sab.0		man-sys-catman		.cat
 ./usr/share/man/cat4/sparc64/sabtty.0		man-sys-catman		.cat
+./usr/share/man/cat4/sparc64/tda.0		man-sys-catman		.cat
 ./usr/share/man/cat4/spc.0			man-sys-catman		.cat
 ./usr/share/man/cat4/spdmem.0			man-sys-catman		.cat
 ./usr/share/man/cat4/speaker.0			man-sys-catman		.cat
@@ -4393,6 +4394,7 @@
 ./usr/share/man/html4/sparc64/lom.html		man-sys-htmlman		html
 ./usr/share/man/html4/sparc64/sab.html		man-sys-htmlman		html
 ./usr/share/man/html4/sparc64/sabtty.html	man-sys-htmlman		html
+./usr/share/man/html4/sparc64/tda.html		man-sys-htmlman		html
 ./usr/share/man/html4/spc.html			man-sys-htmlman		html
 ./usr/share/man/html4/spdmem.html		man-sys-htmlman		html
 ./usr/share/man/html4/speaker.html		man-sys-htmlman		html
@@ -7112,6 +7114,7 @@
 ./usr/share/man/man4/sparc64/lom.4		man-sys-man		.man
 ./usr/share/man/man4/sparc64/sab.4		man-sys-man		.man
 ./usr/share/man/man4/sparc64/sabtty.4		man-sys-man		.man
+./usr/share/man/man4/sparc64/tda.4		man-sys-man		.man
 ./usr/share/man/man4/spc.4			man-sys-man		.man
 ./usr/share/man/man4/spdmem.4			man-sys-man		.man
 ./usr/share/man/man4/speaker.4			man-sys-man		.man

cvs diff -r1.6 -r1.6.6.1 src/share/man/man4/man4.sparc64/Makefile (expand / switch to context diff)
--- src/share/man/man4/man4.sparc64/Makefile 2011/04/09 19:37:13 1.6
+++ src/share/man/man4/man4.sparc64/Makefile 2013/06/13 07:30:45 1.6.6.1
@@ -1,8 +1,8 @@
-# $NetBSD: Makefile,v 1.6 2011/04/09 19:37:13 jdc Exp $
+# $NetBSD: Makefile,v 1.6.6.1 2013/06/13 07:30:45 msaitoh Exp $
 
 MANSUBDIR=/sparc64
 
-MAN=	envctrl.4 ffb.4 fdc.4 intro.4 lom.4 sab.4
+MAN=	envctrl.4 ffb.4 fdc.4 intro.4 lom.4 sab.4 tda.4
 
 MLINKS+=	sab.4 sabtty.4
 

File Added: src/share/man/man4/man4.sparc64/tda.4
.\"	$NetBSD: tda.4,v 1.3.4.2 2013/06/13 07:30:45 msaitoh Exp $
.\"
.\" Copyright (c) 2013 The NetBSD Foundation, Inc.
.\" All rights reserved.
.\"
.\" This code is derived from software contributed to The NetBSD Foundation
.\" by Julian Coleman
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd February 2, 2013
.Dt TDA 4 sparc64
.Os
.Sh NAME
.Nm tda
.Nd TDA8444 fan speed controller
.Sh SYNOPSIS
.Cd "tda0 at iic1 addr 0x24: fan-control"
.Sh DESCRIPTION
The
.Nm
driver provides support for the TDA8444 DAC used to control the fan speeds
in Sun Blade 1000 and Blade 2000 systems.
The speed of the CPU fan and of the system fan are automatically adjusted
every 60 seconds, based on the currently reported CPU and system
temperatures, respectively.
.Pp
The speed-related values are made available through the
.Xr envstat 8
interface.
The range of the values are:
.Bl -column -offset indent ".Sy System temperature" ".Sy Minimum" ".Sy Maximum"
.It Sy Ta Sy Minimum Ta Sy Maximum
.It Li CPU temperature Ta <=57 Ta >=67
.It Li System temperature Ta <=20 Ta >=30
.It Li Speed value Ta 12 Ta 63
.El
.Sh SEE ALSO
.Xr admtemp 4 ,
.Xr envstat 8
.Sh BUGS
The temperatures are reported as
.Sq internal
and
.Sq external
instead of
.Sq system
and
.Sq CPU ,
respectively.

cvs diff -r1.4 -r1.4.10.1 src/sys/arch/sparc64/dev/tda.c (expand / switch to context diff)
--- src/sys/arch/sparc64/dev/tda.c 2011/04/03 06:25:11 1.4
+++ src/sys/arch/sparc64/dev/tda.c 2013/06/13 07:30:45 1.4.10.1
@@ -1,4 +1,4 @@
-/*	$NetBSD: tda.c,v 1.4 2011/04/03 06:25:11 jdc Exp $	*/
+/*	$NetBSD: tda.c,v 1.4.10.1 2013/06/13 07:30:45 msaitoh Exp $	*/
 /*	$OpenBSD: tda.c,v 1.4 2008/02/27 17:25:00 robert Exp $ */
 
 /*
@@ -41,10 +41,14 @@
 #define TDA_PSFAN_ON            0x1f
 #define TDA_PSFAN_OFF           0x00
 
-/* Internal and External temperature senor numbers */
+/* Internal and External temperature sensor numbers */
 #define SENSOR_TEMP_EXT		0
 #define SENSOR_TEMP_INT		1
 
+/* Fan sensor numbers */
+#define SENSOR_FAN_CPU		0
+#define SENSOR_FAN_SYS		1
+
 #define CPU_TEMP_MAX		(67 * 1000000 + 273150000)
 #define CPU_TEMP_MIN		(57 * 1000000 + 273150000)
 #define SYS_TEMP_MAX		(30 * 1000000 + 273150000)
@@ -58,19 +62,25 @@
 	u_int16_t		sc_cfan_speed;	/* current CPU fan speed */
 	u_int16_t		sc_sfan_speed;	/* current SYS fan speed */
 
+	struct sysmon_envsys	*sc_sme;
+	envsys_data_t		sc_sensor[2];
+
 	callout_t		sc_timer;
 };
 
 int	tda_match(struct device *, struct cfdata *, void *);
 void	tda_attach(struct device *, struct device *, void *);
+static int	tda_detach(struct device *, int);
+void	tda_refresh(struct sysmon_envsys *, envsys_data_t *);
 
 void	tda_setspeed(struct tda_softc *);
 static void	tda_adjust(void *);
 static void	tda_timeout(void *);
 
 
-CFATTACH_DECL_NEW(tda, sizeof(struct tda_softc),
-	tda_match, tda_attach, NULL, NULL);
+CFATTACH_DECL3_NEW(tda, sizeof(struct tda_softc),
+	tda_match, tda_attach, tda_detach, NULL, NULL, NULL,
+	DVF_DETACH_SHUTDOWN);
 
 int
 tda_match(struct device *parent, struct cfdata *match, void *aux)
@@ -112,11 +122,63 @@
 	 */
 	sc->sc_cfan_speed = sc->sc_sfan_speed = (TDA_FANSPEED_MAX+TDA_FANSPEED_MIN)/2;
 	tda_setspeed(sc);
-
+	
 	callout_init(&sc->sc_timer, CALLOUT_MPSAFE);
 	callout_reset(&sc->sc_timer, hz*20, tda_timeout, sc);
+
+	/* Initialise sensor data */
+	sc->sc_sensor[SENSOR_FAN_CPU].state = ENVSYS_SINVALID;
+	sc->sc_sensor[SENSOR_FAN_CPU].units = ENVSYS_INTEGER;
+	sc->sc_sensor[SENSOR_FAN_CPU].flags = ENVSYS_FMONNOTSUPP;
+	strlcpy(sc->sc_sensor[SENSOR_FAN_CPU].desc,
+	    "fan.cpu",sizeof("fan.cpu"));
+	sc->sc_sensor[SENSOR_FAN_SYS].state = ENVSYS_SINVALID;
+	sc->sc_sensor[SENSOR_FAN_SYS].units = ENVSYS_INTEGER;
+	sc->sc_sensor[SENSOR_FAN_SYS].flags = ENVSYS_FMONNOTSUPP;
+	strlcpy(sc->sc_sensor[SENSOR_FAN_SYS].desc,
+	    "fan.sys",sizeof("fan.sys"));
+	sc->sc_sme = sysmon_envsys_create();
+	if (sysmon_envsys_sensor_attach(
+	    sc->sc_sme, &sc->sc_sensor[SENSOR_FAN_CPU])) {
+		sysmon_envsys_destroy(sc->sc_sme);
+		aprint_error_dev(self,
+		    "unable to attach cpu fan at sysmon\n");
+		return;
+	}
+	if (sysmon_envsys_sensor_attach(
+	    sc->sc_sme, &sc->sc_sensor[SENSOR_FAN_SYS])) {
+		sysmon_envsys_destroy(sc->sc_sme);
+		aprint_error_dev(self,
+		    "unable to attach sys fan at sysmon\n");
+		return;
+	}
+        sc->sc_sme->sme_name = device_xname(self);
+        sc->sc_sme->sme_cookie = sc;
+        sc->sc_sme->sme_refresh = tda_refresh;
+	if (sysmon_envsys_register(sc->sc_sme)) {
+		aprint_error_dev(self,
+		    "unable to register with sysmon\n");
+		sysmon_envsys_destroy(sc->sc_sme);
+		return;
+	}
 }
 
+int
+tda_detach(struct device *self, int flags)
+{
+	struct tda_softc *sc = device_private(self);
+
+	if (sc->sc_sme != NULL)
+		sysmon_envsys_destroy(sc->sc_sme);
+
+	callout_halt(&sc->sc_timer, NULL);
+	callout_destroy(&sc->sc_timer);
+
+	sc->sc_cfan_speed = sc->sc_sfan_speed = TDA_FANSPEED_MAX;
+	tda_setspeed(sc);
+	return 0;
+}
+
 static void
 tda_timeout(void *v)
 {
@@ -218,7 +280,7 @@
 	if (stemp < SYS_TEMP_MIN)
 		sspeed = TDA_FANSPEED_MIN;
 	else if (stemp < SYS_TEMP_MAX)
-		sc->sc_sfan_speed = TDA_FANSPEED_MIN +
+		sspeed = TDA_FANSPEED_MIN +
 			(stemp - SYS_TEMP_MIN) * 
 			(TDA_FANSPEED_MAX - TDA_FANSPEED_MIN) / 
 			(SYS_TEMP_MAX - SYS_TEMP_MIN);
@@ -230,3 +292,22 @@
 	sc->sc_cfan_speed = cspeed;
 	tda_setspeed(sc);
 }
+
+void
+tda_refresh(struct sysmon_envsys *sme, envsys_data_t *edata)
+{
+	struct tda_softc *sc = sme->sme_cookie;
+	u_int16_t speed;
+
+	if (edata->sensor == SENSOR_FAN_CPU)
+		speed = sc->sc_cfan_speed;
+	else
+		speed = sc->sc_sfan_speed;
+	if (!speed)
+		edata->state = ENVSYS_SINVALID;
+	else {
+		edata->value_cur = speed;
+		edata->state = ENVSYS_SVALID;
+	}
+}
+