Module Name:    src
Committed By:   jmcneill
Date:           Sat Jan 17 15:05:25 UTC 2015

Modified Files:
        src/sys/arch/arm/rockchip: files.rockchip obio.c rockchip_board.c
            rockchip_cpufreq.c rockchip_crureg.h rockchip_emac.c rockchip_reg.h
            rockchip_timer.c rockchip_var.h
        src/sys/arch/evbarm/conf: ROCKCHIP
        src/sys/arch/evbarm/rockchip: rockchip_machdep.c

Log Message:
Add Rockchip PX2 support, from FUKAUMI Naoki <[email protected]>


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/arm/rockchip/files.rockchip
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/rockchip/obio.c
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/rockchip/rockchip_board.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/rockchip/rockchip_cpufreq.c \
    src/sys/arch/arm/rockchip/rockchip_timer.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/rockchip/rockchip_crureg.h
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/rockchip/rockchip_emac.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/rockchip/rockchip_reg.h
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/rockchip/rockchip_var.h
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/evbarm/conf/ROCKCHIP
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/evbarm/rockchip/rockchip_machdep.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/files.rockchip
diff -u src/sys/arch/arm/rockchip/files.rockchip:1.9 src/sys/arch/arm/rockchip/files.rockchip:1.10
--- src/sys/arch/arm/rockchip/files.rockchip:1.9	Sun Jan  4 03:53:02 2015
+++ src/sys/arch/arm/rockchip/files.rockchip	Sat Jan 17 15:05:24 2015
@@ -1,4 +1,4 @@
-#	$NetBSD: files.rockchip,v 1.9 2015/01/04 03:53:02 jmcneill Exp $
+#	$NetBSD: files.rockchip,v 1.10 2015/01/17 15:05:24 jmcneill Exp $
 #
 # Configuration info for Rockchip ARM Peripherals
 #
@@ -32,7 +32,11 @@ device	rkiic: i2cbus, i2cexec
 attach	rkiic at obio
 file	arch/arm/rockchip/rockchip_i2c.c	rkiic
 
-# Timer
+# RK3066 Timer (Synopsys DesignWare)
+attach	dwctmr at obio with rkdwctmr
+file	arch/arm/rockchip/rockchip_dwctmr.c	rkdwctmr
+
+# RK3188 Timer
 device	rktimer
 attach	rktimer at obio
 file	arch/arm/rockchip/rockchip_timer.c	rktimer

Index: src/sys/arch/arm/rockchip/obio.c
diff -u src/sys/arch/arm/rockchip/obio.c:1.16 src/sys/arch/arm/rockchip/obio.c:1.17
--- src/sys/arch/arm/rockchip/obio.c:1.16	Tue Jan 13 10:37:38 2015
+++ src/sys/arch/arm/rockchip/obio.c	Sat Jan 17 15:05:24 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: obio.c,v 1.16 2015/01/13 10:37:38 jmcneill Exp $	*/
+/*	$NetBSD: obio.c,v 1.17 2015/01/17 15:05: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.16 2015/01/13 10:37:38 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: obio.c,v 1.17 2015/01/17 15:05:24 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -63,10 +63,10 @@ CFATTACH_DECL_NEW(obio, 0,
 int	obio_print(void *, const char *);
 int	obio_search(device_t, cfdata_t, const int *, void *);
 
-void	obio_init_grf(void);
-void	obio_iomux(int, int);
-void	obio_init_gpio(void);
-void	obio_swporta(int, int, int);
+static void	obio_init_rk3066(void);
+static void	obio_init_rk3188(void);
+static void	obio_grf_set(uint32_t, uint32_t);
+static int	obio_gpio_set_out(u_int, u_int, u_int);
 
 #ifdef ROCKCHIP_CLOCK_DEBUG
 static void	obio_dump_clocks(void);
@@ -96,8 +96,17 @@ obio_attach(device_t parent, device_t se
 	obio_dump_clocks();
 #endif
 
-	obio_init_grf();
-	obio_init_gpio();
+	switch (rockchip_chip_id()) {
+	case ROCKCHIP_CHIP_ID_RK3066:
+		obio_init_rk3066();
+		break;
+	case ROCKCHIP_CHIP_ID_RK3188:
+	case ROCKCHIP_CHIP_ID_RK3188PLUS:
+		obio_init_rk3188();
+		break;
+	default:
+		break;
+	}
 
 	/*
 	 * Attach all on-board devices as described in the kernel
@@ -178,125 +187,251 @@ obio_search(device_t parent, cfdata_t cf
 	return 0;
 }
 
+#define GRF_GPIO0A_IOMUX_OFFSET	0x00a8
+#define GRF_GPIO0B_IOMUX_OFFSET	0x00ac
+#define GRF_GPIO0C_IOMUX_OFFSET	0x00b0
+#define GRF_GPIO0D_IOMUX_OFFSET	0x00b4
+
+#define GRF_GPIO1A_IOMUX_OFFSET	0x00b8
+#define GRF_GPIO1B_IOMUX_OFFSET	0x00bc
+#define GRF_GPIO1C_IOMUX_OFFSET	0x00c0
+#define GRF_GPIO1D_IOMUX_OFFSET	0x00c4
+
+#define GRF_GPIO2A_IOMUX_OFFSET	0x00c8
+#define GRF_GPIO2B_IOMUX_OFFSET	0x00cc
+#define GRF_GPIO2C_IOMUX_OFFSET	0x00d0
+#define GRF_GPIO2D_IOMUX_OFFSET	0x00d4
+
+#define GRF_GPIO3A_IOMUX_OFFSET	0x00d8
+#define GRF_GPIO3B_IOMUX_OFFSET	0x00dc
+#define GRF_GPIO3C_IOMUX_OFFSET	0x00e0
+#define GRF_GPIO3D_IOMUX_OFFSET	0x00e4
+
+#define GRF_GPIO4A_IOMUX_OFFSET	0x00e8
+#define GRF_GPIO4B_IOMUX_OFFSET	0x00ec
+#define GRF_GPIO4C_IOMUX_OFFSET	0x00f0
+#define GRF_GPIO4D_IOMUX_OFFSET	0x00f4
+
+#define GRF_GPIO6B_IOMUX_OFFSET	0x010c
+
+#define GRF_SOC_CON0_OFFSET	0x0150
+#define GRF_SOC_CON1_OFFSET	0x0154
+#define GRF_SOC_CON2_OFFSET	0x0158
+
+static void
+obio_init_rk3066(void)
+{
+	/* dwctwo[01] */
+	obio_grf_set(GRF_GPIO0A_IOMUX_OFFSET, 0x14001400);
+
+	/* com2 */
+	obio_grf_set(GRF_GPIO1B_IOMUX_OFFSET, 0x00050005);
+
+	/* rkemac0 */
+	obio_grf_set(GRF_GPIO1C_IOMUX_OFFSET, 0xffffaaaa);
+	obio_grf_set(GRF_GPIO1D_IOMUX_OFFSET, 0x000f000a);
+	obio_grf_set(GRF_SOC_CON1_OFFSET,     0x00030002);
+	obio_grf_set(GRF_SOC_CON2_OFFSET,     0x00400040);
+
+	/* rkiic[01234] */
+	obio_grf_set(GRF_GPIO2D_IOMUX_OFFSET, 0x55005500);
+	obio_grf_set(GRF_GPIO3A_IOMUX_OFFSET, 0x05550555);
+	obio_grf_set(GRF_SOC_CON1_OFFSET,     0xf800f800);
+
+	/* dwcmmc0 */
+	obio_grf_set(GRF_GPIO3A_IOMUX_OFFSET, 0x50004000);
+	obio_grf_set(GRF_GPIO3B_IOMUX_OFFSET, 0x55551555);
+
+	/* ChipSPARK Rayeager PX2: dwcmmc2 */
+	obio_grf_set(GRF_GPIO3D_IOMUX_OFFSET, 0xc0008000);
+	obio_grf_set(GRF_GPIO4B_IOMUX_OFFSET, 0x003c0008);
+	obio_grf_set(GRF_SOC_CON0_OFFSET,     0x08000800);
+
+	/* ChipSPARK Rayeager PX2: umass0 */
+	obio_grf_set(GRF_GPIO0B_IOMUX_OFFSET, 0x04000000);
+	obio_grf_set(GRF_GPIO4C_IOMUX_OFFSET, 0x30000000);
+	obio_gpio_set_out(0, 13, 1);
+	obio_gpio_set_out(4, 22, 1);
+
+	/* ChipSPARK Rayeager PX2: uhub2 */
+	obio_grf_set(GRF_GPIO1D_IOMUX_OFFSET, 0x40000000);
+	obio_gpio_set_out(1, 31, 1);
+
+	/* ChipSPARK Rayeager PX2: ukphy0 */
+	/* rtl8201f: clock must be configured before resetting */
+	rockchip_mac_set_rate(50000000);
+	obio_grf_set(GRF_GPIO1D_IOMUX_OFFSET, 0x10000000);
+	obio_gpio_set_out(1, 30, 1);
+	/* rtl8201f: need 1s delay here? */
+}
+
 #define RK3188_GRF_GPIO0C_IOMUX_OFFSET	0x0068
