Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 5 Sep 2016 11:05:14 +0000 (UTC)
From:      Jared McNeill <jmcneill@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r305416 - in head/sys/arm/allwinner: . clk
Message-ID:  <201609051105.u85B5EY5045415@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jmcneill
Date: Mon Sep  5 11:05:14 2016
New Revision: 305416
URL: https://svnweb.freebsd.org/changeset/base/305416

Log:
  Add support for the Allwinner H3 Thermal Sensor Controller. The H3 embeds
  a single thermal sensor located in the CPU.

Modified:
  head/sys/arm/allwinner/aw_thermal.c
  head/sys/arm/allwinner/clk/aw_thsclk.c
  head/sys/arm/allwinner/files.allwinner

Modified: head/sys/arm/allwinner/aw_thermal.c
==============================================================================
--- head/sys/arm/allwinner/aw_thermal.c	Mon Sep  5 08:42:36 2016	(r305415)
+++ head/sys/arm/allwinner/aw_thermal.c	Mon Sep  5 11:05:14 2016	(r305416)
@@ -82,16 +82,26 @@ __FBSDID("$FreeBSD$");
 #define	A83T_FILTER		0x4
 #define	A83T_INTC		0x1000
 #define	A83T_TEMP_BASE		2719000
+#define	A83T_TEMP_MUL		1000
 #define	A83T_TEMP_DIV		14186
 #define	A83T_CLK_RATE		24000000
 
 #define	A64_ADC_ACQUIRE_TIME	0x190
 #define	A64_FILTER		0x6
-#define A64_INTC		0x18000
+#define	A64_INTC		0x18000
 #define	A64_TEMP_BASE		2170000
+#define	A64_TEMP_MUL		1000
 #define	A64_TEMP_DIV		8560
 #define	A64_CLK_RATE		4000000
 
+#define	H3_ADC_ACQUIRE_TIME	0x3f
+#define	H3_FILTER		0x6
+#define	H3_INTC			0x191000
+#define	H3_TEMP_BASE		217000000
+#define	H3_TEMP_MUL		121168
+#define	H3_TEMP_DIV		1000000
+#define	H3_CLK_RATE		4000000
+
 #define	TEMP_C_TO_K		273
 #define	SENSOR_ENABLE_ALL	(SENSOR0_EN|SENSOR1_EN|SENSOR2_EN)
 #define	SHUT_INT_ALL		(SHUT_INT0_STS|SHUT_INT1_STS|SHUT_INT2_STS)
@@ -110,8 +120,10 @@ struct aw_thermal_config {
 	uint32_t			adc_acquire_time;
 	uint32_t			filter;
 	uint32_t			intc;
-	uint32_t			temp_base;
-	uint32_t			temp_div;
+	int				temp_base;
+	int				temp_mul;
+	int				temp_div;
+	int				calib;
 };
 
 static const struct aw_thermal_config a83t_config = {
@@ -135,7 +147,9 @@ static const struct aw_thermal_config a8
 	.filter = A83T_FILTER,
 	.intc = A83T_INTC,
 	.temp_base = A83T_TEMP_BASE,
+	.temp_mul = A83T_TEMP_MUL,
 	.temp_div = A83T_TEMP_DIV,
+	.calib = 1,
 };
 
 static const struct aw_thermal_config a64_config = {
@@ -159,11 +173,30 @@ static const struct aw_thermal_config a6
 	.filter = A64_FILTER,
 	.intc = A64_INTC,
 	.temp_base = A64_TEMP_BASE,
+	.temp_mul = A64_TEMP_MUL,
 	.temp_div = A64_TEMP_DIV,
 };
 
+static const struct aw_thermal_config h3_config = {
+	.nsensors = 1,
+	.sensors = {
+		[0] = {
+			.name = "cpu",
+			.desc = "CPU temperature",
+		},
+	},
+	.clk_rate = H3_CLK_RATE,
+	.adc_acquire_time = H3_ADC_ACQUIRE_TIME,
+	.filter = H3_FILTER,
+	.intc = H3_INTC,
+	.temp_base = H3_TEMP_BASE,
+	.temp_mul = H3_TEMP_MUL,
+	.temp_div = H3_TEMP_DIV,
+};
+
 static struct ofw_compat_data compat_data[] = {
 	{ "allwinner,sun8i-a83t-ts",	(uintptr_t)&a83t_config },
+	{ "allwinner,sun8i-h3-ts",	(uintptr_t)&h3_config },
 	{ "allwinner,sun50i-a64-ts",	(uintptr_t)&a64_config },
 	{ NULL,				(uintptr_t)NULL }
 };
@@ -191,14 +224,16 @@ aw_thermal_init(struct aw_thermal_softc 
 	uint32_t calib0, calib1;
 	int error;
 
-	/* Read calibration settings from SRAM */
-	error = aw_sid_read_tscalib(&calib0, &calib1);
-	if (error != 0)
-		return (error);
-
-	/* Write calibration settings to thermal controller */
-	WR4(sc, THS_CALIB0, calib0);
-	WR4(sc, THS_CALIB1, calib1);
+	if (sc->conf->calib) {
+		/* Read calibration settings from SRAM */
+		error = aw_sid_read_tscalib(&calib0, &calib1);
+		if (error != 0)
+			return (error);
+
+		/* Write calibration settings to thermal controller */
+		WR4(sc, THS_CALIB0, calib0);
+		WR4(sc, THS_CALIB1, calib1);
+	}
 
 	/* Configure ADC acquire time (CLK_IN/(N+1)) and enable sensors */
 	WR4(sc, THS_CTRL1, ADC_CALI_EN);
@@ -221,7 +256,8 @@ aw_thermal_init(struct aw_thermal_softc 
 static int
 aw_thermal_reg_to_temp(struct aw_thermal_softc *sc, uint32_t val)
 {
-	return ((sc->conf->temp_base - val * 1000) / sc->conf->temp_div);
+	return ((sc->conf->temp_base - (val * sc->conf->temp_mul)) /
+	    sc->conf->temp_div);
 }
 
 static int

Modified: head/sys/arm/allwinner/clk/aw_thsclk.c
==============================================================================
--- head/sys/arm/allwinner/clk/aw_thsclk.c	Mon Sep  5 08:42:36 2016	(r305415)
+++ head/sys/arm/allwinner/clk/aw_thsclk.c	Mon Sep  5 11:05:14 2016	(r305416)
@@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$");
 #define	CLK_DIV_RATIO_MAX	3
 
 static struct ofw_compat_data compat_data[] = {
+	{ "allwinner,sun8i-h3-ths-clk",		1 },
 	{ "allwinner,sun50i-a64-ths-clk",	1 },
 	{ NULL, 0 }
 };

Modified: head/sys/arm/allwinner/files.allwinner
==============================================================================
--- head/sys/arm/allwinner/files.allwinner	Mon Sep  5 08:42:36 2016	(r305415)
+++ head/sys/arm/allwinner/files.allwinner	Mon Sep  5 11:05:14 2016	(r305416)
@@ -52,4 +52,5 @@ arm/allwinner/clk/aw_modclk.c		standard
 arm/allwinner/clk/aw_mmcclk.c		standard
 arm/allwinner/clk/aw_oscclk.c		standard
 arm/allwinner/clk/aw_pll.c		standard
+arm/allwinner/clk/aw_thsclk.c		standard
 arm/allwinner/clk/aw_usbclk.c		standard



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201609051105.u85B5EY5045415>