Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev rtsx(4): Add support for RT525A, from openbsd.



details:   https://anonhg.NetBSD.org/src/rev/0d10b94e52db
branches:  trunk
changeset: 322222:0d10b94e52db
user:      maya <maya%NetBSD.org@localhost>
date:      Tue Apr 24 18:34:30 2018 +0000

description:
rtsx(4): Add support for RT525A, from openbsd.

ok rkujawa

diffstat:

 sys/dev/ic/rtsx.c      |  30 +++++++++++++++++++----
 sys/dev/ic/rtsxreg.h   |  10 +++++++-
 sys/dev/ic/rtsxvar.h   |  12 +++++---
 sys/dev/pci/rtsx_pci.c |  63 +++++++++++++++++++++++++++----------------------
 4 files changed, 75 insertions(+), 40 deletions(-)

diffs (252 lines):

diff -r de073cd73e53 -r 0d10b94e52db sys/dev/ic/rtsx.c
--- a/sys/dev/ic/rtsx.c Tue Apr 24 18:31:48 2018 +0000
+++ b/sys/dev/ic/rtsx.c Tue Apr 24 18:34:30 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rtsx.c,v 1.2 2014/10/29 14:24:09 nonaka Exp $  */
+/*     $NetBSD: rtsx.c,v 1.3 2018/04/24 18:34:30 maya Exp $    */
 /*     $OpenBSD: rtsx.c,v 1.10 2014/08/19 17:55:03 phessler Exp $      */
 
 /*
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsx.c,v 1.2 2014/10/29 14:24:09 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsx.c,v 1.3 2018/04/24 18:34:30 maya Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -560,7 +560,9 @@
        disable3 = RTSX_PULL_CTL_DISABLE3;
        if (RTSX_IS_RTS5209(sc))
                RTSX_SET(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_OFF);
-       else if (RTSX_IS_RTS5227(sc) || RTSX_IS_RTS5229(sc)) {
+       else if (RTSX_IS_RTS5227(sc)
+               || RTSX_IS_RTS5229(sc)
+               || RTSX_IS_RTS525A(sc)) {
                RTSX_CLR(sc, RTSX_PWR_GATE_CTRL, RTSX_LDO3318_VCC1 |
                    RTSX_LDO3318_VCC2);
                if (RTSX_IS_RTS5229_TYPE_C(sc))
@@ -578,7 +580,10 @@
        RTSX_CLR(sc, RTSX_CARD_PWR_CTL, RTSX_PMOS_STRG_800mA);
 
        /* Disable pull control. */