-#define RK3188_GRF_GPIO0D_IOMUX_OFFSET	0x006C
+#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_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_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_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 RK3188_GRF_SOC_CON0_OFFSET	0x00a0
+#define RK3188_GRF_SOC_CON1_OFFSET	0x00a4
+#define RK3188_GRF_SOC_CON2_OFFSET	0x00a8
 
-#define RK3188_GRF_IO_CON2_OFFSET	0x00FC
+#define RK3188_GRF_IO_CON2_OFFSET	0x00fc
 #define RK3188_GRF_IO_CON3_OFFSET	0x0100
 
-#define GRF_GPIO0A_IOMUX_OFFSET	0x00a8
-#define GRF_GPIO3A_IOMUX_OFFSET	0x00d8
-#define GRF_GPIO3B_IOMUX_OFFSET	0x00dc
-
-void obio_init_grf(void)
+static void
+obio_init_rk3188(void)
 {
-#if 1
-	/* Radxa Rock */
-	obio_iomux(RK3188_GRF_GPIO3A_IOMUX_OFFSET, 0x55555554); /* MMC0 */
-	obio_iomux(RK3188_GRF_GPIO3B_IOMUX_OFFSET, 0x00050001); /* MMC0 */
-	obio_iomux(RK3188_GRF_IO_CON2_OFFSET,      0x00c000c0); /* MMC0 */
-	obio_iomux(RK3188_GRF_GPIO3D_IOMUX_OFFSET, 0x3c000000); /* VBUS */
-	obio_iomux(RK3188_GRF_GPIO1D_IOMUX_OFFSET, 0x55555555); /* I2C[0124] */
-	obio_iomux(RK3188_GRF_GPIO3B_IOMUX_OFFSET, 0xa000a000); /* I2C3 */
-	obio_iomux(RK3188_GRF_SOC_CON1_OFFSET,	   0xf800f800);	/* I2C[01234] */
-
-//	obio_iomux(RK3188_GRF_GPIO0C_IOMUX_OFFSET, 0x00030000); /* PHY */
-	obio_iomux(RK3188_GRF_GPIO3C_IOMUX_OFFSET, 0xffffaaaa); /* PHY */
-	obio_iomux(RK3188_GRF_GPIO3D_IOMUX_OFFSET, 0x003f000a); /* PHY */
-	obio_iomux(RK3188_GRF_SOC_CON1_OFFSET,     0x00030002); /* VMAC */
-	obio_iomux(RK3188_GRF_IO_CON3_OFFSET,      0x000f000f); /* VMAC */
-#else
-	/* ChipSPARK Rayeager PX2 */
-	obio_iomux(GRF_GPIO0A_IOMUX_OFFSET, 0x14000000); /* VBUS */
-	obio_iomux(GRF_GPIO3A_IOMUX_OFFSET, 0x50004000); /* MMC0 */
-	obio_iomux(GRF_GPIO3B_IOMUX_OFFSET, 0x55551555); /* MMC0 */
-#endif
+	/* com2 */
+	obio_grf_set(RK3188_GRF_GPIO1B_IOMUX_OFFSET, 0x000f0005);
+
+	/* rkiic[01234] */
+	obio_grf_set(RK3188_GRF_GPIO1D_IOMUX_OFFSET, 0x55555555);
+	obio_grf_set(RK3188_GRF_GPIO3B_IOMUX_OFFSET, 0xa000a000);
+	obio_grf_set(RK3188_GRF_SOC_CON1_OFFSET,     0xf800f800);
+
+	/* dwcmmc0 */
+	obio_grf_set(RK3188_GRF_GPIO3A_IOMUX_OFFSET, 0x55555554);
+	obio_grf_set(RK3188_GRF_GPIO3B_IOMUX_OFFSET, 0x00050001);
+	//obio_grf_set(RK3188_GRF_IO_CON2_OFFSET,      0x00c000c0);
+
+	/* rkemac0 */
+	obio_grf_set(RK3188_GRF_GPIO3C_IOMUX_OFFSET, 0xffffaaaa);
+	obio_grf_set(RK3188_GRF_GPIO3D_IOMUX_OFFSET, 0x000f000a);
+	obio_grf_set(RK3188_GRF_SOC_CON1_OFFSET,     0x00030002);
+	obio_grf_set(RK3188_GRF_SOC_CON2_OFFSET,     0x00400040);
+	obio_grf_set(RK3188_GRF_IO_CON3_OFFSET,      0x000f000f);
+
+	/* dwcotg[01] */
+	obio_grf_set(RK3188_GRF_GPIO3D_IOMUX_OFFSET, 0x3c003c00);
+
+	/* Radxa Rock: dwcotg[01] */
+	//obio_grf_set(RK3188_GRF_GPIO3D_IOMUX_OFFSET, 0x3c000000);
+	obio_grf_set(RK3188_GRF_GPIO2D_IOMUX_OFFSET, 0x40000000);
+	obio_gpio_set_out(0, 3, 1);
+	obio_gpio_set_out(2, 31, 1);
+
+	/* Radxa Rock: IT66121 HDMI */
+	obio_gpio_set_out(3, 10, 1);
+
+	/* Radxa Rock: ukphy0 */
+	obio_gpio_set_out(3, 26, 1); /* XXX: RMII_INT, input, active low */
+
+	/* Minix Neo X7: cdce0 */
+	obio_gpio_set_out(0, 30, 1);
 }
 
-void obio_iomux(int offset, int new)
+static void
+obio_grf_set(uint32_t offset, uint32_t value)
 {
 	bus_space_handle_t bh;
 	bus_space_tag_t bt = &rockchip_bs_tag;
-	int old, renew;
+	uint32_t old, new;
 
 	bus_space_subregion(bt, rockchip_core1_bsh, ROCKCHIP_GRF_OFFSET,
 	    ROCKCHIP_GRF_SIZE, &bh);
 
 	old = bus_space_read_4(bt, bh, offset);
-	bus_space_write_4(bt, bh, offset, new);
-	renew = bus_space_read_4(bt, bh, offset);
+	bus_space_write_4(bt, bh, offset, value);
+	new = bus_space_read_4(bt, bh, offset);
 
-	printf("grf iomux: old %08x, new %08x, renew %08x\n", old, new, renew);
+	printf("grf: %04x: 0x%08x 0x%08x -> 0x%08x\n", offset, old, value, new);
 }
 
 #define GPIO_SWPORTA_DR_OFFSET	0x00
-#define GPIO_SWPORTA_DD_OFFSET	0x04
+#define GPIO_SWPORTA_DDR_OFFSET	0x04
 
