The branch main has been updated by mav:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=577130e56e524eb185ff4d32644dae26be4d28d4

commit 577130e56e524eb185ff4d32644dae26be4d28d4
Author:     Henri Hennebert <h...@restart.be>
AuthorDate: 2022-02-19 16:41:53 +0000
Commit:     Alexander Motin <m...@freebsd.org>
CommitDate: 2022-02-19 16:46:40 +0000

    rtsx: Add RTS5260 support and replace bootverbose with sysctl.
    
    Tested by:      mav
    MFC after:      4 days
    Differential Revision:  https://reviews.freebsd.org/D34246
---
 share/man/man4/rtsx.4  |  17 +++-
 sys/dev/rtsx/rtsx.c    | 222 +++++++++++++++++++++++++++++++++----------------
 sys/dev/rtsx/rtsxreg.h |  35 ++++++++
 3 files changed, 199 insertions(+), 75 deletions(-)

diff --git a/share/man/man4/rtsx.4 b/share/man/man4/rtsx.4
index 10d1f54b285c..96f1aa2a6f8e 100644
--- a/share/man/man4/rtsx.4
+++ b/share/man/man4/rtsx.4
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd April 25, 2021
+.Dd February 10, 2022
 .Dt RTSX 4
 .Os
 .Sh NAME
@@ -70,6 +70,8 @@ RTS522A
 .It
 RTS525A
 .It
+RTS5260
+.It
 RTL8411B
 .El
 .Pp
@@ -103,10 +105,19 @@ with modifications found in Linux and
 .An Jesper Schmitz Mouridsen Aq Mt j...@freebsd.org
 .Sh CONTRIBUTORS
 .An Lutz Bichler Aq Mt lutz.bich...@gmail.com
-.Sh BUGS
+.Sh DEBUGGING INFORMATION
+.Em dev.rtsx.0.debug_mask
+can be set with the following masks:
 .Bl -bullet
 .It
-The timeouts experienced during card insert and during I/O are solved in 
version 1.0g.
+0x01 - to show the basic flow of the driver,
+.It
+0x02 - to trace the SD commands,
+.It
+0x04 - to trace the tuning phase.
+.El
+.Sh BUGS
+.Bl -bullet
 .It
 RTS522A on Lenovo T470p, card detection and read-only switch are reversed.
 This is solved by adding in
