Module Name:    src
Committed By:   martin
Date:           Sat Jan 17 13:44:47 UTC 2015

Modified Files:
        src/share/man/man4 [netbsd-7]: rtsx.4
        src/sys/dev/ic [netbsd-7]: rtsx.c rtsxreg.h rtsxvar.h
        src/sys/dev/pci [netbsd-7]: rtsx_pci.c

Log Message:
Pull up following revision(s) (requested by nonaka in ticket #432):
        sys/dev/ic/rtsxreg.h: revision 1.2
        sys/dev/ic/rtsxvar.h: revision 1.2
        sys/dev/pci/rtsx_pci.c: revision 1.3
        sys/dev/ic/rtsx.c: revision 1.2
        share/man/man4/rtsx.4: revision 1.3-1.4
Added RTS5227/RTL8402/RTL8411/RTL8411B support.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.2.6.1 src/share/man/man4/rtsx.4
cvs rdiff -u -r1.1 -r1.1.8.1 src/sys/dev/ic/rtsx.c src/sys/dev/ic/rtsxreg.h \
    src/sys/dev/ic/rtsxvar.h
cvs rdiff -u -r1.2 -r1.2.8.1 src/sys/dev/pci/rtsx_pci.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/share/man/man4/rtsx.4
diff -u src/share/man/man4/rtsx.4:1.2 src/share/man/man4/rtsx.4:1.2.6.1
--- src/share/man/man4/rtsx.4:1.2	Wed Mar 19 17:48:34 2014
+++ src/share/man/man4/rtsx.4	Sat Jan 17 13:44:47 2015
@@ -1,10 +1,10 @@
-.\"	$NetBSD: rtsx.4,v 1.2 2014/03/19 17:48:34 wiz Exp $
-.\"	$OpenBSD: rtsx.4,v 1.4 2013/11/06 13:51:02 stsp Exp $
+.\"	$NetBSD: rtsx.4,v 1.2.6.1 2015/01/17 13:44:47 martin Exp $
+.\"	$OpenBSD: rtsx.4,v 1.6 2014/05/18 10:52:17 stsp Exp $
 .\"
 .\" Theo de Raadt, 2006. Public Domain.
 .\" Stefan Sperling, 2012. Public Domain.
 .\"
-.Dd March 19, 2014
+.Dd October 29, 2014
 .Dt RTSX 4
 .Os
 .Sh NAME
@@ -16,7 +16,8 @@
 .Sh DESCRIPTION
 The
 .Nm
-driver provides support for the Realtek RTS5209 and RTS5229 SD card readers.
+driver provides support for the Realtek RTS5209, RTS5227, RTS5229,
+RTL8402, RTL8411 and RTL8411B SD card readers.
 .Pp
 The
 .Xr sdmmc 4

Index: src/sys/dev/ic/rtsx.c
diff -u src/sys/dev/ic/rtsx.c:1.1 src/sys/dev/ic/rtsx.c:1.1.8.1
--- src/sys/dev/ic/rtsx.c:1.1	Wed Mar 19 15:26:41 2014
+++ src/sys/dev/ic/rtsx.c	Sat Jan 17 13:44:47 2015
@@ -1,5 +1,5 @@
-/*	$NetBSD: rtsx.c,v 1.1 2014/03/19 15:26:41 nonaka Exp $	*/
-/*	$OpenBSD: rtsx.c,v 1.7 2013/12/08 18:31:03 stsp Exp $	*/
+/*	$NetBSD: rtsx.c,v 1.1.8.1 2015/01/17 13:44:47 martin Exp $	*/
+/*	$OpenBSD: rtsx.c,v 1.10 2014/08/19 17:55:03 phessler Exp $	*/
 
 /*
  * Copyright (c) 2006 Uwe Stuehler <u...@openbsd.org>
@@ -19,11 +19,11 @@
  */
 
 /*
- * Realtek RTS5209/RTS5229 Card Reader driver.
+ * Realtek RTS5209/RTS5227/RTS5229/RTL8402/RTL8411/RTL8411B Card Reader driver.
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsx.c,v 1.1 2014/03/19 15:26:41 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsx.c,v 1.1.8.1 2015/01/17 13:44:47 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -97,6 +97,13 @@ __KERNEL_RCSID(0, "$NetBSD: rtsx.c,v 1.1
 			return err;				\
 	} while (/*CONSTCOND*/0)
 