-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));
-
-	/* PHY */
-	obio_swporta(ROCKCHIP_GPIO3_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(26));
-	obio_swporta(ROCKCHIP_GPIO3_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(26));
-
-	/* Minix Neo X7 USB ethernet */
-	obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DR_OFFSET, __BIT(30));
-	obio_swporta(ROCKCHIP_GPIO0_OFFSET, GPIO_SWPORTA_DD_OFFSET, __BIT(30));
-
-	/* 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));
-	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)
+static int
+obio_gpio_set_out(u_int unit, u_int pin, u_int value)
 {
 	bus_space_handle_t bh;
 	bus_space_tag_t bt = &rockchip_bs_tag;
-	int old, renew;
-	int gpio_size = 0x100; /* XXX */
+	uint32_t gpio_base = 0, gpio_size = 0;
+	uint32_t old, new;
+
+	switch (rockchip_chip_id()) {
+	case ROCKCHIP_CHIP_ID_RK3066:
+		switch (unit) {
+		case 0:
+			gpio_base = ROCKCHIP_GPIO0_OFFSET;
+			gpio_size = ROCKCHIP_GPIO0_SIZE;
+			break;
+		case 1:
+			gpio_base = ROCKCHIP_GPIO1_OFFSET;
+			gpio_size = ROCKCHIP_GPIO1_SIZE;
+			break;
+		case 2:
+			gpio_base = ROCKCHIP_GPIO2_OFFSET;
+			gpio_size = ROCKCHIP_GPIO2_SIZE;
+			break;
+		case 3:
+			gpio_base = ROCKCHIP_GPIO3_OFFSET;
+			gpio_size = ROCKCHIP_GPIO3_SIZE;
+			break;
+		case 4:
+			gpio_base = ROCKCHIP_GPIO4_OFFSET;
+			gpio_size = ROCKCHIP_GPIO4_SIZE;
+			break;
+		case 6:
+			gpio_base = ROCKCHIP_GPIO6_OFFSET;
+			gpio_size = ROCKCHIP_GPIO6_SIZE;
+			break;
+		}
+		break;
+	case ROCKCHIP_CHIP_ID_RK3188:
+	case ROCKCHIP_CHIP_ID_RK3188PLUS:
+		switch (unit) {
+		case 0:
+			gpio_base = ROCKCHIP_RK3188_GPIO0_OFFSET;
+			gpio_size = ROCKCHIP_RK3188_GPIO0_SIZE;
+			break;
+		case 1:
+			gpio_base = ROCKCHIP_GPIO1_OFFSET;
+			gpio_size = ROCKCHIP_GPIO1_SIZE;
+			break;
+		case 2:
+			gpio_base = ROCKCHIP_GPIO2_OFFSET;
+			gpio_size = ROCKCHIP_GPIO2_SIZE;
+			break;
+		case 3:
+			gpio_base = ROCKCHIP_GPIO3_OFFSET;
+			gpio_size = ROCKCHIP_GPIO3_SIZE;
+			break;
+		}
+		break;
+	}
+
+	if (gpio_base == 0 || gpio_size == 0 || pin > 31)
+		return EINVAL;
 
 	bus_space_subregion(bt, rockchip_core1_bsh, gpio_base, gpio_size, &bh);
 
-	old = bus_space_read_4(bt, bh, offset);
-	bus_space_write_4(bt, bh, offset, old | new);
-	renew = bus_space_read_4(bt, bh, offset);
+	old = bus_space_read_4(bt, bh, GPIO_SWPORTA_DR_OFFSET);
+	if (value)
+		new = old | __BIT(pin);
+	else
+		new = old & ~__BIT(pin);
+	bus_space_write_4(bt, bh, GPIO_SWPORTA_DR_OFFSET, new);
+	new = bus_space_read_4(bt, bh, GPIO_SWPORTA_DR_OFFSET);
+	printf("gpio%d: dr 0x%08x -> 0x%08x\n", unit, old, new);
+
+	old = bus_space_read_4(bt, bh, GPIO_SWPORTA_DDR_OFFSET);
+	bus_space_write_4(bt, bh, GPIO_SWPORTA_DDR_OFFSET, old | __BIT(pin));
+	new = bus_space_read_4(bt, bh, GPIO_SWPORTA_DDR_OFFSET);
+	printf("gpio%d: ddr 0x%08x -> 0x%08x\n", unit, old, new);
 
-	printf("gpio: 0x%08x 0x%08x -> 0x%08x\n", gpio_base + offset, old, renew);
+	return 0;
 }
 
 #ifdef ROCKCHIP_CLOCK_DEBUG

