Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 163367c9 authored by Ulf Hansson's avatar Ulf Hansson
Browse files

Merge branch 'fixes' into next

parents 1accbced 20314ce3
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1212,13 +1212,13 @@ static int mmc_select_hs400(struct mmc_card *card)
	mmc_set_timing(host, MMC_TIMING_MMC_HS400);
	mmc_set_bus_speed(card);

	if (host->ops->hs400_complete)
		host->ops->hs400_complete(host);

	err = mmc_switch_status(card);
	if (err)
		goto out_err;

	if (host->ops->hs400_complete)
		host->ops->hs400_complete(host);

	return 0;

out_err:
+22 −17
Original line number Diff line number Diff line
@@ -1023,6 +1023,8 @@ static void msdc_request_done(struct msdc_host *host, struct mmc_request *mrq)
	msdc_track_cmd_data(host, mrq->cmd, mrq->data);
	if (mrq->data)
		msdc_unprepare_data(host, mrq);
	if (host->error)
		msdc_reset_hw(host);
	mmc_request_done(host->mmc, mrq);
}

@@ -1375,24 +1377,25 @@ static void msdc_request_timeout(struct work_struct *work)
	}
}

static void __msdc_enable_sdio_irq(struct mmc_host *mmc, int enb)
static void __msdc_enable_sdio_irq(struct msdc_host *host, int enb)
{
	unsigned long flags;
	struct msdc_host *host = mmc_priv(mmc);

	spin_lock_irqsave(&host->lock, flags);
	if (enb)
	if (enb) {
		sdr_set_bits(host->base + MSDC_INTEN, MSDC_INTEN_SDIOIRQ);
	else
		sdr_set_bits(host->base + SDC_CFG, SDC_CFG_SDIOIDE);
	} else {
		sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INTEN_SDIOIRQ);
	spin_unlock_irqrestore(&host->lock, flags);
		sdr_clr_bits(host->base + SDC_CFG, SDC_CFG_SDIOIDE);
	}
}

static void msdc_enable_sdio_irq(struct mmc_host *mmc, int enb)
{
	unsigned long flags;
	struct msdc_host *host = mmc_priv(mmc);

	__msdc_enable_sdio_irq(mmc, enb);
	spin_lock_irqsave(&host->lock, flags);
	__msdc_enable_sdio_irq(host, enb);
	spin_unlock_irqrestore(&host->lock, flags);

	if (enb)
		pm_runtime_get_noresume(host->dev);
@@ -1414,6 +1417,8 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
		spin_lock_irqsave(&host->lock, flags);
		events = readl(host->base + MSDC_INT);
		event_mask = readl(host->base + MSDC_INTEN);
		if ((events & event_mask) & MSDC_INT_SDIOIRQ)
			__msdc_enable_sdio_irq(host, 0);
		/* clear interrupts */
		writel(events & event_mask, host->base + MSDC_INT);

@@ -1422,10 +1427,8 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
		data = host->data;
		spin_unlock_irqrestore(&host->lock, flags);

		if ((events & event_mask) & MSDC_INT_SDIOIRQ) {
			__msdc_enable_sdio_irq(host->mmc, 0);
		if ((events & event_mask) & MSDC_INT_SDIOIRQ)
			sdio_signal_irq(host->mmc);
		}

		if ((events & event_mask) & MSDC_INT_CDSC) {
			if (host->internal_cd)
@@ -1564,9 +1567,6 @@ static void msdc_init_hw(struct msdc_host *host)
	sdr_set_bits(host->base + SDC_CFG, SDC_CFG_SDIO);

	/* Config SDIO device detect interrupt function */
	if (host->mmc->caps & MMC_CAP_SDIO_IRQ)
		sdr_set_bits(host->base + SDC_CFG, SDC_CFG_SDIOIDE);
	else
	sdr_clr_bits(host->base + SDC_CFG, SDC_CFG_SDIOIDE);

	/* Configure to default data timeout */
@@ -2095,7 +2095,12 @@ static void msdc_hw_reset(struct mmc_host *mmc)

static void msdc_ack_sdio_irq(struct mmc_host *mmc)
{
	__msdc_enable_sdio_irq(mmc, 1);
	unsigned long flags;
	struct msdc_host *host = mmc_priv(mmc);

	spin_lock_irqsave(&host->lock, flags);
	__msdc_enable_sdio_irq(host, 1);
	spin_unlock_irqrestore(&host->lock, flags);
}

static int msdc_get_cd(struct mmc_host *mmc)