+#define RTSX_BITOP(sc, reg, mask, bits)				\
+	do {							\
+		int err = rtsx_write((sc), (reg), (mask), (bits));\
+		if (err) 					\
+			return err;				\
+	} while (/*CONSTCOND*/0)
+
 static int	rtsx_host_reset(sdmmc_chipset_handle_t);
 static uint32_t	rtsx_host_ocr(sdmmc_chipset_handle_t);
 static int	rtsx_host_maxblklen(sdmmc_chipset_handle_t);
@@ -214,7 +221,8 @@ rtsx_attach(struct rtsx_softc *sc, bus_s
 	}
 
 	if (bus_dmamap_create(sc->sc_dmat, RTSX_HOSTCMD_BUFSIZE, 1,
-	    RTSX_DMA_MAX_SEGSIZE, 0, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, &sc->sc_dmap_cmd) != 0)
+	    RTSX_DMA_MAX_SEGSIZE, 0, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW,
+	    &sc->sc_dmap_cmd) != 0)
 		goto error;
 
 	/*
@@ -319,23 +327,30 @@ static int
 rtsx_init(struct rtsx_softc *sc, int attaching)
 {
 	uint32_t status;
-	uint8_t ver;
+	uint8_t reg;
 	int error;
 
-	/* Read IC version from dummy register. */
-	if (sc->sc_flags & RTSX_F_5229) {
-		RTSX_READ(sc, RTSX_DUMMY_REG, &ver);
-		switch (ver & 0x0f) {
-		case RTSX_IC_VERSION_A:
-		case RTSX_IC_VERSION_B:
-		case RTSX_IC_VERSION_D:
-			break;
-		case RTSX_IC_VERSION_C:
-			sc->sc_flags |= RTSX_F_5229_TYPE_C;
-			break;
-		default:
-			aprint_error_dev(sc->sc_dev, "unknown ic %02x\n", ver);
-			return 1;
+	if (attaching) {
+		if (RTSX_IS_RTS5229(sc)) {
+			/* Read IC version from dummy register. */
+			RTSX_READ(sc, RTSX_DUMMY_REG, &reg);
+			switch (reg & 0x0f) {
+			case RTSX_IC_VERSION_A:
+			case RTSX_IC_VERSION_B:
+			case RTSX_IC_VERSION_D:
+				break;
+			case RTSX_IC_VERSION_C:
+				sc->sc_flags |= RTSX_F_5229_TYPE_C;
+				break;
+			default:
+				aprint_error_dev(sc->sc_dev,
+				    "unknown RTS5229 version 0x%02x\n", reg);
+				return 1;
+			}
+		} else if (RTSX_IS_RTL8411B(sc)) {
+			RTSX_READ(sc, RTSX_RTL8411B_PACKAGE, &reg);
+			if (reg & RTSX_RTL8411B_QFN48)
+				sc->sc_flags |= RTSX_F_8411B_QFN48;
 		}
 	}
 
@@ -359,10 +374,12 @@ rtsx_init(struct rtsx_softc *sc, int att
 	delay(200);
 
 	/* XXX magic numbers from linux driver */
-	if (sc->sc_flags & RTSX_F_5209)
+	if (RTSX_IS_RTS5209(sc))
 		error = rtsx_write_phy(sc, 0x00, 0xB966);
-	else
+	else if (RTSX_IS_RTS5227(sc) || RTSX_IS_RTS5229(sc))
 		error = rtsx_write_phy(sc, 0x00, 0xBA42);
+	else
+		error = 0;
 	if (error) {
 		aprint_error_dev(sc->sc_dev, "couldn't write phy register\n");
 		return 1;
@@ -397,16 +414,26 @@ rtsx_init(struct rtsx_softc *sc, int att
 	RTSX_SET(sc, RTSX_PETXCFG, RTSX_PETXCFG_CLKREQ_PIN);
 
 	/* Set up LED GPIO. */
-	if (sc->sc_flags & RTSX_F_5209) {
+	if (RTSX_IS_RTS5209(sc)) {
 		RTSX_WRITE(sc, RTSX_CARD_GPIO, 0x03);
 		RTSX_WRITE(sc, RTSX_CARD_GPIO_DIR, 0x03);
-	} else {
+	} else if (RTSX_IS_RTS5227(sc) || RTSX_IS_RTS5229(sc)) {
 		RTSX_SET(sc, RTSX_GPIO_CTL, RTSX_GPIO_LED_ON);
 		/* Switch LDO3318 source from DV33 to 3V3. */
 		RTSX_CLR(sc, RTSX_LDO_PWR_SEL, RTSX_LDO_PWR_SEL_DV33);
 		RTSX_SET(sc, RTSX_LDO_PWR_SEL, RTSX_LDO_PWR_SEL_3V3);
 		/* Set default OLT blink period. */
 		RTSX_SET(sc, RTSX_OLT_LED_CTL, RTSX_OLT_LED_PERIOD);
+	} else if (RTSX_IS_RTL8402(sc)
+	           || RTSX_IS_RTL8411(sc)
+	           || RTSX_IS_RTL8411B(sc)) {
+		if (RTSX_IS_RTL8411B_QFN48(sc))
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, 0xf5);
+		/* Enable SD interrupt */
+		RTSX_WRITE(sc, RTSX_CARD_PAD_CTL, 0x05);
+		RTSX_BITOP(sc, RTSX_EFUSE_CONTENT, 0xe0, 0x80);
+		if (RTSX_IS_RTL8411B(sc))
+			RTSX_WRITE(sc, RTSX_FUNC_FORCE_CTL, 0x00);
 	}
 
 	return 0;
@@ -416,13 +443,19 @@ int
 rtsx_led_enable(struct rtsx_softc *sc)
 {
 
-	if (sc->sc_flags & RTSX_F_5209) {
+	if (RTSX_IS_RTS5209(sc)) {
 		RTSX_CLR(sc, RTSX_CARD_GPIO, RTSX_CARD_GPIO_LED_OFF);
 		RTSX_WRITE(sc, RTSX_CARD_AUTO_BLINK,
 		    RTSX_LED_BLINK_EN | RTSX_LED_BLINK_SPEED);
-	} else {
+	} else if (RTSX_IS_RTS5227(sc) || RTSX_IS_RTS5229(sc)) {
 		RTSX_SET(sc, RTSX_GPIO_CTL, RTSX_GPIO_LED_ON);
 		RTSX_SET(sc, RTSX_OLT_LED_CTL, RTSX_OLT_LED_AUTOBLINK);
+	} else if (RTSX_IS_RTL8402(sc)
+	           || RTSX_IS_RTL8411(sc)
+	           || RTSX_IS_RTL8411B(sc)) {
+		RTSX_CLR(sc, RTSX_GPIO_CTL, 0x01);
+		RTSX_WRITE(sc, RTSX_CARD_AUTO_BLINK,
+		    RTSX_LED_BLINK_EN | RTSX_LED_BLINK_SPEED);
 	}
 
 	return 0;
@@ -432,12 +465,17 @@ int
 rtsx_led_disable(struct rtsx_softc *sc)
 {
 
-	if (sc->sc_flags & RTSX_F_5209) {
+	if (RTSX_IS_RTS5209(sc)) {
 		RTSX_CLR(sc, RTSX_CARD_AUTO_BLINK, RTSX_LED_BLINK_EN);
 		RTSX_WRITE(sc, RTSX_CARD_GPIO, RTSX_CARD_GPIO_LED_OFF);
-	} else {
+	} else if (RTSX_IS_RTS5227(sc) || RTSX_IS_RTS5229(sc)) {
 		RTSX_CLR(sc, RTSX_OLT_LED_CTL, RTSX_OLT_LED_AUTOBLINK);
 		RTSX_CLR(sc, RTSX_GPIO_CTL, RTSX_GPIO_LED_ON);
+	} else if (RTSX_IS_RTL8402(sc)
+	           || RTSX_IS_RTL8411(sc)
+	           || RTSX_IS_RTL8411B(sc)) {
+		RTSX_CLR(sc, RTSX_CARD_AUTO_BLINK, RTSX_LED_BLINK_EN);
+		RTSX_SET(sc, RTSX_GPIO_CTL, 0x01);
 	}
 
 	return 0;
@@ -520,22 +558,51 @@ rtsx_bus_power_off(struct rtsx_softc *sc
 
 	/* Turn off power. */
 	disable3 = RTSX_PULL_CTL_DISABLE3;
-	if (sc->sc_flags & RTSX_F_5209)
+	if (RTSX_IS_RTS5209(sc))
 		RTSX_SET(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_OFF);
-	else {
+	else if (RTSX_IS_RTS5227(sc) || RTSX_IS_RTS5229(sc)) {
 		RTSX_CLR(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_VCC1 |
 		    RTSX_LDO3318_VCC2);
-		if (sc->sc_flags & RTSX_F_5229_TYPE_C)
+		if (RTSX_IS_RTS5229_TYPE_C(sc))
 			disable3 = RTSX_PULL_CTL_DISABLE3_TYPE_C;
+	} else if (RTSX_IS_RTL8402(sc)
+	           || RTSX_IS_RTL8411(sc)
+	           || RTSX_IS_RTL8411B(sc)) {
+		RTSX_BITOP(sc, RTSX_CARD_PWR_CTL, RTSX_BPP_POWER_MASK,
+		    RTSX_BPP_POWER_OFF);
+		RTSX_BITOP(sc, RTSX_LDO_CTL, RTSX_BPP_LDO_POWB,
+		    RTSX_BPP_LDO_SUSPEND);
 	}
 
 	RTSX_SET(sc, RTSX_CARD_PWR_CTL, RTSX_SD_PWR_OFF);
 	RTSX_CLR(sc, RTSX_CARD_PWR_CTL, RTSX_PMOS_STRG_800mA);
 
 	/* Disable pull control. */
-	RTSX_WRITE(sc, RTSX_CARD_PULL_CTL1, RTSX_PULL_CTL_DISABLE12);
-	RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, RTSX_PULL_CTL_DISABLE12);
-	RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, disable3);
+	if (RTSX_IS_RTS5209(sc) || RTSX_IS_RTS5227(sc) || RTSX_IS_RTS5229(sc)) {
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL1, RTSX_PULL_CTL_DISABLE12);
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, RTSX_PULL_CTL_DISABLE12);
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, disable3);
+	} else if (RTSX_IS_RTL8402(sc) || RTSX_IS_RTL8411(sc)) {
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL1, 0x65);
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, 0x65);
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, 0x95);
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL4, 0x09);
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL5, 0x05);
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL6, 0x04);
+	} else if (RTSX_IS_RTL8411B(sc)) {
+		if (RTSX_IS_RTL8411B_QFN48(sc)) {
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, 0x55);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, 0xf5);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL6, 0x15);
+		} else {
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL1, 0x65);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, 0x55);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, 0xd9);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL4, 0x59);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL5, 0x55);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL6, 0x15);
+		}
+	}
 
 	return 0;
 }
