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, ®); + 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, ®); + 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) {