Port the linux v6.7 mmc host caps2 parsing.
While at it, remove the ->no_sd and ->no_sdio. These are bits in the
caps2 field.

Signed-off-by: Steffen Trumtrar <s.trumt...@pengutronix.de>
Reviewed-by: Ahmad Fatoum <a.fat...@pengutronix.de>
---
 drivers/mci/mci-core.c | 36 ++++++++++++++++++++++++++++++------
 include/mci.h          | 32 ++++++++++++++++++++++++++++++--
 2 files changed, 60 insertions(+), 8 deletions(-)

diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
index 6c473d21bf..3e078862f2 100644
--- a/drivers/mci/mci-core.c
+++ b/drivers/mci/mci-core.c
@@ -2031,7 +2031,7 @@ static int mci_card_probe(struct mci *mci)
                goto on_error;
        }
 
-       if (!host->no_sdio) {
+       if (!(host->caps2 & MMC_CAP2_NO_SDIO)) {
                rc = sdio_send_op_cond(mci);
                if (!rc) {
                        mci->ready_for_use = true;
@@ -2042,11 +2042,11 @@ static int mci_card_probe(struct mci *mci)
        }
 
        /* Check if this card can handle the "SD Card Physical Layer 
Specification 2.0" */
-       if (!host->no_sd) {
+       if (!(host->caps2 & MMC_CAP2_NO_SD)) {
                rc = sd_send_if_cond(mci);
                rc = sd_send_op_cond(mci);
        }
-       if (host->no_sd || rc == -ETIMEDOUT) {
+       if ((host->caps2 & MMC_CAP2_NO_SD) || rc == -ETIMEDOUT) {
                /* If SD card initialization was skipped or if it timed out,
                 * we check for an MMC card */
                dev_dbg(&mci->dev, "Card seems to be a MultiMediaCard\n");
@@ -2253,7 +2253,7 @@ int mci_register(struct mci_host *host)
        if (IS_ENABLED(CONFIG_MCI_STARTUP))
                mci_card_probe(mci);
 
-       if (!host->no_sd && dev_of_node(host->hw_dev))
+       if (!(host->caps2 & MMC_CAP2_NO_SD) && dev_of_node(host->hw_dev))
                of_register_fixup(of_broken_cd_fixup, host);
 
        list_add_tail(&mci->list, &mci_list);
@@ -2324,9 +2324,33 @@ void mci_of_parse_node(struct mci_host *host,
 
        host->broken_cd = of_property_read_bool(np, "broken-cd");
        host->non_removable = of_property_read_bool(np, "non-removable");
-       host->no_sd = of_property_read_bool(np, "no-sd");
-       host->no_sdio = of_property_read_bool(np, "no-sdio");
        host->disable_wp = of_property_read_bool(np, "disable-wp");
+
+       if (of_property_read_bool(np, "full-pwr-cycle"))
+               host->caps2 |= MMC_CAP2_FULL_PWR_CYCLE;
+       if (of_property_read_bool(np, "full-pwr-cycle-in-suspend"))
+               host->caps2 |= MMC_CAP2_FULL_PWR_CYCLE_IN_SUSPEND;
+       if (of_property_read_bool(np, "no-sdio"))
+               host->caps2 |= MMC_CAP2_NO_SDIO;
+       if (of_property_read_bool(np, "no-sd"))
+               host->caps2 |= MMC_CAP2_NO_SD;
+       if (of_property_read_bool(np, "no-mmc"))
+               host->caps2 |= MMC_CAP2_NO_MMC;
+       if (IS_ENABLED(CONFIG_MCI_TUNING)) {
+               if (of_property_read_bool(np, "mmc-hs200-1_8v"))
+                       host->caps2 |= MMC_CAP2_HS200_1_8V_SDR;
+               if (of_property_read_bool(np, "mmc-hs200-1_2v"))
+                       host->caps2 |= MMC_CAP2_HS200_1_2V_SDR;
+               if (of_property_read_bool(np, "mmc-hs400-1_8v"))
+                       host->caps2 |= MMC_CAP2_HS400_1_8V | 
MMC_CAP2_HS200_1_8V_SDR;
+               if (of_property_read_bool(np, "mmc-hs400-1_2v"))
+                       host->caps2 |= MMC_CAP2_HS400_1_2V | 
MMC_CAP2_HS200_1_2V_SDR;
+               if (of_property_read_bool(np, "mmc-hs400-enhanced-strobe"))
+                       host->caps2 |= MMC_CAP2_HS400_ES;
+               if (of_property_read_bool(np, "no-mmc-hs400"))
+                       host->caps2 &= ~(MMC_CAP2_HS400_1_8V | 
MMC_CAP2_HS400_1_2V |
+                                        MMC_CAP2_HS400_ES);
+       }
 }
 
 void mci_of_parse(struct mci_host *host)
diff --git a/include/mci.h b/include/mci.h
index a72ede8db5..7a4521adde 100644
--- a/include/mci.h
+++ b/include/mci.h
@@ -468,6 +468,36 @@ struct mci_host {
        const char *devname;            /**< the devicename for the card, 
defaults to disk%d */
        unsigned voltages;
        unsigned host_caps;     /**< Host's interface capabilities, refer 
MMC_VDD_* */
+       unsigned caps2;         /* More host capabilities */
+#define MMC_CAP2_BOOTPART_NOACC        (1 << 0)        /* Boot partition no 
access */
+#define MMC_CAP2_FULL_PWR_CYCLE        (1 << 2)        /* Can do full power 
cycle */
+#define MMC_CAP2_FULL_PWR_CYCLE_IN_SUSPEND (1 << 3) /* Can do full power cycle 
in suspend */
+#define MMC_CAP2_HS200_1_8V_SDR        (1 << 5)        /* can support */
+#define MMC_CAP2_HS200_1_2V_SDR        (1 << 6)        /* can support */
+#define MMC_CAP2_HS200         (MMC_CAP2_HS200_1_8V_SDR | \
+                                MMC_CAP2_HS200_1_2V_SDR)
+#define MMC_CAP2_SD_EXP                (1 << 7)        /* SD express via PCIe 
*/
+#define MMC_CAP2_SD_EXP_1_2V   (1 << 8)        /* SD express 1.2V */
+#define MMC_CAP2_CD_ACTIVE_HIGH        (1 << 10)       /* Card-detect signal 
active high */
+#define MMC_CAP2_RO_ACTIVE_HIGH        (1 << 11)       /* Write-protect signal 
active high */
+#define MMC_CAP2_NO_PRESCAN_POWERUP (1 << 14)  /* Don't power up before scan */
+#define MMC_CAP2_HS400_1_8V    (1 << 15)       /* Can support HS400 1.8V */
+#define MMC_CAP2_HS400_1_2V    (1 << 16)       /* Can support HS400 1.2V */
+#define MMC_CAP2_HS400         (MMC_CAP2_HS400_1_8V | \
+                                MMC_CAP2_HS400_1_2V)
+#define MMC_CAP2_HSX00_1_8V    (MMC_CAP2_HS200_1_8V_SDR | MMC_CAP2_HS400_1_8V)
+#define MMC_CAP2_HSX00_1_2V    (MMC_CAP2_HS200_1_2V_SDR | MMC_CAP2_HS400_1_2V)
+#define MMC_CAP2_SDIO_IRQ_NOTHREAD (1 << 17)
+#define MMC_CAP2_NO_WRITE_PROTECT (1 << 18)    /* No physical write protect 
pin, assume that card is always read-write */
+#define MMC_CAP2_NO_SDIO       (1 << 19)       /* Do not send SDIO commands 
during initialization */
+#define MMC_CAP2_HS400_ES      (1 << 20)       /* Host supports enhanced 
strobe */
+#define MMC_CAP2_NO_SD         (1 << 21)       /* Do not send SD commands 
during initialization */
+#define MMC_CAP2_NO_MMC                (1 << 22)       /* Do not send (e)MMC 
commands during initialization */
+#define MMC_CAP2_CQE           (1 << 23)       /* Has eMMC command queue 
engine */
+#define MMC_CAP2_CQE_DCMD      (1 << 24)       /* CQE can issue a direct 
command */
+#define MMC_CAP2_AVOID_3_3V    (1 << 25)       /* Host must negotiate down 
from 3.3V */
+#define MMC_CAP2_MERGE_CAPABLE (1 << 26)       /* Host can merge a segment 
over the segment size */
+#define MMC_CAP2_CRYPTO                0
        unsigned f_min;         /**< host interface lower limit */
        unsigned f_max;         /**< host interface upper limit */
        unsigned clock;         /**< Current clock used to talk to the card */
@@ -479,8 +509,6 @@ struct mci_host {
        int use_dsr;            /**< optional dsr usage flag */
        int broken_cd;          /**< card detect is broken */
        bool non_removable;     /**< device is non removable */
-       bool no_sd;             /**< do not send SD commands during 
initialization */
-       bool no_sdio;           /**< do not send SDIO commands during 
initialization */
        bool disable_wp;        /**< ignore write-protect detection logic */
        struct regulator *supply;
 

-- 
2.40.1


Reply via email to