Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 08 Feb 2014 22:57:20 +0100
From:      Steven Lawrance <stl@koffein.net>
To:        freebsd-arm <freebsd-arm@freebsd.org>
Subject:   Re: i.MX6 on-die temperature sensor
Message-ID:  <1391896463-sup-1007@luwak.koffein.net>
In-Reply-To: <1391893231-sup-6174@luwak.koffein.net>
References:  <1391893231-sup-6174@luwak.koffein.net>

next in thread | previous in thread | raw e-mail | index | archive | help

--=-1391896640-307870-43411-8607-2-=
Content-Type: text/plain; charset=UTF-8
Content-Disposition: inline

Excerpts from Steven Lawrance's message of 2014-02-08 22:32:31 +0100:
> A patch is attached, but I've got a few questions, mostly about FDTs:
> order in the FDT?  The current scenario seems quite fragile if that's

Another attempt at sending the patch -- it appears to have been
stripped the first time around.

-- 
Steven Lawrance
stl@koffein.net

--=-1391896640-307870-43411-8607-2-=
Content-Disposition: attachment; filename="imx6_tempmon.txt"
Content-Type: text/plain; name="imx6_tempmon.txt"
Content-Transfer-Encoding: quoted-printable

Index: sys/arm/freescale/imx/files.imx6
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- sys/arm/freescale/imx/files.imx6	(revision 261623)
+++ sys/arm/freescale/imx/files.imx6	(working copy)
@@ -22,6 +22,8 @@
 arm/freescale/imx/imx6_ccm.c		standard
 arm/freescale/imx/imx6_machdep.c	standard
 arm/freescale/imx/imx6_pl310.c		standard
+arm/freescale/imx/imx6_ocotp.c		standard
+arm/freescale/imx/imx6_tempmon.c	standard
 arm/freescale/imx/imx_machdep.c		standard
 arm/freescale/imx/imx_gpt.c		standard
 =

Index: sys/arm/freescale/imx/imx6_anatopreg.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- sys/arm/freescale/imx/imx6_anatopreg.h	(revision 261623)
+++ sys/arm/freescale/imx/imx6_anatopreg.h	(working copy)
@@ -101,6 +101,23 @@
 #define	IMX6_ANALOG_CCM_MISC2_CLR			0x178
 #define	IMX6_ANALOG_CCM_MISC2_TOG			0x17C
 =

+#define	IMX6_ANALOG_TEMPMON_TEMPSENSE0			0x180
+#define	IMX6_ANALOG_TEMPMON_TEMPSENSE0_SET		0x184
+#define	IMX6_ANALOG_TEMPMON_TEMPSENSE0_CLR		0x188
+#define	IMX6_ANALOG_TEMPMON_TEMPSENSE0_TOG		0x18C
+#define	IMX6_ANALOG_TEMPMON_TEMPSENSE0_TOG		0x18C
+#define	  IMX6_ANALOG_TEMPMON_TEMPSENSE0_TEMP_CNT_SHIFT	  8
+#define	  IMX6_ANALOG_TEMPMON_TEMPSENSE0_TEMP_CNT_MASK	  \
+    (0xfff << IMX6_ANALOG_TEMPMON_TEMPSENSE0_TEMP_CNT_SHIFT)
+#define	  IMX6_ANALOG_TEMPMON_TEMPSENSE0_VALID		0x4
+#define	  IMX6_ANALOG_TEMPMON_TEMPSENSE0_MEASURE	0x2
+#define	  IMX6_ANALOG_TEMPMON_TEMPSENSE0_POWER_DOWN	0x1
+
+#define	IMX6_ANALOG_TEMPMON_TEMPSENSE1			0x190
+#define	IMX6_ANALOG_TEMPMON_TEMPSENSE1_SET		0x194
+#define	IMX6_ANALOG_TEMPMON_TEMPSENSE1_CLR		0x198
+#define	IMX6_ANALOG_TEMPMON_TEMPSENSE1_TOG		0x19C
+
 #define	IMX6_ANALOG_USB1_VBUS_DETECT			0x1A0
 #define	IMX6_ANALOG_USB1_VBUS_DETECT_SET		0x1A4
 #define	IMX6_ANALOG_USB1_VBUS_DETECT_CLR		0x1A8