@@ -551,34 +618,76 @@ rtsx_bus_power_on(struct rtsx_softc *sc)
 	RTSX_SET(sc, RTSX_CARD_CLK_EN, RTSX_SD_CLK_EN);
 
 	/* Enable pull control. */
-	RTSX_WRITE(sc, RTSX_CARD_PULL_CTL1, RTSX_PULL_CTL_ENABLE12);
-	RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, RTSX_PULL_CTL_ENABLE12);
-	if (sc->sc_flags & RTSX_F_5229_TYPE_C)
-		enable3 = RTSX_PULL_CTL_ENABLE3_TYPE_C;
-	else
-		enable3 = RTSX_PULL_CTL_ENABLE3;
-	RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, enable3);
+	if (RTSX_IS_RTS5209(sc) || RTSX_IS_RTS5227(sc) || RTSX_IS_RTS5229(sc)) {
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL1, RTSX_PULL_CTL_ENABLE12);
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, RTSX_PULL_CTL_ENABLE12);
+		if (RTSX_IS_RTS5229_TYPE_C(sc))
+			enable3 = RTSX_PULL_CTL_ENABLE3_TYPE_C;
+		else
+			enable3 = RTSX_PULL_CTL_ENABLE3;
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, enable3);
+	} else if (RTSX_IS_RTL8402(sc) || RTSX_IS_RTL8411(sc)) {
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL1, 0xaa);
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, 0xaa);
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, 0xa9);
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL4, 0x09);
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL5, 0x09);
+		RTSX_WRITE(sc, RTSX_CARD_PULL_CTL6, 0x04);
+	} else if (RTSX_IS_RTL8411B(sc)) {
+		if (RTSX_IS_RTL8411B_QFN48(sc)) {
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, 0xaa);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, 0xf9);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL6, 0x19);
+		} else {
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL1, 0xaa);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, 0xaa);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, 0xd9);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL4, 0x59);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL5, 0x59);
+			RTSX_WRITE(sc, RTSX_CARD_PULL_CTL6, 0x15);
+		}
+	}
 
 	/*
 	 * To avoid a current peak, enable card power in two phases with a
 	 * delay in between.
 	 */
 
