mmc: dw_mmc: Use core to handle absent write protect line
Use the new MMC_CAP2_NO_WRITE_PROTECT to let the core handle the case where no write protect line is present instead of having custom driver code to handle it. dw_mci_of_get_slot_quirks() is slightly refactored to directly modify the mmc_host capabilities instead of returning a quirk mask. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
		
							parent
							
								
									0293efddad
								
							
						
					
					
						commit
						eff8f2f5df
					
				@ -1282,10 +1282,7 @@ static int dw_mci_get_ro(struct mmc_host *mmc)
 | 
			
		||||
	int gpio_ro = mmc_gpio_get_ro(mmc);
 | 
			
		||||
 | 
			
		||||
	/* Use platform get_ro function, else try on board write protect */
 | 
			
		||||
	if ((slot->quirks & DW_MCI_SLOT_QUIRK_NO_WRITE_PROTECT) ||
 | 
			
		||||
			(slot->host->quirks & DW_MCI_QUIRK_NO_WRITE_PROTECT))
 | 
			
		||||
		read_only = 0;
 | 
			
		||||
	else if (!IS_ERR_VALUE(gpio_ro))
 | 
			
		||||
	if (!IS_ERR_VALUE(gpio_ro))
 | 
			
		||||
		read_only = gpio_ro;
 | 
			
		||||
	else
 | 
			
		||||
		read_only =
 | 
			
		||||
@ -2284,9 +2281,10 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_OF
 | 
			
		||||
/* given a slot id, find out the device node representing that slot */
 | 
			
		||||
static struct device_node *dw_mci_of_find_slot_node(struct device *dev, u8 slot)
 | 
			
		||||
/* given a slot, find out the device node representing that slot */
 | 
			
		||||