Index: sys/arm/freescale/imx/imx6_ocotp.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- sys/arm/freescale/imx/imx6_ocotp.c	(revision 0)
+++ sys/arm/freescale/imx/imx6_ocotp.c	(working copy)
@@ -0,0 +1,150 @@
+/*-
+ * Copyright (c) 2014 Steven Lawrance <stl@koffein.net>
+ * All rights reserved.
+ *
+ * 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 th=
e
+ *    documentation and/or other materials provided with the distributio=
n.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AN=
D
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE=

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU=
RPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIAB=
LE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUE=
NTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOO=
DS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)=

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S=
TRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY=
 WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O=
F
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Access to the Freescale i.MX6 On-Chip One-Time-Programmable Memory
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
+#include <machine/bus.h>
+
+#include <arm/freescale/imx/imx6_ocotpreg.h>
+#include <arm/freescale/imx/imx6_ocotpvar.h>
+#include <arm/freescale/imx/imx_machdep.h>
+
+struct ocotp_softc {
+	device_t	dev;
+	struct resource	*mem_res;
+};
+
+static struct ocotp_softc *ocotp_sc;
+
+static inline uint32_t
+RD4(struct ocotp_softc *sc, bus_size_t off)
+{
+	return (bus_read_4(sc->mem_res, off));
+}
+
+
+static int
+ocotp_detach(device_t dev)
+{
+	struct ocotp_softc *sc;
+
+	sc =3D device_get_softc(dev);
+
+	if (sc->mem_res !=3D NULL)
+		bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->mem_res);
+
+	ocotp_sc =3D NULL;
+
+	return (0);
+}
+
+static int
+ocotp_attach(device_t dev)
+{
+	struct ocotp_softc *sc;
+	int err, rid;
+
+	sc =3D device_get_softc(dev);
+	err =3D 0;
+
+	/* Allocate bus_space resources. */
+	rid =3D 0;
+	sc->mem_res =3D bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
+	    RF_ACTIVE);
+	if (sc->mem_res =3D=3D NULL) {
+		device_printf(dev, "Cannot allocate memory resources\n");
+		err =3D ENXIO;
+		goto out;
+	}
+
+	ocotp_sc =3D sc;
+
+out:
+	if (err !=3D 0)
+		ocotp_detach(dev);
+
+	return (err);
+}
+
+static int
+ocotp_probe(device_t dev)
+{
+
+	if (!ofw_bus_status_okay(dev))
+		return (ENXIO);
+
+        if (ofw_bus_is_compatible(dev, "fsl,imx6q-ocotp") =3D=3D 0)
+		return (ENXIO);
+
+	device_set_desc(dev, "Freescale i.MX6 On-Chip One-Time-Programmable Mem=
ory");
+
+	return (BUS_PROBE_DEFAULT);
+}
+
+int
+imx6_ocotp_read_4(bus_size_t off, uint32_t *val)
+{
+	if (!ocotp_sc)
+		return (ENXIO);
+
+	*val =3D RD4(ocotp_sc, off);
+	return (0);
+}
+
+static device_method_t ocotp_methods[] =3D {
+	/* Device interface */
+	DEVMETHOD(device_probe,  ocotp_probe),
+	DEVMETHOD(device_attach, ocotp_attach),
+	DEVMETHOD(device_detach, ocotp_detach),
+
+	DEVMETHOD_END
+};
+
+static driver_t ocotp_driver =3D {
+	"ocotp",
+	ocotp_methods,
+	sizeof(struct ocotp_softc)
+};
+
+static devclass_t ocotp_devclass;
+
+DRIVER_MODULE(ocotp, simplebus, ocotp_driver, ocotp_devclass, 0, 0);
+

Property changes on: sys/arm/freescale/imx/imx6_ocotp.c
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+FreeBSD=3D%H
\ No newline at end of property
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: sys/arm/freescale/imx/imx6_ocotpreg.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- sys/arm/freescale/imx/imx6_ocotpreg.h	(revision 0)
+++ sys/arm/freescale/imx/imx6_ocotpreg.h	(working copy)
@@ -0,0 +1,79 @@
+/*-
+ * Copyright (c) 2014 Steven Lawrance <stl@koffein.net>
+ * All rights reserved.
+ *
+ * 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 th=
e
+ *    documentation and/or other materials provided with the distributio=
n.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AN=
D
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE=

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU=
RPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIAB=
LE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUE=
NTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOO=
DS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)=

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S=
TRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY=
 WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O=
F
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef	IMX6_OCOTPREG_H
+#define	IMX6_OCOTPREG_H
+
+#define	IMX6_OCOTP_CTRL				0x000
+#define	IMX6_OCOTP_CTRL_SET			0x004
+#define	IMX6_OCOTP_CTRL_CLR			0x008
+#define	IMX6_OCOTP_CTRL_TOG			0x00C
+#define	IMX6_OCOTP_TIMING			0x010
+#define	IMX6_OCOTP_DATA				0x020
+#define	IMX6_OCOTP_READ_CTRL			0x030
+#define	IMX6_OCOTP_READ_FUSE_DATA		0x040
+#define	IMX6_OCOTP_SW_STICKY			0x050
+#define	IMX6_OCOTP_SCS				0x060
+#define	IMX6_OCOTP_SCS_SET			0x064
+#define	IMX6_OCOTP_SCS_CLR			0x068
+#define	IMX6_OCOTP_SCS_TOG			0x06C
+#define	IMX6_OCOTP_VERSION			0x090
+#define	IMX6_OCOTP_LOCK				0x400
+#define	IMX6_OCOTP_CFG0				0x410
+#define	IMX6_OCOTP_CFG1				0x420
+#define	IMX6_OCOTP_CFG2				0x430
+#define	IMX6_OCOTP_CFG3				0x440
+#define	IMX6_OCOTP_CFG4				0x450
+#define	IMX6_OCOTP_CFG5				0x460
+#define	IMX6_OCOTP_CFG6				0x470
+#define	IMX6_OCOTP_MEM0				0x480
+#define	IMX6_OCOTP_MEM1				0x490
+#define	IMX6_OCOTP_MEM2				0x4A0
+#define	IMX6_OCOTP_MEM3				0x4B0
+#define	IMX6_OCOTP_ANA0				0x4D0
+#define	IMX6_OCOTP_ANA1				0x4E0
+#define	IMX6_OCOTP_ANA2				0x4F0
+#define	IMX6_OCOTP_SRK0				0x580
+#define	IMX6_OCOTP_SRK1				0x590
+#define	IMX6_OCOTP_SRK2				0x5A0
+#define	IMX6_OCOTP_SRK3				0x5B0
+#define	IMX6_OCOTP_SRK4				0x5C0
+#define	IMX6_OCOTP_SRK5				0x5D0
+#define	IMX6_OCOTP_SRK6				0x5E0
+#define	IMX6_OCOTP_SRK7				0x5F0
+#define	IMX6_OCOTP_HSJC_RESP0			0x600
+#define	IMX6_OCOTP_HSJC_RESP1			0x610
+#define	IMX6_OCOTP_MAC0				0x620
+#define	IMX6_OCOTP_MAC1				0x630
+#define	IMX6_OCOTP_GP1				0x660
+#define	IMX6_OCOTP_GP2				0x670
+#define	IMX6_OCOTP_MISC_CONF			0x6D0
+#define	IMX6_OCOTP_FIELD_RETURN			0x6E0
+#define	IMX6_OCOTP_SRK_REVOKE			0x6F0
+
+#endif

Property changes on: sys/arm/freescale/imx/imx6_ocotpreg.h
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+FreeBSD=3D%H
\ No newline at end of property
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: sys/arm/freescale/imx/imx6_ocotpvar.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- sys/arm/freescale/imx/imx6_ocotpvar.h	(revision 0)
+++ sys/arm/freescale/imx/imx6_ocotpvar.h	(working copy)
@@ -0,0 +1,34 @@
+/*-
+ * Copyright (c) 2014 Steven Lawrance <stl@koffein.net>
+ * All rights reserved.
+ *
+ * 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 th=
e
+ *    documentation and/or other materials provided with the distributio=
n.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AN=
D
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE=

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU=
RPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIAB=
LE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUE=
NTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOO=
DS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)=

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S=
TRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY=
 WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O=
F
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef	IMX6_OCOTPVAR_H
+#define	IMX6_OCOTPVAR_H
+
+int imx6_ocotp_read_4(bus_size_t _offset, uint32_t *_value);
+
+#endif

Property changes on: sys/arm/freescale/imx/imx6_ocotpvar.h
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+FreeBSD=3D%H
\ No newline at end of property
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: sys/arm/freescale/imx/imx6_tempmon.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- sys/arm/freescale/imx/imx6_tempmon.c	(revision 0)
+++ sys/arm/freescale/imx/imx6_tempmon.c	(working copy)
@@ -0,0 +1,203 @@
+/*-
+ * Copyright (c) 2014 Steven Lawrance <stl@koffein.net>
+ * All rights reserved.
+ *
+ * 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 th=
e
+ *    documentation and/or other materials provided with the distributio=
n.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AN=
D
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE=

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU=
RPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIAB=
LE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUE=
NTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOO=
DS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)=

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S=
TRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY=
 WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O=
F
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Freescale i.MX6 Temperature Monitor (TEMPMON)
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/sysctl.h>
+#include <sys/module.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
+#include <machine/bus.h>
+
+#include <arm/freescale/imx/imx6_anatopreg.h>
+#include <arm/freescale/imx/imx6_anatopvar.h>
+#include <arm/freescale/imx/imx6_ocotpreg.h>
+#include <arm/freescale/imx/imx6_ocotpvar.h>
+#include <arm/freescale/imx/imx_machdep.h>
+
+#define TZ_ZEROC	2732
+
+struct tempmon_softc {
+	device_t	dev;
+	uint32_t	room_cnt;
+	uint32_t	high_cnt;
+	uint32_t	high_temp;
+	uint32_t	last;
+};
+
+static struct tempmon_softc *tempmon_sc;
+
+static void
+update_count(void)
+{
+	uint32_t val;
+	=

+	val =3D imx6_anatop_read_4(IMX6_ANALOG_TEMPMON_TEMPSENSE0);
+	if (!(val & IMX6_ANALOG_TEMPMON_TEMPSENSE0_VALID))
+		return;
+	tempmon_sc->last =3D
+	    (val & IMX6_ANALOG_TEMPMON_TEMPSENSE0_TEMP_CNT_MASK)
+	    >> IMX6_ANALOG_TEMPMON_TEMPSENSE0_TEMP_CNT_SHIFT;
+}
+
+static int
+temperature_sysctl_handler(SYSCTL_HANDLER_ARGS)
+{
+	uint32_t t;
+	=

+	update_count();
+
+	t =3D tempmon_sc->high_temp * 1000
+	    - (tempmon_sc->last - tempmon_sc->high_cnt)
+	    * (tempmon_sc->high_temp * 1000 - 25000)
+	    / (tempmon_sc->room_cnt - tempmon_sc->high_cnt);
+	t =3D t/100 + TZ_ZEROC;
+
+	return (sysctl_handle_int(oidp, &t, 0, req));
+}
+
+static int
+count_sysctl_handler(SYSCTL_HANDLER_ARGS)
+{
+	update_count();
+
+	return (sysctl_handle_int(oidp, &tempmon_sc->last, 0, req));
+}
+
+static int
+tempmon_detach(device_t dev)
+{
+	struct tempmon_softc *sc;
+
+	sc =3D device_get_softc(dev);
+
+	return (0);
+}
+
+static int
+tempmon_attach(device_t dev)
+{
+	struct tempmon_softc *sc;
+	uint32_t cal;
+	int err;
+	struct sysctl_ctx_list *ctx;
+
+	sc =3D device_get_softc(dev);
+
+	/*
+	 * Fetch calibration data: a sensor count at room temperature (25C),
+	 * a sensor count at a high temperature, and that temperature
+	 */
+	err =3D imx6_ocotp_read_4(IMX6_OCOTP_ANA1, &cal);
+	if (err !=3D 0)
+		goto out;
+	sc->room_cnt =3D (cal & 0xFFF00000) >> 20;
+	sc->high_cnt =3D (cal & 0x000FFF00) >> 8;
+	sc->high_temp =3D cal & 0x000000FF;
+
+	/*
+	 * Set the sensor to sample automatically every ~1 second
+	 * and power it on.
+	 */
+	imx6_anatop_write_4(IMX6_ANALOG_TEMPMON_TEMPSENSE1_SET, 0x8000);
+	imx6_anatop_write_4(IMX6_ANALOG_TEMPMON_TEMPSENSE0_SET,
+	    IMX6_ANALOG_TEMPMON_TEMPSENSE0_MEASURE);
+	imx6_anatop_write_4(IMX6_ANALOG_TEMPMON_TEMPSENSE0_CLR,
+	    IMX6_ANALOG_TEMPMON_TEMPSENSE0_POWER_DOWN);
+
+	ctx =3D device_get_sysctl_ctx(dev);
+	SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
+	    OID_AUTO, "temperature", CTLTYPE_INT | CTLFLAG_RD, dev, 0,
+	    temperature_sysctl_handler, "IK", "Current die temperature");
+	SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
+	    OID_AUTO, "current_count", CTLTYPE_INT | CTLFLAG_RD, dev, 0,
+	    count_sysctl_handler, "I", "Current sensor count");
+	SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
+	    OID_AUTO, "room_temp_count", CTLTYPE_INT | CTLFLAG_RD,
+	    &sc->room_cnt, 0, "Counter value at 25 degrees C");
+	SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
+	    OID_AUTO, "high_temp_count", CTLTYPE_INT | CTLFLAG_RD,
+	    &sc->high_cnt, 0, "Counter value at high calibration temperature");=