-	/* Partial power. */
-	RTSX_SET(sc, RTSX_CARD_PWR_CTL, RTSX_SD_PARTIAL_PWR_ON);
-	if (sc->sc_flags & RTSX_F_5209)
-		RTSX_SET(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_SUSPEND);
-	else
-		RTSX_SET(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_VCC1);
-
-	delay(200);
-
-	/* Full power. */
-	RTSX_CLR(sc, RTSX_CARD_PWR_CTL, RTSX_SD_PWR_OFF);
-	if (sc->sc_flags & RTSX_F_5209)
-		RTSX_CLR(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_OFF);
-	else
-		RTSX_SET(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_VCC2);
+	if (RTSX_IS_RTS5209(sc) || RTSX_IS_RTS5227(sc) || RTSX_IS_RTS5229(sc)) {
+		/* Partial power. */
+		RTSX_SET(sc, RTSX_CARD_PWR_CTL, RTSX_SD_PARTIAL_PWR_ON);
+		if (RTSX_IS_RTS5209(sc))
+			RTSX_SET(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_SUSPEND);
+		else
+			RTSX_SET(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_VCC1);
+
+		delay(200);
+
+		/* Full power. */
+		RTSX_CLR(sc, RTSX_CARD_PWR_CTL, RTSX_SD_PWR_OFF);
+		if (RTSX_IS_RTS5209(sc))
+			RTSX_CLR(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_OFF);
+		else
+			RTSX_SET(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_VCC2);
+	} else if (RTSX_IS_RTL8402(sc)
+	           || RTSX_IS_RTL8411(sc)
+	           || RTSX_IS_RTL8411B(sc)) {
+		RTSX_BITOP(sc, RTSX_CARD_PWR_CTL, RTSX_BPP_POWER_MASK,
+		    RTSX_BPP_POWER_5_PERCENT_ON);
+		RTSX_BITOP(sc, RTSX_LDO_CTL, RTSX_BPP_LDO_POWB,
+		    RTSX_BPP_LDO_SUSPEND);
+		delay(150);
+		RTSX_BITOP(sc, RTSX_CARD_PWR_CTL, RTSX_BPP_POWER_MASK,
+		    RTSX_BPP_POWER_10_PERCENT_ON);
+		delay(150);
+		RTSX_BITOP(sc, RTSX_CARD_PWR_CTL, RTSX_BPP_POWER_MASK,
+		    RTSX_BPP_POWER_15_PERCENT_ON);
+		delay(150);
+		RTSX_BITOP(sc, RTSX_CARD_PWR_CTL, RTSX_BPP_POWER_MASK,
+		    RTSX_BPP_POWER_ON);
+		RTSX_BITOP(sc, RTSX_LDO_CTL, RTSX_BPP_LDO_POWB,
+		    RTSX_BPP_LDO_ON);
+	}
 
 	/* Enable SD card output. */
 	RTSX_WRITE(sc, RTSX_CARD_OE, RTSX_SD_OUTPUT_EN);