Index: src/sys/arch/arm/rockchip/rockchip_board.c
diff -u src/sys/arch/arm/rockchip/rockchip_board.c:1.12 src/sys/arch/arm/rockchip/rockchip_board.c:1.13
--- src/sys/arch/arm/rockchip/rockchip_board.c:1.12	Sun Jan  4 11:52:45 2015
+++ src/sys/arch/arm/rockchip/rockchip_board.c	Sat Jan 17 15:05:24 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rockchip_board.c,v 1.12 2015/01/04 11:52:45 jmcneill Exp $ */
+/* $NetBSD: rockchip_board.c,v 1.13 2015/01/17 15:05:24 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014 Jared D. McNeill <[email protected]>
@@ -29,7 +29,7 @@
 #include "opt_rockchip.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rockchip_board.c,v 1.12 2015/01/04 11:52:45 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rockchip_board.c,v 1.13 2015/01/17 15:05:24 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -62,18 +62,39 @@ rockchip_bootstrap(void)
 		panic("%s: failed to map CORE1 registers: %d", __func__, error);
 }
 
-bool
-rockchip_is_chip(const char *chipver)
+uint32_t
+rockchip_chip_id(void)
 {
-	const size_t chipver_len = 16;
-	char *env_chipver;
+	static uint32_t chip_id = 0;
+	char *chipver;
 
-	if (get_bootconf_option(boot_args, "chipver",
-				BOOTOPT_TYPE_STRING, &env_chipver) == 0) {
-		return false;
+	if (!chip_id) {
+		if (get_bootconf_option(boot_args, "chipver",
+		    BOOTOPT_TYPE_STRING, &chipver) == 0) {
+			return 0;
+		} else if (strncmp(chipver, "300A20111111V101", 16) == 0) {
+			chip_id = ROCKCHIP_CHIP_ID_RK3066;
+		} else if (strncmp(chipver, "310B20121130V100", 16) == 0) {
+			chip_id = ROCKCHIP_CHIP_ID_RK3188;
+		} else if (strncmp(chipver, "310B20130131V101", 16) == 0) {
+			chip_id = ROCKCHIP_CHIP_ID_RK3188PLUS;
+		}
 	}
 
-	return strncmp(env_chipver, chipver, chipver_len) == 0;
+	return chip_id;
+}
+
+const char *
+rockchip_chip_name(void)
+{
+	uint32_t chip_id = rockchip_chip_id();
+
+	switch (chip_id) {
+	case ROCKCHIP_CHIP_ID_RK3066: return "RK3066";
+	case ROCKCHIP_CHIP_ID_RK3188: return "RK3188";
+	case ROCKCHIP_CHIP_ID_RK3188PLUS: return "RK3188+";
+	default: return "Rockchip";
+	}
 }
 
 static void
@@ -97,8 +118,20 @@ rockchip_pll_get_rate(bus_size_t con0_re
 	pll_con1 = bus_space_read_4(bst, bsh, con1_reg);
 
 	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;
+
+	switch (rockchip_chip_id()) {
+	case ROCKCHIP_CHIP_ID_RK3066:
+	case ROCKCHIP_CHIP_ID_RK3188PLUS:
+		no = __SHIFTOUT(pll_con0, CRU_PLL_CON0_CLKOD) + 1;
+		nf = __SHIFTOUT(pll_con1, CRU_PLL_CON1_CLKF) + 1;
+		break;
+	case ROCKCHIP_CHIP_ID_RK3188:
+		no = __SHIFTOUT(pll_con0, RK3188_CRU_PLL_CON0_CLKOD) + 1;
+		nf = __SHIFTOUT(pll_con1, RK3188_CRU_PLL_CON1_CLKF) + 1;
+		break;
+	default:
+		return EINVAL;
+	}
 
 #ifdef ROCKCHIP_CLOCK_DEBUG
 	printf("%s: %#x %#x: nr=%d no=%d nf=%d\n", __func__,
@@ -106,7 +139,7 @@ rockchip_pll_get_rate(bus_size_t con0_re
 	    nr, no, nf);
 #endif
 
-	return (ROCKCHIP_REF_FREQ * nf) / (nr * no);
+	return ((uint64_t)ROCKCHIP_REF_FREQ * nf) / (nr * no);
 }
 
 u_int
@@ -139,31 +172,34 @@ rockchip_cpu_get_rate(void)
 	bus_space_tag_t bst = &rockchip_bs_tag;
 	bus_space_handle_t bsh;
 	uint32_t clksel_con0;
-	uint32_t a9_core_div_con;
-	u_int rate;
+	u_int a9_core_div;
 
 	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) {
-		rate = rockchip_gpll_get_rate();
-	} else {
-		rate = rockchip_apll_get_rate();
-	}
-
-	if (rockchip_is_chip(ROCKCHIP_CHIPVER_RK3066)) {
-		a9_core_div_con = __SHIFTOUT(clksel_con0,
-				     CRU_CLKSEL_CON0_A9_CORE_DIV_CON);
-	} else {
-		a9_core_div_con = __SHIFTOUT(clksel_con0,
-				     RK3188_CRU_CLKSEL_CON0_A9_CORE_DIV_CON);
+	switch (rockchip_chip_id()) {
+	case ROCKCHIP_CHIP_ID_RK3066:
+		a9_core_div = __SHIFTOUT(clksel_con0,
+					 CRU_CLKSEL_CON0_A9_CORE_DIV_CON) + 1;
+		break;
+	case ROCKCHIP_CHIP_ID_RK3188:
+	case ROCKCHIP_CHIP_ID_RK3188PLUS:
+		a9_core_div = __SHIFTOUT(clksel_con0,
+					 RK3188_CRU_CLKSEL_CON0_A9_CORE_DIV_CON) + 1;
+		break;
+	default:
+		return EINVAL;
 	}
 
 #ifdef ROCKCHIP_CLOCK_DEBUG
 	printf("%s: clksel_con0=%#x\n", __func__, clksel_con0);
 #endif
 
-	return rate / (a9_core_div_con + 1);
+	if (clksel_con0 & CRU_CLKSEL_CON0_CPU_CLK_PLL_SEL) {
+		return rockchip_gpll_get_rate() / a9_core_div;
+	} else {
+		return rockchip_apll_get_rate() / a9_core_div;
+	}
 }
 
 u_int
@@ -172,17 +208,15 @@ rockchip_a9periph_get_rate(void)
 	bus_space_tag_t bst = &rockchip_bs_tag;
 	bus_space_handle_t bsh;
 	uint32_t clksel_con0;
-	uint32_t core_peri_div_con;
-	u_int rate;
+	u_int core_peri_div;
 
 	rockchip_get_cru_bsh(&bsh);
 
 	clksel_con0 = bus_space_read_4(bst, bsh, CRU_CLKSEL_CON_REG(0));
-	rate = rockchip_cpu_get_rate();
-	core_peri_div_con = __SHIFTOUT(clksel_con0,
-				       CRU_CLKSEL_CON0_CORE_PERI_DIV_CON);
+	core_peri_div = 1 << (__SHIFTOUT(clksel_con0,
+					 CRU_CLKSEL_CON0_CORE_PERI_DIV_CON) + 1);
 
-	return rate / ((1 << core_peri_div_con) * 2);
+	return rockchip_cpu_get_rate() / core_peri_div;
 }
 
 u_int
@@ -191,13 +225,25 @@ rockchip_pclk_cpu_get_rate(void)
 	bus_space_tag_t bst = &rockchip_bs_tag;
 	bus_space_handle_t bsh;
 	uint32_t clksel_con1;
-	u_int core_axi_div, pclk_div;
+	u_int aclk_div, core_axi_div, pclk_div;
 
 	rockchip_get_cru_bsh(&bsh);
 
 	clksel_con1 = bus_space_read_4(bst, bsh, CRU_CLKSEL_CON_REG(1));
-	switch (__SHIFTOUT(clksel_con1,
-			   RK3188_CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON)) {
+	switch (rockchip_chip_id()) {
+	case ROCKCHIP_CHIP_ID_RK3066:
+		aclk_div = __SHIFTOUT(clksel_con1,
+				      CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON);
+		break;
+	case ROCKCHIP_CHIP_ID_RK3188:
+	case ROCKCHIP_CHIP_ID_RK3188PLUS:
+		aclk_div = __SHIFTOUT(clksel_con1,
+				      RK3188_CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON);
+		break;
+	default:
+		return EINVAL;
+	}
+	switch (aclk_div) {
 	case 0: core_axi_div = 1; break;
 	case 1: core_axi_div = 2; break;
 	case 2: core_axi_div = 3; break;
@@ -218,17 +264,39 @@ rockchip_ahb_get_rate(void)
 	bus_space_handle_t bsh;
 	uint32_t clksel_con10;
 	uint32_t hclk_div, aclk_div;
+	u_int rate;
 
 	rockchip_get_cru_bsh(&bsh);
 
 	clksel_con10 = bus_space_read_4(bst, bsh, CRU_CLKSEL_CON_REG(10));
+	switch (rockchip_chip_id()) {
+	case ROCKCHIP_CHIP_ID_RK3066:
+		if (clksel_con10 & CRU_CLKSEL_CON10_PERI_PLL_SEL) {
+			rate = rockchip_cpll_get_rate();
+		} else {
+			rate = rockchip_gpll_get_rate();
+		}
+		break;
+	case ROCKCHIP_CHIP_ID_RK3188:
+	case ROCKCHIP_CHIP_ID_RK3188PLUS:
+		if (clksel_con10 & CRU_CLKSEL_CON10_PERI_PLL_SEL) {
+			rate = rockchip_gpll_get_rate();
+		} else {
+			rate = rockchip_cpll_get_rate();
+		}
+		break;
+	default:
+		return EINVAL;
+	}
+	aclk_div = __SHIFTOUT(clksel_con10,
+			      CRU_CLKSEL_CON10_PERI_ACLK_DIV_CON) + 1;
+	hclk_div = 1 << __SHIFTOUT(clksel_con10,
+				   CRU_CLKSEL_CON10_PERI_HCLK_DIV_CON);
 
-	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);
+	if (hclk_div > 4)
+		return EINVAL;
 
-	return rockchip_gpll_get_rate() / (hclk_div * aclk_div);
+	return rate / (aclk_div * hclk_div);
 }
 
 u_int
@@ -238,17 +306,37 @@ rockchip_apb_get_rate(void)
 	bus_space_handle_t bsh;
 	uint32_t clksel_con10;
 	uint32_t pclk_div, aclk_div;
+	u_int rate;
 
 	rockchip_get_cru_bsh(&bsh);
 
 	clksel_con10 = bus_space_read_4(bst, bsh, CRU_CLKSEL_CON_REG(10));
 
-	pclk_div = __SHIFTOUT(clksel_con10,
-			      CRU_CLKSEL_CON10_PERI_PCLK_DIV_CON) + 1;
-	aclk_div = 1 << __SHIFTOUT(clksel_con10,
-				   CRU_CLKSEL_CON10_PERI_ACLK_DIV_CON);
+	switch (rockchip_chip_id()) {
+	case ROCKCHIP_CHIP_ID_RK3066:
+		if (clksel_con10 & CRU_CLKSEL_CON10_PERI_PLL_SEL) {
+			rate = rockchip_cpll_get_rate();
+		} else {
+			rate = rockchip_gpll_get_rate();
+		}
+		break;
+	case ROCKCHIP_CHIP_ID_RK3188:
+	case ROCKCHIP_CHIP_ID_RK3188PLUS:
+		if (clksel_con10 & CRU_CLKSEL_CON10_PERI_PLL_SEL) {
+			rate = rockchip_gpll_get_rate();
+		} else {
+			rate = rockchip_cpll_get_rate();
+		}
+		break;
+	default:
+		return EINVAL;
+	}
+	aclk_div = __SHIFTOUT(clksel_con10,
+			      CRU_CLKSEL_CON10_PERI_ACLK_DIV_CON) + 1;
+	pclk_div = 1 << __SHIFTOUT(clksel_con10,
+				   CRU_CLKSEL_CON10_PERI_PCLK_DIV_CON);
 
-	return rockchip_gpll_get_rate() / (pclk_div * aclk_div);
+	return rate / (aclk_div * pclk_div);
 }
 
 u_int
@@ -257,16 +345,16 @@ rockchip_mmc0_get_rate(void)
 	bus_space_tag_t bst = &rockchip_bs_tag;
 	bus_space_handle_t bsh;
 	uint32_t clksel_con11;
-	uint32_t mmc0_div_con;
+	u_int mmc0_div;
 
 	rockchip_get_cru_bsh(&bsh);
 
 	clksel_con11 = bus_space_read_4(bst, bsh, CRU_CLKSEL_CON_REG(11));
 
-	mmc0_div_con = __SHIFTOUT(clksel_con11,
-				  CRU_CLKSEL_CON11_MMC0_DIV_CON);
+	mmc0_div = __SHIFTOUT(clksel_con11,
+			      CRU_CLKSEL_CON11_MMC0_DIV_CON) + 1;
 
-	return rockchip_ahb_get_rate() / (mmc0_div_con + 1);
+	return rockchip_ahb_get_rate() / mmc0_div;
 }
 
 u_int
@@ -281,9 +369,7 @@ rockchip_mmc0_set_div(u_int div)
 
 	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 = CRU_CLKSEL_CON11_MMC0_DIV_CON_MASK;
 	clksel_con11 |= __SHIFTIN(div - 1, CRU_CLKSEL_CON11_MMC0_DIV_CON);
 
 #ifdef ROCKCHIP_CLOCK_DEBUG
@@ -321,19 +407,18 @@ rockchip_mac_get_rate(void)
 	bus_space_tag_t bst = &rockchip_bs_tag;
 	bus_space_handle_t bsh;
 	uint32_t clksel_con21;
-	uint32_t mac_div_con;
+	u_int mac_div;
 
 	rockchip_get_cru_bsh(&bsh);
 
 	clksel_con21 = bus_space_read_4(bst, bsh, CRU_CLKSEL_CON_REG(21));
-
-	mac_div_con = __SHIFTOUT(clksel_con21,
-				 CRU_CLKSEL_CON21_MAC_DIV_CON);
+	mac_div = __SHIFTOUT(clksel_con21,
+			     CRU_CLKSEL_CON21_MAC_DIV_CON) + 1;
 
 	if (clksel_con21 & CRU_CLKSEL_CON21_MAC_PLL_SEL) {
-		return rockchip_dpll_get_rate() / (mac_div_con + 1);
+		return rockchip_dpll_get_rate() / mac_div;
 	} else {
-		return rockchip_gpll_get_rate() / (mac_div_con + 1);
+		return rockchip_gpll_get_rate() / mac_div;
 	}
 }
 

Index: src/sys/arch/arm/rockchip/rockchip_cpufreq.c
diff -u src/sys/arch/arm/rockchip/rockchip_cpufreq.c:1.1 src/sys/arch/arm/rockchip/rockchip_cpufreq.c:1.2
--- src/sys/arch/arm/rockchip/rockchip_cpufreq.c:1.1	Fri Jan  2 21:59:29 2015
+++ src/sys/arch/arm/rockchip/rockchip_cpufreq.c	Sat Jan 17 15:05:24 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rockchip_cpufreq.c,v 1.1 2015/01/02 21:59:29 jmcneill Exp $ */
+/* $NetBSD: rockchip_cpufreq.c,v 1.2 2015/01/17 15:05:24 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -30,7 +30,7 @@
 #include "act8846pm.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rockchip_cpufreq.c,v 1.1 2015/01/02 21:59:29 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rockchip_cpufreq.c,v 1.2 2015/01/17 15:05:24 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -85,17 +85,17 @@ rockchip_cpufreq_init(void)
 	bus_space_subregion(bst, rockchip_core1_bsh, ROCKCHIP_GRF_OFFSET,
 	    ROCKCHIP_GRF_SIZE, &grf_bsh);
 
-	if (rockchip_is_chip(ROCKCHIP_CHIPVER_RK3188) ||
-	    rockchip_is_chip(ROCKCHIP_CHIPVER_RK3188PLUS)) {
+	switch (rockchip_chip_id()) {
+	case ROCKCHIP_CHIP_ID_RK3066: /* XXX */
+	case ROCKCHIP_CHIP_ID_RK3188:
+	case ROCKCHIP_CHIP_ID_RK3188PLUS:
 		cpufreq_set_rate = &rk3188_cpu_set_rate;
 		cpufreq_get_rate = &rk3188_cpu_get_rate;
 		cpufreq_get_available = &rk3188_cpu_get_available;
