@@ -127,10 +127,9 @@ struct sdhci_msm_host {
127
127
struct platform_device * pdev ;
128
128
void __iomem * core_mem ; /* MSM SDCC mapped address */
129
129
int pwr_irq ; /* power irq */
130
- struct clk * clk ; /* main SD/MMC bus clock */
131
- struct clk * pclk ; /* SDHC peripheral bus clock */
132
130
struct clk * bus_clk ; /* SDHC bus voter clock */
133
131
struct clk * xo_clk ; /* TCXO clk needed for FLL feature of cm_dll*/
132
+ struct clk_bulk_data bulk_clks [2 ]; /* core, iface clocks */
134
133
unsigned long clk_rate ;
135
134
struct mmc_host * mmc ;
136
135
bool use_14lpp_dll_reset ;
@@ -164,10 +163,11 @@ static void msm_set_clock_rate_for_bus_mode(struct sdhci_host *host,
164
163
struct sdhci_pltfm_host * pltfm_host = sdhci_priv (host );
165
164
struct sdhci_msm_host * msm_host = sdhci_pltfm_priv (pltfm_host );
166
165
struct mmc_ios curr_ios = host -> mmc -> ios ;
166
+ struct clk * core_clk = msm_host -> bulk_clks [0 ].clk ;
167
167
int rc ;
168
168
169
169
clock = msm_get_clock_rate_for_bus_mode (host , clock );
170
- rc = clk_set_rate (msm_host -> clk , clock );
170
+ rc = clk_set_rate (core_clk , clock );
171
171
if (rc ) {
172
172
pr_err ("%s: Failed to set clock at rate %u at timing %d\n" ,
173
173
mmc_hostname (host -> mmc ), clock ,
@@ -176,7 +176,7 @@ static void msm_set_clock_rate_for_bus_mode(struct sdhci_host *host,
176
176
}
177
177
msm_host -> clk_rate = clock ;
178
178
pr_debug ("%s: Setting clock at rate %lu at timing %d\n" ,
179
- mmc_hostname (host -> mmc ), clk_get_rate (msm_host -> clk ),
179
+ mmc_hostname (host -> mmc ), clk_get_rate (core_clk ),
180
180
curr_ios .timing );
181
181
}
182
182
@@ -1032,8 +1032,9 @@ static unsigned int sdhci_msm_get_max_clock(struct sdhci_host *host)
1032
1032
{
1033
1033
struct sdhci_pltfm_host * pltfm_host = sdhci_priv (host );
1034
1034
struct sdhci_msm_host * msm_host = sdhci_pltfm_priv (pltfm_host );
1035
+ struct clk * core_clk = msm_host -> bulk_clks [0 ].clk ;
1035
1036
1036
- return clk_round_rate (msm_host -> clk , ULONG_MAX );
1037
+ return clk_round_rate (core_clk , ULONG_MAX );
1037
1038
}
1038
1039
1039
1040
static unsigned int sdhci_msm_get_min_clock (struct sdhci_host * host )
@@ -1124,6 +1125,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)
1124
1125
struct sdhci_pltfm_host * pltfm_host ;
1125
1126
struct sdhci_msm_host * msm_host ;
1126
1127
struct resource * core_memres ;
1128
+ struct clk * clk ;
1127
1129
int ret ;
1128
1130
u16 host_version , core_minor ;
1129
1131
u32 core_version , config ;
@@ -1160,24 +1162,32 @@ static int sdhci_msm_probe(struct platform_device *pdev)
1160
1162
}
1161
1163
1162
1164
/* Setup main peripheral bus clock */
1163
- msm_host -> pclk = devm_clk_get (& pdev -> dev , "iface" );
1164
- if (IS_ERR (msm_host -> pclk )) {
1165
- ret = PTR_ERR (msm_host -> pclk );
1165
+ clk = devm_clk_get (& pdev -> dev , "iface" );
1166
+ if (IS_ERR (clk )) {
1167
+ ret = PTR_ERR (clk );
1166
1168
dev_err (& pdev -> dev , "Peripheral clk setup failed (%d)\n" , ret );
1167
1169
goto bus_clk_disable ;
1168
1170
}
1169
-
1170
- ret = clk_prepare_enable (msm_host -> pclk );
1171
- if (ret )
1172
- goto bus_clk_disable ;
1171
+ msm_host -> bulk_clks [1 ].clk = clk ;
1173
1172
1174
1173
/* Setup SDC MMC clock */
1175
- msm_host -> clk = devm_clk_get (& pdev -> dev , "core" );
1176
- if (IS_ERR (msm_host -> clk )) {
1177
- ret = PTR_ERR (msm_host -> clk );
1174
+ clk = devm_clk_get (& pdev -> dev , "core" );
1175
+ if (IS_ERR (clk )) {
1176
+ ret = PTR_ERR (clk );
1178
1177
dev_err (& pdev -> dev , "SDC MMC clk setup failed (%d)\n" , ret );
1179
- goto pclk_disable ;
1178
+ goto bus_clk_disable ;
1180
1179
}
1180
+ msm_host -> bulk_clks [0 ].clk = clk ;
1181
+
1182
+ /* Vote for maximum clock rate for maximum performance */
1183
+ ret = clk_set_rate (clk , INT_MAX );
1184
+ if (ret )
1185
+ dev_warn (& pdev -> dev , "core clock boost failed\n" );
1186
+
1187
+ ret = clk_bulk_prepare_enable (ARRAY_SIZE (msm_host -> bulk_clks ),
1188
+ msm_host -> bulk_clks );
1189
+ if (ret )
1190
+ goto bus_clk_disable ;
1181
1191
1182
1192
/*
1183
1193
* xo clock is needed for FLL feature of cm_dll.
@@ -1189,15 +1199,6 @@ static int sdhci_msm_probe(struct platform_device *pdev)
1189
1199
dev_warn (& pdev -> dev , "TCXO clk not present (%d)\n" , ret );
1190
1200
}
1191
1201
1192
- /* Vote for maximum clock rate for maximum performance */
1193
- ret = clk_set_rate (msm_host -> clk , INT_MAX );
1194
- if (ret )
1195
- dev_warn (& pdev -> dev , "core clock boost failed\n" );
1196
-
1197
- ret = clk_prepare_enable (msm_host -> clk );
1198
- if (ret )
1199
- goto pclk_disable ;
1200
-
1201
1202
core_memres = platform_get_resource (pdev , IORESOURCE_MEM , 1 );
1202
1203
msm_host -> core_mem = devm_ioremap_resource (& pdev -> dev , core_memres );
1203
1204
@@ -1290,9 +1291,8 @@ static int sdhci_msm_probe(struct platform_device *pdev)
1290
1291
pm_runtime_set_suspended (& pdev -> dev );
1291
1292
pm_runtime_put_noidle (& pdev -> dev );
1292
1293
clk_disable :
1293
- clk_disable_unprepare (msm_host -> clk );
1294
- pclk_disable :
1295
- clk_disable_unprepare (msm_host -> pclk );
1294
+ clk_bulk_disable_unprepare (ARRAY_SIZE (msm_host -> bulk_clks ),
1295
+ msm_host -> bulk_clks );
1296
1296
bus_clk_disable :
1297
1297
if (!IS_ERR (msm_host -> bus_clk ))
1298
1298
clk_disable_unprepare (msm_host -> bus_clk );
@@ -1315,8 +1315,8 @@ static int sdhci_msm_remove(struct platform_device *pdev)
1315
1315
pm_runtime_disable (& pdev -> dev );
1316
1316
pm_runtime_put_noidle (& pdev -> dev );
1317
1317
1318
- clk_disable_unprepare ( msm_host -> clk );
1319
- clk_disable_unprepare ( msm_host -> pclk );
1318
+ clk_bulk_disable_unprepare ( ARRAY_SIZE ( msm_host -> bulk_clks ),
1319
+ msm_host -> bulk_clks );
1320
1320
if (!IS_ERR (msm_host -> bus_clk ))
1321
1321
clk_disable_unprepare (msm_host -> bus_clk );
1322
1322
sdhci_pltfm_free (pdev );
@@ -1330,8 +1330,8 @@ static int sdhci_msm_runtime_suspend(struct device *dev)
1330
1330
struct sdhci_pltfm_host * pltfm_host = sdhci_priv (host );
1331
1331
struct sdhci_msm_host * msm_host = sdhci_pltfm_priv (pltfm_host );
1332
1332
1333
- clk_disable_unprepare ( msm_host -> clk );
1334
- clk_disable_unprepare ( msm_host -> pclk );
1333
+ clk_bulk_disable_unprepare ( ARRAY_SIZE ( msm_host -> bulk_clks ),
1334
+ msm_host -> bulk_clks );
1335
1335
1336
1336
return 0 ;
1337
1337
}
@@ -1341,21 +1341,9 @@ static int sdhci_msm_runtime_resume(struct device *dev)
1341
1341
struct sdhci_host * host = dev_get_drvdata (dev );
1342
1342
struct sdhci_pltfm_host * pltfm_host = sdhci_priv (host );
1343
1343
struct sdhci_msm_host * msm_host = sdhci_pltfm_priv (pltfm_host );
1344
- int ret ;
1345
1344
1346
- ret = clk_prepare_enable (msm_host -> clk );
1347
- if (ret ) {
1348
- dev_err (dev , "clk_enable failed for core_clk: %d\n" , ret );
1349
- return ret ;
1350
- }
1351
- ret = clk_prepare_enable (msm_host -> pclk );
1352
- if (ret ) {
1353
- dev_err (dev , "clk_enable failed for iface_clk: %d\n" , ret );
1354
- clk_disable_unprepare (msm_host -> clk );
1355
- return ret ;
1356
- }
1357
-
1358
- return 0 ;
1345
+ return clk_bulk_prepare_enable (ARRAY_SIZE (msm_host -> bulk_clks ),
1346
+ msm_host -> bulk_clks );
1359
1347
}
1360
1348
#endif
1361
1349
0 commit comments