84
84
#define DEVICE_TYPE_RC 0x4
85
85
86
86
#define QCOM_PCIE_2_1_0_MAX_SUPPLY 3
87
+ #define QCOM_PCIE_2_1_0_MAX_CLOCKS 5
87
88
struct qcom_pcie_resources_2_1_0 {
88
- struct clk * iface_clk ;
89
- struct clk * core_clk ;
90
- struct clk * phy_clk ;
91
- struct clk * aux_clk ;
92
- struct clk * ref_clk ;
89
+ struct clk_bulk_data clks [QCOM_PCIE_2_1_0_MAX_CLOCKS ];
93
90
struct reset_control * pci_reset ;
94
91
struct reset_control * axi_reset ;
95
92
struct reset_control * ahb_reset ;
@@ -237,25 +234,21 @@ static int qcom_pcie_get_resources_2_1_0(struct qcom_pcie *pcie)
237
234
if (ret )
238
235
return ret ;
239
236
240
- res -> iface_clk = devm_clk_get (dev , "iface" );
241
- if (IS_ERR (res -> iface_clk ))
242
- return PTR_ERR (res -> iface_clk );
243
-
244
- res -> core_clk = devm_clk_get (dev , "core" );
245
- if (IS_ERR (res -> core_clk ))
246
- return PTR_ERR (res -> core_clk );
247
-
248
- res -> phy_clk = devm_clk_get (dev , "phy" );
249
- if (IS_ERR (res -> phy_clk ))
250
- return PTR_ERR (res -> phy_clk );
237
+ res -> clks [0 ].id = "iface" ;
238
+ res -> clks [1 ].id = "core" ;
239
+ res -> clks [2 ].id = "phy" ;
240
+ res -> clks [3 ].id = "aux" ;
241
+ res -> clks [4 ].id = "ref" ;
251
242
252
- res -> aux_clk = devm_clk_get_optional (dev , "aux" );
253
- if (IS_ERR (res -> aux_clk ))
254
- return PTR_ERR (res -> aux_clk );
243
+ /* iface, core, phy are required */
244
+ ret = devm_clk_bulk_get (dev , 3 , res -> clks );
245
+ if (ret < 0 )
246
+ return ret ;
255
247
256
- res -> ref_clk = devm_clk_get_optional (dev , "ref" );
257
- if (IS_ERR (res -> ref_clk ))
258
- return PTR_ERR (res -> ref_clk );
248
+ /* aux, ref are optional */
249
+ ret = devm_clk_bulk_get_optional (dev , 2 , res -> clks + 3 );
250
+ if (ret < 0 )
251
+ return ret ;
259
252
260
253
res -> pci_reset = devm_reset_control_get_exclusive (dev , "pci" );
261
254
if (IS_ERR (res -> pci_reset ))
@@ -285,17 +278,13 @@ static void qcom_pcie_deinit_2_1_0(struct qcom_pcie *pcie)
285
278
{
286
279
struct qcom_pcie_resources_2_1_0 * res = & pcie -> res .v2_1_0 ;
287
280
288
- clk_disable_unprepare ( res -> phy_clk );
281
+ clk_bulk_disable_unprepare ( ARRAY_SIZE ( res -> clks ), res -> clks );
289
282
reset_control_assert (res -> pci_reset );
290
283
reset_control_assert (res -> axi_reset );
291
284
reset_control_assert (res -> ahb_reset );
292
285
reset_control_assert (res -> por_reset );
293
286
reset_control_assert (res -> ext_reset );
294
287
reset_control_assert (res -> phy_reset );
295
- clk_disable_unprepare (res -> iface_clk );
296
- clk_disable_unprepare (res -> core_clk );
297
- clk_disable_unprepare (res -> aux_clk );
298
- clk_disable_unprepare (res -> ref_clk );
299
288
regulator_bulk_disable (ARRAY_SIZE (res -> supplies ), res -> supplies );
300
289
}
301
290
@@ -313,36 +302,6 @@ static int qcom_pcie_init_2_1_0(struct qcom_pcie *pcie)
313
302
return ret ;
314
303
}
315
304
316
- ret = reset_control_assert (res -> ahb_reset );
317
- if (ret ) {
318
- dev_err (dev , "cannot assert ahb reset\n" );
319
- goto err_assert_ahb ;
320
- }
321
-
322
- ret = clk_prepare_enable (res -> iface_clk );
323
- if (ret ) {
324
- dev_err (dev , "cannot prepare/enable iface clock\n" );
325
- goto err_assert_ahb ;
326
- }
327
-
328
- ret = clk_prepare_enable (res -> core_clk );
329
- if (ret ) {
330
- dev_err (dev , "cannot prepare/enable core clock\n" );
331
- goto err_clk_core ;
332
- }
333
-
334
- ret = clk_prepare_enable (res -> aux_clk );
335
- if (ret ) {
336
- dev_err (dev , "cannot prepare/enable aux clock\n" );
337
- goto err_clk_aux ;
338
- }
339
-
340
- ret = clk_prepare_enable (res -> ref_clk );
341
- if (ret ) {
342
- dev_err (dev , "cannot prepare/enable ref clock\n" );
343
- goto err_clk_ref ;
344
- }
345
-
346
305
ret = reset_control_deassert (res -> ahb_reset );
347
306
if (ret ) {
348
307
dev_err (dev , "cannot deassert ahb reset\n" );
@@ -352,48 +311,46 @@ static int qcom_pcie_init_2_1_0(struct qcom_pcie *pcie)
352
311
ret = reset_control_deassert (res -> ext_reset );
353
312
if (ret ) {
354
313
dev_err (dev , "cannot deassert ext reset\n" );
355
- goto err_deassert_ahb ;
314
+ goto err_deassert_ext ;
356
315
}
357
316
358
- /* enable PCIe clocks and resets */
359
- val = readl (pcie -> parf + PCIE20_PARF_PHY_CTRL );
360
- val &= ~BIT (0 );
361
- writel (val , pcie -> parf + PCIE20_PARF_PHY_CTRL );
362
-
363
- /* enable external reference clock */
364
- val = readl (pcie -> parf + PCIE20_PARF_PHY_REFCLK );
365
- val |= BIT (16 );
366
- writel (val , pcie -> parf + PCIE20_PARF_PHY_REFCLK );
367
-
368
317
ret = reset_control_deassert (res -> phy_reset );
369
318
if (ret ) {
370
319
dev_err (dev , "cannot deassert phy reset\n" );
371
- return ret ;
320
+ goto err_deassert_phy ;
372
321
}
373
322
374
323
ret = reset_control_deassert (res -> pci_reset );
375
324
if (ret ) {
376
325
dev_err (dev , "cannot deassert pci reset\n" );
377
- return ret ;
326
+ goto err_deassert_pci ;
378
327
}
379
328
380
329
ret = reset_control_deassert (res -> por_reset );
381
330
if (ret ) {
382
331
dev_err (dev , "cannot deassert por reset\n" );
383
- return ret ;
332
+ goto err_deassert_por ;
384
333
}
385
334
386
335
ret = reset_control_deassert (res -> axi_reset );
387
336
if (ret ) {
388
337
dev_err (dev , "cannot deassert axi reset\n" );
389
- return ret ;
338
+ goto err_deassert_axi ;
390
339
}
391
340
392
- ret = clk_prepare_enable (res -> phy_clk );
393
- if (ret ) {
394
- dev_err (dev , "cannot prepare/enable phy clock\n" );
395
- goto err_deassert_ahb ;
396
- }
341
+ ret = clk_bulk_prepare_enable (ARRAY_SIZE (res -> clks ), res -> clks );
342
+ if (ret )
343
+ goto err_clks ;
344
+
345
+ /* enable PCIe clocks and resets */
346
+ val = readl (pcie -> parf + PCIE20_PARF_PHY_CTRL );
347
+ val &= ~BIT (0 );
348
+ writel (val , pcie -> parf + PCIE20_PARF_PHY_CTRL );
349
+
350
+ /* enable external reference clock */
351
+ val = readl (pcie -> parf + PCIE20_PARF_PHY_REFCLK );
352
+ val |= BIT (16 );
353
+ writel (val , pcie -> parf + PCIE20_PARF_PHY_REFCLK );
397
354
398
355
/* wait for clock acquisition */
399
356
usleep_range (1000 , 1500 );
@@ -407,15 +364,19 @@ static int qcom_pcie_init_2_1_0(struct qcom_pcie *pcie)
407
364
408
365
return 0 ;
409
366
367
+ err_clks :
368
+ reset_control_assert (res -> axi_reset );
369
+ err_deassert_axi :
370
+ reset_control_assert (res -> por_reset );
371
+ err_deassert_por :
372
+ reset_control_assert (res -> pci_reset );
373
+ err_deassert_pci :
374
+ reset_control_assert (res -> phy_reset );
375
+ err_deassert_phy :
376
+ reset_control_assert (res -> ext_reset );
377
+ err_deassert_ext :
378
+ reset_control_assert (res -> ahb_reset );
410
379
err_deassert_ahb :
411
- clk_disable_unprepare (res -> ref_clk );
412
- err_clk_ref :
413
- clk_disable_unprepare (res -> aux_clk );
414
- err_clk_aux :
415
- clk_disable_unprepare (res -> core_clk );
416
- err_clk_core :
417
- clk_disable_unprepare (res -> iface_clk );
418
- err_assert_ahb :
419
380
regulator_bulk_disable (ARRAY_SIZE (res -> supplies ), res -> supplies );
420
381
421
382
return ret ;
0 commit comments