@@ -729,37 +838,49 @@ rtsx_bus_clock(sdmmc_chipset_handle_t sc
 		n = 80; /* minimum */
 		div = RTSX_CLK_DIV_8;
 		mcu = 7;
-		RTSX_SET(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_128);
+		error = rtsx_write(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_128, 0xff);
+		if (error)
+			goto ret;
 		break;
 	case 20000:
 		n = 80;
 		div = RTSX_CLK_DIV_4;
 		mcu = 7;
-		RTSX_CLR(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK);
+		error = rtsx_write(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK, 0);
+		if (error)
+			goto ret;
 		break;
 	case 25000:
 		n = 100;
 		div = RTSX_CLK_DIV_4;
 		mcu = 7;
-		RTSX_CLR(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK);
+		error = rtsx_write(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK, 0);
+		if (error)
+			goto ret;
 		break;
 	case 30000:
 		n = 120;
 		div = RTSX_CLK_DIV_4;
 		mcu = 7;
-		RTSX_CLR(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK);
+		error = rtsx_write(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK, 0);
+		if (error)
+			goto ret;
 		break;
 	case 40000:
 		n = 80;
 		div = RTSX_CLK_DIV_2;
 		mcu = 7;
-		RTSX_CLR(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK);
+		error = rtsx_write(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK, 0);
+		if (error)
+			goto ret;
 		break;
 	case 50000:
 		n = 100;
 		div = RTSX_CLK_DIV_2;
 		mcu = 6;
-		RTSX_CLR(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK);
+		error = rtsx_write(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_MASK, 0);
+		if (error)
+			goto ret;
 		break;
 	default:
 		error = EINVAL;
Index: src/sys/dev/ic/rtsxreg.h
diff -u src/sys/dev/ic/rtsxreg.h:1.1 src/sys/dev/ic/rtsxreg.h:1.1.8.1
--- src/sys/dev/ic/rtsxreg.h:1.1	Wed Mar 19 15:26:41 2014
+++ src/sys/dev/ic/rtsxreg.h	Sat Jan 17 13:44:47 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsxreg.h,v 1.1 2014/03/19 15:26:41 nonaka Exp $	*/
+/*	$NetBSD: rtsxreg.h,v 1.1.8.1 2015/01/17 13:44:47 martin Exp $	*/
 /*	$OpenBSD: rtsxreg.h,v 1.3 2013/11/26 20:33:16 deraadt Exp $	*/
 
 /*
@@ -87,11 +87,20 @@
 #define	RTSX_PMOS_STRG_MASK	0x10
 #define	RTSX_PMOS_STRG_400mA	0x00
 #define	RTSX_PMOS_STRG_800mA	0x10
+#define	RTSX_BPP_POWER_MASK	0x0F
+#define	RTSX_BPP_POWER_OFF	0x0F
+#define	RTSX_BPP_POWER_5_PERCENT_ON	0x0E
+#define	RTSX_BPP_POWER_10_PERCENT_ON	0x0C
+#define	RTSX_BPP_POWER_15_PERCENT_ON	0x08
+#define	RTSX_BPP_POWER_ON	0x00
 
 #define	RTSX_MS_PWR_OFF		0x0C
 #define	RTSX_MS_PWR_ON		0x00
 #define	RTSX_MS_PARTIAL_PWR_ON	0x04
 
+#define RTSX_RTL8411B_PACKAGE	0xFD51
+#define RTSX_RTL8411B_QFN48	0x02
+
 #define	RTSX_CARD_SHARE_MODE	0xFD52
 #define	RTSX_CARD_SHARE_48_XD	0x02
 #define	RTSX_CARD_SHARE_48_SD	0x04
@@ -111,6 +120,12 @@
 #define RTSX_SDIO_BUS_CTRL	0x01
 #define RTSX_SDIO_CD_CTRL	0x02
 
+#define	RTSX_CARD_PAD_CTL	0xFD73
+#define	RTSX_CARD_XD_CARD	0x01
+#define	RTSX_CARD_SD_CARD	0x02
+#define	RTSX_CARD_MS_CARD	0x04
+#define	RTSX_CARD_AUTO_DISABLE	0x40
+
 /* Internal clock. */
 #define	RTSX_CLK_CTL		0xFC02
 #define	RTSX_CLK_LOW_FREQ	0x01
@@ -154,6 +169,17 @@
 #define	RTSX_OLT_LED_PERIOD	0x02
 #define	RTSX_OLT_LED_AUTOBLINK	0x08
 
+#define	RTSX_LDO_CTL		0xFC1E
+#define	RTSX_BPP_ASIC_3V3	0x07
+#define	RTSX_BPP_ASIC_MASK	0x07
+#define	RTSX_BPP_PAD_3V3	0x04
+#define	RTSX_BPP_PAD_1V8	0x00
+#define	RTSX_BPP_PAD_MASK	0x04
+#define RTSX_BPP_LDO_POWB	0x03
+#define RTSX_BPP_LDO_ON		0x00
+#define RTSX_BPP_LDO_SUSPEND	0x02
+#define RTSX_BPP_LDO_OFF	0x03
+
 #define	RTSX_GPIO_CTL		0xFC1F
 #define	RTSX_GPIO_LED_ON	0x02
 
@@ -174,6 +200,8 @@
 #define	RTSX_FPGA_MS_PULL_CTL_BIT	0x10
 #define	RTSX_FPGA_SD_PULL_CTL_BIT	0x08
 
+#define	RTSX_SYS_VER		0xFC32
+
 /* Clock source configuration register. */
 #define	RTSX_CARD_CLK_SOURCE	0xFC2E
 #define	RTSX_CRC_FIX_CLK	(0x00 << 0)
@@ -191,6 +219,9 @@
 #define	RTSX_CARD_PULL_CTL1	0xFD60
 #define	RTSX_CARD_PULL_CTL2	0xFD61
 #define	RTSX_CARD_PULL_CTL3	0xFD62
+#define	RTSX_CARD_PULL_CTL4	0xFD63
+#define	RTSX_CARD_PULL_CTL5	0xFD64
+#define	RTSX_CARD_PULL_CTL6	0xFD65
 
 #define	RTSX_PULL_CTL_DISABLE12		0x55
 #define	RTSX_PULL_CTL_DISABLE3		0xD5
@@ -488,8 +519,13 @@
 #define	RTSX_LED_BLINK_EN	0x08
 #define	RTSX_LED_BLINK_SPEED	0x05
 
+#define	RTSX_SD30_CLK_DRIVE_SEL	0xFD5A
+#define	RTSX_SD30_CMD_DRIVE_SEL	0xFD5E
+#define	RTSX_SD30_DAT_DRIVE_SEL	0xFD5F
+
 #define	RTSX_WAKE_SEL_CTL	0xFE54
 #define	RTSX_PME_FORCE_CTL	0xFE56
+#define	RTSX_FUNC_FORCE_CTL	0xFE59
 
 #define	RTSX_CHANGE_LINK_STATE	0xFE5B
 #define	RTSX_CD_RST_CORE_EN		0x01
@@ -499,11 +535,13 @@
 
 #define	RTSX_PERST_GLITCH_WIDTH	0xFE5C
 
-#define	RTSX_SD30_DRIVE_SEL	0xFE5E
+#define	RTSX_SD30_DRIVE_SEL	0xFE5E	/* XXX 0xFD5E? */
 #define	RTSX_SD30_DRIVE_SEL_3V3		0x01
 #define	RTSX_SD30_DRIVE_SEL_1V8		0x03
 #define	RTSX_SD30_DRIVE_SEL_MASK	0x07
 
+#define	RTSX_EFUSE_CONTENT	0xFE5F
+
 #define	RTSX_DUMMY_REG		0xFE90
 
 #define	RTSX_SG_INT		0x04
Index: src/sys/dev/ic/rtsxvar.h
diff -u src/sys/dev/ic/rtsxvar.h:1.1 src/sys/dev/ic/rtsxvar.h:1.1.8.1
--- src/sys/dev/ic/rtsxvar.h:1.1	Wed Mar 19 15:26:41 2014
+++ src/sys/dev/ic/rtsxvar.h	Sat Jan 17 13:44:47 2015
@@ -1,5 +1,5 @@
-/*	$NetBSD: rtsxvar.h,v 1.1 2014/03/19 15:26:41 nonaka Exp $	*/
-/*	$OpenBSD: rtsxvar.h,v 1.2 2013/11/06 13:51:02 stsp Exp $	*/
+/*	$NetBSD: rtsxvar.h,v 1.1.8.1 2015/01/17 13:44:47 martin Exp $	*/
+/*	$OpenBSD: rtsxvar.h,v 1.3 2014/08/19 17:55:03 phessler Exp $	*/
 
 /*
  * Copyright (c) 2006 Uwe Stuehler <u...@openbsd.org>
@@ -54,10 +54,29 @@ struct rtsx_softc {
 #define	RTSX_F_CARD_PRESENT	__BIT(0)
 #define	RTSX_F_SDIO_SUPPORT	__BIT(1)
 #define	RTSX_F_5209		__BIT(2)
-#define	RTSX_F_5229		__BIT(3)
-#define	RTSX_F_5229_TYPE_C	__BIT(4)
+#define	RTSX_F_5227		__BIT(3)
+#define	RTSX_F_5229		__BIT(4)
+#define	RTSX_F_5229_TYPE_C	__BIT(5)
+#define	RTSX_F_8402		__BIT(6)
+#define	RTSX_F_8411		__BIT(7)
+#define	RTSX_F_8411B		__BIT(8)
+#define	RTSX_F_8411B_QFN48	__BIT(9)
 };
 
+#define	RTSX_IS_RTS5209(sc)	(((sc)->sc_flags & RTSX_F_5209) == RTSX_F_5209)
+#define	RTSX_IS_RTS5227(sc)	(((sc)->sc_flags & RTSX_F_5227) == RTSX_F_5227)
+#define	RTSX_IS_RTS5229(sc)	(((sc)->sc_flags & RTSX_F_5229) == RTSX_F_5229)
+#define	RTSX_IS_RTS5229_TYPE_C(sc)					\
+	(((sc)->sc_flags & (RTSX_F_5229|RTSX_F_5229_TYPE_C)) ==		\
+	                   (RTSX_F_5229|RTSX_F_5229_TYPE_C))
+#define	RTSX_IS_RTL8402(sc)	(((sc)->sc_flags & RTSX_F_8402) == RTSX_F_8402)
+#define	RTSX_IS_RTL8411(sc)	(((sc)->sc_flags & RTSX_F_8411) == RTSX_F_8411)
+#define	RTSX_IS_RTL8411B(sc)						\
+	(((sc)->sc_flags & RTSX_F_8411B) == RTSX_F_8411B)
+#define	RTSX_IS_RTL8411B_QFN48(sc)					\
+	(((sc)->sc_flags & (RTSX_F_8411B|RTSX_F_8411B_QFN48)) ==	\
+	                   (RTSX_F_8411B|RTSX_F_8411B_QFN48))
+
 /* Host controller functions called by the attachment driver. */
 int	rtsx_attach(struct rtsx_softc *, bus_space_tag_t,
 	    bus_space_handle_t, bus_size_t, bus_dma_tag_t, int);

Index: src/sys/dev/pci/rtsx_pci.c
diff -u src/sys/dev/pci/rtsx_pci.c:1.2 src/sys/dev/pci/rtsx_pci.c:1.2.8.1
--- src/sys/dev/pci/rtsx_pci.c:1.2	Sat Mar 29 19:28:25 2014
+++ src/sys/dev/pci/rtsx_pci.c	Sat Jan 17 13:44:47 2015
@@ -1,5 +1,6 @@
-/*	$NetBSD: rtsx_pci.c,v 1.2 2014/03/29 19:28:25 christos Exp $	*/
-/*	$OpenBSD: rtsx_pci.c,v 1.4 2013/11/06 13:51:02 stsp Exp $	*/
+/*	$NetBSD: rtsx_pci.c,v 1.2.8.1 2015/01/17 13:44:47 martin Exp $	*/
+/*	$OpenBSD: rtsx_pci.c,v 1.7 2014/08/19 17:55:03 phessler Exp $	*/
+
 
 /*
  * Copyright (c) 2006 Uwe Stuehler <u...@openbsd.org>
@@ -19,7 +20,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsx_pci.c,v 1.2 2014/03/29 19:28:25 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsx_pci.c,v 1.2.8.1 2015/01/17 13:44:47 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -71,9 +72,15 @@ rtsx_pci_match(device_t parent, cfdata_t
 	    PCI_CLASS(pa->pa_class) != PCI_CLASS_UNDEFINED)
 		return 0;
 
-	if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_REALTEK_RTS5209 ||
-	    PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_REALTEK_RTS5229)
+	switch (PCI_PRODUCT(pa->pa_id)) {
+	case PCI_PRODUCT_REALTEK_RTS5209:
+	case PCI_PRODUCT_REALTEK_RTS5227:
+	case PCI_PRODUCT_REALTEK_RTS5229:
+	case PCI_PRODUCT_REALTEK_RTL8402:
+	case PCI_PRODUCT_REALTEK_RTL8411:
+	case PCI_PRODUCT_REALTEK_RTL8411B:
 		return 1;
+	}
 
 	return 0;
 }
@@ -134,10 +141,24 @@ rtsx_pci_attach(device_t parent, device_
 	case PCI_PRODUCT_REALTEK_RTS5209:
 		flags = RTSX_F_5209;
 		break;
+	case PCI_PRODUCT_REALTEK_RTS5227:
+		flags = RTSX_F_5227;
+		break;
 	case PCI_PRODUCT_REALTEK_RTS5229:
-	default:
 		flags = RTSX_F_5229;
 		break;
+	case PCI_PRODUCT_REALTEK_RTL8402:
+		flags = RTSX_F_8402;
+		break;
+	case PCI_PRODUCT_REALTEK_RTL8411:
+		flags = RTSX_F_8411;
+		break;
+	case PCI_PRODUCT_REALTEK_RTL8411B:
+		flags = RTSX_F_8411B;
+		break;
+	default:
+		flags = 0;
+		break;
 	}
 
 	if (rtsx_attach(&sc->sc, iot, ioh, size, pa->pa_dmat, flags) != 0) {

Reply via email to