Index: sys/arm/freescale/imx/files.imx6 =================================================================== --- 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 =================================================================== --- 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 =================================================================== --- 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 + * 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 the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Access to the Freescale i.MX6 On-Chip One-Time-Programmable Memory + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include + +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 = device_get_softc(dev); + + if (sc->mem_res != NULL) + bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->mem_res); + + ocotp_sc = NULL; + + return (0); +} + +static int +ocotp_attach(device_t dev) +{ + struct ocotp_softc *sc; + int err, rid; + + sc = device_get_softc(dev); + err = 0; + + /* Allocate bus_space resources. */ + rid = 0; + sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, + RF_ACTIVE); + if (sc->mem_res == NULL) { + device_printf(dev, "Cannot allocate memory resources\n"); + err = ENXIO; + goto out; + } + + ocotp_sc = sc; + +out: + if (err != 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") == 0) + return (ENXIO); + + device_set_desc(dev, "Freescale i.MX6 On-Chip One-Time-Programmable Memory"); + + return (BUS_PROBE_DEFAULT); +} + +int +imx6_ocotp_read_4(bus_size_t off, uint32_t *val) +{ + if (!ocotp_sc) + return (ENXIO); + + *val = RD4(ocotp_sc, off); + return (0); +} + +static device_method_t ocotp_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ocotp_probe), + DEVMETHOD(device_attach, ocotp_attach), + DEVMETHOD(device_detach, ocotp_detach), + + DEVMETHOD_END +}; + +static driver_t ocotp_driver = { + "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=%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 =================================================================== --- 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 + * 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 the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + * + * $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=%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 =================================================================== --- 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 + * 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 the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + * + * $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=%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 =================================================================== --- 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 + * 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 the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Freescale i.MX6 Temperature Monitor (TEMPMON) + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include + +#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 = imx6_anatop_read_4(IMX6_ANALOG_TEMPMON_TEMPSENSE0); + if (!(val & IMX6_ANALOG_TEMPMON_TEMPSENSE0_VALID)) + return; + tempmon_sc->last = + (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 = 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 = 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 = 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 = 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 = imx6_ocotp_read_4(IMX6_OCOTP_ANA1, &cal); + if (err != 0) + goto out; + sc->room_cnt = (cal & 0xFFF00000) >> 20; + sc->high_cnt = (cal & 0x000FFF00) >> 8; + sc->high_temp = 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 = 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 = sc; + err = 0; + +out: + if (err != 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") == 0) + return (ENXIO); + + device_set_desc(dev, "Freescale i.MX6 Temperature Monitor"); + + return (BUS_PROBE_DEFAULT); +} + +static device_method_t tempmon_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, tempmon_probe), + DEVMETHOD(device_attach, tempmon_attach), + DEVMETHOD(device_detach, tempmon_detach), + + DEVMETHOD_END +}; + +static driver_t tempmon_driver = { + "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=%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 =================================================================== --- sys/boot/fdt/dts/imx6.dtsi (revision 261623) +++ sys/boot/fdt/dts/imx6.dtsi (working copy) @@ -223,7 +223,7 @@ interrupts = <45>; status = "disabled"; }; - + }; aips@02100000 { /* AIPS2 */ @@ -317,6 +317,17 @@ bus-width = <0x4>; status ="disabled"; }; + + ocotp0: ocotp@021bc000 { + compatible = "fsl,imx6q-ocotp"; + reg = <0x021bc000 0x4000>; + status ="disabled"; + } }; + + tempmon: tempmon { + compatible = "fsl,imx6q-tempmon"; + status ="disabled"; + }; }; }; Index: sys/boot/fdt/dts/wandboard-quad.dts =================================================================== --- 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 = "okay"; }; usdhc@02198000 { status = "okay"; }; usdhc@0219c000 { status = "disabled"; }; + ocotp@021bc000 { status = "okay"; }; }; + tempmon { status = "okay"; }; }; chosen {