+	SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
+	    OID_AUTO, "high_temp_value", CTLTYPE_INT | CTLFLAG_RD,
+	    &sc->high_temp, 0, "Temperature at high value calibration");
+
+	tempmon_sc =3D sc;
+	err =3D 0;
+
+out:
+	if (err !=3D 0)
+		tempmon_detach(dev);
+
+	return (err);
+}
+
+static int
+tempmon_probe(device_t dev)
+{
+
+	if (!ofw_bus_status_okay(dev))
+		return (ENXIO);
+
+        if (ofw_bus_is_compatible(dev, "fsl,imx6q-tempmon") =3D=3D 0)
+		return (ENXIO);
+
+	device_set_desc(dev, "Freescale i.MX6 Temperature Monitor");
+
+	return (BUS_PROBE_DEFAULT);
+}
+
+static device_method_t tempmon_methods[] =3D {
+	/* Device interface */
+	DEVMETHOD(device_probe,  tempmon_probe),
+	DEVMETHOD(device_attach, tempmon_attach),
+	DEVMETHOD(device_detach, tempmon_detach),
+
+	DEVMETHOD_END
+};
+
+static driver_t tempmon_driver =3D {
+	"tempmon",
+	tempmon_methods,
+	sizeof(struct tempmon_softc)
+};
+
+static devclass_t tempmon_devclass;
+
+DRIVER_MODULE(tempmon, simplebus, tempmon_driver, tempmon_devclass, 0, 0=
);
+

