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

Commit a7626b7a authored by Anton Vorontsov's avatar Anton Vorontsov Committed by Linus Torvalds
Browse files

sdhci-pltfm: implement platform data passing



This includes platform ops, quirks and (de)initialization callbacks.

Signed-off-by: default avatarAnton Vorontsov <avorontsov@ru.mvista.com>
Cc: Richard Röjfors <richard.rojfors@pelagicore.com>
Cc: David Vrabel <david.vrabel@csr.com>
Cc: Pierre Ossman <pierre@ossman.eu>
Cc: Ben Dooks <ben@simtec.co.uk>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent f27f47ef
Loading
Loading
Loading
Loading
+20 −4
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include <linux/mmc/host.h>

#include <linux/io.h>
#include <linux/sdhci-pltfm.h>

#include "sdhci.h"

@@ -49,12 +50,11 @@ static struct sdhci_ops sdhci_pltfm_ops = {

static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
{
	struct sdhci_pltfm_data *pdata = pdev->dev.platform_data;
	struct sdhci_host *host;
	struct resource *iomem;
	int ret;

	BUG_ON(pdev == NULL);

	iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!iomem) {
		ret = -ENOMEM;
@@ -76,7 +76,12 @@ static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
	}

	host->hw_name = "platform";
	if (pdata && pdata->ops)
		host->ops = pdata->ops;
	else
		host->ops = &sdhci_pltfm_ops;
	if (pdata)
		host->quirks = pdata->quirks;
	host->irq = platform_get_irq(pdev, 0);

	if (!request_mem_region(iomem->start, resource_size(iomem),
@@ -93,6 +98,12 @@ static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
		goto err_remap;
	}

	if (pdata && pdata->init) {
		ret = pdata->init(host);
		if (ret)
			goto err_plat_init;
	}

	ret = sdhci_add_host(host);
	if (ret)
		goto err_add_host;
@@ -102,6 +113,9 @@ static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
	return 0;

err_add_host:
	if (pdata && pdata->exit)
		pdata->exit(host);
err_plat_init:
	iounmap(host->ioaddr);
err_remap:
	release_mem_region(iomem->start, resource_size(iomem));
@@ -114,6 +128,7 @@ static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)

static int __devexit sdhci_pltfm_remove(struct platform_device *pdev)
{
	struct sdhci_pltfm_data *pdata = pdev->dev.platform_data;
	struct sdhci_host *host = platform_get_drvdata(pdev);
	struct resource *iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	int dead;
@@ -125,6 +140,8 @@ static int __devexit sdhci_pltfm_remove(struct platform_device *pdev)
		dead = 1;

	sdhci_remove_host(host, dead);
	if (pdata && pdata->exit)
		pdata->exit(host);
	iounmap(host->ioaddr);
	release_mem_region(iomem->start, resource_size(iomem));
	sdhci_free_host(host);
@@ -165,4 +182,3 @@ MODULE_DESCRIPTION("Secure Digital Host Controller Interface platform driver");
MODULE_AUTHOR("Mocean Laboratories <info@mocean-labs.com>");
MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:sdhci");
+35 −0
Original line number Diff line number Diff line
/*
 * Platform data declarations for the sdhci-pltfm driver.
 *
 * Copyright (c) 2010 MontaVista Software, LLC.
 *
 * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 */

#ifndef _SDHCI_PLTFM_H
#define _SDHCI_PLTFM_H

struct sdhci_ops;
struct sdhci_host;

/**
 * struct sdhci_pltfm_data - SDHCI platform-specific information & hooks
 * @ops: optional pointer to the platform-provided SDHCI ops
 * @quirks: optional SDHCI quirks
 * @init: optional hook that is called during device probe, before the
 *        driver tries to access any SDHCI registers
 * @exit: optional hook that is called during device removal
 */
struct sdhci_pltfm_data {
	struct sdhci_ops *ops;
	unsigned int quirks;
	int (*init)(struct sdhci_host *host);
	void (*exit)(struct sdhci_host *host);
};

#endif /* _SDHCI_PLTFM_H */