17
17
#include <linux/platform_device.h>
18
18
#include <linux/clk.h>
19
19
#include <linux/io.h>
20
+ #include <linux/of_gpio.h>
20
21
#include <linux/gpio.h>
21
22
#include <linux/mmc/card.h>
22
23
#include <linux/mmc/host.h>
@@ -73,10 +74,8 @@ static void tegra_sdhci_writel(struct sdhci_host *host, u32 val, int reg)
73
74
74
75
static unsigned int tegra_sdhci_get_ro (struct sdhci_host * sdhci )
75
76
{
76
- struct platform_device * pdev = to_platform_device (mmc_dev (sdhci -> mmc ));
77
- struct tegra_sdhci_platform_data * plat ;
78
-
79
- plat = pdev -> dev .platform_data ;
77
+ struct sdhci_pltfm_host * pltfm_host = sdhci_priv (sdhci );
78
+ struct tegra_sdhci_platform_data * plat = pltfm_host -> priv ;
80
79
81
80
if (!gpio_is_valid (plat -> wp_gpio ))
82
81
return -1 ;
@@ -94,12 +93,10 @@ static irqreturn_t carddetect_irq(int irq, void *data)
94
93
95
94
static int tegra_sdhci_8bit (struct sdhci_host * host , int bus_width )
96
95
{
97
- struct platform_device * pdev = to_platform_device ( mmc_dev ( host -> mmc ) );
98
- struct tegra_sdhci_platform_data * plat ;
96
+ struct sdhci_pltfm_host * pltfm_host = sdhci_priv ( host );
97
+ struct tegra_sdhci_platform_data * plat = pltfm_host -> priv ;
99
98
u32 ctrl ;
100
99
101
- plat = pdev -> dev .platform_data ;
102
-
103
100
ctrl = sdhci_readb (host , SDHCI_HOST_CONTROL );
104
101
if (plat -> is_8bit && bus_width == MMC_BUS_WIDTH_8 ) {
105
102
ctrl &= ~SDHCI_CTRL_4BITBUS ;
@@ -131,6 +128,34 @@ static struct sdhci_pltfm_data sdhci_tegra_pdata = {
131
128
.ops = & tegra_sdhci_ops ,
132
129
};
133
130
131
+ static const struct of_device_id sdhci_tegra_dt_match [] __devinitdata = {
132
+ { .compatible = "nvidia,tegra20-sdhci" , },
133
+ {}
134
+ };
135
+ MODULE_DEVICE_TABLE (of , sdhci_dt_ids );
136
+
137
+ static struct tegra_sdhci_platform_data * __devinit sdhci_tegra_dt_parse_pdata (
138
+ struct platform_device * pdev )
139
+ {
140
+ struct tegra_sdhci_platform_data * plat ;
141
+ struct device_node * np = pdev -> dev .of_node ;
142
+
143
+ if (!np )
144
+ return NULL ;
145
+
146
+ plat = devm_kzalloc (& pdev -> dev , sizeof (* plat ), GFP_KERNEL );
147
+ if (!plat ) {
148
+ dev_err (& pdev -> dev , "Can't allocate platform data\n" );
149
+ return NULL ;
150
+ }
151
+
152
+ plat -> cd_gpio = of_get_named_gpio (np , "cd-gpios" , 0 );
153
+ plat -> wp_gpio = of_get_named_gpio (np , "wp-gpios" , 0 );
154
+ plat -> power_gpio = of_get_named_gpio (np , "power-gpios" , 0 );
155
+
156
+ return plat ;
157
+ }
158
+
134
159
static int __devinit sdhci_tegra_probe (struct platform_device * pdev )
135
160
{
136
161
struct sdhci_pltfm_host * pltfm_host ;
@@ -147,12 +172,17 @@ static int __devinit sdhci_tegra_probe(struct platform_device *pdev)
147
172
148
173
plat = pdev -> dev .platform_data ;
149
174
175
+ if (plat == NULL )
176
+ plat = sdhci_tegra_dt_parse_pdata (pdev );
177
+
150
178
if (plat == NULL ) {
151
179
dev_err (mmc_dev (host -> mmc ), "missing platform data\n" );
152
180
rc = - ENXIO ;
153
181
goto err_no_plat ;
154
182
}
155
183
184
+ pltfm_host -> priv = plat ;
185
+
156
186
if (gpio_is_valid (plat -> power_gpio )) {
157
187
rc = gpio_request (plat -> power_gpio , "sdhci_power" );
158
188
if (rc ) {
@@ -247,13 +277,11 @@ static int __devexit sdhci_tegra_remove(struct platform_device *pdev)
247
277
{
248
278
struct sdhci_host * host = platform_get_drvdata (pdev );
249
279
struct sdhci_pltfm_host * pltfm_host = sdhci_priv (host );
250
- struct tegra_sdhci_platform_data * plat ;
280
+ struct tegra_sdhci_platform_data * plat = pltfm_host -> priv ;
251
281
int dead = (readl (host -> ioaddr + SDHCI_INT_STATUS ) == 0xffffffff );
252
282
253
283
sdhci_remove_host (host , dead );
254
284
255
- plat = pdev -> dev .platform_data ;
256
-
257
285
if (gpio_is_valid (plat -> wp_gpio )) {
258
286
tegra_gpio_disable (plat -> wp_gpio );
259
287
gpio_free (plat -> wp_gpio );
@@ -282,6 +310,7 @@ static struct platform_driver sdhci_tegra_driver = {
282
310
.driver = {
283
311
.name = "sdhci-tegra" ,
284
312
.owner = THIS_MODULE ,
313
+ .of_match_table = sdhci_tegra_dt_match ,
285
314
},
286
315
.probe = sdhci_tegra_probe ,
287
316
.remove = __devexit_p (sdhci_tegra_remove ),
0 commit comments