-	}
-
-	if (cpufreq_set_rate == NULL ||
-	    cpufreq_get_rate == NULL ||
-	    cpufreq_get_available == NULL)
+		break;
+	default:
 		return;
+	}
 
 	nfreq = cpufreq_get_available(availfreq, ROCKCHIP_CPUFREQ_MAX);
 	if (nfreq == 0)
@@ -227,8 +227,10 @@ static const struct rk3188_apll_rate rk3
 	RK3188_RATE( 600, 50, 2, 4, 4, 3, 2, 4, 2, 1000),
 };
 
-#define RK3188_GRF_STATUS0_REG          0x00ac
-#define RK3188_GRF_STATUS0_APLL_LOCK    __BIT(6)
+#define GRF_STATUS0_REG			0x015c
+#define GRF_STATUS0_APLL_LOCK		__BIT(5)
+#define RK3188_GRF_STATUS0_REG		0x00ac
+#define RK3188_GRF_STATUS0_APLL_LOCK	__BIT(6)
 
 static size_t
 rk3188_cpu_get_available(u_int *pavail, size_t maxavail)
@@ -255,25 +257,26 @@ rk3188_cpu_set_rate(u_int rate)
 {
 	const struct rk3188_apll_rate *r = NULL;
 	uint32_t apll_con0, apll_con1, apll_con2, clksel0_con, clksel1_con;
-	uint32_t reset_mask, reset;
+	uint32_t reset_mask, reset, status0_reg, status0_apll_lock;
 	u_int cpu_aclk_div_con;
-	const bool rk3188plus_p = rockchip_is_chip(ROCKCHIP_CHIPVER_RK3188PLUS);
-	device_t pmic;
 	u_int old_rate = rk3188_cpu_get_rate();
 	u_int new_rate;
 #if NACT8846PM > 0
+	device_t pmic;
 	struct act8846_ctrl *dcdc3;
-#endif
-
-#ifdef ROCKCHIP_CLOCK_DEBUG
-	printf("%s: rate=%u rk3188plus_p=%d\n", __func__, rate, rk3188plus_p);
-#endif
 
 	pmic = device_find_by_driver_unit("act8846pm", 0);
 	if (pmic == NULL) {
 		printf("%s: no PMIC driver found\n", __func__);
 		return ENXIO;
 	}
+	dcdc3 = act8846_lookup(pmic, "DCDC3");
+	KASSERT(dcdc3 != NULL);
+#endif
+
+#ifdef ROCKCHIP_CLOCK_DEBUG
+	printf("%s: rate=%u\n", __func__, rate);
+#endif
 
 	/* Pick the closest rate (nearest 100MHz increment) */
 	for (int i = 0; i < __arraycount(rk3188_apll_rates); i++) {
@@ -291,59 +294,34 @@ rk3188_cpu_set_rate(u_int rate)
 		return EINVAL;
 	}
 
-#if NACT8846PM > 0
-	dcdc3 = act8846_lookup(pmic, "DCDC3");
-	KASSERT(dcdc3 != NULL);
-#endif
-
-#ifdef ROCKCHIP_CLOCK_DEBUG
-	printf("%s: Set frequency to %u MHz...\n", __func__, r->rate);
-#endif
-
-	new_rate = r->rate / 1000000;
-	if (new_rate > old_rate) {
-#if NACT8846PM > 0
-		act8846_set_voltage(dcdc3, r->voltage, r->voltage);
-#endif
-	}
-
-	if (rk3188plus_p) {
+	switch (rockchip_chip_id()) {
+	case ROCKCHIP_CHIP_ID_RK3066:
+	case ROCKCHIP_CHIP_ID_RK3188PLUS:
 	    	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(r->no - 1, CRU_PLL_CON0_CLKOD);
-	apll_con0 |= __SHIFTIN(r->nr - 1, CRU_PLL_CON0_CLKR);
-
-	apll_con1 = CRU_PLL_CON1_CLKF_MASK;
-	apll_con1 |= __SHIFTIN(r->nf - 1, CRU_PLL_CON1_CLKF);
-
-	if (rk3188plus_p) {
+		apll_con0 = CRU_PLL_CON0_CLKR_MASK | CRU_PLL_CON0_CLKOD_MASK;
+		apll_con0 |= __SHIFTIN(r->nr - 1, CRU_PLL_CON0_CLKR);
+		apll_con0 |= __SHIFTIN(r->no - 1, CRU_PLL_CON0_CLKOD);
+		apll_con1 = CRU_PLL_CON1_CLKF_MASK;
+		apll_con1 |= __SHIFTIN(r->nf - 1, CRU_PLL_CON1_CLKF);
 		apll_con2 = CRU_PLL_CON2_BWADJ_MASK;
 		apll_con2 |= __SHIFTIN(r->nf >> 1, CRU_PLL_CON2_BWADJ);
-	} else {
+		break;
+	case ROCKCHIP_CHIP_ID_RK3188:
+		reset_mask = CRU_PLL_CON3_POWER_DOWN_MASK;
+		reset = CRU_PLL_CON3_POWER_DOWN;
+		apll_con0 =
+		    CRU_PLL_CON0_CLKR_MASK | RK3188_CRU_PLL_CON0_CLKOD_MASK;
+		apll_con0 |= __SHIFTIN(r->nr - 1, CRU_PLL_CON0_CLKR);
+		apll_con0 |= __SHIFTIN(r->no - 1, RK3188_CRU_PLL_CON0_CLKOD);
+		apll_con1 = RK3188_CRU_PLL_CON1_CLKF_MASK;
+		apll_con1 |= __SHIFTIN(r->nf - 1, RK3188_CRU_PLL_CON1_CLKF);
 		apll_con2 = 0;
+		break;
+	default:
+		return EINVAL;
 	}
 
-	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;
-	clksel0_con |= __SHIFTIN(r->core_div - 1,
-				 RK3188_CRU_CLKSEL_CON0_A9_CORE_DIV_CON);
-	clksel0_con |= __SHIFTIN(ffs(r->core_periph_div) - 2,
-				 CRU_CLKSEL_CON0_CORE_PERI_DIV_CON);
-	clksel0_con |= __SHIFTIN(r->aclk_div - 1,
-				 CRU_CLKSEL_CON0_A9_CORE_DIV_CON);
-
-	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 |
-		      RK3188_CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON_MASK;
-
 	switch (r->core_axi_div) {
 	case 1:	cpu_aclk_div_con = 0; break;
 	case 2: cpu_aclk_div_con = 1; break;
@@ -352,16 +330,59 @@ rk3188_cpu_set_rate(u_int rate)
 	case 8: cpu_aclk_div_con = 4; break;
 	default: panic("bad core_axi_div");
 	}
-	clksel1_con |= __SHIFTIN(ffs(r->ahb2apb_div) - 1,
-				 CRU_CLKSEL_CON1_AHB2APB_PCLKEN_DIV_CON);
-	clksel1_con |= __SHIFTIN(ffs(r->hclk_div) - 1,
-				 CRU_CLKSEL_CON1_CPU_HCLK_DIV_CON);
-	clksel1_con |= __SHIFTIN(ffs(r->pclk_div) - 1,
-				 CRU_CLKSEL_CON1_CPU_PCLK_DIV_CON);
-	clksel1_con |= __SHIFTIN(cpu_aclk_div_con,
-				 RK3188_CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON);
+
+	switch (rockchip_chip_id()) {
+	case ROCKCHIP_CHIP_ID_RK3066:
+		clksel0_con = CRU_CLKSEL_CON0_A9_CORE_DIV_CON_MASK |
+			      CRU_CLKSEL_CON0_CORE_PERI_DIV_CON_MASK;
+		clksel0_con |= __SHIFTIN(r->core_div - 1,
+					 CRU_CLKSEL_CON0_A9_CORE_DIV_CON);
+		clksel0_con |= __SHIFTIN(ffs(r->core_periph_div) - 2,
+					 CRU_CLKSEL_CON0_CORE_PERI_DIV_CON);
+		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 |
+			      CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON_MASK;
+		clksel1_con |= __SHIFTIN(ffs(r->ahb2apb_div) - 1,
+					 CRU_CLKSEL_CON1_AHB2APB_PCLKEN_DIV_CON);
+		clksel1_con |= __SHIFTIN(ffs(r->hclk_div) - 1,
+					 CRU_CLKSEL_CON1_CPU_HCLK_DIV_CON);
+		clksel1_con |= __SHIFTIN(ffs(r->pclk_div) - 1,
+					 CRU_CLKSEL_CON1_CPU_PCLK_DIV_CON);
+		clksel1_con |= __SHIFTIN(cpu_aclk_div_con,
+					 CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON);
+		status0_reg = GRF_STATUS0_REG;
+		status0_apll_lock = GRF_STATUS0_APLL_LOCK;
+		break;
+	case ROCKCHIP_CHIP_ID_RK3188:
+	case ROCKCHIP_CHIP_ID_RK3188PLUS:
+		clksel0_con = RK3188_CRU_CLKSEL_CON0_A9_CORE_DIV_CON_MASK |
+			      CRU_CLKSEL_CON0_CORE_PERI_DIV_CON_MASK;
+		clksel0_con |= __SHIFTIN(r->core_div - 1,
+					 RK3188_CRU_CLKSEL_CON0_A9_CORE_DIV_CON);
+		clksel0_con |= __SHIFTIN(ffs(r->core_periph_div) - 2,
+					 CRU_CLKSEL_CON0_CORE_PERI_DIV_CON);
+		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 |
+			      RK3188_CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON_MASK;
+		clksel1_con |= __SHIFTIN(ffs(r->ahb2apb_div) - 1,
+					 CRU_CLKSEL_CON1_AHB2APB_PCLKEN_DIV_CON);
+		clksel1_con |= __SHIFTIN(ffs(r->hclk_div) - 1,
+					 CRU_CLKSEL_CON1_CPU_HCLK_DIV_CON);
+		clksel1_con |= __SHIFTIN(ffs(r->pclk_div) - 1,
+					 CRU_CLKSEL_CON1_CPU_PCLK_DIV_CON);
+		clksel1_con |= __SHIFTIN(cpu_aclk_div_con,
+					 RK3188_CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON);
+		status0_reg = RK3188_GRF_STATUS0_REG;
+		status0_apll_lock = RK3188_GRF_STATUS0_APLL_LOCK;
+		break;
+	default:
+		return EINVAL;
+	}
 
 #ifdef ROCKCHIP_CLOCK_DEBUG
+	printf("%s: Set frequency to %u MHz...\n", __func__, r->rate);
 	printf("before: APLL_CON0: %#x\n",
 	    bus_space_read_4(bst, cru_bsh, CRU_APLL_CON0_REG));
 	printf("before: APLL_CON1: %#x\n",
@@ -372,6 +393,13 @@ rk3188_cpu_set_rate(u_int rate)
 	    bus_space_read_4(bst, cru_bsh, CRU_CLKSEL_CON_REG(1)));
 #endif
 
+	new_rate = r->rate / 1000000;
+	if (new_rate > old_rate) {
+#if NACT8846PM > 0
+		act8846_set_voltage(dcdc3, r->voltage, r->voltage);
+#endif
+	}
+
 	bus_space_write_4(bst, cru_bsh, CRU_MODE_CON_REG,
 	    CRU_MODE_CON_APLL_WORK_MODE_MASK |
 	    __SHIFTIN(CRU_MODE_CON_APLL_WORK_MODE_SLOW,
@@ -400,12 +428,9 @@ rk3188_cpu_set_rate(u_int rate)
 		;
 	int retry = ROCKCHIP_REF_FREQ;
 	while (--retry > 0) {
-		uint32_t status = bus_space_read_4(bst, grf_bsh,
-		    RK3188_GRF_STATUS0_REG);
-		if (status & RK3188_GRF_STATUS0_APLL_LOCK)
+		uint32_t status = bus_space_read_4(bst, grf_bsh, status0_reg);
+		if (status & status0_apll_lock)
 			break;
-		for (volatile int i = 1000; i >= 0; i--)
-			;
 	}
 	if (retry == 0)
 		printf("%s: PLL lock timeout\n", __func__);
Index: src/sys/arch/arm/rockchip/rockchip_timer.c
diff -u src/sys/arch/arm/rockchip/rockchip_timer.c:1.1 src/sys/arch/arm/rockchip/rockchip_timer.c:1.2
--- src/sys/arch/arm/rockchip/rockchip_timer.c:1.1	Fri Jan  2 23:20:18 2015
+++ src/sys/arch/arm/rockchip/rockchip_timer.c	Sat Jan 17 15:05:24 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rockchip_timer.c,v 1.1 2015/01/02 23:20:18 jmcneill Exp $ */
+/* $NetBSD: rockchip_timer.c,v 1.2 2015/01/17 15:05:24 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rockchip_timer.c,v 1.1 2015/01/02 23:20:18 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rockchip_timer.c,v 1.2 2015/01/17 15:05:24 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -65,6 +65,10 @@ CFATTACH_DECL_NEW(rktimer, sizeof(struct
 static int
 rktimer_match(device_t parent, cfdata_t cf, void *aux)
 {
+
+	if (rockchip_chip_id() == ROCKCHIP_CHIP_ID_RK3066)
+		return 0;
+
 	return 1;
 }
 

Index: src/sys/arch/arm/rockchip/rockchip_crureg.h
diff -u src/sys/arch/arm/rockchip/rockchip_crureg.h:1.7 src/sys/arch/arm/rockchip/rockchip_crureg.h:1.8
--- src/sys/arch/arm/rockchip/rockchip_crureg.h:1.7	Sun Jan  4 11:54:05 2015
+++ src/sys/arch/arm/rockchip/rockchip_crureg.h	Sat Jan 17 15:05:24 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rockchip_crureg.h,v 1.7 2015/01/04 11:54:05 jmcneill Exp $ */
+/* $NetBSD: rockchip_crureg.h,v 1.8 2015/01/17 15:05:24 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014 Jared D. McNeill <[email protected]>
@@ -54,21 +54,25 @@
 #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(21,16)
-#define CRU_PLL_CON0_CLKR	__BITS(13,8)
-#define CRU_PLL_CON0_CLKOD	__BITS(5,0)
-
-#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_PLL_CON0_CLKR_MASK		__BITS(29,24)
+#define CRU_PLL_CON0_CLKOD_MASK		__BITS(18,16)
+#define CRU_PLL_CON0_CLKR		__BITS(13,8)
+#define CRU_PLL_CON0_CLKOD		__BITS(3,0)
+#define RK3188_CRU_PLL_CON0_CLKOD_MASK	__BITS(21,16)
+#define RK3188_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 RK3188_CRU_PLL_CON1_CLKF_MASK	__BITS(31,16)
+#define RK3188_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)
 #define CRU_MODE_CON_APLL_WORK_MODE		__BITS(1,0)
@@ -76,38 +80,36 @@
 #define CRU_MODE_CON_APLL_WORK_MODE_NORMAL	1
 #define CRU_MODE_CON_APLL_WORK_MODE_DEEP_SLOW	2
 
-#define RK3188_CRU_CLKSEL_CON0_A9_CORE_DIV_CON_MASK __BITS(29,25)
 #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 RK3188_CRU_CLKSEL_CON0_A9_CORE_DIV_CON	__BITS(13,9)
 #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_MASK __BITS(29,25)
+#define RK3188_CRU_CLKSEL_CON0_A9_CORE_DIV_CON	__BITS(13,9)
 
 #define CRU_CLKSEL_CON1_AHB2APB_PCLKEN_DIV_CON_MASK __BITS(31,30)
 #define CRU_CLKSEL_CON1_CPU_PCLK_DIV_CON_MASK	__BITS(29,28)
 #define CRU_CLKSEL_CON1_CPU_HCLK_DIV_CON_MASK	__BITS(25,24)
-#define RK3188_CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON_MASK __BITS(21,19)
 #define CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON_MASK	__BITS(18,16)
 #define CRU_CLKSEL_CON1_AHB2APB_PCLKEN_DIV_CON	__BITS(15,14)
 #define CRU_CLKSEL_CON1_CPU_PCLK_DIV_CON	__BITS(13,12)
 #define CRU_CLKSEL_CON1_CPU_HCLK_DIV_CON	__BITS(9,8)
-#define RK3188_CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON	__BITS(5,3)
 #define CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON	__BITS(2,0)
+#define RK3188_CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON_MASK __BITS(21,19)
+#define RK3188_CRU_CLKSEL_CON1_CPU_ACLK_DIV_CON	__BITS(5,3)
 
 #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(26,24)
+#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(10,8)
+#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_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_CLKSEL_CON13_UART0_CLK_SEL_MASK	__BITS(25,24)

Index: src/sys/arch/arm/rockchip/rockchip_emac.c
diff -u src/sys/arch/arm/rockchip/rockchip_emac.c:1.10 src/sys/arch/arm/rockchip/rockchip_emac.c:1.11
--- src/sys/arch/arm/rockchip/rockchip_emac.c:1.10	Tue Jan 13 10:36:15 2015
+++ src/sys/arch/arm/rockchip/rockchip_emac.c	Sat Jan 17 15:05:24 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rockchip_emac.c,v 1.10 2015/01/13 10:36:15 jmcneill Exp $ */
+/* $NetBSD: rockchip_emac.c,v 1.11 2015/01/17 15:05:24 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -29,7 +29,7 @@
 #include "opt_rkemac.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rockchip_emac.c,v 1.10 2015/01/13 10:36:15 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rockchip_emac.c,v 1.11 2015/01/17 15:05:24 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -182,8 +182,8 @@ rkemac_attach(device_t parent, device_t 
 	callout_init(&sc->sc_mii_tick, 0);
 	callout_setfunc(&sc->sc_mii_tick, rkemac_tick, sc);
 
-	if (rockchip_is_chip(ROCKCHIP_CHIPVER_RK3188) ||
-	    rockchip_is_chip(ROCKCHIP_CHIPVER_RK3188PLUS)) {
+	if (rockchip_chip_id() == ROCKCHIP_CHIP_ID_RK3188 ||
+	    rockchip_chip_id() == ROCKCHIP_CHIP_ID_RK3188PLUS) {
 		soc_con1_reg = 0x00a4;
 	} else {
 		soc_con1_reg = 0x0154;
@@ -264,7 +264,7 @@ rkemac_attach(device_t parent, device_t 
 	mii->mii_readreg = rkemac_mii_readreg;
 	mii->mii_writereg = rkemac_mii_writereg;
 	mii->mii_statchg = rkemac_mii_statchg;
-	mii_attach(sc->sc_dev, mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY, 0);
+	mii_attach(sc->sc_dev, mii, 0xffffffff, 0/* XXX */, MII_OFFSET_ANY, 0);
 
 	if (LIST_EMPTY(&mii->mii_phys)) {
 		aprint_error_dev(sc->sc_dev, "no PHY found!\n");

Index: src/sys/arch/arm/rockchip/rockchip_reg.h
diff -u src/sys/arch/arm/rockchip/rockchip_reg.h:1.4 src/sys/arch/arm/rockchip/rockchip_reg.h:1.5
--- src/sys/arch/arm/rockchip/rockchip_reg.h:1.4	Sun Dec 28 16:03:09 2014
+++ src/sys/arch/arm/rockchip/rockchip_reg.h	Sat Jan 17 15:05:24 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rockchip_reg.h,v 1.4 2014/12/28 16:03:09 jmcneill Exp $ */
+/* $NetBSD: rockchip_reg.h,v 1.5 2015/01/17 15:05:24 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -81,10 +81,14 @@
 #define ROCKCHIP_UART2_SIZE	0x400
 #define ROCKCHIP_UART3_OFFSET	0x00068000
 #define ROCKCHIP_UART3_SIZE	0x400
-#define ROCKCHIP_GPIO0_OFFSET	0x0000A000
-#define ROCKCHIP_GPIO0_SIZE	0x100
+#define ROCKCHIP_GPIO6_OFFSET	0x0000A000
+#define ROCKCHIP_GPIO6_SIZE	0x100
+#define ROCKCHIP_RK3188_GPIO0_OFFSET	0x0000A000
+#define ROCKCHIP_RK3188_GPIO0_SIZE	0x100
 #define ROCKCHIP_DDR_PCTL_OFFSET 0x00020000
 #define ROCKCHIP_DDR_PCTL_SIZE	0x4000
+#define ROCKCHIP_GPIO0_OFFSET	0x00034000
+#define ROCKCHIP_GPIO0_SIZE	0x100
 #define ROCKCHIP_GPIO1_OFFSET	0x0003C000
 #define ROCKCHIP_GPIO1_SIZE	0x100
 #define ROCKCHIP_GPIO2_OFFSET	0x0003E000
@@ -93,5 +97,7 @@
 #define ROCKCHIP_DDR_PUBL_SIZE	0x4000
 #define ROCKCHIP_GPIO3_OFFSET	0x00080000
 #define ROCKCHIP_GPIO3_SIZE	0x100
+#define ROCKCHIP_GPIO4_OFFSET	0x00084000
+#define ROCKCHIP_GPIO4_SIZE	0x100
 
 #endif /* _ARM_ROCKCHIP_ROCKCHIP_REG_H_ */

Index: src/sys/arch/arm/rockchip/rockchip_var.h
diff -u src/sys/arch/arm/rockchip/rockchip_var.h:1.11 src/sys/arch/arm/rockchip/rockchip_var.h:1.12
--- src/sys/arch/arm/rockchip/rockchip_var.h:1.11	Mon Jan  5 21:35:53 2015
+++ src/sys/arch/arm/rockchip/rockchip_var.h	Sat Jan 17 15:05:24 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rockchip_var.h,v 1.11 2015/01/05 21:35:53 jmcneill Exp $ */
+/* $NetBSD: rockchip_var.h,v 1.12 2015/01/17 15:05:24 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -62,10 +62,11 @@ void rockchip_bootstrap(void);
 
 void rockchip_cpufreq_init(void);
 
-bool rockchip_is_chip(const char *);
-#define ROCKCHIP_CHIPVER_RK3066		"300A20111111V101"
-#define ROCKCHIP_CHIPVER_RK3188		"310B20121130V100"
-#define ROCKCHIP_CHIPVER_RK3188PLUS	"310B20130131V101"
+uint32_t rockchip_chip_id(void);
+#define ROCKCHIP_CHIP_ID_RK3066		0x30660000
+#define ROCKCHIP_CHIP_ID_RK3188		0x31880000
+#define ROCKCHIP_CHIP_ID_RK3188PLUS	0x31880001
+const char *rockchip_chip_name(void);
 
 u_int rockchip_apll_get_rate(void);
 u_int rockchip_cpll_get_rate(void);

Index: src/sys/arch/evbarm/conf/ROCKCHIP
diff -u src/sys/arch/evbarm/conf/ROCKCHIP:1.17 src/sys/arch/evbarm/conf/ROCKCHIP:1.18
--- src/sys/arch/evbarm/conf/ROCKCHIP:1.17	Sun Jan 11 16:53:42 2015
+++ src/sys/arch/evbarm/conf/ROCKCHIP	Sat Jan 17 15:05:24 2015
@@ -1,5 +1,5 @@
 #
-#	$NetBSD: ROCKCHIP,v 1.17 2015/01/11 16:53:42 jmcneill Exp $
+#	$NetBSD: ROCKCHIP,v 1.18 2015/01/17 15:05:24 jmcneill Exp $
 #
 #	Rockchip RK3066/RK3188 based SBC (Single Board Computer)
 #
@@ -179,6 +179,7 @@ com0		at obio0 addr 0x20064000 size 0x40
 options 	CONSADDR=0x20064000, CONSPEED=115200
 
 # Timer
+dwctmr2 	at obio0 addr 0x2000e000 size 0x2000 crit 1
 rktimer0	at obio0 addr 0x20038000 size 0x2000 crit 1
 
 # I2C controllers

Index: src/sys/arch/evbarm/rockchip/rockchip_machdep.c
diff -u src/sys/arch/evbarm/rockchip/rockchip_machdep.c:1.19 src/sys/arch/evbarm/rockchip/rockchip_machdep.c:1.20
--- src/sys/arch/evbarm/rockchip/rockchip_machdep.c:1.19	Tue Jan  6 00:45:45 2015
+++ src/sys/arch/evbarm/rockchip/rockchip_machdep.c	Sat Jan 17 15:05:24 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: rockchip_machdep.c,v 1.19 2015/01/06 00:45:45 jmcneill Exp $ */
+/*	$NetBSD: rockchip_machdep.c,v 1.20 2015/01/17 15:05:24 jmcneill Exp $ */
 
 /*
  * Machine dependent functions for kernel setup for TI OSK5912 board.
@@ -125,7 +125,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rockchip_machdep.c,v 1.19 2015/01/06 00:45:45 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rockchip_machdep.c,v 1.20 2015/01/17 15:05:24 jmcneill Exp $");
 
 #include "opt_machdep.h"
 #include "opt_ddb.h"
@@ -520,7 +520,7 @@ initarm(void *arg)
 
 #ifdef VERBOSE_INIT_ARM
 	/* Talk to the user */
-	printf("\nNetBSD/evbarm (rockchip) booting ...\n");
+	printf("\nNetBSD/evbarm (%s) booting ...\n", rockchip_chip_name());
 #endif
 
 #ifdef BOOT_ARGS
@@ -530,13 +530,13 @@ initarm(void *arg)
 
 #ifdef VERBOSE_INIT_ARM
 	printf("initarm: Configuring system ...\n");
-#endif
 
 #if !defined(CPU_CORTEXA8)
 	printf("initarm: cbar=%#x\n", armreg_cbar_read());
 	printf("KERNEL_BASE=0x%x, KERNEL_VM_BASE=0x%x, KERNEL_VM_BASE - KERNEL_BASE=0x%x, KERNEL_BASE_VOFFSET=0x%x\n",
 		KERNEL_BASE, KERNEL_VM_BASE, KERNEL_VM_BASE - KERNEL_BASE, KERNEL_BASE_VOFFSET);
 #endif
+#endif
 
 	ram_size = rockchip_get_memsize();
 

Reply via email to