Module Name: src Committed By: hkenken Date: Fri Sep 27 02:59:21 UTC 2019
Modified Files: src/sys/arch/arm/imx: imx51_spi.c imxcspireg.h imxecspireg.h imxspi.c imxspivar.h src/sys/arch/arm/imx/fdt: imx6_spi.c Log Message: Add i.MX SPI device type. IMX31_CSPI IMX35_CSPI IMX51_ECSPI To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/imx/imx51_spi.c \ src/sys/arch/arm/imx/imxspivar.h cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/imx/imxcspireg.h \ src/sys/arch/arm/imx/imxecspireg.h cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/imx/imxspi.c cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/imx/fdt/imx6_spi.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/imx/imx51_spi.c diff -u src/sys/arch/arm/imx/imx51_spi.c:1.2 src/sys/arch/arm/imx/imx51_spi.c:1.3 --- src/sys/arch/arm/imx/imx51_spi.c:1.2 Mon Aug 19 11:41:36 2019 +++ src/sys/arch/arm/imx/imx51_spi.c Fri Sep 27 02:59:21 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: imx51_spi.c,v 1.2 2019/08/19 11:41:36 hkenken Exp $ */ +/* $NetBSD: imx51_spi.c,v 1.3 2019/09/27 02:59:21 hkenken Exp $ */ /*- * Copyright (c) 2014 Genetec Corporation. All rights reserved. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: imx51_spi.c,v 1.2 2019/08/19 11:41:36 hkenken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: imx51_spi.c,v 1.3 2019/09/27 02:59:21 hkenken Exp $"); #include "locators.h" #include "opt_imx.h" @@ -95,6 +95,10 @@ imxspi_attach(device_t parent, device_t sc->sc_iot = aa->aa_iot; sc->sc_enhanced = cf_flags; + if (sc->sc_enhanced) + sc->sc_type = IMX51_ECSPI; + else + sc->sc_type = IMX35_CSPI; sc->sc_nslaves = IMXSPINSLAVES; sc->sc_freq = imx51_get_clock(IMX51CLK_CSPI_CLK_ROOT); Index: src/sys/arch/arm/imx/imxspivar.h diff -u src/sys/arch/arm/imx/imxspivar.h:1.2 src/sys/arch/arm/imx/imxspivar.h:1.3 --- src/sys/arch/arm/imx/imxspivar.h:1.2 Mon Aug 19 11:41:36 2019 +++ src/sys/arch/arm/imx/imxspivar.h Fri Sep 27 02:59:21 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: imxspivar.h,v 1.2 2019/08/19 11:41:36 hkenken Exp $ */ +/* $NetBSD: imxspivar.h,v 1.3 2019/09/27 02:59:21 hkenken Exp $ */ /* * Copyright (c) 2014 Genetec Corporation. All rights reserved. @@ -38,6 +38,12 @@ typedef struct spi_chipset_tag { int (*spi_cs_disable)(void *, int); } *spi_chipset_tag_t; +enum imxspi_type { + IMX31_CSPI, + IMX35_CSPI, + IMX51_ECSPI, +}; + struct imxspi_softc { device_t sc_dev; int sc_phandle; @@ -57,6 +63,7 @@ struct imxspi_softc { int sc_nslaves; int sc_enhanced; + enum imxspi_type sc_type; }; int imxspi_attach_common(device_t); Index: src/sys/arch/arm/imx/imxcspireg.h diff -u src/sys/arch/arm/imx/imxcspireg.h:1.1 src/sys/arch/arm/imx/imxcspireg.h:1.2 --- src/sys/arch/arm/imx/imxcspireg.h:1.1 Sat Mar 22 09:28:08 2014 +++ src/sys/arch/arm/imx/imxcspireg.h Fri Sep 27 02:59:21 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: imxcspireg.h,v 1.1 2014/03/22 09:28:08 hkenken Exp $ */ +/* $NetBSD: imxcspireg.h,v 1.2 2019/09/27 02:59:21 hkenken Exp $ */ /* * Copyright (c) 2014 Genetec Corporation. All rights reserved. @@ -32,15 +32,12 @@ #define CSPI_RXDATA 0x00 #define CSPI_TXDATA 0x04 #define CSPI_CONREG 0x08 -#ifdef IMX51 -#define CSPI_CON_CS __BITS(13, 12) -#define CSPI_CON_DRCTL __BITS( 9, 8) -#define CSPI_CON_BITCOUNT __BITS(31, 20) -#else -#define CSPI_CON_CS __BITS(25, 24) -#define CSPI_CON_DRCTL __BITS(21, 20) -#define CSPI_CON_BITCOUNT __BITS(12, 8) -#endif +#define CSPI_IMX31_CON_CS __BITS(25, 24) +#define CSPI_IMX31_CON_DRCTL __BITS(21, 20) +#define CSPI_IMX31_CON_BITCOUNT __BITS(12, 8) +#define CSPI_IMX35_CON_CS __BITS(13, 12) +#define CSPI_IMX35_CON_DRCTL __BITS( 9, 8) +#define CSPI_IMX35_CON_BITCOUNT __BITS(31, 20) #define CSPI_CON_DIV __BITS(18, 16) #define CSPI_CON_SSPOL __BIT(7) /* SPI SS Polarity Select */ #define CSPI_CON_SSCTL __BIT(6) /* In master mode, this bit @@ -55,12 +52,9 @@ #define CSPI_CON_ENABLE __BIT(0) /* EN */ #define CSPI_INTREG 0x0c #define CSPI_INTR_ALL_EN 0x000001ff /* All Intarruption Enabled */ -#ifdef IMX51 -#define CSPI_INTR_TC_EN __BIT(7) /* TX Complete */ -#else -#define CSPI_INTR_TC_EN __BIT(8) /* TX Complete */ -#define CSPI_INTR_BO_EN __BIT(7) /* Bit Counter Overflow */ -#endif +#define CSPI_IMX31_INTR_TC_EN __BIT(8) /* TX Complete */ +#define CSPI_IMX31_INTR_BO_EN __BIT(7) /* Bit Counter Overflow */ +#define CSPI_IMX35_INTR_TC_EN __BIT(7) /* TX Complete */ #define CSPI_INTR_RO_EN __BIT(6) /* RXFIFO Overflow */ #define CSPI_INTR_RF_EN __BIT(5) /* RXFIFO Full */ #define CSPI_INTR_RH_EN __BIT(4) /* RXFIFO Half Full */ @@ -70,14 +64,11 @@ #define CSPI_INTR_TE_EN __BIT(0) /* TXFIFO Empty */ #define CSPI_DMAREG 0x10 #define CSPI_STATREG 0x14 -#ifdef IMX51 -#define CSPI_STAT_CLR_TC __BIT(7) /* Clear TC of status register */ -#define CSPI_STAT_CLR CSPI_STAT_CLR_TC -#else -#define CSPI_STAT_CLR_TC __BIT(8) /* Clear TC of status register */ -#define CSPI_STAT_CLR_BO __BIT(7) /* Clear BO of status register */ -#define CSPI_STAT_CLR (CSPI_STAT_CLR_TC | CSPI_STAT_CLR_BO) -#endif +#define CSPI_IMX31_STAT_CLR_TC __BIT(8) /* Clear TC of status register */ +#define CSPI_IMX31_STAT_CLR_BO __BIT(7) /* Clear BO of status register */ +#define CSPI_IMX31_STAT_CLR (CSPI_IMX31_STAT_CLR_TC | CSPI_IMX31_STAT_CLR_BO) +#define CSPI_IMX35_STAT_CLR_TC __BIT(7) /* Clear TC of status register */ +#define CSPI_IMX35_STAT_CLR CSPI_IMX35_STAT_CLR_TC #define CSPI_STAT_RO __BIT(6) /* RXFIFO Overflow */ #define CSPI_STAT_RF __BIT(5) /* RXFIFO Full */ #define CSPI_STAT_RH __BIT(4) /* RXFIFO Half Full */ Index: src/sys/arch/arm/imx/imxecspireg.h diff -u src/sys/arch/arm/imx/imxecspireg.h:1.1 src/sys/arch/arm/imx/imxecspireg.h:1.2 --- src/sys/arch/arm/imx/imxecspireg.h:1.1 Sat Mar 22 09:28:08 2014 +++ src/sys/arch/arm/imx/imxecspireg.h Fri Sep 27 02:59:21 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: imxecspireg.h,v 1.1 2014/03/22 09:28:08 hkenken Exp $ */ +/* $NetBSD: imxecspireg.h,v 1.2 2019/09/27 02:59:21 hkenken Exp $ */ /* * Copyright (c) 2012 Genetec Corporation. All rights reserved. @@ -32,7 +32,7 @@ #define ECSPI_RXDATA 0x00 #define ECSPI_TXDATA 0x04 #define ECSPI_CONREG 0x08 -#define ECSPI_CON_BITCOUNT __BITS(31, 20) +#define ECSPI_CON_BITCOUNT __BITS(31,20) #define ECSPI_CON_CS __BITS(19,18) #define ECSPI_CON_DRCTL __BITS(17,16) #define ECSPI_CON_PREDIV __BITS(15,12) /* PRE DIVIDER */ Index: src/sys/arch/arm/imx/imxspi.c diff -u src/sys/arch/arm/imx/imxspi.c:1.5 src/sys/arch/arm/imx/imxspi.c:1.6 --- src/sys/arch/arm/imx/imxspi.c:1.5 Mon Aug 19 11:41:36 2019 +++ src/sys/arch/arm/imx/imxspi.c Fri Sep 27 02:59:21 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: imxspi.c,v 1.5 2019/08/19 11:41:36 hkenken Exp $ */ +/* $NetBSD: imxspi.c,v 1.6 2019/09/27 02:59:21 hkenken Exp $ */ /*- * Copyright (c) 2014 Genetec Corporation. All rights reserved. @@ -32,9 +32,8 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: imxspi.c,v 1.5 2019/08/19 11:41:36 hkenken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: imxspi.c,v 1.6 2019/09/27 02:59:21 hkenken Exp $"); -#include "opt_imx.h" #include "opt_imxspi.h" #include "opt_fdt.h" @@ -68,8 +67,13 @@ void imxspi_send(struct imxspi_softc *); void imxspi_recv(struct imxspi_softc *); void imxspi_sched(struct imxspi_softc *); -#define IMXSPI(x) \ - ((sc->sc_enhanced) ? __CONCAT(ECSPI_, x) : __CONCAT(CSPI_, x)) +#define IMXCSPI_TYPE(type, x) \ + ((sc->sc_type == IMX31_CSPI) ? __CONCAT(CSPI_IMX31_, x) : \ + (sc->sc_type == IMX35_CSPI) ? __CONCAT(CSPI_IMX35_, x) : 0) +#define IMXCSPI(x) __CONCAT(CSPI_, x) +#define IMXESPI(x) __CONCAT(ECSPI_, x) +#define IMXSPI(x) ((sc->sc_enhanced) ? IMXESPI(x) : IMXCSPI(x)) +#define IMXSPI_TYPE(x) ((sc->sc_enhanced) ? IMXESPI(x) : IMXCSPI_TYPE(sc->sc_type, x)) #define READ_REG(sc, x) \ bus_space_read_4(sc->sc_iot, sc->sc_ioh, IMXSPI(x)) #define WRITE_REG(sc, x, v) \ @@ -123,13 +127,13 @@ imxspi_attach_common(device_t self) /* configure SPI */ /* Setup Control Register */ - WRITE_REG(sc, CONREG, __SHIFTIN(0, IMXSPI(CON_DRCTL)) | - __SHIFTIN(8 - 1, IMXSPI(CON_BITCOUNT)) | + WRITE_REG(sc, CONREG, + __SHIFTIN(0, IMXSPI_TYPE(CON_DRCTL)) | + __SHIFTIN(8 - 1, IMXSPI_TYPE(CON_BITCOUNT)) | __SHIFTIN(0xf, IMXSPI(CON_MODE)) | IMXSPI(CON_ENABLE)); - /* TC and RR interruption */ - WRITE_REG(sc, INTREG, (IMXSPI(INTR_TC_EN) | IMXSPI(INTR_RR_EN))); - WRITE_REG(sc, STATREG, IMXSPI(STAT_CLR)); + WRITE_REG(sc, INTREG, (IMXSPI_TYPE(INTR_TC_EN) | IMXSPI(INTR_RR_EN))); + WRITE_REG(sc, STATREG, IMXSPI_TYPE(STAT_CLR)); WRITE_REG(sc, PERIODREG, 0x0); @@ -332,8 +336,8 @@ imxspi_sched(struct imxspi_softc *sc) /* chip slect */ chipselect = READ_REG(sc, CONREG); - chipselect &= ~IMXSPI(CON_CS); - chipselect |= __SHIFTIN(st->st_slave, IMXSPI(CON_CS)); + chipselect &= ~IMXSPI_TYPE(CON_CS); + chipselect |= __SHIFTIN(st->st_slave, IMXSPI_TYPE(CON_CS)); WRITE_REG(sc, CONREG, chipselect); delay(1); @@ -398,11 +402,9 @@ imxspi_intr(void *arg) imxspi_done(sc, err); } - /* Transfer Conplete? */ - if (sr & IMXSPI(INTR_TC_EN)) { - /* complete TX */ + /* Transfer Complete? */ + if (sr & IMXSPI_TYPE(INTR_TC_EN)) imxspi_send(sc); - } /* status register clear */ WRITE_REG(sc, STATREG, sr); Index: src/sys/arch/arm/imx/fdt/imx6_spi.c diff -u src/sys/arch/arm/imx/fdt/imx6_spi.c:1.1 src/sys/arch/arm/imx/fdt/imx6_spi.c:1.2 --- src/sys/arch/arm/imx/fdt/imx6_spi.c:1.1 Mon Aug 19 11:41:36 2019 +++ src/sys/arch/arm/imx/fdt/imx6_spi.c Fri Sep 27 02:59:21 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: imx6_spi.c,v 1.1 2019/08/19 11:41:36 hkenken Exp $ */ +/* $NetBSD: imx6_spi.c,v 1.2 2019/09/27 02:59:21 hkenken Exp $ */ /*- * Copyright (c) 2019 Genetec Corporation. All rights reserved. * Written by Hashimoto Kenichi for Genetec Corporation. @@ -25,7 +25,7 @@ * SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: imx6_spi.c,v 1.1 2019/08/19 11:41:36 hkenken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: imx6_spi.c,v 1.2 2019/09/27 02:59:21 hkenken Exp $"); #include "opt_imxspi.h" @@ -48,8 +48,18 @@ struct imxspi_fdt_softc { struct fdtbus_gpio_pin **sc_pin_cs; }; +struct imx_spi_config { + bool enhanced; + enum imxspi_type type; +}; + +static const struct imx_spi_config imx6q_spi_config = { + .enhanced = true, + .type = IMX51_ECSPI, +}; + static const struct of_compat_data compat_data[] = { - { "fsl,imx6q-ecspi", true }, + { "fsl,imx6q-ecspi", (uintptr_t)&imx6q_spi_config }, { NULL } }; @@ -122,7 +132,10 @@ imxspi_attach(device_t parent, device_t sc->sc_phandle = phandle; sc->sc_iot = faa->faa_bst; - sc->sc_enhanced = of_search_compatible(phandle, compat_data)->data; + + struct imx_spi_config *config = (void *)of_search_compatible(phandle, compat_data)->data; + sc->sc_enhanced = config->enhanced; + sc->sc_type = config->type; sc->sc_nslaves = nslaves; sc->sc_freq = clk_get_rate(ifsc->sc_clk);