card->pref_erase = 0;
 }
 
+static bool is_trim_arg(unsigned int arg)
+{
+       return (arg & MMC_TRIM_OR_DISCARD_ARGS) && arg != MMC_DISCARD_ARG;
+}
+
 static unsigned int mmc_mmc_erase_timeout(struct mmc_card *card,
                                          unsigned int arg, unsigned int qty)
 {
            !(card->ext_csd.sec_feature_support & EXT_CSD_SEC_ER_EN))
                return -EOPNOTSUPP;
 
-       if (mmc_card_mmc(card) && (arg & MMC_TRIM_ARGS) &&
+       if (mmc_card_mmc(card) && is_trim_arg(arg) &&
            !(card->ext_csd.sec_feature_support & EXT_CSD_SEC_GB_CL_EN))
                return -EOPNOTSUPP;
 
         * identified by the card->eg_boundary flag.
         */
        rem = card->erase_size - (from % card->erase_size);
-       if ((arg & MMC_TRIM_ARGS) && (card->eg_boundary) && (nr > rem)) {
+       if ((arg & MMC_TRIM_OR_DISCARD_ARGS) && card->eg_boundary && nr > rem) {
                err = mmc_do_erase(card, from, from + rem - 1, arg);
                from += rem;
                if ((err) || (to <= from))
 
 #define MMC_SECURE_TRIM1_ARG           0x80000001
 #define MMC_SECURE_TRIM2_ARG           0x80008000
 #define MMC_SECURE_ARGS                        0x80000000
-#define MMC_TRIM_ARGS                  0x00008001
+#define MMC_TRIM_OR_DISCARD_ARGS       0x00008003
 
 #define mmc_driver_type_mask(n)                (1 << (n))