@@ -29,9 +29,16 @@ struct f_sdhost_priv {
29
29
bool enable_cmd_dat_delay ;
30
30
};
31
31
32
+ static void * sdhci_f_sdhost_priv (struct sdhci_host * host )
33
+ {
34
+ struct sdhci_pltfm_host * pltfm_host = sdhci_priv (host );
35
+
36
+ return sdhci_pltfm_priv (pltfm_host );
37
+ }
38
+
32
39
static void sdhci_f_sdh30_soft_voltage_switch (struct sdhci_host * host )
33
40
{
34
- struct f_sdhost_priv * priv = sdhci_priv (host );
41
+ struct f_sdhost_priv * priv = sdhci_f_sdhost_priv (host );
35
42
u32 ctrl = 0 ;
36
43
37
44
usleep_range (2500 , 3000 );
@@ -64,7 +71,7 @@ static unsigned int sdhci_f_sdh30_get_min_clock(struct sdhci_host *host)
64
71
65
72
static void sdhci_f_sdh30_reset (struct sdhci_host * host , u8 mask )
66
73
{
67
- struct f_sdhost_priv * priv = sdhci_priv (host );
74
+ struct f_sdhost_priv * priv = sdhci_f_sdhost_priv (host );
68
75
u32 ctl ;
69
76
70
77
if (sdhci_readw (host , SDHCI_CLOCK_CONTROL ) == 0 )
@@ -95,49 +102,39 @@ static const struct sdhci_ops sdhci_f_sdh30_ops = {
95
102
.set_uhs_signaling = sdhci_set_uhs_signaling ,
96
103
};
97
104
105
+ static const struct sdhci_pltfm_data sdhci_f_sdh30_pltfm_data = {
106
+ .ops = & sdhci_f_sdh30_ops ,
107
+ .quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC
108
+ | SDHCI_QUIRK_INVERTED_WRITE_PROTECT ,
109
+ .quirks2 = SDHCI_QUIRK2_SUPPORT_SINGLE
110
+ | SDHCI_QUIRK2_TUNING_WORK_AROUND ,
111
+ };
112
+
98
113
static int sdhci_f_sdh30_probe (struct platform_device * pdev )
99
114
{
100
115
struct sdhci_host * host ;
101
116
struct device * dev = & pdev -> dev ;
102
- int irq , ctrl = 0 , ret = 0 ;
117
+ int ctrl = 0 , ret = 0 ;
103
118
struct f_sdhost_priv * priv ;
119
+ struct sdhci_pltfm_host * pltfm_host ;
104
120
u32 reg = 0 ;
105
121
106
- irq = platform_get_irq (pdev , 0 );
107
- if (irq < 0 )
108
- return irq ;
109
-
110
- host = sdhci_alloc_host (dev , sizeof (struct f_sdhost_priv ));
122
+ host = sdhci_pltfm_init (pdev , & sdhci_f_sdh30_pltfm_data ,
123
+ sizeof (struct f_sdhost_priv ));
111
124
if (IS_ERR (host ))
112
125
return PTR_ERR (host );
113
126
114
- priv = sdhci_priv (host );
127
+ pltfm_host = sdhci_priv (host );
128
+ priv = sdhci_pltfm_priv (pltfm_host );
115
129
priv -> dev = dev ;
116
130
117
- host -> quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC |
118
- SDHCI_QUIRK_INVERTED_WRITE_PROTECT ;
119
- host -> quirks2 = SDHCI_QUIRK2_SUPPORT_SINGLE |
120
- SDHCI_QUIRK2_TUNING_WORK_AROUND ;
121
-
122
131
priv -> enable_cmd_dat_delay = device_property_read_bool (dev ,
123
132
"fujitsu,cmd-dat-delay-select" );
124
133
125
134
ret = mmc_of_parse (host -> mmc );
126
135
if (ret )
127
136
goto err ;
128
137
129
- platform_set_drvdata (pdev , host );
130
-
131
- host -> hw_name = "f_sdh30" ;
132
- host -> ops = & sdhci_f_sdh30_ops ;
133
- host -> irq = irq ;
134
-
135
- host -> ioaddr = devm_platform_ioremap_resource (pdev , 0 );
136
- if (IS_ERR (host -> ioaddr )) {
137
- ret = PTR_ERR (host -> ioaddr );
138
- goto err ;
139
- }
140
-
141
138
if (dev_of_node (dev )) {
142
139
sdhci_get_of_property (pdev );
143
140
@@ -204,24 +201,21 @@ static int sdhci_f_sdh30_probe(struct platform_device *pdev)
204
201
err_clk :
205
202
clk_disable_unprepare (priv -> clk_iface );
206
203
err :
207
- sdhci_free_host (host );
204
+ sdhci_pltfm_free (pdev );
205
+
208
206
return ret ;
209
207
}
210
208
211
209
static int sdhci_f_sdh30_remove (struct platform_device * pdev )
212
210
{
213
211
struct sdhci_host * host = platform_get_drvdata (pdev );
214
- struct f_sdhost_priv * priv = sdhci_priv (host );
215
-
216
- sdhci_remove_host (host , readl (host -> ioaddr + SDHCI_INT_STATUS ) ==
217
- 0xffffffff );
212
+ struct f_sdhost_priv * priv = sdhci_f_sdhost_priv (host );
218
213
219
214
reset_control_assert (priv -> rst );
220
215
clk_disable_unprepare (priv -> clk );
221
216
clk_disable_unprepare (priv -> clk_iface );
222
217
223
- sdhci_free_host (host );
224
- platform_set_drvdata (pdev , NULL );
218
+ sdhci_pltfm_unregister (pdev );
225
219
226
220
return 0 ;
227
221
}
0 commit comments