Refresh patches for all targets that support kernel 4.4. compile/run-tested on ar71xx, brcm47xx, kirkwood. Signed-off-by: Paul Wassi <p.wassi@gmx.at> Tested-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 2b859a1735c3113756c172ab8113f3f764c49c38 Mon Sep 17 00:00:00 2001
 | 
						|
From: Phil Elwell <phil@raspberrypi.org>
 | 
						|
Date: Fri, 20 May 2016 10:11:43 +0100
 | 
						|
Subject: [PATCH] mmc: Add card_quirks module parameter, log quirks
 | 
						|
 | 
						|
Use mmc_block.card_quirks to override the quirks for all SD or MMC
 | 
						|
cards. The value is a bitfield using the bit positions defined in
 | 
						|
include/linux/mmc/card.h. If the module parameter is placed in the
 | 
						|
kernel command line (or bootargs) stored on the card then, assuming the
 | 
						|
device only has one SD card interface, the override effectively becomes
 | 
						|
card-specific.
 | 
						|
 | 
						|
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 | 
						|
---
 | 
						|
 drivers/mmc/card/block.c | 28 +++++++++++++++++++++++++---
 | 
						|
 1 file changed, 25 insertions(+), 3 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/mmc/card/block.c
 | 
						|
+++ b/drivers/mmc/card/block.c
 | 
						|
@@ -137,6 +137,13 @@ enum {
 | 
						|
 module_param(perdev_minors, int, 0444);
 | 
						|
 MODULE_PARM_DESC(perdev_minors, "Minors numbers to allocate per device");
 | 
						|
 
 | 
						|
+/*
 | 
						|
+ * Allow quirks to be overridden for the current card
 | 
						|
+ */
 | 
						|
+static char *card_quirks;
 | 
						|
+module_param(card_quirks, charp, 0644);
 | 
						|
+MODULE_PARM_DESC(card_quirks, "Force the use of the indicated quirks (a bitfield)");
 | 
						|
+
 | 
						|
 static inline int mmc_blk_part_switch(struct mmc_card *card,
 | 
						|
 				      struct mmc_blk_data *md);
 | 
						|
 static int get_card_status(struct mmc_card *card, u32 *status, int retries);
 | 
						|
@@ -2571,6 +2578,7 @@ static int mmc_blk_probe(struct mmc_card
 | 
						|
 {
 | 
						|
 	struct mmc_blk_data *md, *part_md;
 | 
						|
 	char cap_str[10];
 | 
						|
+	char quirk_str[24];
 | 
						|
 
 | 
						|
 	/*
 | 
						|
 	 * Check that the card supports the command class(es) we need.
 | 
						|
@@ -2578,7 +2586,16 @@ static int mmc_blk_probe(struct mmc_card
 | 
						|
 	if (!(card->csd.cmdclass & CCC_BLOCK_READ))
 | 
						|
 		return -ENODEV;
 | 
						|
 
 | 
						|
-	mmc_fixup_device(card, blk_fixups);
 | 
						|
+	if (card_quirks) {
 | 
						|
+		unsigned long quirks;
 | 
						|
+		if (kstrtoul(card_quirks, 0, &quirks) == 0)
 | 
						|
+			card->quirks = (unsigned int)quirks;
 | 
						|
+		else
 | 
						|
+			pr_err("mmc_block: Invalid card_quirks parameter '%s'\n",
 | 
						|
+			       card_quirks);
 | 
						|
+	}
 | 
						|
+	else
 | 
						|
+		mmc_fixup_device(card, blk_fixups);
 | 
						|
 
 | 
						|
 	md = mmc_blk_alloc(card);
 | 
						|
 	if (IS_ERR(md))
 | 
						|
@@ -2586,9 +2603,14 @@ static int mmc_blk_probe(struct mmc_card
 | 
						|
 
 | 
						|
 	string_get_size((u64)get_capacity(md->disk), 512, STRING_UNITS_2,
 | 
						|
 			cap_str, sizeof(cap_str));
 | 
						|
-	pr_info("%s: %s %s %s %s\n",
 | 
						|
+	if (card->quirks)
 | 
						|
+		snprintf(quirk_str, sizeof(quirk_str),
 | 
						|
+			 " (quirks 0x%08x)", card->quirks);
 | 
						|
+	else
 | 
						|
+		quirk_str[0] = '\0';
 | 
						|
+	pr_info("%s: %s %s %s%s%s\n",
 | 
						|
 		md->disk->disk_name, mmc_card_id(card), mmc_card_name(card),
 | 
						|
-		cap_str, md->read_only ? "(ro)" : "");
 | 
						|
+		cap_str, md->read_only ? " (ro)" : "", quirk_str);
 | 
						|
 
 | 
						|
 	if (mmc_blk_alloc_parts(card, md))
 | 
						|
 		goto out;
 |