-       if (RTSX_IS_RTS5209(sc) || RTSX_IS_RTS5227(sc) || RTSX_IS_RTS5229(sc)) {
+       if (RTSX_IS_RTS5209(sc)
+           || RTSX_IS_RTS5227(sc)
+           || RTSX_IS_RTS5229(sc)
+           || RTSX_IS_RTS525A(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);
@@ -612,13 +617,23 @@
 {
        uint8_t enable3;
 
+       if (RTSX_IS_RTS525A(sc)) {
+               int err = rtsx_write(sc, RTSX_LDO_VCC_CFG1, RTSX_LDO_VCC_TUNE_MASK,
+                   RTSX_LDO_VCC_3V3);
+               if (err)
+                       return err;
+       }
+
        /* Select SD card. */
        RTSX_WRITE(sc, RTSX_CARD_SELECT, RTSX_SD_MOD_SEL);
        RTSX_WRITE(sc, RTSX_CARD_SHARE_MODE, RTSX_CARD_SHARE_48_SD);
        RTSX_SET(sc, RTSX_CARD_CLK_EN, RTSX_SD_CLK_EN);
 
        /* Enable pull control. */
-       if (RTSX_IS_RTS5209(sc) || RTSX_IS_RTS5227(sc) || RTSX_IS_RTS5229(sc)) {
+       if (RTSX_IS_RTS5209(sc)
+           || RTSX_IS_RTS5227(sc)
+           || RTSX_IS_RTS5229(sc)
+           || RTSX_IS_RTS525A(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))
@@ -653,7 +668,10 @@
         * delay in between.
         */
 
-       if (RTSX_IS_RTS5209(sc) || RTSX_IS_RTS5227(sc) || RTSX_IS_RTS5229(sc)) {
+       if (RTSX_IS_RTS5209(sc)
+           || RTSX_IS_RTS5227(sc)
+           || RTSX_IS_RTS5229(sc)
+           || RTSX_IS_RTS525A(sc)) {
                /* Partial power. */
                RTSX_SET(sc, RTSX_CARD_PWR_CTL, RTSX_SD_PARTIAL_PWR_ON);
                if (RTSX_IS_RTS5209(sc))
diff -r de073cd73e53 -r 0d10b94e52db sys/dev/ic/rtsxreg.h
--- a/sys/dev/ic/rtsxreg.h      Tue Apr 24 18:31:48 2018 +0000
+++ b/sys/dev/ic/rtsxreg.h      Tue Apr 24 18:34:30 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rtsxreg.h,v 1.2 2014/10/29 14:24:09 nonaka Exp $       */
+/*     $NetBSD: rtsxreg.h,v 1.3 2018/04/24 18:34:30 maya Exp $ */
 /*     $OpenBSD: rtsxreg.h,v 1.3 2013/11/26 20:33:16 deraadt Exp $     */
 
 /*
@@ -544,6 +544,14 @@
 
 #define        RTSX_DUMMY_REG          0xFE90
 
+#define        RTSX_LDO_VCC_CFG1       0xFF73
+#define        RTSX_LDO_VCC_REF_TUNE_MASK      0x30
+#define        RTSX_LDO_VCC_REF_1V2            0x20
+#define        RTSX_LDO_VCC_TUNE_MASK          0x07
+#define        RTSX_LDO_VCC_1V8                0x04
+#define        RTSX_LDO_VCC_3V3                0x07
+#define        RTSX_LDO_VCC_LMT_EN             0x08
+
 #define        RTSX_SG_INT             0x04
 #define        RTSX_SG_END             0x02
 #define        RTSX_SG_VALID           0x01
diff -r de073cd73e53 -r 0d10b94e52db sys/dev/ic/rtsxvar.h
--- a/sys/dev/ic/rtsxvar.h      Tue Apr 24 18:31:48 2018 +0000
+++ b/sys/dev/ic/rtsxvar.h      Tue Apr 24 18:34:30 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rtsxvar.h,v 1.2 2014/10/29 14:24:09 nonaka Exp $       */
+/*     $NetBSD: rtsxvar.h,v 1.3 2018/04/24 18:34:30 maya Exp $ */
 /*     $OpenBSD: rtsxvar.h,v 1.3 2014/08/19 17:55:03 phessler Exp $    */
 
 /*
@@ -57,10 +57,11 @@
 #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_F_525A             __BIT(6)
+#define        RTSX_F_8402             __BIT(7)
+#define        RTSX_F_8411             __BIT(8)
+#define        RTSX_F_8411B            __BIT(9)
+#define        RTSX_F_8411B_QFN48      __BIT(10)
 };
 
 #define        RTSX_IS_RTS5209(sc)     (((sc)->sc_flags & RTSX_F_5209) == RTSX_F_5209)
@@ -69,6 +70,7 @@
 #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_RTS525A(sc)     (((sc)->sc_flags & RTSX_F_525A) == RTSX_F_525A)
 #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)                                            \
diff -r de073cd73e53 -r 0d10b94e52db sys/dev/pci/rtsx_pci.c
--- a/sys/dev/pci/rtsx_pci.c    Tue Apr 24 18:31:48 2018 +0000
+++ b/sys/dev/pci/rtsx_pci.c    Tue Apr 24 18:34:30 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rtsx_pci.c,v 1.6 2016/07/07 06:55:41 msaitoh Exp $     */
+/*     $NetBSD: rtsx_pci.c,v 1.7 2018/04/24 18:34:30 maya Exp $        */
 /*     $OpenBSD: rtsx_pci.c,v 1.7 2014/08/19 17:55:03 phessler Exp $   */
 
 
@@ -20,7 +20,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsx_pci.c,v 1.6 2016/07/07 06:55:41 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsx_pci.c,v 1.7 2018/04/24 18:34:30 maya Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -36,7 +36,8 @@
 
 #include <dev/sdmmc/sdmmcvar.h>
 
-#define RTSX_PCI_BAR   0x10
+#define RTSX_PCI_BAR           0x10
+#define RTSX_PCI_BAR_525A      0x14
 
 struct rtsx_pci_softc {
        struct rtsx_softc sc;
@@ -78,6 +79,7 @@
        case PCI_PRODUCT_REALTEK_RTS5209:
        case PCI_PRODUCT_REALTEK_RTS5227:
        case PCI_PRODUCT_REALTEK_RTS5229:
+       case PCI_PRODUCT_REALTEK_RTS525A:
        case PCI_PRODUCT_REALTEK_RTL8402:
        case PCI_PRODUCT_REALTEK_RTL8411:
        case PCI_PRODUCT_REALTEK_RTL8411B:
@@ -100,11 +102,40 @@
        bus_space_handle_t ioh;
        bus_size_t size;
        uint32_t flags;
+       int bar = RTSX_PCI_BAR;
        char intrbuf[PCI_INTRSTR_LEN];
 
        sc->sc.sc_dev = self;
        sc->sc_pc = pc;
 
+       switch (PCI_PRODUCT(pa->pa_id)) {
+       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:
+               flags = RTSX_F_5229;
+               break;
+       case PCI_PRODUCT_REALTEK_RTS525A:
+               flags = RTSX_F_525A;
+               bar = RTSX_PCI_BAR_525A;
+               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;
+       }
+
        pci_aprint_devinfo(pa, NULL);
 
        if ((pci_conf_read(pc, tag, RTSX_CFG_PCI) & RTSX_CFG_ASIC) != 0) {
@@ -112,7 +143,7 @@
                return;
        }
 
-       if (pci_mapreg_map(pa, RTSX_PCI_BAR, PCI_MAPREG_TYPE_MEM, 0,
+       if (pci_mapreg_map(pa, bar, PCI_MAPREG_TYPE_MEM, 0,
            &iot, &ioh, NULL, &size)) {
                aprint_error_dev(self, "couldn't map registers\n");
                return;
@@ -139,30 +170,6 @@
        /* Power up the device */
        pci_set_powerstate(pc, tag, PCI_PMCSR_STATE_D0);
 
-       switch (PCI_PRODUCT(pa->pa_id)) {
-       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:
-               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) {
                aprint_error_dev(self, "couldn't initialize chip\n");
                return;



Home | Main Index | Thread Index | Old Index