Fri Nov 6 12:50:30 2015 UTC ()
Support Armada XP.


(kiyohara)
diff -r1.1 -r1.2 src/sys/arch/arm/marvell/mvsocts.c

cvs diff -r1.1 -r1.2 src/sys/arch/arm/marvell/mvsocts.c (expand / switch to context diff)
--- src/sys/arch/arm/marvell/mvsocts.c 2012/08/01 10:34:42 1.1
+++ src/sys/arch/arm/marvell/mvsocts.c 2015/11/06 12:50:30 1.2
@@ -1,6 +1,6 @@
-/*	$NetBSD: mvsocts.c,v 1.1 2012/08/01 10:34:42 kiyohara Exp $	*/
+/*	$NetBSD: mvsocts.c,v 1.2 2015/11/06 12:50:30 kiyohara Exp $	*/
 /*
- * Copyright (c) 2012 KIYOHARA Takashi
+ * Copyright (c) 2012, 2015 KIYOHARA Takashi
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -25,7 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mvsocts.c,v 1.1 2012/08/01 10:34:42 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mvsocts.c,v 1.2 2015/11/06 12:50:30 kiyohara Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -34,17 +34,18 @@
 
 #include <dev/sysmon/sysmonvar.h>
 
+#include <dev/marvell/marvellreg.h>
 #include <dev/marvell/marvellvar.h>
 
 #define TS_STATUS		0x0
-#define   STATUS_VALID			(1 << 9)
 #define   STATUS_VAL(v)			(((v) >> 10) & 0x1ff)
 
-#define VAL2MCELSIUS(v)		(((322 - (v)) * 10000) / 13625)
-
 struct mvsocts_softc {
 	device_t sc_dev;
 
+	bool (*sc_isvalid)(int);
+	int (*sc_val2uc)(int);
+
 	struct sysmon_envsys *sc_sme;
 	envsys_data_t sc_sensor;
 
@@ -58,6 +59,12 @@
 
 static void mvsocts_refresh(struct sysmon_envsys *, envsys_data_t *);
 
+static bool mvsocts_isvalid_88f6282(int);
+static int mvsocts_val2uc_88f6282(int);
+
+static bool mvsocts_isvalid_armada(int);
+static int mvsocts_val2uc_armada(int);
+
 CFATTACH_DECL_NEW(mvsocts, sizeof(struct mvsocts_softc),
     mvsocts_match, mvsocts_attach, NULL, NULL);
 
@@ -89,10 +96,34 @@
 	    mva->mva_offset, sizeof(uint32_t), &sc->sc_ioh))
 		panic("%s: Cannot map registers", device_xname(self));
 
+	switch (mva->mva_model) {
+	case MARVELL_KIRKWOOD_88F6282:
+		sc->sc_isvalid = mvsocts_isvalid_88f6282;
+		sc->sc_val2uc = mvsocts_val2uc_88f6282;
+		break;
+	case MARVELL_ARMADAXP_MV78130:
+	case MARVELL_ARMADAXP_MV78160:
+	case MARVELL_ARMADAXP_MV78230:
+	case MARVELL_ARMADAXP_MV78260:
+	case MARVELL_ARMADAXP_MV78460:
+/*
+	case MARVELL_ARMADA370_MV6707:
+	case MARVELL_ARMADA370_MV6710:
+	case MARVELL_ARMADA370_MV6W11:
+ */
+		sc->sc_isvalid = mvsocts_isvalid_armada;
+		sc->sc_val2uc = mvsocts_val2uc_armada;
+		break;
+
+	default:
+		aprint_error_dev(self, "unknwon model: 0x%x", mva->mva_model);
+		return;
+	}
+
 	sc->sc_sme = sysmon_envsys_create();
 	/* Initialize sensor data. */
-	sc->sc_sensor.units =  ENVSYS_STEMP;
-	sc->sc_sensor.state =  ENVSYS_SINVALID;
+	sc->sc_sensor.units = ENVSYS_STEMP;
+	sc->sc_sensor.state = ENVSYS_SINVALID;
 	strlcpy(sc->sc_sensor.desc, device_xname(self),
 	    sizeof(sc->sc_sensor.desc));
 	if (sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor)) {
@@ -118,12 +149,40 @@
 	uint32_t val, uc, uk;
 
 	val = bus_space_read_4(sc->sc_iot, sc->sc_ioh, TS_STATUS);
-	if (!(val & STATUS_VALID)) {
+	if (!sc->sc_isvalid(val)) {
 		aprint_error_dev(sc->sc_dev, "status value is invalid\n");
 		return;
 	}
-	uc = VAL2MCELSIUS(STATUS_VAL(val)) * 1000000;	/* uC */
+	uc = sc->sc_val2uc(STATUS_VAL(val));		/* uC */
 	uk = uc + 273150000;				/* convert to uKelvin */
 	sc->sc_sensor.value_cur = uk;
 	sc->sc_sensor.state = ENVSYS_SVALID;
+}
+
+static bool
+mvsocts_isvalid_88f6282(int v)
+{
+
+	return (v & (1 << 9)) != 0;
+}
+
+static int
+mvsocts_val2uc_88f6282(int v)
+{
+
+	return (322 - v) * 10 * 1000000 / 13625 * 1000;
+}
+
+static bool
+mvsocts_isvalid_armada(int v)
+{
+
+	return (v & (1 << 0)) != 0;
+}
+
+static int
+mvsocts_val2uc_armada(int v)
+{
+
+	return (3153 - v * 10) * 1000000 / 13825 * 1000;
 }