CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Fri Jan 2 23:23:17 UTC 2015 Modified Files: src/sys/arch/arm/rockchip: obio.c Log Message: back out r1.8, its fine (and preferred) to write value before direction reg To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/sys/arch/arm/rockchip/obio.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/rockchip/obio.c diff -u src/sys/arch/arm/rockchip/obio.c:1.9 src/sys/arch/arm/rockchip/obio.c:1.10 --- src/sys/arch/arm/rockchip/obio.c:1.9 Fri Jan 2 21:59:29 2015 +++ src/sys/arch/arm/rockchip/obio.c Fri Jan 2 23:23:17 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: obio.c,v 1.9 2015/01/02 21:59:29 jmcneill Exp $ */ +/* $NetBSD: obio.c,v 1.10 2015/01/02 23:23:17 jmcneill Exp $ */ /* * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc. @@ -38,7 +38,7 @@ #include opt_rockchip.h #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: obio.c,v 1.9 2015/01/02 21:59:29 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: obio.c,v 1.10 2015/01/02 23:23:17 jmcneill Exp $); #include sys/param.h #include sys/systm.h @@ -237,22 +237,22 @@ void obio_init_gpio(void) { #if 1 /* Radxa Rock */ - obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(3)); obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(3)); - obio_swporta(ROCKCHIP_GPIO2_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(31)); + obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(3)); obio_swporta(ROCKCHIP_GPIO2_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(31)); + obio_swporta(ROCKCHIP_GPIO2_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(31)); /* IT66121 HDMI */ - obio_swporta(ROCKCHIP_GPIO3_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(10)); obio_swporta(ROCKCHIP_GPIO3_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(10)); + obio_swporta(ROCKCHIP_GPIO3_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(10)); #else /* ChipSPARK Rayeager PX2 */ - obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(5)); obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(5)); - obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(6)); + obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(5)); obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(6)); - obio_swporta(ROCKCHIP_GPIO1_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(31)); + obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(6)); obio_swporta(ROCKCHIP_GPIO1_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(31)); + obio_swporta(ROCKCHIP_GPIO1_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(31)); #endif }
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Thu Jan 1 15:18:45 UTC 2015 Modified Files: src/sys/arch/arm/rockchip: rockchip_i2c.c Log Message: drop clk rate to 100kHz, explicit register initialization, shift slave addr left 1, add some more debugging, now this works To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/rockchip/rockchip_i2c.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/rockchip/rockchip_i2c.c diff -u src/sys/arch/arm/rockchip/rockchip_i2c.c:1.3 src/sys/arch/arm/rockchip/rockchip_i2c.c:1.4 --- src/sys/arch/arm/rockchip/rockchip_i2c.c:1.3 Tue Dec 30 18:57:36 2014 +++ src/sys/arch/arm/rockchip/rockchip_i2c.c Thu Jan 1 15:18:45 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_i2c.c,v 1.3 2014/12/30 18:57:36 jmcneill Exp $ */ +/* $NetBSD: rockchip_i2c.c,v 1.4 2015/01/01 15:18:45 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -30,7 +30,7 @@ #include opt_rkiic.h #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: rockchip_i2c.c,v 1.3 2014/12/30 18:57:36 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: rockchip_i2c.c,v 1.4 2015/01/01 15:18:45 jmcneill Exp $); #include sys/param.h #include sys/bus.h @@ -48,7 +48,7 @@ __KERNEL_RCSID(0, $NetBSD: rockchip_i2c #include dev/i2c/i2cvar.h -#define RKIIC_CLOCK_RATE 40 +#define RKIIC_CLOCK_RATE 10 struct rkiic_softc { device_t sc_dev; @@ -129,6 +129,14 @@ rkiic_attach(device_t parent, device_t s } } + if (rkiic_set_rate(sc, RKIIC_CLOCK_RATE) != 0) { + aprint_error_dev(sc-sc_dev, couldn't set clock rate\n); + return; + } + + I2C_WRITE(sc, I2C_CON_REG, 0); + I2C_WRITE(sc, I2C_IEN_REG, 0); + sc-sc_ic.ic_cookie = sc; sc-sc_ic.ic_acquire_bus = rkiic_acquire_bus; sc-sc_ic.ic_release_bus = rkiic_release_bus; @@ -151,6 +159,10 @@ rkiic_intr(void *priv) I2C_WRITE(sc, I2C_IPD_REG, ipd); +#ifdef RKIIC_INTR + device_printf(sc-sc_dev, %s: ipd %#x\n, __func__, ipd); +#endif + mutex_enter(sc-sc_lock); sc-sc_intr_ipd |= ipd; cv_broadcast(sc-sc_cv); @@ -183,12 +195,12 @@ rkiic_exec(void *priv, i2c_op_t op, i2c_ { struct rkiic_softc *sc = priv; uint32_t con, ien; - u_int mode; + u_int mode, sraddr; int error; KASSERT(mutex_owned(sc-sc_lock)); - if (sc-sc_ih == NULL) { + if (sc-sc_ih == NULL || cold) { flags |= I2C_F_POLL; } @@ -199,30 +211,27 @@ rkiic_exec(void *priv, i2c_op_t op, i2c_ if (error) return error; - I2C_WRITE(sc, I2C_MRXADDR_REG, I2C_MRXADDR_ADDLVLD | - __SHIFTIN(addr, I2C_MRXADDR_SADDR)); - if (cmdlen == 1) { - const uint8_t reg = *(const uint8_t *)cmdbuf; if (I2C_OP_READ_P(op)) { mode = I2C_CON_MODE_TRX; } else { mode = I2C_CON_MODE_TX; } - I2C_WRITE(sc, I2C_MRXRADDR_REG, I2C_MRXRADDR_SRADDLVLD | - __SHIFTIN(reg, I2C_MRXRADDR_SRADDR)); + sraddr = *(const uint8_t *)cmdbuf; } else { if (I2C_OP_READ_P(op)) { mode = I2C_CON_MODE_RX; } else { mode = I2C_CON_MODE_TX; } - I2C_WRITE(sc, I2C_MRXRADDR_REG, 0); + sraddr = 0; } sc-sc_intr_ipd = 0; + I2C_WRITE(sc, I2C_IPD_REG, I2C_READ(sc, I2C_IPD_REG)); - ien = I2C_INT_START | (I2C_OP_READ_P(op) ? I2C_INT_MBRF : I2C_INT_MBTF); + ien = I2C_OP_READ_P(op) ? I2C_INT_MBRF : I2C_INT_MBTF; + ien |= I2C_INT_START | I2C_INT_STOP | I2C_INT_NAKRCV; I2C_WRITE(sc, I2C_IEN_REG, ien); con = I2C_CON_START | I2C_CON_EN | I2C_CON_ACK | @@ -236,6 +245,13 @@ rkiic_exec(void *priv, i2c_op_t op, i2c_ #endif goto done; } + con = ~I2C_CON_START; + I2C_WRITE(sc, I2C_CON_REG, con); + + I2C_WRITE(sc, I2C_MRXADDR_REG, I2C_MRXADDR_ADDLVLD | + __SHIFTIN((addr 1), I2C_MRXADDR_SADDR)); + I2C_WRITE(sc, I2C_MRXRADDR_REG, I2C_MRXRADDR_SRADDLVLD | + __SHIFTIN(sraddr, I2C_MRXRADDR_SRADDR)); if (I2C_OP_READ_P(op)) { error = rkiic_read(sc, addr, buf, len, flags); @@ -244,10 +260,22 @@ rkiic_exec(void *priv, i2c_op_t op, i2c_ } if (I2C_OP_STOP_P(op)) { - I2C_WRITE(sc, I2C_CON_REG, I2C_CON_STOP); + con = I2C_READ(sc, I2C_CON_REG); + con |= I2C_CON_STOP; + I2C_WRITE(sc, I2C_CON_REG, con); + if (rkiic_wait(sc, I2C_INT_STOP, hz, flags) != 0) { +#ifdef RKIIC_DEBUG + device_printf(sc-sc_dev, timeout waiting for stop\n); +#endif + error = ETIMEDOUT; + goto done; + } + con = ~I2C_CON_STOP; + I2C_WRITE(sc, I2C_CON_REG, con); } done: + I2C_WRITE(sc, I2C_CON_REG, 0); I2C_WRITE(sc, I2C_IEN_REG, 0); return error; } @@ -283,6 +311,9 @@ rkiic_wait(struct rkiic_softc *sc, uint3 } } +#ifdef RKIIC_DEBUG + device_printf(sc-sc_dev, %s: ipd %#x\n, __func__, sc-sc_intr_ipd); +#endif return ETIMEDOUT; } @@ -307,6 +338,13 @@ rkiic_read(struct rkiic_softc *sc, i2c_a return error; } + if (sc-sc_intr_ipd I2C_INT_NAKRCV) { +#ifdef RKIIC_DEBUG + device_printf(sc-sc_dev, nak received\n); +#endif + return EIO; + } + for (off = 0, resid = buflen; off 8 resid 0; off++) { const
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Thu Jan 1 13:32:24 UTC 2015 Modified Files: src/sys/arch/arm/rockchip: obio.c Log Message: RK3188 I2C iomux init To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/rockchip/obio.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/rockchip/obio.c diff -u src/sys/arch/arm/rockchip/obio.c:1.5 src/sys/arch/arm/rockchip/obio.c:1.6 --- src/sys/arch/arm/rockchip/obio.c:1.5 Tue Dec 30 17:15:31 2014 +++ src/sys/arch/arm/rockchip/obio.c Thu Jan 1 13:32:24 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: obio.c,v 1.5 2014/12/30 17:15:31 jmcneill Exp $ */ +/* $NetBSD: obio.c,v 1.6 2015/01/01 13:32:24 jmcneill Exp $ */ /* * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc. @@ -38,7 +38,7 @@ #include opt_rockchip.h #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: obio.c,v 1.5 2014/12/30 17:15:31 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: obio.c,v 1.6 2015/01/01 13:32:24 jmcneill Exp $); #include sys/param.h #include sys/systm.h @@ -169,11 +169,29 @@ obio_search(device_t parent, cfdata_t cf return 0; } +#define RK3188_GRF_GPIO0C_IOMUX_OFFSET 0x0068 +#define RK3188_GRF_GPIO0D_IOMUX_OFFSET 0x006C + +#define RK3188_GRF_GPIO1A_IOMUX_OFFSET 0x0070 +#define RK3188_GRF_GPIO1B_IOMUX_OFFSET 0x0074 +#define RK3188_GRF_GPIO1C_IOMUX_OFFSET 0x0078 +#define RK3188_GRF_GPIO1D_IOMUX_OFFSET 0x007C + +#define RK3188_GRF_GPIO2A_IOMUX_OFFSET 0x0080 +#define RK3188_GRF_GPIO2B_IOMUX_OFFSET 0x0084 +#define RK3188_GRF_GPIO2C_IOMUX_OFFSET 0x0088 +#define RK3188_GRF_GPIO2D_IOMUX_OFFSET 0x008C + #define RK3188_GRF_GPIO3A_IOMUX_OFFSET 0x0090 #define RK3188_GRF_GPIO3B_IOMUX_OFFSET 0x0094 #define RK3188_GRF_GPIO3C_IOMUX_OFFSET 0x0098 #define RK3188_GRF_GPIO3D_IOMUX_OFFSET 0x009C +#define RK3188_GRF_SOC_CON0_OFFSET 0x00A0 +#define RK3188_GRF_SOC_CON1_OFFSET 0x00A4 +#define RK3188_GRF_SOC_CON2_OFFSET 0x00A8 +#define RK3188_GRF_SOC_STATUS_OFFSET 0x00AC + #define GRF_GPIO0A_IOMUX_OFFSET 0x00a8 #define GRF_GPIO3A_IOMUX_OFFSET 0x00d8 #define GRF_GPIO3B_IOMUX_OFFSET 0x00dc @@ -185,6 +203,9 @@ void obio_init_grf(void) obio_iomux(RK3188_GRF_GPIO3A_IOMUX_OFFSET, 0x5554); /* MMC0 */ obio_iomux(RK3188_GRF_GPIO3B_IOMUX_OFFSET, 0x00050001); /* MMC0 */ obio_iomux(RK3188_GRF_GPIO3D_IOMUX_OFFSET, 0x3c00); /* VBUS */ + obio_iomux(RK3188_GRF_GPIO1D_IOMUX_OFFSET, 0x); /* I2C[0124] */ + obio_iomux(RK3188_GRF_GPIO3B_IOMUX_OFFSET, 0xa000a000); /* I2C3 */ + obio_iomux(RK3188_GRF_SOC_CON1_OFFSET, 0xf800f800); /* I2C[01234] */ #else /* ChipSPARK Rayeager PX2 */ obio_iomux(GRF_GPIO0A_IOMUX_OFFSET, 0x1400); /* VBUS */
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Thu Jan 1 22:15:40 UTC 2015 Modified Files: src/sys/arch/arm/rockchip: rockchip_i2c.c Log Message: Include addr and reg in data sent with rkiic_write, now writes work too. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/rockchip/rockchip_i2c.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/rockchip/rockchip_i2c.c diff -u src/sys/arch/arm/rockchip/rockchip_i2c.c:1.4 src/sys/arch/arm/rockchip/rockchip_i2c.c:1.5 --- src/sys/arch/arm/rockchip/rockchip_i2c.c:1.4 Thu Jan 1 15:18:45 2015 +++ src/sys/arch/arm/rockchip/rockchip_i2c.c Thu Jan 1 22:15:40 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_i2c.c,v 1.4 2015/01/01 15:18:45 jmcneill Exp $ */ +/* $NetBSD: rockchip_i2c.c,v 1.5 2015/01/01 22:15:40 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -30,7 +30,7 @@ #include opt_rkiic.h #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: rockchip_i2c.c,v 1.4 2015/01/01 15:18:45 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: rockchip_i2c.c,v 1.5 2015/01/01 22:15:40 jmcneill Exp $); #include sys/param.h #include sys/bus.h @@ -207,6 +207,14 @@ rkiic_exec(void *priv, i2c_op_t op, i2c_ if (cmdlen != 0 cmdlen != 1) return EINVAL; + if (I2C_OP_READ_P(op)) { + if (len 32) + return EINVAL; + } else { + if (len 30) + return EINVAL; + } + error = rkiic_set_rate(sc, RKIIC_CLOCK_RATE); if (error) return error; @@ -256,7 +264,15 @@ rkiic_exec(void *priv, i2c_op_t op, i2c_ if (I2C_OP_READ_P(op)) { error = rkiic_read(sc, addr, buf, len, flags); } else { - error = rkiic_write(sc, addr, buf, len, flags); + uint8_t tmp_buf[32]; + tmp_buf[0] = addr 1; + if (cmdlen == 1) { + tmp_buf[1] = sraddr; + memcpy(tmp_buf[2], buf, len); + } else { + memcpy(tmp_buf[1], buf, len); + } + error = rkiic_write(sc, addr, tmp_buf, len + cmdlen + 1, flags); } if (I2C_OP_STOP_P(op)) { @@ -369,7 +385,7 @@ rkiic_write(struct rkiic_softc *sc, i2c_ for (off = 0, resid = buflen; off 8 resid 0; off++) { uint32_t data = 0; for (byte = 0; byte 4 resid 0; byte++, resid--) { - data |= buf[off * 4 + byte] (byte * 8); + data |= (uint32_t)buf[off * 4 + byte] (byte * 8); } I2C_WRITE(sc, I2C_TXDATA_REG(off), data); }
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Thu Jan 1 18:59:03 UTC 2015 Modified Files: src/sys/arch/arm/rockchip: obio.c Log Message: obio_init_gpio: set pin direction to output before writing data To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/rockchip/obio.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/rockchip/obio.c diff -u src/sys/arch/arm/rockchip/obio.c:1.7 src/sys/arch/arm/rockchip/obio.c:1.8 --- src/sys/arch/arm/rockchip/obio.c:1.7 Thu Jan 1 18:25:52 2015 +++ src/sys/arch/arm/rockchip/obio.c Thu Jan 1 18:59:03 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: obio.c,v 1.7 2015/01/01 18:25:52 jmcneill Exp $ */ +/* $NetBSD: obio.c,v 1.8 2015/01/01 18:59:03 jmcneill Exp $ */ /* * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc. @@ -38,7 +38,7 @@ #include opt_rockchip.h #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: obio.c,v 1.7 2015/01/01 18:25:52 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: obio.c,v 1.8 2015/01/01 18:59:03 jmcneill Exp $); #include sys/param.h #include sys/systm.h @@ -237,22 +237,22 @@ void obio_init_gpio(void) { #if 1 /* Radxa Rock */ - obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(3)); obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(3)); - obio_swporta(ROCKCHIP_GPIO2_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(31)); + obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(3)); obio_swporta(ROCKCHIP_GPIO2_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(31)); + obio_swporta(ROCKCHIP_GPIO2_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(31)); /* IT66121 HDMI */ - obio_swporta(ROCKCHIP_GPIO3_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(10)); obio_swporta(ROCKCHIP_GPIO3_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(10)); + obio_swporta(ROCKCHIP_GPIO3_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(10)); #else /* ChipSPARK Rayeager PX2 */ - obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(5)); obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(5)); - obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(6)); + obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(5)); obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(6)); - obio_swporta(ROCKCHIP_GPIO1_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(31)); + obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(6)); obio_swporta(ROCKCHIP_GPIO1_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(31)); + obio_swporta(ROCKCHIP_GPIO1_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(31)); #endif }
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Thu Jan 1 18:25:52 UTC 2015 Modified Files: src/sys/arch/arm/rockchip: obio.c Log Message: IT66121 HDMI transmitter GPIO setup To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/rockchip/obio.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/rockchip/obio.c diff -u src/sys/arch/arm/rockchip/obio.c:1.6 src/sys/arch/arm/rockchip/obio.c:1.7 --- src/sys/arch/arm/rockchip/obio.c:1.6 Thu Jan 1 13:32:24 2015 +++ src/sys/arch/arm/rockchip/obio.c Thu Jan 1 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: obio.c,v 1.6 2015/01/01 13:32:24 jmcneill Exp $ */ +/* $NetBSD: obio.c,v 1.7 2015/01/01 18:25:52 jmcneill Exp $ */ /* * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc. @@ -38,7 +38,7 @@ #include opt_rockchip.h #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: obio.c,v 1.6 2015/01/01 13:32:24 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: obio.c,v 1.7 2015/01/01 18:25:52 jmcneill Exp $); #include sys/param.h #include sys/systm.h @@ -241,6 +241,10 @@ void obio_init_gpio(void) obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(3)); obio_swporta(ROCKCHIP_GPIO2_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(31)); obio_swporta(ROCKCHIP_GPIO2_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(31)); + + /* IT66121 HDMI */ + obio_swporta(ROCKCHIP_GPIO3_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(10)); + obio_swporta(ROCKCHIP_GPIO3_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(10)); #else /* ChipSPARK Rayeager PX2 */ obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(5));
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Wed Dec 31 18:09:06 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_board.c Log Message: Cleanup freq setting a bit. Add a table of supported rates in ~200MHz steps from 600MHz to 1608MHz, and let the cpu.frequency parameter match the closest available freq (without going over +50MHz). After updating APLL, wait for PLL lock. Do APLL changes with PLL mode set to slow, rather than the previous (and more complex) APLL/GPLL dance. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/arch/arm/rockchip/rockchip_board.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/rockchip/rockchip_board.c diff -u src/sys/arch/arm/rockchip/rockchip_board.c:1.8 src/sys/arch/arm/rockchip/rockchip_board.c:1.9 --- src/sys/arch/arm/rockchip/rockchip_board.c:1.8 Wed Dec 31 16:16:35 2014 +++ src/sys/arch/arm/rockchip/rockchip_board.c Wed Dec 31 18:09:05 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_board.c,v 1.8 2014/12/31 16:16:35 jmcneill Exp $ */ +/* $NetBSD: rockchip_board.c,v 1.9 2014/12/31 18:09:05 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -29,7 +29,7 @@ #include opt_rockchip.h #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: rockchip_board.c,v 1.8 2014/12/31 16:16:35 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: rockchip_board.c,v 1.9 2014/12/31 18:09:05 jmcneill Exp $); #include sys/param.h #include sys/bus.h @@ -83,6 +83,13 @@ rockchip_get_cru_bsh(bus_space_handle_t ROCKCHIP_CRU_OFFSET, ROCKCHIP_CRU_SIZE, pbsh); } +static void +rockchip_get_grf_bsh(bus_space_handle_t *pbsh) +{ + bus_space_subregion(rockchip_bs_tag, rockchip_core1_bsh, + ROCKCHIP_GRF_OFFSET, ROCKCHIP_GRF_SIZE, pbsh); +} + static u_int rockchip_pll_get_rate(bus_size_t con0_reg, bus_size_t con1_reg) { @@ -127,80 +134,68 @@ rockchip_apll_get_rate(void) return rockchip_pll_get_rate(CRU_APLL_CON0_REG, CRU_APLL_CON1_REG); } +struct rk3188_apll_rate { + u_int rate; + u_int nr, nf, no; + u_int core_div, core_periph_div, core_axi_div; + u_int aclk_div, hclk_div, pclk_div, ahb2apb_div; +}; + +#define RK3188_RATE(_r, _nf, _no, _p, _a, _aclk, _hclk, _pclk, _ahb2apb) \ + { .rate = (_r) * 100, .nr = 1, .nf = (_nf), .no = (_no), \ + .core_div = 1, .core_periph_div = (_p), .core_axi_div = (_a), \ + .aclk_div = (_aclk), .hclk_div = (_hclk), .pclk_div = (_pclk), \ + .ahb2apb_div = (_ahb2apb) } + +static const struct rk3188_apll_rate rk3188_apll_rates[] = { + RK3188_RATE(1608, 67, 1, 8, 4, 4, 2, 4, 2), + RK3188_RATE(1416, 59, 1, 8, 4, 4, 2, 4, 2), + RK3188_RATE(1200, 50, 1, 8, 4, 4, 2, 4, 2), + RK3188_RATE(1008, 42, 1, 8, 3, 3, 2, 4, 2), + RK3188_RATE( 816, 68, 2, 8, 4, 3, 2, 4, 2), + RK3188_RATE( 600, 50, 2, 4, 4, 3, 2, 4, 2), +}; + +#define RK3188_GRF_STATUS0_REG 0x00ac +#define RK3188_GRF_STATUS0_APLL_LOCK __BIT(6) + static u_int rk3188_apll_set_rate(u_int rate) { + const struct rk3188_apll_rate *r = NULL; bus_space_tag_t bst = rockchip_bs_tag; - bus_space_handle_t bsh; + bus_space_handle_t bsh, grf_bsh; uint32_t apll_con0, apll_con1, apll_con2, clksel0_con, clksel1_con; uint32_t reset_mask, reset; - u_int no, nr, nf, core_div, core_periph_div, core_axi_div, - aclk_div, hclk_div, pclk_div, ahb2apb_div; u_int cpu_aclk_div_con; const bool rk3188plus_p = rockchip_is_chip(ROCKCHIP_CHIPVER_RK3188PLUS); rockchip_get_cru_bsh(bsh); + rockchip_get_grf_bsh(grf_bsh); #ifdef ROCKCHIP_CLOCK_DEBUG printf(%s: rate=%u rk3188plus_p=%d\n, __func__, rate, rk3188plus_p); #endif - switch (rate) { - case 160800: - nr = 1; - nf = 67; - no = 1; - core_div = 1; - core_periph_div = 8; - core_axi_div = 4; - aclk_div = 4; - hclk_div = 2; - pclk_div = 4; - ahb2apb_div = 2; - break; - case 141600: - nr = 1; - nf = 59; - no = 1; - core_div = 1; - core_periph_div = 8; - core_axi_div = 4; - aclk_div = 4; - hclk_div = 2; - pclk_div = 4; - ahb2apb_div = 2; - break; - case 100800: - nr = 1; - nf = 42; - no = 1; - core_div = 1; - core_periph_div = 8; - core_axi_div = 3; - aclk_div = 3; - hclk_div = 2; - pclk_div = 4; - ahb2apb_div = 2; - break; - case 6: - nr = 1; - nf = 50; - no = 2; - core_div = 1; - core_periph_div = 4; - core_axi_div = 4; - aclk_div = 3; - hclk_div = 2; - pclk_div = 4; - ahb2apb_div = 2; - break; - default: + /* Pick the closest rate (nearest 100MHz increment) */ + for (int i = 0; i __arraycount(rk3188_apll_rates); i++) { + u_int trate = rate / 100; + u_int arate = ((rk3188_apll_rates[i].rate / 100) + 50) + / 100 * 100; + if (arate = trate) { + r = rk3188_apll_rates[i]; + break; + } + } + if (r == NULL) { #ifdef ROCKCHIP_CLOCK_DEBUG - printf(%s: unsupported rate %u\n, __func__, rate); + printf(CPU: No matching rate found for %u MHz\n, rate); #endif - return EINVAL; + return
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Wed Dec 31 18:08:58 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_crureg.h Log Message: add some more bits To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/rockchip/rockchip_crureg.h 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/rockchip/rockchip_crureg.h diff -u src/sys/arch/arm/rockchip/rockchip_crureg.h:1.5 src/sys/arch/arm/rockchip/rockchip_crureg.h:1.6 --- src/sys/arch/arm/rockchip/rockchip_crureg.h:1.5 Tue Dec 30 03:53:52 2014 +++ src/sys/arch/arm/rockchip/rockchip_crureg.h Wed Dec 31 18:08:58 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_crureg.h,v 1.5 2014/12/30 03:53:52 jmcneill Exp $ */ +/* $NetBSD: rockchip_crureg.h,v 1.6 2014/12/31 18:08:58 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -62,7 +62,12 @@ #define CRU_PLL_CON1_CLKF_MASK __BITS(31,16) #define CRU_PLL_CON1_CLKF __BITS(15,0) +#define CRU_PLL_CON2_BWADJ_MASK __BITS(27,16) +#define CRU_PLL_CON2_BWADJ __BITS(11,0) + +#define CRU_PLL_CON3_RESET_MASK __BIT(21) #define CRU_PLL_CON3_POWER_DOWN_MASK __BIT(17) +#define CRU_PLL_CON3_RESET __BIT(5) #define CRU_PLL_CON3_POWER_DOWN __BIT(1) #define CRU_MODE_CON_APLL_WORK_MODE_MASK __BITS(17,16) @@ -105,6 +110,11 @@ #define CRU_CLKSEL_CON11_MMC0_PLL_SEL __BIT(6) #define CRU_CLKSEL_CON11_MMC0_DIV_CON __BITS(5,0) +#define CRU_CLKSEL_CON13_UART0_CLK_SEL_MASK __BITS(25,24) +#define CRU_CLKSEL_CON13_UART0_DIV_CON_MASK __BITS(22,16) +#define CRU_CLKSEL_CON13_UART0_CLK_SEL __BITS(9,8) +#define CRU_CLKSEL_CON13_UART0_DIV_CON __BITS(6,0) + #define CRU_GLB_SRST_FST_MAGIC 0xfdb9 #endif /* !_ROCKCHIP_CRUREG_H */
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Wed Dec 31 16:16:35 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_board.c Log Message: add RK3188plus freq scaling, and a 1.4GHz mode. anything above 1GHz with all 4 cores enabled seems to have trouble locking apll, needs more work To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/rockchip/rockchip_board.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/rockchip/rockchip_board.c diff -u src/sys/arch/arm/rockchip/rockchip_board.c:1.7 src/sys/arch/arm/rockchip/rockchip_board.c:1.8 --- src/sys/arch/arm/rockchip/rockchip_board.c:1.7 Tue Dec 30 17:15:31 2014 +++ src/sys/arch/arm/rockchip/rockchip_board.c Wed Dec 31 16:16:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_board.c,v 1.7 2014/12/30 17:15:31 jmcneill Exp $ */ +/* $NetBSD: rockchip_board.c,v 1.8 2014/12/31 16:16:35 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -29,7 +29,7 @@ #include opt_rockchip.h #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: rockchip_board.c,v 1.7 2014/12/30 17:15:31 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: rockchip_board.c,v 1.8 2014/12/31 16:16:35 jmcneill Exp $); #include sys/param.h #include sys/bus.h @@ -37,6 +37,7 @@ __KERNEL_RCSID(0, $NetBSD: rockchip_boa #include sys/device.h #include arm/bootconfig.h +#include arm/cpufunc.h #include arm/rockchip/rockchip_reg.h #include arm/rockchip/rockchip_crureg.h @@ -131,15 +132,17 @@ rk3188_apll_set_rate(u_int rate) { bus_space_tag_t bst = rockchip_bs_tag; bus_space_handle_t bsh; - uint32_t apll_con0, apll_con1, clksel0_con, clksel1_con; + uint32_t apll_con0, apll_con1, apll_con2, clksel0_con, clksel1_con; + uint32_t reset_mask, reset; u_int no, nr, nf, core_div, core_periph_div, core_axi_div, aclk_div, hclk_div, pclk_div, ahb2apb_div; u_int cpu_aclk_div_con; + const bool rk3188plus_p = rockchip_is_chip(ROCKCHIP_CHIPVER_RK3188PLUS); rockchip_get_cru_bsh(bsh); #ifdef ROCKCHIP_CLOCK_DEBUG - printf(%s: rate=%u\n, __func__, rate); + printf(%s: rate=%u rk3188plus_p=%d\n, __func__, rate, rk3188plus_p); #endif switch (rate) { @@ -155,6 +158,18 @@ rk3188_apll_set_rate(u_int rate) pclk_div = 4; ahb2apb_div = 2; break; + case 141600: + nr = 1; + nf = 59; + no = 1; + core_div = 1; + core_periph_div = 8; + core_axi_div = 4; + aclk_div = 4; + hclk_div = 2; + pclk_div = 4; + ahb2apb_div = 2; + break; case 100800: nr = 1; nf = 42; @@ -186,6 +201,14 @@ rk3188_apll_set_rate(u_int rate) return EINVAL; } + if (rk3188plus_p) { + reset_mask = CRU_PLL_CON3_RESET_MASK; + reset = CRU_PLL_CON3_RESET; + } else { + reset_mask = CRU_PLL_CON3_POWER_DOWN_MASK; + reset = CRU_PLL_CON3_POWER_DOWN; + } + apll_con0 = CRU_PLL_CON0_CLKR_MASK | CRU_PLL_CON0_CLKOD_MASK; apll_con0 |= __SHIFTIN(no - 1, CRU_PLL_CON0_CLKOD); apll_con0 |= __SHIFTIN(nr - 1, CRU_PLL_CON0_CLKR); @@ -193,10 +216,16 @@ rk3188_apll_set_rate(u_int rate) apll_con1 = CRU_PLL_CON1_CLKF_MASK; apll_con1 |= __SHIFTIN(nf - 1, CRU_PLL_CON1_CLKF); + if (rk3188plus_p) { + apll_con2 = CRU_PLL_CON2_BWADJ_MASK; + apll_con2 |= __SHIFTIN(nf 1, CRU_PLL_CON2_BWADJ); + } else { + apll_con2 = 0; + } + clksel0_con = RK3188_CRU_CLKSEL_CON0_A9_CORE_DIV_CON_MASK | CRU_CLKSEL_CON0_CORE_PERI_DIV_CON_MASK | - CRU_CLKSEL_CON0_A9_CORE_DIV_CON_MASK | - CRU_CLKSEL_CON0_CPU_CLK_PLL_SEL; + CRU_CLKSEL_CON0_A9_CORE_DIV_CON_MASK; clksel0_con |= __SHIFTIN(core_div - 1, RK3188_CRU_CLKSEL_CON0_A9_CORE_DIV_CON); clksel0_con |= __SHIFTIN(ffs(core_periph_div) - 2, @@ -204,11 +233,10 @@ rk3188_apll_set_rate(u_int rate) clksel0_con |= __SHIFTIN(aclk_div - 1, CRU_CLKSEL_CON0_A9_CORE_DIV_CON); - clksel1_con = RK3188_CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON_MASK | - CRU_CLKSEL_CON1_AHB2APB_PCLKEN_DIV_CON_MASK | + clksel1_con = CRU_CLKSEL_CON1_AHB2APB_PCLKEN_DIV_CON_MASK | CRU_CLKSEL_CON1_CPU_PCLK_DIV_CON_MASK | CRU_CLKSEL_CON1_CPU_HCLK_DIV_CON_MASK; - + switch (core_axi_div) { case 1: cpu_aclk_div_con = 0; break; case 2: cpu_aclk_div_con = 1; break; @@ -217,8 +245,6 @@ rk3188_apll_set_rate(u_int rate) case 8: cpu_aclk_div_con = 4; break; default: panic(bad core_axi_div); } - clksel1_con |= __SHIFTIN(cpu_aclk_div_con, - RK3188_CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON); clksel1_con |= __SHIFTIN(ffs(ahb2apb_div) - 1, CRU_CLKSEL_CON1_AHB2APB_PCLKEN_DIV_CON); clksel1_con |= __SHIFTIN(ffs(hclk_div) - 1, @@ -237,40 +263,48 @@ rk3188_apll_set_rate(u_int rate) bus_space_read_4(bst, bsh, CRU_CLKSEL_CON_REG(1))); #endif - /* Change from normal to slow mode */ - bus_space_write_4(bst, bsh, CRU_MODE_CON_REG, - CRU_MODE_CON_APLL_WORK_MODE_MASK | - __SHIFTIN(CRU_MODE_CON_APLL_WORK_MODE_SLOW, - CRU_MODE_CON_APLL_WORK_MODE)); +
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Wed Dec 31 18:14:15 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_board.c Log Message: fix typo in 1008MHz rate definition for rk3188 To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/sys/arch/arm/rockchip/rockchip_board.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/rockchip/rockchip_board.c diff -u src/sys/arch/arm/rockchip/rockchip_board.c:1.9 src/sys/arch/arm/rockchip/rockchip_board.c:1.10 --- src/sys/arch/arm/rockchip/rockchip_board.c:1.9 Wed Dec 31 18:09:05 2014 +++ src/sys/arch/arm/rockchip/rockchip_board.c Wed Dec 31 18:14:14 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_board.c,v 1.9 2014/12/31 18:09:05 jmcneill Exp $ */ +/* $NetBSD: rockchip_board.c,v 1.10 2014/12/31 18:14:14 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -29,7 +29,7 @@ #include opt_rockchip.h #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: rockchip_board.c,v 1.9 2014/12/31 18:09:05 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: rockchip_board.c,v 1.10 2014/12/31 18:14:14 jmcneill Exp $); #include sys/param.h #include sys/bus.h @@ -151,7 +151,7 @@ static const struct rk3188_apll_rate rk3 RK3188_RATE(1608, 67, 1, 8, 4, 4, 2, 4, 2), RK3188_RATE(1416, 59, 1, 8, 4, 4, 2, 4, 2), RK3188_RATE(1200, 50, 1, 8, 4, 4, 2, 4, 2), - RK3188_RATE(1008, 42, 1, 8, 3, 3, 2, 4, 2), + RK3188_RATE(1008, 42, 1, 8, 4, 3, 2, 4, 2), RK3188_RATE( 816, 68, 2, 8, 4, 3, 2, 4, 2), RK3188_RATE( 600, 50, 2, 4, 4, 3, 2, 4, 2), };
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Tue Dec 30 12:38:20 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: obio.c Log Message: MMC0/VBUS GPIO changes for Radxa Rock, from FUKAUMI Naoki f...@naobsd.org. XXX Need to find a way to handle board-specific configurations. To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/rockchip/obio.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/rockchip/obio.c diff -u src/sys/arch/arm/rockchip/obio.c:1.3 src/sys/arch/arm/rockchip/obio.c:1.4 --- src/sys/arch/arm/rockchip/obio.c:1.3 Sat Dec 27 16:18:50 2014 +++ src/sys/arch/arm/rockchip/obio.c Tue Dec 30 12:38:20 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: obio.c,v 1.3 2014/12/27 16:18:50 jmcneill Exp $ */ +/* $NetBSD: obio.c,v 1.4 2014/12/30 12:38:20 jmcneill Exp $ */ /* * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc. @@ -38,7 +38,7 @@ #include opt_rockchip.h #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: obio.c,v 1.3 2014/12/27 16:18:50 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: obio.c,v 1.4 2014/12/30 12:38:20 jmcneill Exp $); #include sys/param.h #include sys/systm.h @@ -166,16 +166,28 @@ obio_search(device_t parent, cfdata_t cf return 0; } -#define GRF_GPIO3A_IOMUX_OFFSET 0x0090 -#define GRF_GPIO3B_IOMUX_OFFSET 0x0094 -#define GRF_GPIO3C_IOMUX_OFFSET 0x0098 -#define GRF_GPIO3D_IOMUX_OFFSET 0x009C +#define RK3188_GRF_GPIO3A_IOMUX_OFFSET 0x0090 +#define RK3188_GRF_GPIO3B_IOMUX_OFFSET 0x0094 +#define RK3188_GRF_GPIO3C_IOMUX_OFFSET 0x0098 +#define RK3188_GRF_GPIO3D_IOMUX_OFFSET 0x009C + +#define GRF_GPIO0A_IOMUX_OFFSET 0x00a8 +#define GRF_GPIO3A_IOMUX_OFFSET 0x00d8 +#define GRF_GPIO3B_IOMUX_OFFSET 0x00dc void obio_init_grf(void) { - obio_iomux(GRF_GPIO3A_IOMUX_OFFSET, 0x); - obio_iomux(GRF_GPIO3B_IOMUX_OFFSET, 0x0004); - obio_iomux(GRF_GPIO3D_IOMUX_OFFSET, 0x1400); +#if 1 + /* Radxa Rock */ + obio_iomux(RK3188_GRF_GPIO3A_IOMUX_OFFSET, 0x5554); /* MMC0 */ + obio_iomux(RK3188_GRF_GPIO3B_IOMUX_OFFSET, 0x00050001); /* MMC0 */ + obio_iomux(RK3188_GRF_GPIO3D_IOMUX_OFFSET, 0x3c00); /* VBUS */ +#else + /* ChipSPARK Rayeager PX2 */ + obio_iomux(GRF_GPIO0A_IOMUX_OFFSET, 0x1400); /* VBUS */ + obio_iomux(GRF_GPIO3A_IOMUX_OFFSET, 0x50004000); /* MMC0 */ + obio_iomux(GRF_GPIO3B_IOMUX_OFFSET, 0x1555); /* MMC0 */ +#endif } void obio_iomux(int offset, int new) @@ -188,7 +200,7 @@ void obio_iomux(int offset, int new) ROCKCHIP_GRF_SIZE, bh); old = bus_space_read_4(bt, bh, offset); - bus_space_write_4(bt, bh, offset, (old | new | 0x)); + bus_space_write_4(bt, bh, offset, new); renew = bus_space_read_4(bt, bh, offset); printf(grf iomux: old %08x, new %08x, renew %08x\n, old, new, renew); @@ -199,8 +211,21 @@ void obio_iomux(int offset, int new) void obio_init_gpio(void) { +#if 1 + /* Radxa Rock */ obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(3)); obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(3)); + obio_swporta(ROCKCHIP_GPIO2_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(31)); + obio_swporta(ROCKCHIP_GPIO2_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(31)); +#else + /* ChipSPARK Rayeager PX2 */ + obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(5)); + obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(5)); + obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(6)); + obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(6)); + obio_swporta(ROCKCHIP_GPIO1_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(31)); + obio_swporta(ROCKCHIP_GPIO1_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(31)); +#endif } void obio_swporta(int gpio_base, int offset, int new)
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Tue Dec 30 17:28:11 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_i2c.c Log Message: drop clock rate to 400kHz To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/rockchip/rockchip_i2c.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/rockchip/rockchip_i2c.c diff -u src/sys/arch/arm/rockchip/rockchip_i2c.c:1.1 src/sys/arch/arm/rockchip/rockchip_i2c.c:1.2 --- src/sys/arch/arm/rockchip/rockchip_i2c.c:1.1 Tue Dec 30 17:15:31 2014 +++ src/sys/arch/arm/rockchip/rockchip_i2c.c Tue Dec 30 17:28:11 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_i2c.c,v 1.1 2014/12/30 17:15:31 jmcneill Exp $ */ +/* $NetBSD: rockchip_i2c.c,v 1.2 2014/12/30 17:28:11 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -29,7 +29,7 @@ #include locators.h #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: rockchip_i2c.c,v 1.1 2014/12/30 17:15:31 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: rockchip_i2c.c,v 1.2 2014/12/30 17:28:11 jmcneill Exp $); #include sys/param.h #include sys/bus.h @@ -47,7 +47,7 @@ __KERNEL_RCSID(0, $NetBSD: rockchip_i2c #include dev/i2c/i2cvar.h -#define RKIIC_CLOCK_RATE 100 +#define RKIIC_CLOCK_RATE 40 struct rkiic_softc { device_t sc_dev;
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Tue Dec 30 18:57:36 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: files.rockchip rockchip_i2c.c rockchip_i2creg.h Log Message: Actually set slave addr / reg. Wait for start irq after sending start before transferring data. Add RKIIC_DEBUG kernel option. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/rockchip/files.rockchip cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/rockchip/rockchip_i2c.c cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/rockchip/rockchip_i2creg.h 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/rockchip/files.rockchip diff -u src/sys/arch/arm/rockchip/files.rockchip:1.4 src/sys/arch/arm/rockchip/files.rockchip:1.5 --- src/sys/arch/arm/rockchip/files.rockchip:1.4 Tue Dec 30 17:15:31 2014 +++ src/sys/arch/arm/rockchip/files.rockchip Tue Dec 30 18:57:36 2014 @@ -1,4 +1,4 @@ -# $NetBSD: files.rockchip,v 1.4 2014/12/30 17:15:31 jmcneill Exp $ +# $NetBSD: files.rockchip,v 1.5 2014/12/30 18:57:36 jmcneill Exp $ # # Configuration info for Rockchip ARM Peripherals # @@ -49,3 +49,4 @@ defparam opt_rockchip.h MEMSIZE # Debugging parameters defflag opt_rockchip.h ROCKCHIP_CLOCK_DEBUG +defflag opt_rkiic.h RKIIC_DEBUG Index: src/sys/arch/arm/rockchip/rockchip_i2c.c diff -u src/sys/arch/arm/rockchip/rockchip_i2c.c:1.2 src/sys/arch/arm/rockchip/rockchip_i2c.c:1.3 --- src/sys/arch/arm/rockchip/rockchip_i2c.c:1.2 Tue Dec 30 17:28:11 2014 +++ src/sys/arch/arm/rockchip/rockchip_i2c.c Tue Dec 30 18:57:36 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_i2c.c,v 1.2 2014/12/30 17:28:11 jmcneill Exp $ */ +/* $NetBSD: rockchip_i2c.c,v 1.3 2014/12/30 18:57:36 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -27,9 +27,10 @@ */ #include locators.h +#include opt_rkiic.h #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: rockchip_i2c.c,v 1.2 2014/12/30 17:28:11 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: rockchip_i2c.c,v 1.3 2014/12/30 18:57:36 jmcneill Exp $); #include sys/param.h #include sys/bus.h @@ -181,7 +182,7 @@ rkiic_exec(void *priv, i2c_op_t op, i2c_ const void *cmdbuf, size_t cmdlen, void *buf, size_t len, int flags) { struct rkiic_softc *sc = priv; - uint32_t con; + uint32_t con, ien; u_int mode; int error; @@ -191,32 +192,49 @@ rkiic_exec(void *priv, i2c_op_t op, i2c_ flags |= I2C_F_POLL; } + if (cmdlen != 0 cmdlen != 1) + return EINVAL; + error = rkiic_set_rate(sc, RKIIC_CLOCK_RATE); if (error) return error; - if (cmdlen 0) { + I2C_WRITE(sc, I2C_MRXADDR_REG, I2C_MRXADDR_ADDLVLD | + __SHIFTIN(addr, I2C_MRXADDR_SADDR)); + + if (cmdlen == 1) { + const uint8_t reg = *(const uint8_t *)cmdbuf; if (I2C_OP_READ_P(op)) { - mode = I2C_CON_MODE_RRX; - } else { mode = I2C_CON_MODE_TRX; + } else { + mode = I2C_CON_MODE_TX; } + I2C_WRITE(sc, I2C_MRXRADDR_REG, I2C_MRXRADDR_SRADDLVLD | + __SHIFTIN(reg, I2C_MRXRADDR_SRADDR)); } else { if (I2C_OP_READ_P(op)) { mode = I2C_CON_MODE_RX; } else { mode = I2C_CON_MODE_TX; } + I2C_WRITE(sc, I2C_MRXRADDR_REG, 0); } - con = I2C_CON_START | I2C_CON_EN | __SHIFTIN(mode, I2C_CON_MODE); + sc-sc_intr_ipd = 0; + + ien = I2C_INT_START | (I2C_OP_READ_P(op) ? I2C_INT_MBRF : I2C_INT_MBTF); + I2C_WRITE(sc, I2C_IEN_REG, ien); + + con = I2C_CON_START | I2C_CON_EN | I2C_CON_ACK | + __SHIFTIN(mode, I2C_CON_MODE); I2C_WRITE(sc, I2C_CON_REG, con); - if (cmdlen 0) { - error = rkiic_write(sc, addr, cmdbuf, cmdlen, flags); - if (error) { - goto done; - } + error = rkiic_wait(sc, I2C_INT_START, hz, flags); + if (error) { +#ifdef RKIIC_DEBUG + device_printf(sc-sc_dev, timeout waiting for start\n); +#endif + goto done; } if (I2C_OP_READ_P(op)) { @@ -225,11 +243,12 @@ rkiic_exec(void *priv, i2c_op_t op, i2c_ error = rkiic_write(sc, addr, buf, len, flags); } -done: if (I2C_OP_STOP_P(op)) { I2C_WRITE(sc, I2C_CON_REG, I2C_CON_STOP); } +done: + I2C_WRITE(sc, I2C_IEN_REG, 0); return error; } @@ -246,14 +265,14 @@ rkiic_wait(struct rkiic_softc *sc, uint3 if (flags I2C_F_POLL) { retry = (timeout / hz) * 100; while (retry 0) { - if (I2C_READ(sc, I2C_IPD_REG) mask) + sc-sc_intr_ipd |= I2C_READ(sc, I2C_IPD_REG); + if (sc-sc_intr_ipd mask) return 0; delay(1); --retry; } } else { retry = timeout / hz; - while (retry 0) { error = cv_timedwait(sc-sc_cv, sc-sc_lock, hz); if (error error != EWOULDBLOCK) @@ -278,17 +297,15 @@ rkiic_read(struct rkiic_softc *sc, i2c_a if (buflen 32) return EINVAL; - sc-sc_intr_ipd = 0; - - if (!(flags I2C_F_POLL)) { - I2C_WRITE(sc, I2C_IEN_REG, I2C_INT_MBRF); - } - I2C_WRITE(sc, I2C_MRXCNT_REG, __SHIFTIN(buflen, I2C_MRXCNT_COUNT)); error = rkiic_wait(sc, I2C_INT_MBRF, hz, flags); - if (error) - goto done; + if (error) {
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Mon Dec 29 23:59:52 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_dwcmmc.c Log Message: - Set DWC_MMC_F_FORCE_CLK - Force max sdmmc clk to 24MHz - Update for simpler dwcmmc clock setup To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/rockchip/rockchip_dwcmmc.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/rockchip/rockchip_dwcmmc.c diff -u src/sys/arch/arm/rockchip/rockchip_dwcmmc.c:1.3 src/sys/arch/arm/rockchip/rockchip_dwcmmc.c:1.4 --- src/sys/arch/arm/rockchip/rockchip_dwcmmc.c:1.3 Sun Dec 28 16:27:14 2014 +++ src/sys/arch/arm/rockchip/rockchip_dwcmmc.c Mon Dec 29 23:59:52 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_dwcmmc.c,v 1.3 2014/12/28 16:27:14 jmcneill Exp $ */ +/* $NetBSD: rockchip_dwcmmc.c,v 1.4 2014/12/29 23:59:52 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -27,7 +27,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: rockchip_dwcmmc.c,v 1.3 2014/12/28 16:27:14 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: rockchip_dwcmmc.c,v 1.4 2014/12/29 23:59:52 jmcneill Exp $); #include sys/param.h #include sys/bus.h @@ -48,8 +48,6 @@ static void rk_dwcmmc_attach(device_t, d static void rk_dwcmmc_attach_i(device_t); -static int rk_dwcmmc_set_clkdiv(struct dwc_mmc_softc *, int); - CFATTACH_DECL_NEW(rkdwcmmc, sizeof(struct dwc_mmc_softc), rk_dwcmmc_match, rk_dwcmmc_attach, NULL, NULL); @@ -65,13 +63,16 @@ rk_dwcmmc_attach(device_t parent, device struct dwc_mmc_softc *sc = device_private(self); struct obio_attach_args * const obio = aux; + rockchip_mmc0_set_div(1); + sc-sc_dev = self; sc-sc_bst = obio-obio_bst; sc-sc_dmat = obio-obio_dmat; - sc-sc_flags = DWC_MMC_F_USE_HOLD_REG | DWC_MMC_F_PWREN_CLEAR; - sc-sc_clock_freq = rockchip_ahb_get_rate(); - sc-sc_fifo_depth = 256; - sc-sc_set_clkdiv = rk_dwcmmc_set_clkdiv; + sc-sc_flags = DWC_MMC_F_USE_HOLD_REG | DWC_MMC_F_PWREN_CLEAR | + DWC_MMC_F_FORCE_CLK; + sc-sc_clock_freq = rockchip_mmc0_get_rate(); + sc-sc_clock_max = 24000; + sc-sc_fifo_depth = 32; bus_space_subregion(obio-obio_bst, obio-obio_bsh, obio-obio_offset, obio-obio_size, sc-sc_bsh); @@ -97,9 +98,3 @@ rk_dwcmmc_attach_i(device_t self) dwc_mmc_init(sc); } - -static int -rk_dwcmmc_set_clkdiv(struct dwc_mmc_softc *sc, int div) -{ - return rockchip_mmc0_set_div(div); -}
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Sun Dec 28 16:03:09 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_reg.h Log Message: add SRAM, SCU, PMU offsets To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/rockchip/rockchip_reg.h 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/rockchip/rockchip_reg.h diff -u src/sys/arch/arm/rockchip/rockchip_reg.h:1.3 src/sys/arch/arm/rockchip/rockchip_reg.h:1.4 --- src/sys/arch/arm/rockchip/rockchip_reg.h:1.3 Sun Dec 28 01:50:39 2014 +++ src/sys/arch/arm/rockchip/rockchip_reg.h Sun Dec 28 16:03:09 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_reg.h,v 1.3 2014/12/28 01:50:39 jmcneill Exp $ */ +/* $NetBSD: rockchip_reg.h,v 1.4 2014/12/28 16:03:09 jmcneill Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -43,6 +43,10 @@ #define ROCKCHIP_CORE0_SIZE 0x0030 /* CORE0 */ +#define ROCKCHIP_SRAM_OFFSET 0x0008 +#define ROCKCHIP_SRAM_SIZE 0x8000 +#define ROCKCHIP_SCU_OFFSET 0x0013C000 +#define ROCKCHIP_SCU_SIZE 0x100 #define ROCKCHIP_OTG_OFFSET 0x0018 #define ROCKCHIP_OTG_SIZE 0x4 #define ROCKCHIP_USB_OFFSET 0x001C @@ -69,6 +73,8 @@ /* CORE1 */ #define ROCKCHIP_CRU_OFFSET 0x #define ROCKCHIP_CRU_SIZE 0x4000 +#define ROCKCHIP_PMU_OFFSET 0x4000 +#define ROCKCHIP_PMU_SIZE 0x4000 #define ROCKCHIP_GRF_OFFSET 0x8000 #define ROCKCHIP_GRF_SIZE 0x2000 #define ROCKCHIP_UART2_OFFSET 0x00064000
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Sun Dec 28 16:27:15 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_dwcmmc.c Log Message: remove redundant irq print To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/rockchip/rockchip_dwcmmc.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/rockchip/rockchip_dwcmmc.c diff -u src/sys/arch/arm/rockchip/rockchip_dwcmmc.c:1.2 src/sys/arch/arm/rockchip/rockchip_dwcmmc.c:1.3 --- src/sys/arch/arm/rockchip/rockchip_dwcmmc.c:1.2 Sat Dec 27 19:18:35 2014 +++ src/sys/arch/arm/rockchip/rockchip_dwcmmc.c Sun Dec 28 16:27:14 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_dwcmmc.c,v 1.2 2014/12/27 19:18:35 jmcneill Exp $ */ +/* $NetBSD: rockchip_dwcmmc.c,v 1.3 2014/12/28 16:27:14 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -27,7 +27,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: rockchip_dwcmmc.c,v 1.2 2014/12/27 19:18:35 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: rockchip_dwcmmc.c,v 1.3 2014/12/28 16:27:14 jmcneill Exp $); #include sys/param.h #include sys/bus.h @@ -86,7 +86,6 @@ rk_dwcmmc_attach(device_t parent, device obio-obio_intr); return; } - aprint_normal_dev(self, interrupting on irq %d\n, obio-obio_intr); config_interrupts(self, rk_dwcmmc_attach_i); }
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Sat Dec 27 16:18:50 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: files.rockchip obio.c rockchip_board.c rockchip_crureg.h rockchip_var.h Log Message: More clock fixes, debugging. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/rockchip/files.rockchip \ src/sys/arch/arm/rockchip/obio.c \ src/sys/arch/arm/rockchip/rockchip_crureg.h cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/rockchip/rockchip_board.c cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/rockchip/rockchip_var.h 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/rockchip/files.rockchip diff -u src/sys/arch/arm/rockchip/files.rockchip:1.2 src/sys/arch/arm/rockchip/files.rockchip:1.3 --- src/sys/arch/arm/rockchip/files.rockchip:1.2 Fri Dec 26 19:44:48 2014 +++ src/sys/arch/arm/rockchip/files.rockchip Sat Dec 27 16:18:50 2014 @@ -1,4 +1,4 @@ -# $NetBSD: files.rockchip,v 1.2 2014/12/26 19:44:48 jmcneill Exp $ +# $NetBSD: files.rockchip,v 1.3 2014/12/27 16:18:50 jmcneill Exp $ # # Configuration info for Rockchip ARM Peripherals # @@ -41,3 +41,6 @@ defparam opt_rockchip.h CONMODE # Memory parameters defparam opt_rockchip.h MEMSIZE + +# Debugging parameters +defflag opt_rockchip.h ROCKCHIP_CLOCK_DEBUG Index: src/sys/arch/arm/rockchip/obio.c diff -u src/sys/arch/arm/rockchip/obio.c:1.2 src/sys/arch/arm/rockchip/obio.c:1.3 --- src/sys/arch/arm/rockchip/obio.c:1.2 Fri Dec 26 19:44:48 2014 +++ src/sys/arch/arm/rockchip/obio.c Sat Dec 27 16:18:50 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: obio.c,v 1.2 2014/12/26 19:44:48 jmcneill Exp $ */ +/* $NetBSD: obio.c,v 1.3 2014/12/27 16:18:50 jmcneill Exp $ */ /* * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc. @@ -35,8 +35,10 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include opt_rockchip.h + #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: obio.c,v 1.2 2014/12/26 19:44:48 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: obio.c,v 1.3 2014/12/27 16:18:50 jmcneill Exp $); #include sys/param.h #include sys/systm.h @@ -66,6 +68,10 @@ void obio_iomux(int, int); void obio_init_gpio(void); void obio_swporta(int, int, int); +#ifdef ROCKCHIP_CLOCK_DEBUG +static void obio_dump_clocks(void); +#endif + /* there can be only one */ bool obio_found; @@ -86,6 +92,10 @@ obio_attach(device_t parent, device_t se aprint_naive(\n); aprint_normal(: On-board I/O\n); +#ifdef ROCKCHIP_CLOCK_DEBUG + obio_dump_clocks(); +#endif + obio_init_grf(); obio_init_gpio(); @@ -208,3 +218,16 @@ void obio_swporta(int gpio_base, int off printf(gpio: 0x%08x 0x%08x - 0x%08x\n, gpio_base + offset, old, renew); } + +#ifdef ROCKCHIP_CLOCK_DEBUG +static void +obio_dump_clocks(void) +{ + printf(APLL: %u Hz\n, rockchip_apll_get_rate()); + printf(GPLL: %u Hz\n, rockchip_gpll_get_rate()); + printf(CPU: %u Hz\n, rockchip_cpu_get_rate()); + printf(AHB: %u Hz\n, rockchip_ahb_get_rate()); + printf(A9PERIPH: %u Hz\n, rockchip_a9periph_get_rate()); + printf(MMC0: %u Hz\n, rockchip_mmc0_get_rate()); +} +#endif Index: src/sys/arch/arm/rockchip/rockchip_crureg.h diff -u src/sys/arch/arm/rockchip/rockchip_crureg.h:1.2 src/sys/arch/arm/rockchip/rockchip_crureg.h:1.3 --- src/sys/arch/arm/rockchip/rockchip_crureg.h:1.2 Sat Dec 27 02:12:29 2014 +++ src/sys/arch/arm/rockchip/rockchip_crureg.h Sat Dec 27 16:18:50 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_crureg.h,v 1.2 2014/12/27 02:12:29 jmcneill Exp $ */ +/* $NetBSD: rockchip_crureg.h,v 1.3 2014/12/27 16:18:50 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -55,12 +55,12 @@ #define CRU_GLB_CNT_TH_REG 0x0140 #define CRU_PLL_CON0_CLKR_MASK __BITS(29,24) -#define CRU_PLL_CON0_CLKOD_MASK __BITS(19,16) +#define CRU_PLL_CON0_CLKOD_MASK __BITS(21,16) #define CRU_PLL_CON0_CLKR __BITS(13,8) -#define CRU_PLL_CON0_CLKOD __BITS(3,0) +#define CRU_PLL_CON0_CLKOD __BITS(5,0) -#define CRU_PLL_CON1_CLKF_MASK __BITS(28,16) -#define CRU_PLL_CON1_CLKF __BITS(12,0) +#define CRU_PLL_CON1_CLKF_MASK __BITS(31,16) +#define CRU_PLL_CON1_CLKF __BITS(15,0) #define CRU_CLKSEL_CON0_CPU_CLK_PLL_SEL_MASK __BIT(24) #define CRU_CLKSEL_CON0_CORE_PERI_DIV_CON_MASK __BITS(23,22) @@ -68,6 +68,7 @@ #define CRU_CLKSEL_CON0_CPU_CLK_PLL_SEL __BIT(8) #define CRU_CLKSEL_CON0_CORE_PERI_DIV_CON __BITS(7,6) #define CRU_CLKSEL_CON0_A9_CORE_DIV_CON __BITS(4,0) +#define RK3188_CRU_CLKSEL_CON0_A9_CORE_DIV_CON __BITS(13,9) #define CRU_CLKSEL_CON10_PERI_PLL_SEL_MASK __BIT(31) #define CRU_CLKSEL_CON10_PERI_PCLK_DIV_CON_MASK __BITS(29,28) @@ -78,6 +79,9 @@ #define CRU_CLKSEL_CON10_PERI_HCLK_DIV_CON __BITS(9,8) #define CRU_CLKSEL_CON10_PERI_ACLK_DIV_CON __BITS(4,0) +#define CRU_CLKSEL_CON11_MMC0_DIV_CON_MASK __BITS(21,16) +#define CRU_CLKSEL_CON11_MMC0_DIV_CON __BITS(5,0) + #define CRU_GLB_SRST_FST_MAGIC 0xfdb9 #endif /* !_ROCKCHIP_CRUREG_H */ Index:
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Sat Dec 27 19:14:05 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_board.c rockchip_var.h Log Message: mmc0 on rk3188 is based on ahb clk, not gpll. add a function to control mmc0 clock as well. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/rockchip/rockchip_board.c cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/rockchip/rockchip_var.h 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/rockchip/rockchip_board.c diff -u src/sys/arch/arm/rockchip/rockchip_board.c:1.4 src/sys/arch/arm/rockchip/rockchip_board.c:1.5 --- src/sys/arch/arm/rockchip/rockchip_board.c:1.4 Sat Dec 27 16:18:50 2014 +++ src/sys/arch/arm/rockchip/rockchip_board.c Sat Dec 27 19:14:05 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_board.c,v 1.4 2014/12/27 16:18:50 jmcneill Exp $ */ +/* $NetBSD: rockchip_board.c,v 1.5 2014/12/27 19:14:05 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -29,7 +29,7 @@ #include opt_rockchip.h #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: rockchip_board.c,v 1.4 2014/12/27 16:18:50 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: rockchip_board.c,v 1.5 2014/12/27 19:14:05 jmcneill Exp $); #include sys/param.h #include sys/bus.h @@ -199,5 +199,41 @@ rockchip_mmc0_get_rate(void) mmc0_div_con = __SHIFTOUT(clksel_con11, CRU_CLKSEL_CON11_MMC0_DIV_CON); - return rockchip_gpll_get_rate() / (mmc0_div_con + 1); + return rockchip_ahb_get_rate() / (mmc0_div_con + 1); +} + +u_int +rockchip_mmc0_set_div(u_int div) +{ + bus_space_tag_t bst = rockchip_bs_tag; + bus_space_handle_t bsh; + uint32_t clksel_con11; + + if (div == 0 || div 0x40) + return EINVAL; + + rockchip_get_cru_bsh(bsh); + + clksel_con11 = CRU_CLKSEL_CON11_MMC0_PLL_SEL_MASK | + CRU_CLKSEL_CON11_MMC0_DIV_CON_MASK; + //clksel_con11 |= CRU_CLKSEL_CON11_MMC0_PLL_SEL; /* GPLL */ + clksel_con11 |= __SHIFTIN(div - 1, CRU_CLKSEL_CON11_MMC0_DIV_CON); + +#ifdef ROCKCHIP_CLOCK_DEBUG + const u_int old_rate = rockchip_mmc0_get_rate(); +#endif + + bus_space_write_4(bst, bsh, CRU_CLKSEL_CON_REG(11), clksel_con11); + +#ifdef ROCKCHIP_CLOCK_DEBUG + const u_int new_rate = rockchip_mmc0_get_rate(); + + printf(%s: update %u Hz - %u Hz\n, __func__, old_rate, new_rate); + + const uint32_t clkgate2 = bus_space_read_4(bst, bsh, + CRU_CLKGATE_CON_REG(2)); + printf(%s: clkgate2 = %#x\n, __func__, clkgate2); +#endif + + return 0; } Index: src/sys/arch/arm/rockchip/rockchip_var.h diff -u src/sys/arch/arm/rockchip/rockchip_var.h:1.5 src/sys/arch/arm/rockchip/rockchip_var.h:1.6 --- src/sys/arch/arm/rockchip/rockchip_var.h:1.5 Sat Dec 27 16:18:50 2014 +++ src/sys/arch/arm/rockchip/rockchip_var.h Sat Dec 27 19:14:05 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_var.h,v 1.5 2014/12/27 16:18:50 jmcneill Exp $ */ +/* $NetBSD: rockchip_var.h,v 1.6 2014/12/27 19:14:05 jmcneill Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -64,5 +64,6 @@ u_int rockchip_cpu_get_rate(void); u_int rockchip_ahb_get_rate(void); u_int rockchip_a9periph_get_rate(void); u_int rockchip_mmc0_get_rate(void); +u_int rockchip_mmc0_set_div(u_int); #endif /* _ARM_ROCKCHIP_ROCKCHIP_VAR_H_ */
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Sat Dec 27 19:14:34 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_crureg.h Log Message: update some bits for rk3188 To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/rockchip/rockchip_crureg.h 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/rockchip/rockchip_crureg.h diff -u src/sys/arch/arm/rockchip/rockchip_crureg.h:1.3 src/sys/arch/arm/rockchip/rockchip_crureg.h:1.4 --- src/sys/arch/arm/rockchip/rockchip_crureg.h:1.3 Sat Dec 27 16:18:50 2014 +++ src/sys/arch/arm/rockchip/rockchip_crureg.h Sat Dec 27 19:14:34 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_crureg.h,v 1.3 2014/12/27 16:18:50 jmcneill Exp $ */ +/* $NetBSD: rockchip_crureg.h,v 1.4 2014/12/27 19:14:34 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -72,14 +72,16 @@ #define CRU_CLKSEL_CON10_PERI_PLL_SEL_MASK __BIT(31) #define CRU_CLKSEL_CON10_PERI_PCLK_DIV_CON_MASK __BITS(29,28) -#define CRU_CLKSEL_CON10_PERI_HCLK_DIV_CON_MASK __BITS(25,24) +#define CRU_CLKSEL_CON10_PERI_HCLK_DIV_CON_MASK __BITS(26,24) #define CRU_CLKSEL_CON10_PERI_ACLK_DIV_CON_MASK __BITS(20,16) #define CRU_CLKSEL_CON10_PERI_PLL_SEL __BIT(15) #define CRU_CLKSEL_CON10_PERI_PCLK_DIV_CON __BITS(13,12) -#define CRU_CLKSEL_CON10_PERI_HCLK_DIV_CON __BITS(9,8) +#define CRU_CLKSEL_CON10_PERI_HCLK_DIV_CON __BITS(10,8) #define CRU_CLKSEL_CON10_PERI_ACLK_DIV_CON __BITS(4,0) +#define CRU_CLKSEL_CON11_MMC0_PLL_SEL_MASK __BIT(22) #define CRU_CLKSEL_CON11_MMC0_DIV_CON_MASK __BITS(21,16) +#define CRU_CLKSEL_CON11_MMC0_PLL_SEL __BIT(6) #define CRU_CLKSEL_CON11_MMC0_DIV_CON __BITS(5,0) #define CRU_GLB_SRST_FST_MAGIC 0xfdb9
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Sat Dec 27 19:18:35 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_dwcmmc.c Log Message: set DWC_MMC_F_PWREN_CLEAR, implement set_clkdiv callback; now this works To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/rockchip/rockchip_dwcmmc.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/rockchip/rockchip_dwcmmc.c diff -u src/sys/arch/arm/rockchip/rockchip_dwcmmc.c:1.1 src/sys/arch/arm/rockchip/rockchip_dwcmmc.c:1.2 --- src/sys/arch/arm/rockchip/rockchip_dwcmmc.c:1.1 Sat Dec 27 01:22:07 2014 +++ src/sys/arch/arm/rockchip/rockchip_dwcmmc.c Sat Dec 27 19:18:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_dwcmmc.c,v 1.1 2014/12/27 01:22:07 jmcneill Exp $ */ +/* $NetBSD: rockchip_dwcmmc.c,v 1.2 2014/12/27 19:18:35 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -27,7 +27,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: rockchip_dwcmmc.c,v 1.1 2014/12/27 01:22:07 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: rockchip_dwcmmc.c,v 1.2 2014/12/27 19:18:35 jmcneill Exp $); #include sys/param.h #include sys/bus.h @@ -48,6 +48,8 @@ static void rk_dwcmmc_attach(device_t, d static void rk_dwcmmc_attach_i(device_t); +static int rk_dwcmmc_set_clkdiv(struct dwc_mmc_softc *, int); + CFATTACH_DECL_NEW(rkdwcmmc, sizeof(struct dwc_mmc_softc), rk_dwcmmc_match, rk_dwcmmc_attach, NULL, NULL); @@ -66,9 +68,10 @@ rk_dwcmmc_attach(device_t parent, device sc-sc_dev = self; sc-sc_bst = obio-obio_bst; sc-sc_dmat = obio-obio_dmat; - sc-sc_flags = DWC_MMC_F_USE_HOLD_REG; + sc-sc_flags = DWC_MMC_F_USE_HOLD_REG | DWC_MMC_F_PWREN_CLEAR; sc-sc_clock_freq = rockchip_ahb_get_rate(); sc-sc_fifo_depth = 256; + sc-sc_set_clkdiv = rk_dwcmmc_set_clkdiv; bus_space_subregion(obio-obio_bst, obio-obio_bsh, obio-obio_offset, obio-obio_size, sc-sc_bsh); @@ -95,3 +98,9 @@ rk_dwcmmc_attach_i(device_t self) dwc_mmc_init(sc); } + +static int +rk_dwcmmc_set_clkdiv(struct dwc_mmc_softc *sc, int div) +{ + return rockchip_mmc0_set_div(div); +}
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Sun Dec 28 01:50:39 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_reg.h Log Message: add DDR offsets To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/rockchip/rockchip_reg.h 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/rockchip/rockchip_reg.h diff -u src/sys/arch/arm/rockchip/rockchip_reg.h:1.2 src/sys/arch/arm/rockchip/rockchip_reg.h:1.3 --- src/sys/arch/arm/rockchip/rockchip_reg.h:1.2 Fri Dec 26 19:44:48 2014 +++ src/sys/arch/arm/rockchip/rockchip_reg.h Sun Dec 28 01:50:39 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_reg.h,v 1.2 2014/12/26 19:44:48 jmcneill Exp $ */ +/* $NetBSD: rockchip_reg.h,v 1.3 2014/12/28 01:50:39 jmcneill Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -77,10 +77,14 @@ #define ROCKCHIP_UART3_SIZE 0x400 #define ROCKCHIP_GPIO0_OFFSET 0xA000 #define ROCKCHIP_GPIO0_SIZE 0x100 +#define ROCKCHIP_DDR_PCTL_OFFSET 0x0002 +#define ROCKCHIP_DDR_PCTL_SIZE 0x4000 #define ROCKCHIP_GPIO1_OFFSET 0x0003C000 #define ROCKCHIP_GPIO1_SIZE 0x100 #define ROCKCHIP_GPIO2_OFFSET 0x0003E000 #define ROCKCHIP_GPIO2_SIZE 0x100 +#define ROCKCHIP_DDR_PUBL_OFFSET 0x0004 +#define ROCKCHIP_DDR_PUBL_SIZE 0x4000 #define ROCKCHIP_GPIO3_OFFSET 0x0008 #define ROCKCHIP_GPIO3_SIZE 0x100
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Sat Dec 27 01:20:31 UTC 2014 Added Files: src/sys/arch/arm/rockchip: rockchip_crureg.h Log Message: add CRU reg definitions To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/rockchip/rockchip_crureg.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Added files: Index: src/sys/arch/arm/rockchip/rockchip_crureg.h diff -u /dev/null src/sys/arch/arm/rockchip/rockchip_crureg.h:1.1 --- /dev/null Sat Dec 27 01:20:31 2014 +++ src/sys/arch/arm/rockchip/rockchip_crureg.h Sat Dec 27 01:20:31 2014 @@ -0,0 +1,76 @@ +/* $NetBSD: rockchip_crureg.h,v 1.1 2014/12/27 01:20:31 jmcneill Exp $ */ + +/*- + * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca + * 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 ``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 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. + */ + +#ifndef _ROCKCHIP_CRUREG_H +#define _ROCKCHIP_CRUREG_H + +#define CRU_APLL_CON0_REG 0x +#define CRU_APLL_CON1_REG 0x0004 +#define CRU_APLL_CON2_REG 0x0008 +#define CRU_APLL_CON3_REG 0x000c +#define CRU_DPLL_CON0_REG 0x0010 +#define CRU_DPLL_CON1_REG 0x0014 +#define CRU_DPLL_CON2_REG 0x0018 +#define CRU_DPLL_CON3_REG 0x001c +#define CRU_CPLL_CON0_REG 0x0020 +#define CRU_CPLL_CON1_REG 0x0024 +#define CRU_CPLL_CON2_REG 0x0028 +#define CRU_CPLL_CON3_REG 0x002c +#define CRU_GPLL_CON0_REG 0x0030 +#define CRU_GPLL_CON1_REG 0x0034 +#define CRU_GPLL_CON2_REG 0x0038 +#define CRU_GPLL_CON3_REG 0x003c +#define CRU_MODE_CON_REG 0x0040 +#define CRU_CLKSEL_CON_REG(n) (0x0044 + (n) * 4) +#define CRU_CLKGATE_CON_REG(n) (0x00d0 + (n) * 4) +#define CRU_GLB_SRST_FST_REG 0x0100 +#define CRU_GLB_SRST_SND_REG 0x0104 +#define CRU_SOFTRST_REG(n) (0x0110 + (n) * 4) +#define CRU_MISC_CON_REG 0x0134 +#define CRU_GLB_CNT_TH_REG 0x0140 + +#define CRU_PLL_CON0_CLKR_MASK __BITS(29,24) +#define CRU_PLL_CON0_CLKOD_MASK __BITS(19,16) +#define CRU_PLL_CON0_CLKR __BITS(13,8) +#define CRU_PLL_CON0_CLKOD __BITS(3,0) + +#define CRU_PLL_CON1_CLKF_MASK __BITS(28,16) +#define CRU_PLL_CON1_CLKF __BITS(12,0) + +#define CRU_CLKSEL_CON10_PERI_PLL_SEL_MASK __BIT(31) +#define CRU_CLKSEL_CON10_PERI_PCLK_DIV_CON_MASK __BITS(29,28) +#define CRU_CLKSEL_CON10_PERI_HCLK_DIV_CON_MASK __BITS(25,24) +#define CRU_CLKSEL_CON10_PERI_ACLK_DIV_CON_MASK __BITS(20,16) +#define CRU_CLKSEL_CON10_PERI_PLL_SEL __BIT(15) +#define CRU_CLKSEL_CON10_PERI_PCLK_DIV_CON __BITS(13,12) +#define CRU_CLKSEL_CON10_PERI_HCLK_DIV_CON __BITS(9,8) +#define CRU_CLKSEL_CON10_PERI_ACLK_DIV_CON __BITS(4,0) + +#define CRU_GLB_SRST_FST_MAGIC 0xfdb9 + +#endif /* !_ROCKCHIP_CRUREG_H */
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Sat Dec 27 01:21:21 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_board.c rockchip_var.h Log Message: add helpers to get gpll and ahb clock rates To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/rockchip/rockchip_board.c cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/rockchip/rockchip_var.h 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/rockchip/rockchip_board.c diff -u src/sys/arch/arm/rockchip/rockchip_board.c:1.1 src/sys/arch/arm/rockchip/rockchip_board.c:1.2 --- src/sys/arch/arm/rockchip/rockchip_board.c:1.1 Fri Dec 26 19:44:48 2014 +++ src/sys/arch/arm/rockchip/rockchip_board.c Sat Dec 27 01:21:21 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_board.c,v 1.1 2014/12/26 19:44:48 jmcneill Exp $ */ +/* $NetBSD: rockchip_board.c,v 1.2 2014/12/27 01:21:21 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -27,7 +27,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: rockchip_board.c,v 1.1 2014/12/26 19:44:48 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: rockchip_board.c,v 1.2 2014/12/27 01:21:21 jmcneill Exp $); #include sys/param.h #include sys/bus.h @@ -35,6 +35,7 @@ __KERNEL_RCSID(0, $NetBSD: rockchip_boa #include sys/device.h #include arm/rockchip/rockchip_reg.h +#include arm/rockchip/rockchip_crureg.h #include arm/rockchip/rockchip_var.h bus_space_handle_t rockchip_core0_bsh; @@ -55,3 +56,50 @@ rockchip_bootstrap(void) if (error) panic(%s: failed to map CORE1 registers: %d, __func__, error); } + +static void +rockchip_get_cru_bsh(bus_space_handle_t *pbsh) +{ + bus_space_subregion(rockchip_bs_tag, rockchip_core1_bsh, + ROCKCHIP_CRU_OFFSET, ROCKCHIP_CRU_SIZE, pbsh); +} + +u_int +rockchip_gpll_get_rate(void) +{ + bus_space_tag_t bst = rockchip_bs_tag; + bus_space_handle_t bsh; + uint32_t gpll_con0, gpll_con1; + uint32_t nr, nf, no; + + rockchip_get_cru_bsh(bsh); + + gpll_con0 = bus_space_read_4(bst, bsh, CRU_GPLL_CON0_REG); + gpll_con1 = bus_space_read_4(bst, bsh, CRU_GPLL_CON1_REG); + + nr = __SHIFTOUT(gpll_con0, CRU_PLL_CON0_CLKR) + 1; + no = __SHIFTOUT(gpll_con0, CRU_PLL_CON0_CLKOD) + 1; + nf = __SHIFTOUT(gpll_con1, CRU_PLL_CON1_CLKF) + 1; + + return ROCKCHIP_REF_FREQ * nf / (nr * no); +} + +u_int +rockchip_ahb_get_rate(void) +{ + bus_space_tag_t bst = rockchip_bs_tag; + bus_space_handle_t bsh; + uint32_t clksel_con10; + uint32_t hclk_div, aclk_div; + + rockchip_get_cru_bsh(bsh); + + clksel_con10 = bus_space_read_4(bst, bsh, CRU_CLKSEL_CON_REG(10)); + + hclk_div = __SHIFTOUT(clksel_con10, + CRU_CLKSEL_CON10_PERI_HCLK_DIV_CON) + 1; + aclk_div = 1 __SHIFTOUT(clksel_con10, + CRU_CLKSEL_CON10_PERI_ACLK_DIV_CON); + + return rockchip_gpll_get_rate() / (hclk_div * aclk_div); +} Index: src/sys/arch/arm/rockchip/rockchip_var.h diff -u src/sys/arch/arm/rockchip/rockchip_var.h:1.2 src/sys/arch/arm/rockchip/rockchip_var.h:1.3 --- src/sys/arch/arm/rockchip/rockchip_var.h:1.2 Fri Dec 26 19:44:48 2014 +++ src/sys/arch/arm/rockchip/rockchip_var.h Sat Dec 27 01:21:21 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_var.h,v 1.2 2014/12/26 19:44:48 jmcneill Exp $ */ +/* $NetBSD: rockchip_var.h,v 1.3 2014/12/27 01:21:21 jmcneill Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -56,4 +56,7 @@ extern bus_space_handle_t rockchip_core1 void rockchip_bootstrap(void); +u_int rockchip_gpll_get_rate(void); +u_int rockchip_ahb_get_rate(void); + #endif /* _ARM_ROCKCHIP_ROCKCHIP_VAR_H_ */
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Sat Dec 27 01:22:07 UTC 2014 Added Files: src/sys/arch/arm/rockchip: rockchip_dwcmmc.c Log Message: add dwcmmc glue, doesnt work yet To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/rockchip/rockchip_dwcmmc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Added files: Index: src/sys/arch/arm/rockchip/rockchip_dwcmmc.c diff -u /dev/null src/sys/arch/arm/rockchip/rockchip_dwcmmc.c:1.1 --- /dev/null Sat Dec 27 01:22:07 2014 +++ src/sys/arch/arm/rockchip/rockchip_dwcmmc.c Sat Dec 27 01:22:07 2014 @@ -0,0 +1,97 @@ +/* $NetBSD: rockchip_dwcmmc.c,v 1.1 2014/12/27 01:22:07 jmcneill Exp $ */ + +/*- + * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca + * 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 ``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 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 sys/cdefs.h +__KERNEL_RCSID(0, $NetBSD: rockchip_dwcmmc.c,v 1.1 2014/12/27 01:22:07 jmcneill Exp $); + +#include sys/param.h +#include sys/bus.h +#include sys/device.h +#include sys/intr.h +#include sys/systm.h +#include sys/kernel.h +#include sys/mutex.h +#include sys/condvar.h + +#include arm/rockchip/rockchip_reg.h +#include arm/rockchip/rockchip_var.h + +#include dev/ic/dwc_mmc_var.h + +static int rk_dwcmmc_match(device_t, cfdata_t, void *); +static void rk_dwcmmc_attach(device_t, device_t, void *); + +static void rk_dwcmmc_attach_i(device_t); + +CFATTACH_DECL_NEW(rkdwcmmc, sizeof(struct dwc_mmc_softc), + rk_dwcmmc_match, rk_dwcmmc_attach, NULL, NULL); + +static int +rk_dwcmmc_match(device_t parent, cfdata_t cf, void *aux) +{ + return 1; +} + +static void +rk_dwcmmc_attach(device_t parent, device_t self, void *aux) +{ + struct dwc_mmc_softc *sc = device_private(self); + struct obio_attach_args * const obio = aux; + + sc-sc_dev = self; + sc-sc_bst = obio-obio_bst; + sc-sc_dmat = obio-obio_dmat; + sc-sc_flags = DWC_MMC_F_USE_HOLD_REG; + sc-sc_clock_freq = rockchip_ahb_get_rate(); + sc-sc_fifo_depth = 256; + + bus_space_subregion(obio-obio_bst, obio-obio_bsh, obio-obio_offset, + obio-obio_size, sc-sc_bsh); + + aprint_naive(\n); + aprint_normal(: SD/MMC controller\n); + + sc-sc_ih = intr_establish(obio-obio_intr, IPL_BIO, IST_LEVEL, + dwc_mmc_intr, sc); + if (sc-sc_ih == NULL) { + aprint_error_dev(self, couldn't establish interrupt %d\n, + obio-obio_intr); + return; + } + aprint_normal_dev(self, interrupting on irq %d\n, obio-obio_intr); + + config_interrupts(self, rk_dwcmmc_attach_i); +} + +static void +rk_dwcmmc_attach_i(device_t self) +{ + struct dwc_mmc_softc *sc = device_private(self); + + dwc_mmc_init(sc); +}
CVS commit: src/sys/arch/arm/rockchip
Module Name:src Committed By: jmcneill Date: Sat Dec 27 02:12:30 UTC 2014 Modified Files: src/sys/arch/arm/rockchip: rockchip_board.c rockchip_crureg.h rockchip_var.h Log Message: add functions to get apll and cpu rates To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/rockchip/rockchip_board.c cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/rockchip/rockchip_crureg.h cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/rockchip/rockchip_var.h 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/rockchip/rockchip_board.c diff -u src/sys/arch/arm/rockchip/rockchip_board.c:1.2 src/sys/arch/arm/rockchip/rockchip_board.c:1.3 --- src/sys/arch/arm/rockchip/rockchip_board.c:1.2 Sat Dec 27 01:21:21 2014 +++ src/sys/arch/arm/rockchip/rockchip_board.c Sat Dec 27 02:12:29 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_board.c,v 1.2 2014/12/27 01:21:21 jmcneill Exp $ */ +/* $NetBSD: rockchip_board.c,v 1.3 2014/12/27 02:12:29 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -27,7 +27,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: rockchip_board.c,v 1.2 2014/12/27 01:21:21 jmcneill Exp $); +__KERNEL_RCSID(0, $NetBSD: rockchip_board.c,v 1.3 2014/12/27 02:12:29 jmcneill Exp $); #include sys/param.h #include sys/bus.h @@ -64,27 +64,56 @@ rockchip_get_cru_bsh(bus_space_handle_t ROCKCHIP_CRU_OFFSET, ROCKCHIP_CRU_SIZE, pbsh); } -u_int -rockchip_gpll_get_rate(void) +static u_int +rockchip_pll_get_rate(bus_size_t con0_reg, bus_size_t con1_reg) { bus_space_tag_t bst = rockchip_bs_tag; bus_space_handle_t bsh; - uint32_t gpll_con0, gpll_con1; + uint32_t pll_con0, pll_con1; uint32_t nr, nf, no; rockchip_get_cru_bsh(bsh); - gpll_con0 = bus_space_read_4(bst, bsh, CRU_GPLL_CON0_REG); - gpll_con1 = bus_space_read_4(bst, bsh, CRU_GPLL_CON1_REG); + pll_con0 = bus_space_read_4(bst, bsh, con0_reg); + pll_con1 = bus_space_read_4(bst, bsh, con1_reg); - nr = __SHIFTOUT(gpll_con0, CRU_PLL_CON0_CLKR) + 1; - no = __SHIFTOUT(gpll_con0, CRU_PLL_CON0_CLKOD) + 1; - nf = __SHIFTOUT(gpll_con1, CRU_PLL_CON1_CLKF) + 1; + nr = __SHIFTOUT(pll_con0, CRU_PLL_CON0_CLKR) + 1; + no = __SHIFTOUT(pll_con0, CRU_PLL_CON0_CLKOD) + 1; + nf = __SHIFTOUT(pll_con1, CRU_PLL_CON1_CLKF) + 1; return ROCKCHIP_REF_FREQ * nf / (nr * no); } u_int +rockchip_gpll_get_rate(void) +{ + return rockchip_pll_get_rate(CRU_GPLL_CON0_REG, CRU_GPLL_CON1_REG); +} + +u_int +rockchip_apll_get_rate(void) +{ + return rockchip_pll_get_rate(CRU_APLL_CON0_REG, CRU_APLL_CON1_REG); +} + +u_int +rockchip_cpu_get_rate(void) +{ + bus_space_tag_t bst = rockchip_bs_tag; + bus_space_handle_t bsh; + uint32_t clksel_con0; + + rockchip_get_cru_bsh(bsh); + + clksel_con0 = bus_space_read_4(bst, bsh, CRU_CLKSEL_CON_REG(0)); + if (clksel_con0 CRU_CLKSEL_CON0_CPU_CLK_PLL_SEL) { + return rockchip_gpll_get_rate(); + } else { + return rockchip_apll_get_rate(); + } +} + +u_int rockchip_ahb_get_rate(void) { bus_space_tag_t bst = rockchip_bs_tag; Index: src/sys/arch/arm/rockchip/rockchip_crureg.h diff -u src/sys/arch/arm/rockchip/rockchip_crureg.h:1.1 src/sys/arch/arm/rockchip/rockchip_crureg.h:1.2 --- src/sys/arch/arm/rockchip/rockchip_crureg.h:1.1 Sat Dec 27 01:20:31 2014 +++ src/sys/arch/arm/rockchip/rockchip_crureg.h Sat Dec 27 02:12:29 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_crureg.h,v 1.1 2014/12/27 01:20:31 jmcneill Exp $ */ +/* $NetBSD: rockchip_crureg.h,v 1.2 2014/12/27 02:12:29 jmcneill Exp $ */ /*- * Copyright (c) 2014 Jared D. McNeill jmcne...@invisible.ca @@ -62,6 +62,13 @@ #define CRU_PLL_CON1_CLKF_MASK __BITS(28,16) #define CRU_PLL_CON1_CLKF __BITS(12,0) +#define CRU_CLKSEL_CON0_CPU_CLK_PLL_SEL_MASK __BIT(24) +#define CRU_CLKSEL_CON0_CORE_PERI_DIV_CON_MASK __BITS(23,22) +#define CRU_CLKSEL_CON0_A9_CORE_DIV_CON_MASK __BITS(20,16) +#define CRU_CLKSEL_CON0_CPU_CLK_PLL_SEL __BIT(8) +#define CRU_CLKSEL_CON0_CORE_PERI_DIV_CON __BITS(7,6) +#define CRU_CLKSEL_CON0_A9_CORE_DIV_CON __BITS(4,0) + #define CRU_CLKSEL_CON10_PERI_PLL_SEL_MASK __BIT(31) #define CRU_CLKSEL_CON10_PERI_PCLK_DIV_CON_MASK __BITS(29,28) #define CRU_CLKSEL_CON10_PERI_HCLK_DIV_CON_MASK __BITS(25,24) Index: src/sys/arch/arm/rockchip/rockchip_var.h diff -u src/sys/arch/arm/rockchip/rockchip_var.h:1.3 src/sys/arch/arm/rockchip/rockchip_var.h:1.4 --- src/sys/arch/arm/rockchip/rockchip_var.h:1.3 Sat Dec 27 01:21:21 2014 +++ src/sys/arch/arm/rockchip/rockchip_var.h Sat Dec 27 02:12:29 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rockchip_var.h,v 1.3 2014/12/27 01:21:21 jmcneill Exp $ */ +/* $NetBSD: rockchip_var.h,v 1.4 2014/12/27 02:12:29 jmcneill Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -56,7 +56,9 @@ extern bus_space_handle_t rockchip_core1 void rockchip_bootstrap(void); +u_int rockchip_apll_get_rate(void); u_int rockchip_gpll_get_rate(void); +u_int