diff --git a/sys/dev/rtsx/rtsx.c b/sys/dev/rtsx/rtsx.c
index 7492b94461de..dffdbd2ca094 100644
--- a/sys/dev/rtsx/rtsx.c
+++ b/sys/dev/rtsx/rtsx.c
@@ -132,7 +132,10 @@ struct rtsx_softc {
        uint8_t         rtsx_read_only;         /* card read only status */
        uint8_t         rtsx_inversion;         /* inversion of card detection 
and read only status */
        uint8_t         rtsx_force_timing;      /* force bus_timing_uhs_sdr50 */
-       uint8_t         rtsx_debug;             /* print debugging */
+       uint8_t         rtsx_debug_mask;        /* debugging mask */
+#define        RTSX_DEBUG_BASIC        0x01    /* debug basic flow */
+#define        RTSX_TRACE_SD_CMD       0x02    /* trace SD commands */
+#define        RTSX_DEBUG_TUNING       0x04    /* debug tuning */
 #ifdef MMCCAM
        uint8_t         rtsx_cam_status;        /* CAM status - 1 if card in 
use */
 #endif /* MMCCAM */
@@ -165,11 +168,12 @@ struct rtsx_softc {
 #define        RTSX_RTS522A            0x522a
 #define        RTSX_RTS525A            0x525a
 #define        RTSX_RTS5249            0x5249
+#define        RTSX_RTS5260            0x5260
 #define        RTSX_RTL8402            0x5286
 #define        RTSX_RTL8411            0x5289
 #define        RTSX_RTL8411B           0x5287
 
-#define        RTSX_VERSION            "2.1c"
+#define        RTSX_VERSION            "2.1d"
 
 static const struct rtsx_device {
        uint16_t        vendor_id;
@@ -182,6 +186,7 @@ static const struct rtsx_device {
        { RTSX_REALTEK, RTSX_RTS522A,   RTSX_VERSION " Realtek RTS522A PCIe 
MMC/SD Card Reader"},
        { RTSX_REALTEK, RTSX_RTS525A,   RTSX_VERSION " Realtek RTS525A PCIe 
MMC/SD Card Reader"},
        { RTSX_REALTEK, RTSX_RTS5249,   RTSX_VERSION " Realtek RTS5249 PCIe 
MMC/SD Card Reader"},
+       { RTSX_REALTEK, RTSX_RTS5260,   RTSX_VERSION " Realtek RTS5260 PCIe 
MMC/SD Card Reader"},
        { RTSX_REALTEK, RTSX_RTL8402,   RTSX_VERSION " Realtek RTL8402 PCIe 
MMC/SD Card Reader"},
        { RTSX_REALTEK, RTSX_RTL8411,   RTSX_VERSION " Realtek RTL8411 PCIe 
MMC/SD Card Reader"},
        { RTSX_REALTEK, RTSX_RTL8411B,  RTSX_VERSION " Realtek RTL8411B PCIe 
MMC/SD Card Reader"},
@@ -209,6 +214,7 @@ static int  rtsx_init(struct rtsx_softc *sc);
 static int     rtsx_map_sd_drive(int index);
 static int     rtsx_rts5227_fill_driving(struct rtsx_softc *sc);
 static int     rtsx_rts5249_fill_driving(struct rtsx_softc *sc);
+static int     rtsx_rts5260_fill_driving(struct rtsx_softc *sc);
 static int     rtsx_read(struct rtsx_softc *, uint16_t, uint8_t *);
 static int     rtsx_read_cfg(struct rtsx_softc *sc, uint8_t func, uint16_t 
addr, uint32_t *val);
 static int     rtsx_write(struct rtsx_softc *sc, uint16_t addr, uint8_t mask, 
uint8_t val);
@@ -555,7 +561,7 @@ rtsx_intr(void *arg)
        status = READ4(sc, RTSX_BIPR);  /* read Bus Interrupt Pending Register 
*/
        sc->rtsx_intr_status = status;
 
-       if (bootverbose)
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(sc->rtsx_dev, "Interrupt handler - enabled: 
0x%08x, status: 0x%08x\n", enabled, status);
 
        /* Ack interrupts. */
@@ -655,7 +661,7 @@ rtsx_card_task(void *arg, int pending __unused)
 #else  /* !MMCCAM */
                if (sc->rtsx_mmc_dev == NULL) {
 #endif /* MMCCAM */
-                       if (bootverbose)
+                       if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                                device_printf(sc->rtsx_dev, "Card inserted\n");
 
                        sc->rtsx_read_count = sc->rtsx_write_count = 0;
@@ -682,10 +688,10 @@ rtsx_card_task(void *arg, int pending __unused)
 #else  /* !MMCCAM */
                if (sc->rtsx_mmc_dev != NULL) {
 #endif /* MMCCAM */
-                       if (bootverbose)
+                       if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                                device_printf(sc->rtsx_dev, "Card removed\n");
 
-                       if (sc->rtsx_debug)
+                       if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                                device_printf(sc->rtsx_dev, "Read count: %" 
PRIu64 ", write count: %" PRIu64 "\n",
                                              sc->rtsx_read_count, 
sc->rtsx_write_count);
 #ifdef MMCCAM
@@ -715,7 +721,6 @@ rtsx_is_card_present(struct rtsx_softc *sc)
 static int
 rtsx_init(struct rtsx_softc *sc)
 {
-       bool    rtsx_init_debug = false;
        uint8_t version;
        uint8_t val;
        int     error;
@@ -781,10 +786,10 @@ rtsx_init(struct rtsx_softc *sc)
                if (!(reg & 0x80)) {
                        sc->rtsx_card_drive_sel = (reg >> 8) & 0x3F;
                        sc->rtsx_sd30_drive_sel_3v3 = reg & 0x07;
-               } else if (bootverbose || rtsx_init_debug) {
+               } else if (bootverbose || sc->rtsx_debug_mask & 
RTSX_DEBUG_BASIC) {
                        device_printf(sc->rtsx_dev, "pci_read_config() error - 
reg: 0x%08x\n", reg);
                }
-               if (bootverbose || rtsx_init_debug)
+               if (bootverbose || sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev, "card_drive_sel: 0x%02x, 
sd30_drive_sel_3v3: 0x%02x\n",
                                      sc->rtsx_card_drive_sel, 
sc->rtsx_sd30_drive_sel_3v3);
                break;
@@ -799,10 +804,10 @@ rtsx_init(struct rtsx_softc *sc)
                        sc->rtsx_sd30_drive_sel_3v3 = (reg >> 5) & 0x03;
                        if (reg & 0x4000)
                                sc->rtsx_flags |= RTSX_F_REVERSE_SOCKET;
-               } else if (bootverbose || rtsx_init_debug) {
+               } else if (bootverbose || sc->rtsx_debug_mask & 
RTSX_DEBUG_BASIC) {
                        device_printf(sc->rtsx_dev, "pci_read_config() error - 
reg: 0x%08x\n", reg);
                }
-               if (bootverbose || rtsx_init_debug)
+               if (bootverbose || sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev,
                                      "card_drive_sel: 0x%02x, 
sd30_drive_sel_3v3: 0x%02x, reverse_socket is %s\n",
                                      sc->rtsx_card_drive_sel, 
sc->rtsx_sd30_drive_sel_3v3,
@@ -816,15 +821,16 @@ rtsx_init(struct rtsx_softc *sc)
                        sc->rtsx_card_drive_sel |= ((reg >> 25) & 0x01) << 6;
                        reg = pci_read_config(sc->rtsx_dev, 
RTSX_PCR_SETTING_REG2, 4);
                        sc->rtsx_sd30_drive_sel_3v3 = rtsx_map_sd_drive((reg >> 
5) & 0x03);
-               } else if (bootverbose || rtsx_init_debug) {
+               } else if (bootverbose || sc->rtsx_debug_mask & 
RTSX_DEBUG_BASIC) {
                        device_printf(sc->rtsx_dev, "pci_read_config() error - 
reg: 0x%08x\n", reg);
                }
-               if (bootverbose || rtsx_init_debug)
+               if (bootverbose || sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev, "card_drive_sel: 0x%02x, 
sd30_drive_sel_3v3: 0x%02x\n",
                                      sc->rtsx_card_drive_sel, 
sc->rtsx_sd30_drive_sel_3v3);
                break;
        case RTSX_RTS525A:
        case RTSX_RTS5249:
+       case RTSX_RTS5260:
                sc->rtsx_sd30_drive_sel_3v3 = RTSX_CFG_DRIVER_TYPE_B;
                reg = pci_read_config(sc->rtsx_dev, RTSX_PCR_SETTING_REG1, 4);
                if ((reg & 0x1000000)) {
@@ -834,10 +840,10 @@ rtsx_init(struct rtsx_softc *sc)
                        sc->rtsx_sd30_drive_sel_3v3 = (reg >> 5) & 0x03;
                        if (reg & 0x4000)
                                sc->rtsx_flags |= RTSX_F_REVERSE_SOCKET;
-               } else if (bootverbose || rtsx_init_debug) {
+               } else if (bootverbose || sc->rtsx_debug_mask & 
RTSX_DEBUG_BASIC) {
                        device_printf(sc->rtsx_dev, "pci_read_config() error - 
reg: 0x%08x\n", reg);
                }
-               if (bootverbose || rtsx_init_debug)
+               if (bootverbose || sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev,
                                      "card_drive_sel = 0x%02x, 
sd30_drive_sel_3v3: 0x%02x, reverse_socket is %s\n",
                                      sc->rtsx_card_drive_sel, 
sc->rtsx_sd30_drive_sel_3v3,
@@ -853,10 +859,10 @@ rtsx_init(struct rtsx_softc *sc)
                        sc->rtsx_card_drive_sel |= ((reg1 >> 25) & 0x01) << 6;
                        reg3 = pci_read_config(sc->rtsx_dev, 
RTSX_PCR_SETTING_REG3, 1);
                        sc->rtsx_sd30_drive_sel_3v3 = (reg3 >> 5) & 0x07;
-               } else if (bootverbose || rtsx_init_debug) {
+               } else if (bootverbose || sc->rtsx_debug_mask & 
RTSX_DEBUG_BASIC) {
                        device_printf(sc->rtsx_dev, "pci_read_config() error - 
reg1: 0x%08x\n", reg1);
                }
-               if (bootverbose || rtsx_init_debug)
+               if (bootverbose || sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev,
                                      "card_drive_sel: 0x%02x, 
sd30_drive_sel_3v3: 0x%02x\n",
                                      sc->rtsx_card_drive_sel, 
sc->rtsx_sd30_drive_sel_3v3);
@@ -867,17 +873,17 @@ rtsx_init(struct rtsx_softc *sc)
                reg = pci_read_config(sc->rtsx_dev, RTSX_PCR_SETTING_REG1, 4);
                if (!(reg & 0x1000000)) {
                        sc->rtsx_sd30_drive_sel_3v3 = rtsx_map_sd_drive(reg & 
0x03);
-               } else if (bootverbose || rtsx_init_debug) {
+               } else if (bootverbose || sc->rtsx_debug_mask & 
RTSX_DEBUG_BASIC) {
                        device_printf(sc->rtsx_dev, "pci_read_config() error - 
reg: 0x%08x\n", reg);
                }
-               if (bootverbose || rtsx_init_debug)
+               if (bootverbose || sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev,
                                      "card_drive_sel: 0x%02x, 
sd30_drive_sel_3v3: 0x%02x\n",
                                      sc->rtsx_card_drive_sel, 
sc->rtsx_sd30_drive_sel_3v3);
                break;
        }
 
-       if (bootverbose || rtsx_init_debug)
+       if (bootverbose || sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                device_printf(sc->rtsx_dev, "rtsx_init() rtsx_flags: 0x%04x\n", 
sc->rtsx_flags);
 
        /* Enable interrupts. */
@@ -1199,6 +1205,27 @@ rtsx_init(struct rtsx_softc *sc)
                else
                        RTSX_BITOP(sc, RTSX_PETXCFG, 0xB0, 0x80);
                break;
+       case RTSX_RTS5260:
+               /* Set mcu_cnt to 7 to ensure data can be sampled properly. */
+               RTSX_BITOP(sc, RTSX_CLK_DIV, 0x07, 0x07);
+               RTSX_WRITE(sc, RTSX_SSC_DIV_N_0, 0x5D);
+               /* force no MDIO*/
+               RTSX_WRITE(sc, RTSX_RTS5260_AUTOLOAD_CFG4, 
RTSX_RTS5260_MIMO_DISABLE);
+               /*Modify SDVCC Tune Default Parameters!*/
+               RTSX_BITOP(sc, RTSX_LDO_VCC_CFG0, RTSX_RTS5260_DVCC_TUNE_MASK, 
RTSX_RTS5260_DVCC_33);
+               RTSX_BITOP(sc, RTSX_PCLK_CTL, RTSX_PCLK_MODE_SEL, 
RTSX_PCLK_MODE_SEL);
+               RTSX_BITOP(sc, RTSX_L1SUB_CONFIG1, 
RTSX_AUX_CLK_ACTIVE_SEL_MASK, RTSX_MAC_CKSW_DONE);
+               /* Rest L1SUB Config */
+               RTSX_CLR(sc, RTSX_L1SUB_CONFIG3, 0xFF);
+               RTSX_BITOP(sc, RTSX_PM_CLK_FORCE_CTL, RTSX_CLK_PM_EN, 
RTSX_CLK_PM_EN);
+               RTSX_BITOP(sc, RTSX_PWR_GATE_CTRL, RTSX_PWR_GATE_EN, 
RTSX_PWR_GATE_EN);
+               RTSX_BITOP(sc, RTSX_RB_FLUSH, RTSX_U_AUTO_DMA_EN_MASK, 
RTSX_U_AUTO_DMA_DISABLE);
+               if (sc->rtsx_flags & RTSX_F_REVERSE_SOCKET)
+                       RTSX_BITOP(sc, RTSX_PETXCFG, 0xB0, 0xB0);
+               else
+                       RTSX_BITOP(sc, RTSX_PETXCFG, 0xB0, 0x80);
+               RTSX_BITOP(sc, RTSX_OBFF_CFG, RTSX_OBFF_EN_MASK, 
RTSX_OBFF_DISABLE);
+               break;
        case RTSX_RTL8402:
        case RTSX_RTL8411:
                RTSX_WRITE(sc, RTSX_SD30_CMD_DRIVE_SEL, 
sc->rtsx_sd30_drive_sel_3v3);
@@ -1273,6 +1300,22 @@ rtsx_rts5249_fill_driving(struct rtsx_softc *sc)
        return (0);
 }
 
+static int
+rtsx_rts5260_fill_driving(struct rtsx_softc *sc)
+{
+       u_char  driving_3v3[4][3] = {
+                                    {0x11, 0x11, 0x11},
+                                    {0x22, 0x22, 0x22},
+                                    {0x55, 0x55, 0x55},
+                                    {0x33, 0x33, 0x33},
+       };
+       RTSX_WRITE(sc, RTSX_SD30_CLK_DRIVE_SEL, 
driving_3v3[sc->rtsx_sd30_drive_sel_3v3][0]);
+       RTSX_WRITE(sc, RTSX_SD30_CMD_DRIVE_SEL, 
driving_3v3[sc->rtsx_sd30_drive_sel_3v3][1]);
+       RTSX_WRITE(sc, RTSX_SD30_DAT_DRIVE_SEL, 
driving_3v3[sc->rtsx_sd30_drive_sel_3v3][2]);
+
+       return (0);
+}
+
 static int
 rtsx_read(struct rtsx_softc *sc, uint16_t addr, uint8_t *val)
 {
@@ -1396,7 +1439,7 @@ rtsx_write_phy(struct rtsx_softc *sc, uint8_t addr, 
uint16_t val)
 static int
 rtsx_bus_power_off(struct rtsx_softc *sc)
 {
-       if (bootverbose || sc->rtsx_debug)
+       if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                device_printf(sc->rtsx_dev, "rtsx_bus_power_off()\n");
 
        /* Disable SD clock. */
@@ -1419,6 +1462,10 @@ rtsx_bus_power_off(struct rtsx_softc *sc)
                           RTSX_SD_PWR_OFF | RTSX_PMOS_STRG_400mA);
                RTSX_CLR(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_PWR_MASK);
                break;
+       case RTSX_RTS5260:
+               RTSX_BITOP(sc, RTSX_LDO_VCC_CFG1, RTSX_LDO_POW_SDVDD1_MASK, 
RTSX_LDO_POW_SDVDD1_OFF);
+               RTSX_BITOP(sc, RTSX_LDO_CONFIG2, RTSX_DV331812_POWERON, 
RTSX_DV331812_POWEROFF);
+               break;
        case RTSX_RTL8402:
        case RTSX_RTL8411:
        case RTSX_RTL8411B:
@@ -1455,6 +1502,7 @@ rtsx_bus_power_off(struct rtsx_softc *sc)
                break;
        case RTSX_RTS525A:
        case RTSX_RTS5249:
+       case RTSX_RTS5260:
                RTSX_WRITE(sc, RTSX_CARD_PULL_CTL1, 0x66);
                RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, RTSX_PULL_CTL_DISABLE12);
                RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, RTSX_PULL_CTL_DISABLE3);
@@ -1491,7 +1539,7 @@ rtsx_bus_power_off(struct rtsx_softc *sc)
 static int
 rtsx_bus_power_on(struct rtsx_softc *sc)
 {
-       if (bootverbose || sc->rtsx_debug)
+       if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                device_printf(sc->rtsx_dev, "rtsx_bus_power_on()\n");
 
        /* Select SD card. */
@@ -1522,6 +1570,7 @@ rtsx_bus_power_on(struct rtsx_softc *sc)
                break;
        case RTSX_RTS525A:
        case RTSX_RTS5249:
+       case RTSX_RTS5260:
                RTSX_WRITE(sc, RTSX_CARD_PULL_CTL1, 0x66);
                RTSX_WRITE(sc, RTSX_CARD_PULL_CTL2, RTSX_PULL_CTL_ENABLE12);
                RTSX_WRITE(sc, RTSX_CARD_PULL_CTL3, RTSX_PULL_CTL_ENABLE3);
@@ -1609,6 +1658,26 @@ rtsx_bus_power_on(struct rtsx_softc *sc)
                RTSX_BITOP(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_PWR_MASK,
                           RTSX_LDO3318_VCC1 | RTSX_LDO3318_VCC2);
                break;
+       case RTSX_RTS5260:
+               RTSX_BITOP(sc, RTSX_LDO_CONFIG2, RTSX_DV331812_VDD1, 
RTSX_DV331812_VDD1);
+               RTSX_BITOP(sc, RTSX_LDO_VCC_CFG0, RTSX_RTS5260_DVCC_TUNE_MASK, 
RTSX_RTS5260_DVCC_33);
+               RTSX_BITOP(sc, RTSX_LDO_VCC_CFG1, RTSX_LDO_POW_SDVDD1_MASK, 
RTSX_LDO_POW_SDVDD1_ON);
+               RTSX_BITOP(sc, RTSX_LDO_CONFIG2, RTSX_DV331812_POWERON, 
RTSX_DV331812_POWERON);
+
+               DELAY(20000);
+
+               /* Initialize SD_CFG1 register */
+               RTSX_WRITE(sc, RTSX_SD_CFG1, RTSX_CLK_DIVIDE_128 | 
RTSX_SD20_MODE);
+               RTSX_WRITE(sc, RTSX_SD_SAMPLE_POINT_CTL, RTSX_SD20_RX_POS_EDGE);
+               RTSX_CLR(sc, RTSX_SD_PUSH_POINT_CTL, 0xff);
+               RTSX_BITOP(sc, RTSX_CARD_STOP, RTSX_MS_STOP | RTSX_SD_CLR_ERR,
+                          RTSX_MS_STOP | RTSX_SD_CLR_ERR);
+               /* Reset SD_CFG3 register */
+               RTSX_CLR(sc, RTSX_SD_CFG3, RTSX_SD30_CLK_END_EN);
+               RTSX_CLR(sc, RTSX_REG_SD_STOP_SDCLK_CFG,
+                        RTSX_SD30_CLK_STOP_CFG_EN | RTSX_SD30_CLK_STOP_CFG0 | 
RTSX_SD30_CLK_STOP_CFG1);
+               RTSX_CLR(sc, RTSX_REG_PRE_RW_MODE, RTSX_EN_INFINITE_MODE);
+               break;
        case RTSX_RTL8402:
        case RTSX_RTL8411:
        case RTSX_RTL8411B:
@@ -1661,7 +1730,7 @@ rtsx_set_bus_width(struct rtsx_softc *sc, enum 
mmc_bus_width width)
        }
        RTSX_BITOP(sc, RTSX_SD_CFG1, RTSX_BUS_WIDTH_MASK, bus_width);
 
-       if (bootverbose || sc->rtsx_debug) {
+       if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC) {
                char *busw[] = {
                                "1 bit",
                                "4 bits",
@@ -1680,7 +1749,7 @@ rtsx_set_sd_timing(struct rtsx_softc *sc, enum 
mmc_bus_timing timing)
                sc->rtsx_ios_timing = timing;
        }
 
-       if (bootverbose || sc->rtsx_debug)
+       if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                device_printf(sc->rtsx_dev, "rtsx_set_sd_timing(%u)\n", timing);
 
        switch (timing) {
@@ -1734,7 +1803,7 @@ rtsx_set_sd_clock(struct rtsx_softc *sc, uint32_t freq)
        uint8_t clk_divider, n, div, mcu;
        int     error = 0;
 
-       if (bootverbose || sc->rtsx_debug)
+       if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                device_printf(sc->rtsx_dev, "rtsx_set_sd_clock(%u)\n", freq);
 
        if (freq == RTSX_SDCLK_OFF) {
@@ -1821,7 +1890,7 @@ rtsx_stop_sd_clock(struct rtsx_softc *sc)
 static int
 rtsx_switch_sd_clock(struct rtsx_softc *sc, uint8_t clk, uint8_t n, uint8_t 
div, uint8_t mcu)
 {
-       if (bootverbose || sc->rtsx_debug) {
+       if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC) {
                device_printf(sc->rtsx_dev, "rtsx_switch_sd_clock() - 
discovery-mode is %s, ssc_depth: %d\n",
                              (sc->rtsx_discovery_mode) ? "true" : "false", 
sc->rtsx_ssc_depth);
                device_printf(sc->rtsx_dev, "rtsx_switch_sd_clock() - clk: %d, 
n: %d, div: %d, mcu: %d\n",
@@ -1851,7 +1920,7 @@ rtsx_switch_sd_clock(struct rtsx_softc *sc, uint8_t clk, 
uint8_t n, uint8_t div,
 static void
 rtsx_sd_change_tx_phase(struct rtsx_softc *sc, uint8_t sample_point)
 {
-       if (bootverbose || sc->rtsx_debug)
+       if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                device_printf(sc->rtsx_dev, "rtsx_sd_change_tx_phase() - 
sample_point: %d\n", sample_point);
 
        rtsx_write(sc, RTSX_CLK_CTL, RTSX_CHANGE_CLK, RTSX_CHANGE_CLK);
@@ -1865,7 +1934,7 @@ rtsx_sd_change_tx_phase(struct rtsx_softc *sc, uint8_t 
sample_point)
 static void
 rtsx_sd_change_rx_phase(struct rtsx_softc *sc, uint8_t sample_point)
 {
-       if (bootverbose || sc->rtsx_debug == 2)
+       if (sc->rtsx_debug_mask & RTSX_DEBUG_TUNING)
                device_printf(sc->rtsx_dev, "rtsx_sd_change_rx_phase() - 
sample_point: %d\n", sample_point);
 
        rtsx_write(sc, RTSX_CLK_CTL, RTSX_CHANGE_CLK, RTSX_CHANGE_CLK);
@@ -1932,7 +2001,7 @@ rtsx_sd_tuning_rx_cmd(struct rtsx_softc *sc, uint8_t 
sample_point)
        error = rtsx_sd_tuning_rx_cmd_wait(sc, &cmd);
 
        if (error) {
-               if (bootverbose || sc->rtsx_debug == 2)
+               if (sc->rtsx_debug_mask & RTSX_DEBUG_TUNING)
                        device_printf(sc->rtsx_dev, "rtsx_sd_tuning_rx_cmd() - 
error: %d\n", error);
                rtsx_sd_wait_data_idle(sc);
                rtsx_clear_error(sc);
@@ -2001,7 +2070,7 @@ rtsx_sd_search_final_rx_phase(struct rtsx_softc *sc, 
uint32_t phase_map)
 
        final_phase = (start_final + len_final / 2) % RTSX_RX_PHASE_MAX;
 
-       if (bootverbose || sc->rtsx_debug)
+       if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                device_printf(sc->rtsx_dev,
                              "rtsx_sd_search_final_rx_phase() - phase_map: %x, 
start_final: %d, len_final: %d, final_phase: %d\n",
                              phase_map, start_final, len_final, final_phase);
@@ -2154,7 +2223,7 @@ rtsx_set_cmd_data_len(struct rtsx_softc *sc, uint16_t 
block_cnt, uint16_t byte_c
 static void
 rtsx_send_cmd(struct rtsx_softc *sc)
 {
-       if (bootverbose)
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(sc->rtsx_dev, "rtsx_send_cmd()\n");
 
        sc->rtsx_intr_status = 0;
@@ -2181,6 +2250,15 @@ rtsx_stop_cmd(struct rtsx_softc *sc)
        /* Stop DMA transfer. */
        WRITE4(sc, RTSX_HDBCTLR, RTSX_STOP_DMA);
 
+       switch (sc->rtsx_device_id) {
+       case RTSX_RTS5260:
+               rtsx_write(sc, RTSX_RTS5260_DMA_RST_CTL_0,
+                          RTSX_RTS5260_DMA_RST | RTSX_RTS5260_ADMA3_RST,
+                          RTSX_RTS5260_DMA_RST | RTSX_RTS5260_ADMA3_RST);
+               rtsx_write(sc, RTSX_RBCTL, RTSX_RB_FLUSH, RTSX_RB_FLUSH);
+               break;
+       }
+       
        rtsx_write(sc, RTSX_DMACTL, RTSX_DMA_RST, RTSX_DMA_RST);
 
        rtsx_write(sc, RTSX_RBCTL, RTSX_RB_FLUSH, RTSX_RB_FLUSH);
@@ -2240,7 +2318,7 @@ rtsx_send_req(struct rtsx_softc *sc, struct mmc_command 
*cmd)
        uint8_t  rsp_type;
        uint16_t reg;
 
-       if (bootverbose)
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(sc->rtsx_dev, "rtsx_send_req() - CMD%d\n", 
cmd->opcode);
 
        /* Convert response type. */
@@ -2321,7 +2399,7 @@ rtsx_set_resp(struct rtsx_softc *sc, struct mmc_command 
*cmd)
        if (ISSET(cmd->flags, MMC_RSP_PRESENT)) {
                uint32_t *cmd_buffer = (uint32_t *)(sc->rtsx_cmd_dmamem);
 
-               if (bootverbose) {
+               if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD) {
                        device_printf(sc->rtsx_dev, "cmd_buffer: 0x%08x 0x%08x 
0x%08x 0x%08x 0x%08x\n",
                                      cmd_buffer[0], cmd_buffer[1], 
cmd_buffer[2], cmd_buffer[3], cmd_buffer[4]);
                }
@@ -2350,7 +2428,7 @@ rtsx_set_resp(struct rtsx_softc *sc, struct mmc_command 
*cmd)
                                ((be32toh(cmd_buffer[1]) & 0xffff0000) >> 16);
                }
 
-               if (bootverbose)
+               if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                        device_printf(sc->rtsx_dev, "cmd->resp: 0x%08x 0x%08x 
0x%08x 0x%08x\n",
                                      cmd->resp[0], cmd->resp[1], cmd->resp[2], 
cmd->resp[3]);
        }
@@ -2373,7 +2451,7 @@ rtsx_xfer_short(struct rtsx_softc *sc, struct mmc_command 
*cmd)
 
        read = ISSET(cmd->data->flags, MMC_DATA_READ);
 
-       if (bootverbose)
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(sc->rtsx_dev, "rtsx_xfer_short() - %s xfer: %ld 
bytes with block size %ld\n",
                              read ? "Read" : "Write",
                              (unsigned long)cmd->data->len, (unsigned 
long)cmd->data->xfer_len);
@@ -2491,7 +2569,7 @@ rtsx_get_ppbuf_part1(struct rtsx_softc *sc)
                /* Run the command queue. */
                rtsx_send_cmd(sc);
        } else {
-               if (bootverbose && cmd->opcode == ACMD_SEND_SCR) {
+               if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD && cmd->opcode == 
ACMD_SEND_SCR) {
                        uint8_t *ptr = cmd->data->data;
                        device_printf(sc->rtsx_dev, "SCR: 
0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
                                      ptr[0], ptr[1], ptr[2], ptr[3],
@@ -2643,7 +2721,7 @@ rtsx_xfer(struct rtsx_softc *sc, struct mmc_command *cmd)
        cmd->data->xfer_len = (cmd->data->len > RTSX_MAX_DATA_BLKLEN) ?
                RTSX_MAX_DATA_BLKLEN : cmd->data->len;
 
-       if (bootverbose)
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(sc->rtsx_dev, "rtsx_xfer() - %s xfer: %ld bytes 
with block size %ld\n",
                              read ? "Read" : "Write",
                              (unsigned long)cmd->data->len, (unsigned 
long)cmd->data->xfer_len);
@@ -2679,7 +2757,7 @@ rtsx_xfer_begin(struct rtsx_softc *sc)
 
        cmd = sc->rtsx_req->cmd;
 
-       if (bootverbose)
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(sc->rtsx_dev, "rtsx_xfer_begin() - CMD%d\n", 
cmd->opcode);
 
        rtsx_set_resp(sc, cmd);
@@ -2792,7 +2870,7 @@ rtsx_xfer_finish(struct rtsx_softc *sc)
 
        cmd = sc->rtsx_req->cmd;
 
-       if (bootverbose)
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(sc->rtsx_dev, "rtsx_xfer_finish() - CMD%d\n", 
cmd->opcode);
 
        read = ISSET(cmd->data->flags, MMC_DATA_READ);
@@ -2869,47 +2947,47 @@ rtsx_set_tran_settings(device_t dev, struct 
ccb_trans_settings_mmc *cts)
        if (cts->ios_valid & MMC_CLK) {
                ios->clock = new_ios->clock;
                sc->rtsx_ios_clock = -1;        /* To be updated by 
rtsx_mmcbr_update_ios(). */
-               if (bootverbose || sc->rtsx_debug)
+               if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - 
clock: %u\n", ios->clock);
        }
        if (cts->ios_valid & MMC_VDD) {
                ios->vdd = new_ios->vdd;
-               if (bootverbose || sc->rtsx_debug)
+               if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - 
vdd: %d\n", ios->vdd);
        }
        if (cts->ios_valid & MMC_CS) {
                ios->chip_select = new_ios->chip_select;
-               if (bootverbose || sc->rtsx_debug)
+               if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - 
chip_select: %d\n", ios->chip_select);
        }
        if (cts->ios_valid & MMC_BW) {
                ios->bus_width = new_ios->bus_width;
                sc->rtsx_ios_bus_width = -1;    /* To be updated by 
rtsx_mmcbr_update_ios(). */
-               if (bootverbose || sc->rtsx_debug)
+               if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - 
bus width: %d\n", ios->bus_width);
        }
        if (cts->ios_valid & MMC_PM) {
                ios->power_mode = new_ios->power_mode;
                sc->rtsx_ios_power_mode = -1;   /* To be updated by 
rtsx_mmcbr_update_ios(). */
-               if (bootverbose || sc->rtsx_debug)
+               if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - 
power mode: %d\n", ios->power_mode);
        }
        if (cts->ios_valid & MMC_BT) {
                ios->timing = new_ios->timing;
                sc->rtsx_ios_timing = -1;       /* To be updated by 
rtsx_mmcbr_update_ios(). */
-               if (bootverbose || sc->rtsx_debug)
+               if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - 
timing: %d\n", ios->timing);
        }
        if (cts->ios_valid & MMC_BM) {
                ios->bus_mode = new_ios->bus_mode;
-               if (bootverbose || sc->rtsx_debug)
+               if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - 
bus mode: %d\n", ios->bus_mode);
        }
 #if  __FreeBSD_version >= 1300000
        if (cts->ios_valid & MMC_VCCQ) {
                ios->vccq = new_ios->vccq;
                sc->rtsx_ios_vccq = -1;         /* To be updated by 
rtsx_mmcbr_update_ios(). */
-               if (bootverbose || sc->rtsx_debug)
+               if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                        device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - 
vccq: %d\n", ios->vccq);
        }
 #endif /* __FreeBSD_version >= 1300000 */
@@ -3002,7 +3080,7 @@ rtsx_read_ivar(device_t bus, device_t child, int which, 
uintptr_t *result)
                return (EINVAL);
        }
 
-       if (bootverbose)
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(bus, "Read ivar #%d, value %#x / #%d\n",
                              which, *(int *)result, *(int *)result);
 
@@ -3014,11 +3092,11 @@ rtsx_write_ivar(device_t bus, device_t child, int 
which, uintptr_t value)
 {
        struct rtsx_softc *sc;
 
-       if (bootverbose)
+       sc = device_get_softc(bus);
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(bus, "Write ivar #%d, value %#x / #%d\n",
                              which, (int)value, (int)value);
 
-       sc = device_get_softc(bus);
        switch (which) {
        case MMCBR_IVAR_BUS_MODE:               /* ivar  0 - 1 = opendrain, 2 = 
pushpull */
                sc->rtsx_host.ios.bus_mode = value;
@@ -3080,7 +3158,7 @@ rtsx_mmcbr_update_ios(device_t bus, device_t 
child__unused)
        sc = device_get_softc(bus);
        ios = &sc->rtsx_host.ios;
 
-       if (bootverbose)
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(bus, "rtsx_mmcbr_update_ios()\n");
 
        /* if MMCBR_IVAR_BUS_WIDTH updated. */
@@ -3196,6 +3274,12 @@ rtsx_mmcbr_switch_vccq(device_t bus, device_t child 
__unused)
                        if ((error = rtsx_rts5249_fill_driving(sc)))
                                return (error);
                        break;
+               case RTSX_RTS5260:
+                       RTSX_BITOP(sc, RTSX_LDO_CONFIG2, RTSX_DV331812_VDD1, 
RTSX_DV331812_VDD1);
+                       RTSX_BITOP(sc, RTSX_LDO_DV18_CFG, RTSX_DV331812_MASK, 
RTSX_DV331812_33);
+                       if ((error = rtsx_rts5260_fill_driving(sc)))
+                               return (error);
+                       break;
                case RTSX_RTL8402:
                        RTSX_BITOP(sc, RTSX_SD30_CMD_DRIVE_SEL, 
RTSX_SD30_DRIVE_SEL_MASK, sc->rtsx_sd30_drive_sel_3v3);
                        RTSX_BITOP(sc, RTSX_LDO_CTL,
@@ -3213,7 +3297,7 @@ rtsx_mmcbr_switch_vccq(device_t bus, device_t child 
__unused)
                DELAY(300);
        }
 
-       if (bootverbose || sc->rtsx_debug)
+       if (sc->rtsx_debug_mask & (RTSX_DEBUG_BASIC | RTSX_TRACE_SD_CMD))
                device_printf(sc->rtsx_dev, "rtsx_mmcbr_switch_vccq(%d)\n", 
vccq);
 
        return (0);
@@ -3234,7 +3318,7 @@ rtsx_mmcbr_tune(device_t bus, device_t child __unused, 
bool hs400)
 
        sc = device_get_softc(bus);
 
-       if (bootverbose || sc->rtsx_debug)
+       if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                device_printf(sc->rtsx_dev, "rtsx_mmcbr_tune() - hs400 is %s\n",
                              (hs400) ? "true" : "false");
 
@@ -3274,24 +3358,18 @@ rtsx_mmcbr_tune(device_t bus, device_t child __unused, 
bool hs400)
 
        phase_map = 0xffffffff;
        for (i = 0; i < RTSX_RX_TUNING_CNT; i++) {
-               if (bootverbose || sc->rtsx_debug)
+               if (sc->rtsx_debug_mask & (RTSX_DEBUG_BASIC | 
RTSX_DEBUG_TUNING))
                        device_printf(sc->rtsx_dev, "rtsx_mmcbr_tune() - RX 
raw_phase_map[%d]: 0x%08x\n",
                                      i, raw_phase_map[i]);
                phase_map &= raw_phase_map[i];
        }
-       if (bootverbose || sc->rtsx_debug)
+       if (sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                device_printf(sc->rtsx_dev, "rtsx_mmcbr_tune() - RX phase_map: 
0x%08x\n", phase_map);
 
        if (phase_map) {
                final_phase = rtsx_sd_search_final_rx_phase(sc, phase_map);
                if (final_phase != 0xff) {
-                       if (sc->rtsx_debug == 1) {
-                               sc->rtsx_debug = 2;
-                               rtsx_sd_change_rx_phase(sc, final_phase);
-                               sc->rtsx_debug = 1;
-                       } else {
-                               rtsx_sd_change_rx_phase(sc, final_phase);
-                       }
+                       rtsx_sd_change_rx_phase(sc, final_phase);
                }
        }
 
@@ -3307,7 +3385,7 @@ rtsx_mmcbr_retune(device_t bus, device_t child __unused, 
bool reset __unused)
 
        sc = device_get_softc(bus);
 
-       if (bootverbose)
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(sc->rtsx_dev, "rtsx_mmcbr_retune()\n");
 
        return (0);
@@ -3336,7 +3414,7 @@ rtsx_mmcbr_request(device_t bus, device_t child __unused, 
struct mmc_request *re
        sc->rtsx_intr_trans_ok = NULL;
        sc->rtsx_intr_trans_ko = rtsx_req_done;
 
-       if (bootverbose)
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(sc->rtsx_dev, "rtsx_mmcbr_request(CMD%u arg %#x, 
flags %#x, dlen %u, dflags %#x)\n",
                              cmd->opcode, cmd->arg, cmd->flags,
                              cmd->data != NULL ? (unsigned int)cmd->data->len 
: 0,
@@ -3406,10 +3484,10 @@ rtsx_mmcbr_acquire_host(device_t bus, device_t child 
__unused)
 {
        struct rtsx_softc *sc;
 
-       if (bootverbose)
+       sc = device_get_softc(bus);
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(bus, "rtsx_mmcbr_acquire_host()\n");
 
-       sc = device_get_softc(bus);
        RTSX_LOCK(sc);
        while (sc->rtsx_bus_busy)
                msleep(&sc->rtsx_bus_busy, &sc->rtsx_mtx, 0, "rtsxah", 0);
@@ -3424,10 +3502,10 @@ rtsx_mmcbr_release_host(device_t bus, device_t child 
__unused)
 {
        struct rtsx_softc *sc;
 
-       if (bootverbose)
+       sc = device_get_softc(bus);
+       if (sc->rtsx_debug_mask & RTSX_TRACE_SD_CMD)
                device_printf(bus, "rtsx_mmcbr_release_host()\n");
 
-       sc = device_get_softc(bus);
        RTSX_LOCK(sc);
        sc->rtsx_bus_busy--;
        wakeup(&sc->rtsx_bus_busy);
@@ -3502,7 +3580,7 @@ rtsx_attach(device_t dev)
        sc->rtsx_read_only = 0;
        sc->rtsx_inversion = 0;
        sc->rtsx_force_timing = 0;
-       sc->rtsx_debug = 0;
+       sc->rtsx_debug_mask = 0;
        sc->rtsx_read_count = 0;
        sc->rtsx_write_count = 0;
 
@@ -3534,14 +3612,14 @@ rtsx_attach(device_t dev)
                      &sc->rtsx_inversion, 0, "Inversion of card detection and 
read only status");
        SYSCTL_ADD_U8(ctx, tree, OID_AUTO, "force_timing", CTLFLAG_RW,
                      &sc->rtsx_force_timing, 0, "Force bus_timing_uhs_sdr50");
-       SYSCTL_ADD_U8(ctx, tree, OID_AUTO, "debug", CTLFLAG_RWTUN,
-                     &sc->rtsx_debug, 0, "Debugging flag");
+       SYSCTL_ADD_U8(ctx, tree, OID_AUTO, "debug_mask", CTLFLAG_RWTUN,
+                     &sc->rtsx_debug_mask, 0, "debugging mask, see rtsx(4)");
        SYSCTL_ADD_U64(ctx, tree, OID_AUTO, "read_count", CTLFLAG_RD | 
CTLFLAG_STATS,
                       &sc->rtsx_read_count, 0, "Count of read operations");
        SYSCTL_ADD_U64(ctx, tree, OID_AUTO, "write_count", CTLFLAG_RD | 
CTLFLAG_STATS,
                       &sc->rtsx_write_count, 0, "Count of write operations");
 
-       if (bootverbose || sc->rtsx_debug)
+       if (bootverbose || sc->rtsx_debug_mask & RTSX_DEBUG_BASIC)
                device_printf(dev, "We are running with inversion: %d\n", 
sc->rtsx_inversion);
 
        /* Allocate IRQ. */
diff --git a/sys/dev/rtsx/rtsxreg.h b/sys/dev/rtsx/rtsxreg.h
index fc01bfbdaafb..18beff9088c9 100644
--- a/sys/dev/rtsx/rtsxreg.h
+++ b/sys/dev/rtsx/rtsxreg.h
@@ -356,6 +356,7 @@
 #define        RTSX_SD_RSP_TYPE_R7             0x01
 
 #define        RTSX_SD_CFG3                    0xFDA2
+#define RTSX_SD30_CLK_END_EN           0x10
 #define        RTSX_SD_RSP_80CLK_TIMEOUT_EN    0x01
 
 #define        RTSX_SD_STAT1                   0xFDA3
@@ -477,6 +478,14 @@
 #define        RTSX_SD_DATA_STATE              0xFDB6
 #define        RTSX_SD_DATA_IDLE               0x80
 
+#define RTSX_REG_SD_STOP_SDCLK_CFG     0xFDB8
+#define RTSX_SD30_CLK_STOP_CFG_EN      0x04
+#define RTSX_SD30_CLK_STOP_CFG0                0x01
+#define RTSX_SD30_CLK_STOP_CFG1                0x02
+
+#define RTSX_REG_PRE_RW_MODE           0xFD70
+#define RTSX_EN_INFINITE_MODE          0x01
+
 /* ping-pong buffer 2 */
 #define        RTSX_PPBUF_BASE2                0xFA00
 #define        RTSX_PPBUF_SIZE                 256
@@ -519,6 +528,8 @@
 
 #define        RTSX_RBCTL                      0xFE34
 #define        RTSX_RB_FLUSH                   0x80
+#define RTSX_U_AUTO_DMA_EN_MASK                0x20
+#define RTSX_U_AUTO_DMA_DISABLE                0x00
 
 #define        RTSX_CFGADDR0                   0xFE35
 #define        RTSX_CFGADDR1                   0xFE36
@@ -685,6 +696,8 @@
 #define        RTSX_FORCE_ASPM_NO_ASPM         0x00
 
 #define        RTSX_PM_CLK_FORCE_CTL           0xFE58
+#define RTSX_CLK_PM_EN                 0x01
+
 #define        RTSX_FUNC_FORCE_CTL             0xFE59
 #define        RTSX_FUNC_FORCE_UPME_XMT_DBG    0x02
 
@@ -701,6 +714,10 @@
 #define        RTSX_PM_EVENT_DEBUG             0xFE71
 #define        RTSX_PME_DEBUG_0                0x08
 
+#define RTSX_L1SUB_CONFIG1             0xFE8D
+#define RTSX_AUX_CLK_ACTIVE_SEL_MASK   0x01
+#define RTSX_MAC_CKSW_DONE             0x00
+
 #define        RTSX_L1SUB_CONFIG2              0xFE8E
 #define        RTSX_L1SUB_AUTO_CFG             0x02
 
@@ -708,6 +725,10 @@
 
 #define        RTSX_DUMMY_REG                  0xFE90
 
+#define RTSX_RTS5260_DMA_RST_CTL_0     0xFEBF
+#define RTSX_RTS5260_DMA_RST           0x80
+#define RTSX_RTS5260_ADMA3_RST         0x40
+
 #define        RTSX_PETXCFG                    0xFF03 /* was 0xFE49 in OpenBSD 
*/
 #define        RTSX_PETXCFG_CLKREQ_PIN         0x08
 
@@ -724,6 +745,10 @@
 #define        RTSX_OOBS_AUTOK_DIS             0x80
 #define        RTSX_OOBS_VAL_MASK              0x1F
 
+#define RTSX_LDO_DV18_CFG              0xFF70
+#define RTSX_DV331812_MASK             0x70
+#define RTSX_DV331812_33               0x70
+
 #define        RTSX_LDO_CONFIG2                0xFF71
 #define        RTSX_LDO_D3318_MASK             0x07
 #define        RTSX_LDO_D3318_33V              0x07
@@ -735,6 +760,8 @@
 #define        RTSX_LDO_VCC_CFG0               0xFF72
 #define        RTSX_LDO_VCC_LMTVTH_MASK        0x30
 #define        RTSX_LDO_VCC_LMTVTH_2A          0x10
+#define RTSX_RTS5260_DVCC_TUNE_MASK    0x70
+#define RTSX_RTS5260_DVCC_33           0x70
 
 #define        RTSX_LDO_VCC_CFG1               0xFF73
 #define        RTSX_LDO_VCC_REF_TUNE_MASK      0x30
@@ -743,6 +770,11 @@
 #define        RTSX_LDO_VCC_1V8                0x04
 #define        RTSX_LDO_VCC_3V3                0x07
 #define        RTSX_LDO_VCC_LMT_EN             0x08
+/*RTS5260*/
+#define        RTSX_LDO_POW_SDVDD1_MASK        0x08
+#define        RTSX_LDO_POW_SDVDD1_ON          0x08
+#define        RTSX_LDO_POW_SDVDD1_OFF         0x00
+
 
 #define        RTSX_LDO_VIO_CFG                0xFF75
 #define        RTSX_LDO_VIO_TUNE_MASK          0x07
@@ -769,6 +801,9 @@
 #define        RTSX_IC_VERSION_C               0x02
 #define        RTSX_IC_VERSION_D               0x03
 
+#define        RTSX_RTS5260_AUTOLOAD_CFG4      0xFF7F
+#define RTSX_RTS5260_MIMO_DISABLE      0x8A
+
 #define        RTSX_PCR_SETTING_REG1           0x724
 #define        RTSX_PCR_SETTING_REG2           0x814
 #define        RTSX_PCR_SETTING_REG3           0x747

Reply via email to