49
49
#define PCIE_LTSSM_STATUS_MASK GENMASK(5, 0)
50
50
51
51
struct rockchip_pcie {
52
- struct dw_pcie pci ;
53
- void __iomem * apb_base ;
54
- struct phy * phy ;
55
- struct clk_bulk_data * clks ;
56
- unsigned int clk_cnt ;
57
- struct reset_control * rst ;
58
- struct gpio_desc * rst_gpio ;
59
- struct regulator * vpcie3v3 ;
60
- struct irq_domain * irq_domain ;
52
+ struct dw_pcie pci ;
53
+ void __iomem * apb_base ;
54
+ struct phy * phy ;
55
+ struct clk_bulk_data * clks ;
56
+ unsigned int clk_cnt ;
57
+ struct reset_control * rst ;
58
+ struct gpio_desc * rst_gpio ;
59
+ struct regulator * vpcie3v3 ;
60
+ struct irq_domain * irq_domain ;
61
+ const struct rockchip_pcie_of_data * data ;
62
+ };
63
+
64
+ struct rockchip_pcie_of_data {
65
+ enum dw_pcie_device_mode mode ;
61
66
};
62
67
63
68
static int rockchip_pcie_readl_apb (struct rockchip_pcie * rockchip , u32 reg )
@@ -195,7 +200,6 @@ static int rockchip_pcie_host_init(struct dw_pcie_rp *pp)
195
200
struct dw_pcie * pci = to_dw_pcie_from_pp (pp );
196
201
struct rockchip_pcie * rockchip = to_rockchip_pcie (pci );
197
202
struct device * dev = rockchip -> pci .dev ;
198
- u32 val = HIWORD_UPDATE_BIT (PCIE_LTSSM_ENABLE_ENHANCE );
199
203
int irq , ret ;
200
204
201
205
irq = of_irq_get_byname (dev -> of_node , "legacy" );
@@ -209,12 +213,6 @@ static int rockchip_pcie_host_init(struct dw_pcie_rp *pp)
209
213
irq_set_chained_handler_and_data (irq , rockchip_pcie_intx_handler ,
210
214
rockchip );
211
215
212
- /* LTSSM enable control mode */
213
- rockchip_pcie_writel_apb (rockchip , val , PCIE_CLIENT_HOT_RESET_CTRL );
214
-
215
- rockchip_pcie_writel_apb (rockchip , PCIE_CLIENT_RC_MODE ,
216
- PCIE_CLIENT_GENERAL_CONTROL );
217
-
218
216
return 0 ;
219
217
}
220
218
@@ -294,13 +292,35 @@ static const struct dw_pcie_ops dw_pcie_ops = {
294
292
.start_link = rockchip_pcie_start_link ,
295
293
};
296
294
295
+ static int rockchip_pcie_configure_rc (struct rockchip_pcie * rockchip )
296
+ {
297
+ struct dw_pcie_rp * pp ;
298
+ u32 val ;
299
+
300
+ /* LTSSM enable control mode */
301
+ val = HIWORD_UPDATE_BIT (PCIE_LTSSM_ENABLE_ENHANCE );
302
+ rockchip_pcie_writel_apb (rockchip , val , PCIE_CLIENT_HOT_RESET_CTRL );
303
+
304
+ rockchip_pcie_writel_apb (rockchip , PCIE_CLIENT_RC_MODE ,
305
+ PCIE_CLIENT_GENERAL_CONTROL );
306
+
307
+ pp = & rockchip -> pci .pp ;
308
+ pp -> ops = & rockchip_pcie_host_ops ;
309
+
310
+ return dw_pcie_host_init (pp );
311
+ }
312
+
297
313
static int rockchip_pcie_probe (struct platform_device * pdev )
298
314
{
299
315
struct device * dev = & pdev -> dev ;
300
316
struct rockchip_pcie * rockchip ;
301
- struct dw_pcie_rp * pp ;
317
+ const struct rockchip_pcie_of_data * data ;
302
318
int ret ;
303
319
320
+ data = of_device_get_match_data (dev );
321
+ if (!data )
322
+ return - EINVAL ;
323
+
304
324
rockchip = devm_kzalloc (dev , sizeof (* rockchip ), GFP_KERNEL );
305
325
if (!rockchip )
306
326
return - ENOMEM ;
@@ -309,9 +329,7 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
309
329
310
330
rockchip -> pci .dev = dev ;
311
331
rockchip -> pci .ops = & dw_pcie_ops ;
312
-
313
- pp = & rockchip -> pci .pp ;
314
- pp -> ops = & rockchip_pcie_host_ops ;
332
+ rockchip -> data = data ;
315
333
316
334
ret = rockchip_pcie_resource_get (pdev , rockchip );
317
335
if (ret )
@@ -347,10 +365,21 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
347
365
if (ret )
348
366
goto deinit_phy ;
349
367
350
- ret = dw_pcie_host_init (pp );
351
- if (!ret )
352
- return 0 ;
368
+ switch (data -> mode ) {
369
+ case DW_PCIE_RC_TYPE :
370
+ ret = rockchip_pcie_configure_rc (rockchip );
371
+ if (ret )
372
+ goto deinit_clk ;
373
+ break ;
374
+ default :
375
+ dev_err (dev , "INVALID device type %d\n" , data -> mode );
376
+ ret = - EINVAL ;
377
+ goto deinit_clk ;
378
+ }
379
+
380
+ return 0 ;
353
381
382
+ deinit_clk :
354
383
clk_bulk_disable_unprepare (rockchip -> clk_cnt , rockchip -> clks );
355
384
deinit_phy :
356
385
rockchip_pcie_phy_deinit (rockchip );
@@ -361,8 +390,15 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
361
390
return ret ;
362
391
}
363
392
393
+ static const struct rockchip_pcie_of_data rockchip_pcie_rc_of_data_rk3568 = {
394
+ .mode = DW_PCIE_RC_TYPE ,
395
+ };
396
+
364
397
static const struct of_device_id rockchip_pcie_of_match [] = {
365
- { .compatible = "rockchip,rk3568-pcie" , },
398
+ {
399
+ .compatible = "rockchip,rk3568-pcie" ,
400
+ .data = & rockchip_pcie_rc_of_data_rk3568 ,
401
+ },
366
402
{},
367
403
};
368
404
0 commit comments