mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 07:10:27 +00:00
MMC core:
- Fix initialization of HS400-ES eMMC cards - A couple of fixes for the mmc block device driver - Resolved a compiler warning MMC host: - sdhci: Do not disable IRQs while waiting for clock - sdhci-pci: Do not disable IRQs in sdhci_intel_set_power - sdhci-of-arasan: Fix incorrect timeout clock - mediatek: Fix bug for setting wrong clock frequency - sdhci-of-at91: Use regulator to fix cmd timeout errors - ushc: Fix NULL-deref at probe - rockchip-dw-mshc: Rename RK1108 to RV1108 in DT -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJY1OMSAAoJEP4mhCVzWIwpKyIQAIUGeulfz50/3w8tHrn1o2SP WAGQ0wtum5LVw7EUNMQL6WbNca0tclTucv9KFj4v7uMc1cOsWvbkUt9N1OZE4Xgl nd/zeOQZUT03R+VFouHqNAt67+V6mQ53NNNp2E6D4MXI1FmNJCpcfU30Pl3rJ6uH h8H61j4kA6a4eMKyJ12lJlIuoxV7VN8TS1TCe4iiu2ZSiaqtH+Q98Li6TvsvOcRo kM72Bs8UBBEpMFqrUaGN8mo+cfCc+ByPOWVc+fvmkiyKGrfz2ivrQLDR5QkT38yU AgdfptQgMuKtwc5lthnM1kxSsixUgROCuWTECWWSHPl5W29frFfI6QvBFjBGFqbR ckL9ZMtpKfRuph1m9COODZneYDH3PULKIQpmUjwBLsh6FAQfvzkppPFvDhLTz+xi jP5+iqKjUkrAc7i5doSNrdwjMQZR5GSo+c1KlqfiK2QXdf/ay/rSP/IpotHjKgbl xUTe5dk7rs0WyT/T6Hd4lXGCEPb0mRO8ExulkOE8pEO78Sb+UBn1pPokLqPvp4zz Ct8pFARBGqEX2DMOyV6qqDBr1qbbyMW8L3yymqI3iL2Inu8AaFkqefQvOg1M40MB Qx8US2RN8jeRNg8KGQdRO6p53X/RYy3qdEAAkj42Mv5OvEvwtcIHlBfwRhTkGd4t PTaxnc8pdfT8QyuwTSvP =AB+h -----END PGP SIGNATURE----- Merge tag 'mmc-v4.11-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc Pull mmc fixes from Ulf Hansson: "Here are a couple of mmc fixes intended for v4.11 rc4. MMC core: - Fix initialization of HS400-ES eMMC cards - A couple of fixes for the mmc block device driver - Resolved a compiler warning MMC host: - sdhci: Do not disable IRQs while waiting for clock - sdhci-pci: Do not disable IRQs in sdhci_intel_set_power - sdhci-of-arasan: Fix incorrect timeout clock - mediatek: Fix bug for setting wrong clock frequency - sdhci-of-at91: Use regulator to fix cmd timeout errors - ushc: Fix NULL-deref at probe - rockchip-dw-mshc: Rename RK1108 to RV1108 in DT" * tag 'mmc-v4.11-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc: mmc: sdhci-pci: Do not disable interrupts in sdhci_intel_set_power mmc: sdhci: Do not disable interrupts while waiting for clock mmc: ushc: fix NULL-deref at probe mmc: sdhci-of-at91: Support external regulators mmc: core: mmc_blk_rw_cmd_err - remove unused variable mmc: mediatek: Fixed bug where clock frequency could be set wrong mmc: block: Fix cmd error reset failure path mmc: block: Fix is_waiting_last_req set incorrectly mmc: core: Fix access to HS400-ES devices mmc: sdhci-of-arasan: fix incorrect timeout clock dt-bindings: rockchip-dw-mshc: rename RK1108 to RV1108
This commit is contained in:
commit
9a31328f31
@ -13,7 +13,7 @@ Required Properties:
|
||||
- "rockchip,rk2928-dw-mshc": for Rockchip RK2928 and following,
|
||||
before RK3288
|
||||
- "rockchip,rk3288-dw-mshc": for Rockchip RK3288
|
||||
- "rockchip,rk1108-dw-mshc", "rockchip,rk3288-dw-mshc": for Rockchip RK1108
|
||||
- "rockchip,rv1108-dw-mshc", "rockchip,rk3288-dw-mshc": for Rockchip RV1108
|
||||
- "rockchip,rk3036-dw-mshc", "rockchip,rk3288-dw-mshc": for Rockchip RK3036
|
||||
- "rockchip,rk3368-dw-mshc", "rockchip,rk3288-dw-mshc": for Rockchip RK3368
|
||||
- "rockchip,rk3399-dw-mshc", "rockchip,rk3288-dw-mshc": for Rockchip RK3399
|
||||
|
@ -1560,11 +1560,8 @@ static bool mmc_blk_rw_cmd_err(struct mmc_blk_data *md, struct mmc_card *card,
|
||||
struct mmc_blk_request *brq, struct request *req,
|
||||
bool old_req_pending)
|
||||
{
|
||||
struct mmc_queue_req *mq_rq;
|
||||
bool req_pending;
|
||||
|
||||
mq_rq = container_of(brq, struct mmc_queue_req, brq);
|
||||
|
||||
/*
|
||||
* If this is an SD card and we're writing, we can first
|
||||
* mark the known good sectors as ok.
|
||||
@ -1701,7 +1698,8 @@ static void mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *new_req)
|
||||
case MMC_BLK_CMD_ERR:
|
||||
req_pending = mmc_blk_rw_cmd_err(md, card, brq, old_req, req_pending);
|
||||
if (mmc_blk_reset(md, card->host, type)) {
|
||||
mmc_blk_rw_cmd_abort(card, old_req);
|
||||
if (req_pending)
|
||||
mmc_blk_rw_cmd_abort(card, old_req);
|
||||
mmc_blk_rw_try_restart(mq, new_req);
|
||||
return;
|
||||
}
|
||||
@ -1817,6 +1815,7 @@ void mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
|
||||
mmc_blk_issue_flush(mq, req);
|
||||
} else {
|
||||
mmc_blk_issue_rw_rq(mq, req);
|
||||
card->host->context_info.is_waiting_last_req = false;
|
||||
}
|
||||
|
||||
out:
|
||||
|
@ -1730,7 +1730,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
|
||||
err = mmc_select_hs400(card);
|
||||
if (err)
|
||||
goto free_card;
|
||||
} else {
|
||||
} else if (!mmc_card_hs400es(card)) {
|
||||
/* Select the desired bus width optionally */
|
||||
err = mmc_select_bus_width(card);
|
||||
if (err > 0 && mmc_card_hs(card)) {
|
||||
|
@ -580,7 +580,7 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
|
||||
}
|
||||
}
|
||||
sdr_set_field(host->base + MSDC_CFG, MSDC_CFG_CKMOD | MSDC_CFG_CKDIV,
|
||||
(mode << 8) | (div % 0xff));
|
||||
(mode << 8) | div);
|
||||
sdr_set_bits(host->base + MSDC_CFG, MSDC_CFG_CKPDN);
|
||||
while (!(readl(host->base + MSDC_CFG) & MSDC_CFG_CKSTB))
|
||||
cpu_relax();
|
||||
@ -1559,7 +1559,7 @@ static int msdc_drv_probe(struct platform_device *pdev)
|
||||
host->src_clk_freq = clk_get_rate(host->src_clk);
|
||||
/* Set host parameters to mmc */
|
||||
mmc->ops = &mt_msdc_ops;
|
||||
mmc->f_min = host->src_clk_freq / (4 * 255);
|
||||
mmc->f_min = DIV_ROUND_UP(host->src_clk_freq, 4 * 255);
|
||||
|
||||
mmc->caps |= MMC_CAP_ERASE | MMC_CAP_CMD23;
|
||||
/* MMC core transfer sizes tunable parameters */
|
||||
|
@ -28,13 +28,9 @@
|
||||
#include "sdhci-pltfm.h"
|
||||
#include <linux/of.h>
|
||||
|
||||
#define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c
|
||||
#define SDHCI_ARASAN_VENDOR_REGISTER 0x78
|
||||
|
||||
#define VENDOR_ENHANCED_STROBE BIT(0)
|
||||
#define CLK_CTRL_TIMEOUT_SHIFT 16
|
||||
#define CLK_CTRL_TIMEOUT_MASK (0xf << CLK_CTRL_TIMEOUT_SHIFT)
|
||||
#define CLK_CTRL_TIMEOUT_MIN_EXP 13
|
||||
|
||||
#define PHY_CLK_TOO_SLOW_HZ 400000
|
||||
|
||||
@ -163,15 +159,15 @@ static int sdhci_arasan_syscon_write(struct sdhci_host *host,
|
||||
|
||||
static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host)
|
||||
{
|
||||
u32 div;
|
||||
unsigned long freq;
|
||||
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
||||
|
||||
div = readl(host->ioaddr + SDHCI_ARASAN_CLK_CTRL_OFFSET);
|
||||
div = (div & CLK_CTRL_TIMEOUT_MASK) >> CLK_CTRL_TIMEOUT_SHIFT;
|
||||
/* SDHCI timeout clock is in kHz */
|
||||
freq = DIV_ROUND_UP(clk_get_rate(pltfm_host->clk), 1000);
|
||||
|
||||
freq = clk_get_rate(pltfm_host->clk);
|
||||
freq /= 1 << (CLK_CTRL_TIMEOUT_MIN_EXP + div);
|
||||
/* or in MHz */
|
||||
if (host->caps & SDHCI_TIMEOUT_CLK_UNIT)
|
||||
freq = DIV_ROUND_UP(freq, 1000);
|
||||
|
||||
return freq;
|
||||
}
|
||||
|
@ -85,11 +85,30 @@ static void sdhci_at91_set_clock(struct sdhci_host *host, unsigned int clock)
|
||||
sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
|
||||
}
|
||||
|
||||
/*
|
||||
* In this specific implementation of the SDHCI controller, the power register
|
||||
* needs to have a valid voltage set even when the power supply is managed by
|
||||
* an external regulator.
|
||||
*/
|
||||
static void sdhci_at91_set_power(struct sdhci_host *host, unsigned char mode,
|
||||
unsigned short vdd)
|
||||
{
|
||||
if (!IS_ERR(host->mmc->supply.vmmc)) {
|
||||
struct mmc_host *mmc = host->mmc;
|
||||
|
||||
spin_unlock_irq(&host->lock);
|
||||
mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
|
||||
spin_lock_irq(&host->lock);
|
||||
}
|
||||
sdhci_set_power_noreg(host, mode, vdd);
|
||||
}
|
||||
|
||||
static const struct sdhci_ops sdhci_at91_sama5d2_ops = {
|
||||
.set_clock = sdhci_at91_set_clock,
|
||||
.set_bus_width = sdhci_set_bus_width,
|
||||
.reset = sdhci_reset,
|
||||
.set_uhs_signaling = sdhci_set_uhs_signaling,
|
||||
.set_power = sdhci_at91_set_power,
|
||||
};
|
||||
|
||||
static const struct sdhci_pltfm_data soc_data_sama5d2 = {
|
||||
|
@ -451,6 +451,8 @@ static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode,
|
||||
if (mode == MMC_POWER_OFF)
|
||||
return;
|
||||
|
||||
spin_unlock_irq(&host->lock);
|
||||
|
||||
/*
|
||||
* Bus power might not enable after D3 -> D0 transition due to the
|
||||
* present state not yet having propagated. Retry for up to 2ms.
|
||||
@ -463,6 +465,8 @@ static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode,
|
||||
reg |= SDHCI_POWER_ON;
|
||||
sdhci_writeb(host, reg, SDHCI_POWER_CONTROL);
|
||||
}
|
||||
|
||||
spin_lock_irq(&host->lock);
|
||||
}
|
||||
|
||||
static const struct sdhci_ops sdhci_intel_byt_ops = {
|
||||
|
@ -1362,7 +1362,9 @@ void sdhci_enable_clk(struct sdhci_host *host, u16 clk)
|
||||
return;
|
||||
}
|
||||
timeout--;
|
||||
mdelay(1);
|
||||
spin_unlock_irq(&host->lock);
|
||||
usleep_range(900, 1100);
|
||||
spin_lock_irq(&host->lock);
|
||||
}
|
||||
|
||||
clk |= SDHCI_CLOCK_CARD_EN;
|
||||
|
@ -426,6 +426,9 @@ static int ushc_probe(struct usb_interface *intf, const struct usb_device_id *id
|
||||
struct ushc_data *ushc;
|
||||
int ret;
|
||||
|
||||
if (intf->cur_altsetting->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
|
||||
mmc = mmc_alloc_host(sizeof(struct ushc_data), &intf->dev);
|
||||
if (mmc == NULL)
|
||||
return -ENOMEM;
|
||||
|
Loading…
x
Reference in New Issue
Block a user