static struct device_node *dw_mci_of_find_slot_node(struct dw_mci_slot *slot)
 | 
			
		||||
{
 | 
			
		||||
	struct device *dev = slot->mmc->parent;
 | 
			
		||||
	struct device_node *np;
 | 
			
		||||
	const __be32 *addr;
 | 
			
		||||
	int len;
 | 
			
		||||
@ -2298,42 +2296,28 @@ static struct device_node *dw_mci_of_find_slot_node(struct device *dev, u8 slot)
 | 
			
		||||
		addr = of_get_property(np, "reg", &len);
 | 
			
		||||
		if (!addr || (len < sizeof(int)))
 | 
			
		||||
			continue;
 | 
			
		||||
		if (be32_to_cpup(addr) == slot)
 | 
			
		||||
		if (be32_to_cpup(addr) == slot->id)
 | 
			
		||||
			return np;
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct dw_mci_of_slot_quirks {
 | 
			
		||||
	char *quirk;
 | 
			
		||||
	int id;
 | 
			
		||||
} of_slot_quirks[] = {
 | 
			
		||||
	{
 | 
			
		||||
		.quirk	= "disable-wp",
 | 
			
		||||
		.id	= DW_MCI_SLOT_QUIRK_NO_WRITE_PROTECT,
 | 
			
		||||
	},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int dw_mci_of_get_slot_quirks(struct device *dev, u8 slot)
 | 
			
		||||
static void dw_mci_slot_of_parse(struct dw_mci_slot *slot)
 | 
			
		||||
{
 | 
			
		||||
	struct device_node *np = dw_mci_of_find_slot_node(dev, slot);
 | 
			
		||||
	int quirks = 0;
 | 
			
		||||
	int idx;
 | 
			
		||||
	struct device_node *np = dw_mci_of_find_slot_node(slot);
 | 
			
		||||
 | 
			
		||||
	/* get quirks */
 | 
			
		||||
	for (idx = 0; idx < ARRAY_SIZE(of_slot_quirks); idx++)
 | 
			
		||||
		if (of_get_property(np, of_slot_quirks[idx].quirk, NULL)) {
 | 
			
		||||
			dev_warn(dev, "Slot quirk %s is deprecated\n",
 | 
			
		||||
					of_slot_quirks[idx].quirk);
 | 
			
		||||
			quirks |= of_slot_quirks[idx].id;
 | 
			
		||||
		}
 | 
			
		||||
	if (!np)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	return quirks;
 | 
			
		||||
	if (of_property_read_bool(np, "disable-wp")) {
 | 
			
		||||
		slot->mmc->caps2 |= MMC_CAP2_NO_WRITE_PROTECT;
 | 
			
		||||
		dev_warn(slot->mmc->parent,
 | 
			
		||||
			"Slot quirk 'disable-wp' is deprecated\n");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
#else /* CONFIG_OF */
 | 
			
		||||
static int dw_mci_of_get_slot_quirks(struct device *dev, u8 slot)
 | 
			
		||||
static void dw_mci_slot_of_parse(struct dw_mci_slot *slot)
 | 
			
		||||
{
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_OF */
 | 
			
		||||
 | 
			
		||||
@ -2356,8 +2340,6 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id)
 | 
			
		||||
	slot->host = host;
 | 
			
		||||
	host->slot[id] = slot;
 | 
			
		||||
 | 
			
		||||
	slot->quirks = dw_mci_of_get_slot_quirks(host->dev, slot->id);
 | 
			
		||||
 | 
			
		||||
	mmc->ops = &dw_mci_ops;
 | 
			
		||||
	if (of_property_read_u32_array(host->dev->of_node,
 | 
			
		||||
				       "clock-freq-min-max", freq, 2)) {
 | 
			
		||||
@ -2395,6 +2377,8 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id)
 | 
			
		||||
	if (host->pdata->caps2)
 | 
			
		||||
		mmc->caps2 = host->pdata->caps2;
 | 
			
		||||
 | 
			
		||||
	dw_mci_slot_of_parse(slot);
 | 
			
		||||
 | 
			
		||||
	ret = mmc_of_parse(mmc);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		goto err_host_allocated;
 | 
			
		||||
@ -2622,9 +2606,6 @@ static struct dw_mci_of_quirks {
 | 
			
		||||
	{
 | 
			
		||||
		.quirk	= "broken-cd",
 | 
			
		||||
		.id	= DW_MCI_QUIRK_BROKEN_CARD_DETECTION,
 | 
			
		||||
	}, {
 | 
			
		||||
		.quirk	= "disable-wp",
 | 
			
		||||
		.id	= DW_MCI_QUIRK_NO_WRITE_PROTECT,
 | 
			
		||||
	},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -227,7 +227,6 @@ extern int dw_mci_resume(struct dw_mci *host);
 | 
			
		||||
 * struct dw_mci_slot - MMC slot state
 | 
			
		||||
 * @mmc: The mmc_host representing this slot.
 | 
			
		||||
 * @host: The MMC controller this slot is using.
 | 
			
		||||
 * @quirks: Slot-level quirks (DW_MCI_SLOT_QUIRK_XXX)
 | 
			
		||||
 * @ctype: Card type for this slot.
 | 
			
		||||
 * @mrq: mmc_request currently being processed or waiting to be
 | 
			
		||||
 *	processed, or NULL when the slot is idle.
 | 
			
		||||
@ -245,8 +244,6 @@ struct dw_mci_slot {
 | 
			
		||||
	struct mmc_host		*mmc;
 | 
			
		||||
	struct dw_mci		*host;
 | 
			
		||||
 | 
			
		||||
	int			quirks;
 | 
			
		||||
 | 
			
		||||
	u32			ctype;
 | 
			
		||||
 | 
			
		||||
	struct mmc_request	*mrq;
 | 
			
		||||
 | 
			
		||||
@ -226,12 +226,6 @@ struct dw_mci_dma_ops {
 | 
			
		||||
#define DW_MCI_QUIRK_HIGHSPEED			BIT(2)
 | 
			
		||||
/* Unreliable card detection */
 | 
			
		||||
#define DW_MCI_QUIRK_BROKEN_CARD_DETECTION	BIT(3)
 | 
			
		||||
/* No write protect */
 | 
			
		||||
#define DW_MCI_QUIRK_NO_WRITE_PROTECT		BIT(4)
 | 
			
		||||
 | 
			
		||||
/* Slot level quirks */
 | 
			
		||||
/* This slot has no write protect */
 | 
			
		||||
#define DW_MCI_SLOT_QUIRK_NO_WRITE_PROTECT	BIT(0)
 | 
			
		||||
 | 
			
		||||
struct dma_pdata;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user