sdhci-pltfm: implement platform data passing
This includes platform ops, quirks and (de)initialization callbacks. Signed-off-by: Anton 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
f27f47ef5b
commit
a7626b7a5d
@@ -29,6 +29,7 @@
|
|||||||
#include <linux/mmc/host.h>
|
#include <linux/mmc/host.h>
|
||||||
|
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/sdhci-pltfm.h>
|
||||||
|
|
||||||
#include "sdhci.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)
|
static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
|
struct sdhci_pltfm_data *pdata = pdev->dev.platform_data;
|
||||||
struct sdhci_host *host;
|
struct sdhci_host *host;
|
||||||
struct resource *iomem;
|
struct resource *iomem;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
BUG_ON(pdev == NULL);
|
|
||||||
|
|
||||||
iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
if (!iomem) {
|
if (!iomem) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
@@ -76,7 +76,12 @@ static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
host->hw_name = "platform";
|
host->hw_name = "platform";
|
||||||
|
if (pdata && pdata->ops)
|
||||||
|
host->ops = pdata->ops;
|
||||||
|
else
|
||||||
host->ops = &sdhci_pltfm_ops;
|
host->ops = &sdhci_pltfm_ops;
|
||||||
|
if (pdata)
|
||||||
|
host->quirks = pdata->quirks;
|
||||||
host->irq = platform_get_irq(pdev, 0);
|
host->irq = platform_get_irq(pdev, 0);
|
||||||
|
|
||||||
if (!request_mem_region(iomem->start, resource_size(iomem),
|
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;
|
goto err_remap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pdata && pdata->init) {
|
||||||
|
ret = pdata->init(host);
|
||||||
|
if (ret)
|
||||||
|
goto err_plat_init;
|
||||||
|
}
|
||||||
|
|
||||||
ret = sdhci_add_host(host);
|
ret = sdhci_add_host(host);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_add_host;
|
goto err_add_host;
|
||||||
@@ -102,6 +113,9 @@ static int __devinit sdhci_pltfm_probe(struct platform_device *pdev)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_add_host:
|
err_add_host:
|
||||||
|
if (pdata && pdata->exit)
|
||||||
|
pdata->exit(host);
|
||||||
|
err_plat_init:
|
||||||
iounmap(host->ioaddr);
|
iounmap(host->ioaddr);
|
||||||
err_remap:
|
err_remap:
|
||||||
release_mem_region(iomem->start, resource_size(iomem));
|
release_mem_region(iomem->start, resource_size(iomem));
|
||||||
@@ -114,6 +128,7 @@ err:
|
|||||||
|
|
||||||
static int __devexit sdhci_pltfm_remove(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 sdhci_host *host = platform_get_drvdata(pdev);
|
||||||
struct resource *iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
struct resource *iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
int dead;
|
int dead;
|
||||||
@@ -125,6 +140,8 @@ static int __devexit sdhci_pltfm_remove(struct platform_device *pdev)
|
|||||||
dead = 1;
|
dead = 1;
|
||||||
|
|
||||||
sdhci_remove_host(host, dead);
|
sdhci_remove_host(host, dead);
|
||||||
|
if (pdata && pdata->exit)
|
||||||
|
pdata->exit(host);
|
||||||
iounmap(host->ioaddr);
|
iounmap(host->ioaddr);
|
||||||
release_mem_region(iomem->start, resource_size(iomem));
|
release_mem_region(iomem->start, resource_size(iomem));
|
||||||
sdhci_free_host(host);
|
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_AUTHOR("Mocean Laboratories <info@mocean-labs.com>");
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
MODULE_ALIAS("platform:sdhci");
|
MODULE_ALIAS("platform:sdhci");
|
||||||
|
|
||||||
|
35
include/linux/sdhci-pltfm.h
Normal file
35
include/linux/sdhci-pltfm.h
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* 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 */
|
Reference in New Issue
Block a user