diff options
author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2012-03-09 04:16:00 -0500 |
---|---|---|
committer | Chris Ball <cjb@laptop.org> | 2012-03-27 12:20:19 -0400 |
commit | 7f524217439cc17da74523582c303cced432713e (patch) | |
tree | cf3d25dd99f12c8ce73ea1ce45e0ae9f86503f2c | |
parent | e82b4ac94e5c43fad51b975aed058858ceda1f0f (diff) |
mmc: sh_mobile_sdhi: support modular mmc-core with non-standard hotplug
Currently if a platform wants to implement a non-standard card-detection
method, it would need to call tmio_mmc_cd_wakeup(), which is an inline
function, calling mmc_detect_change(). For this the platform would have
to link mmc_core statically into the kernel, losing the ability to build
it as a module. This patch adds a callback to the sh_mobile_sdhi driver,
which eliminates this dependency.
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Acked-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Chris Ball <cjb@laptop.org>
-rw-r--r-- | drivers/mmc/host/sh_mobile_sdhi.c | 11 | ||||
-rw-r--r-- | include/linux/mmc/sh_mobile_sdhi.h | 11 |
2 files changed, 20 insertions, 2 deletions
diff --git a/drivers/mmc/host/sh_mobile_sdhi.c b/drivers/mmc/host/sh_mobile_sdhi.c index 07ff3fee77b3..934b68e9efc3 100644 --- a/drivers/mmc/host/sh_mobile_sdhi.c +++ b/drivers/mmc/host/sh_mobile_sdhi.c | |||
@@ -90,6 +90,15 @@ static int sh_mobile_sdhi_write16_hook(struct tmio_mmc_host *host, int addr) | |||
90 | return 0; | 90 | return 0; |
91 | } | 91 | } |
92 | 92 | ||
93 | static void sh_mobile_sdhi_cd_wakeup(const struct platform_device *pdev) | ||
94 | { | ||
95 | mmc_detect_change(dev_get_drvdata(&pdev->dev), msecs_to_jiffies(100)); | ||
96 | } | ||
97 | |||
98 | static const struct sh_mobile_sdhi_ops sdhi_ops = { | ||
99 | .cd_wakeup = sh_mobile_sdhi_cd_wakeup, | ||
100 | }; | ||
101 | |||
93 | static int __devinit sh_mobile_sdhi_probe(struct platform_device *pdev) | 102 | static int __devinit sh_mobile_sdhi_probe(struct platform_device *pdev) |
94 | { | 103 | { |
95 | struct sh_mobile_sdhi *priv; | 104 | struct sh_mobile_sdhi *priv; |
@@ -110,7 +119,7 @@ static int __devinit sh_mobile_sdhi_probe(struct platform_device *pdev) | |||
110 | p->pdata = mmc_data; | 119 | p->pdata = mmc_data; |
111 | 120 | ||
112 | if (p->init) { | 121 | if (p->init) { |
113 | ret = p->init(pdev); | 122 | ret = p->init(pdev, &sdhi_ops); |
114 | if (ret) | 123 | if (ret) |
115 | goto einit; | 124 | goto einit; |
116 | } | 125 | } |
diff --git a/include/linux/mmc/sh_mobile_sdhi.h b/include/linux/mmc/sh_mobile_sdhi.h index 686b85bfb7a5..e94e620aeddc 100644 --- a/include/linux/mmc/sh_mobile_sdhi.h +++ b/include/linux/mmc/sh_mobile_sdhi.h | |||
@@ -10,6 +10,14 @@ struct tmio_mmc_data; | |||
10 | #define SH_MOBILE_SDHI_IRQ_SDCARD "sdcard" | 10 | #define SH_MOBILE_SDHI_IRQ_SDCARD "sdcard" |
11 | #define SH_MOBILE_SDHI_IRQ_SDIO "sdio" | 11 | #define SH_MOBILE_SDHI_IRQ_SDIO "sdio" |
12 | 12 | ||
13 | /** | ||
14 | * struct sh_mobile_sdhi_ops - SDHI driver callbacks | ||
15 | * @cd_wakeup: trigger a card-detection run | ||
16 | */ | ||
17 | struct sh_mobile_sdhi_ops { | ||
18 | void (*cd_wakeup)(const struct platform_device *pdev); | ||
19 | }; | ||
20 | |||
13 | struct sh_mobile_sdhi_info { | 21 | struct sh_mobile_sdhi_info { |
14 | int dma_slave_tx; | 22 | int dma_slave_tx; |
15 | int dma_slave_rx; | 23 | int dma_slave_rx; |
@@ -22,7 +30,8 @@ struct sh_mobile_sdhi_info { | |||
22 | int (*get_cd)(struct platform_device *pdev); | 30 | int (*get_cd)(struct platform_device *pdev); |
23 | 31 | ||
24 | /* callbacks for board specific setup code */ | 32 | /* callbacks for board specific setup code */ |
25 | int (*init)(struct platform_device *pdev); | 33 | int (*init)(struct platform_device *pdev, |
34 | const struct sh_mobile_sdhi_ops *ops); | ||
26 | void (*cleanup)(struct platform_device *pdev); | 35 | void (*cleanup)(struct platform_device *pdev); |
27 | }; | 36 | }; |
28 | 37 | ||