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

Commit e2d26477 authored by Manuel Lauss's avatar Manuel Lauss Committed by Pierre Ossman
Browse files

au1xmmc: remove custom carddetect poll implementation.



The MMC core provides a carddetect poll feature, time to
remove the driver's own implementation of it.

Signed-off-by: default avatarManuel Lauss <mano@roarinelk.homelinux.net>
Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
parent 08fcb720
Loading
Loading
Loading
Loading
+18 −61
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@
 * published by the Free Software Foundation.
 */

/* Why is a timer used to detect insert events?
/* Why don't we use the SD controllers' carddetect feature?
 *
 * From the AU1100 MMC application guide:
 * If the Au1100-based design is intended to support both MultiMediaCards
@@ -30,8 +30,6 @@
 * In doing so, a MMC card never enters SPI-mode communications,
 * but now the SecureDigital card-detect feature of CD/DAT3 is ineffective
 * (the low to high transition will not occur).
 *
 * So we use the timer to check the status manually.
 */

#include <linux/module.h>
@@ -111,7 +109,6 @@ struct au1xmmc_host {

	int irq;

	struct timer_list timer;
	struct tasklet_struct finish_task;
	struct tasklet_struct data_task;
	struct au1xmmc_platform_data *platdata;
@@ -198,29 +195,24 @@ static void au1xmmc_set_power(struct au1xmmc_host *host, int state)
		host->platdata->set_power(host->mmc, state);
}

static int au1xmmc_card_inserted(struct au1xmmc_host *host)
static int au1xmmc_card_inserted(struct mmc_host *mmc)
{
	int ret;
	struct au1xmmc_host *host = mmc_priv(mmc);

	if (host->platdata && host->platdata->card_inserted)
		ret = host->platdata->card_inserted(host->mmc);
	else
		ret = 1;	/* assume there is a card */
		return !!host->platdata->card_inserted(host->mmc);

	return ret;
	return -ENOSYS;
}

static int au1xmmc_card_readonly(struct mmc_host *mmc)
{
	struct au1xmmc_host *host = mmc_priv(mmc);
	int ret;

	if (host->platdata && host->platdata->card_readonly)
		ret = host->platdata->card_readonly(mmc);
	else
		ret = 0;	/* assume card is read-write */
		return !!host->platdata->card_readonly(mmc);

	return ret;
	return -ENOSYS;
}

static void au1xmmc_finish_request(struct au1xmmc_host *host)
@@ -698,7 +690,7 @@ static void au1xmmc_request(struct mmc_host* mmc, struct mmc_request* mrq)
	host->status = HOST_S_CMD;

	/* fail request immediately if no card is present */
	if (0 == au1xmmc_card_inserted(host)) {
	if (0 == au1xmmc_card_inserted(mmc)) {
		mrq->cmd->error = -ENOMEDIUM;
		au1xmmc_finish_request(host);
		return;
@@ -935,39 +927,10 @@ static const struct mmc_host_ops au1xmmc_ops = {
	.request	= au1xmmc_request,
	.set_ios	= au1xmmc_set_ios,
	.get_ro		= au1xmmc_card_readonly,
	.get_cd		= au1xmmc_card_inserted,
	.enable_sdio_irq = au1xmmc_enable_sdio_irq,
};

static void au1xmmc_poll_event(unsigned long arg)
{
	struct au1xmmc_host *host = (struct au1xmmc_host *)arg;
	int card = au1xmmc_card_inserted(host);
	int controller = (host->flags & HOST_F_ACTIVE) ? 1 : 0;

	if (card != controller) {
		host->flags &= ~HOST_F_ACTIVE;
		if (card)
			host->flags |= HOST_F_ACTIVE;
		mmc_detect_change(host->mmc, 0);
	}

#ifdef DEBUG
	if (host->mrq != NULL) {
		u32 status = au_readl(HOST_STATUS(host));
		DBG("PENDING - %8.8x\n", host->pdev->id, status);
	}
#endif
	mod_timer(&host->timer, jiffies + AU1XMMC_DETECT_TIMEOUT);
}

static void au1xmmc_init_cd_poll_timer(struct au1xmmc_host *host)
{
	init_timer(&host->timer);
	host->timer.function = au1xmmc_poll_event;
	host->timer.data = (unsigned long)host;
	host->timer.expires = jiffies + AU1XMMC_DETECT_TIMEOUT;
}

static int __devinit au1xmmc_probe(struct platform_device *pdev)
{
	struct mmc_host *mmc;
@@ -1042,13 +1005,11 @@ static int __devinit au1xmmc_probe(struct platform_device *pdev)
	if (host->platdata && host->platdata->cd_setup) {
		ret = host->platdata->cd_setup(mmc, 1);
		if (ret) {
			dev_err(&pdev->dev, "board CD setup failed\n");
			goto out4;
		}
	} else {
		/* poll the board-specific is-card-in-socket-? method */
		au1xmmc_init_cd_poll_timer(host);
			dev_warn(&pdev->dev, "board CD setup failed\n");
			mmc->caps |= MMC_CAP_NEEDS_POLL;
		}
	} else
		mmc->caps |= MMC_CAP_NEEDS_POLL;

	tasklet_init(&host->data_task, au1xmmc_tasklet_data,
			(unsigned long)host);
@@ -1084,10 +1045,6 @@ static int __devinit au1xmmc_probe(struct platform_device *pdev)

	platform_set_drvdata(pdev, mmc);

	/* start the carddetect poll timer if necessary */
	if (!(host->platdata && host->platdata->cd_setup))
		add_timer(&host->timer);

	printk(KERN_INFO DRIVER_NAME ": MMC Controller %d set up at %8.8X"
		" (mode=%s)\n", pdev->id, host->iobase,
		host->flags & HOST_F_DMA ? "dma" : "pio");
@@ -1112,9 +1069,10 @@ out5:
	tasklet_kill(&host->data_task);
	tasklet_kill(&host->finish_task);

	if (host->platdata && host->platdata->cd_setup)
	if (host->platdata && host->platdata->cd_setup &&
	    !(mmc->caps & MMC_CAP_NEEDS_POLL))
		host->platdata->cd_setup(mmc, 0);
out4:

	free_irq(host->irq, host);
out3:
	iounmap((void *)host->iobase);
@@ -1142,10 +1100,9 @@ static int __devexit au1xmmc_remove(struct platform_device *pdev)
			led_classdev_unregister(host->platdata->led);
#endif

		if (host->platdata && host->platdata->cd_setup)
		if (host->platdata && host->platdata->cd_setup &&
		    !(mmc->caps & MMC_CAP_NEEDS_POLL))
			host->platdata->cd_setup(mmc, 0);
		else
			del_timer_sync(&host->timer);

		au_writel(0, HOST_ENABLE(host));
		au_writel(0, HOST_CONFIG(host));