Property changes on: sys/arm/freescale/imx/imx6_tempmon.c
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+FreeBSD=3D%H
\ No newline at end of property
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: sys/boot/fdt/dts/imx6.dtsi
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- sys/boot/fdt/dts/imx6.dtsi	(revision 261623)
+++ sys/boot/fdt/dts/imx6.dtsi	(working copy)
@@ -223,7 +223,7 @@
 				interrupts =3D <45>;
 				status =3D "disabled";
 			};
-			=

+
 		};
 =

 		aips@02100000 { /* AIPS2 */
@@ -317,6 +317,17 @@
 				bus-width =3D <0x4>;
 				status =3D"disabled";
 			};
+
+			ocotp0: ocotp@021bc000 {
+				compatible =3D "fsl,imx6q-ocotp";
+				reg =3D <0x021bc000 0x4000>;
+				status =3D"disabled";
+			}
 		};
+
+		tempmon: tempmon {
+			compatible =3D "fsl,imx6q-tempmon";
+			status =3D"disabled";
+		};
 	};
 };
Index: sys/boot/fdt/dts/wandboard-quad.dts
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- sys/boot/fdt/dts/wandboard-quad.dts	(revision 261623)
+++ sys/boot/fdt/dts/wandboard-quad.dts	(working copy)
@@ -71,7 +71,9 @@
 			usdhc@02194000		{ status =3D "okay"; };
 			usdhc@02198000		{ status =3D "okay"; };
 			usdhc@0219c000		{ status =3D "disabled"; };
+			ocotp@021bc000		{ status =3D "okay"; };
 		};
+		tempmon				{ status =3D "okay"; };
 	};
 =

 	chosen {

--=-1391896640-307870-43411-8607-2-=--



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