41
41
#define IMX8MQ_GPR_PCIE_CLK_REQ_OVERRIDE BIT(11)
42
42
#define IMX8MQ_GPR_PCIE_VREG_BYPASS BIT(12)
43
43
#define IMX8MQ_GPR12_PCIE2_CTRL_DEVICE_TYPE GENMASK(11, 8)
44
- #define IMX8MQ_PCIE2_BASE_ADDR 0x33c00000
45
44
46
45
#define IMX95_PCIE_PHY_GEN_CTRL 0x0
47
46
#define IMX95_PCIE_REF_USE_PAD BIT(17)
@@ -109,7 +108,6 @@ enum imx_pcie_variants {
109
108
110
109
#define imx_check_flag (pci , val ) (pci->drvdata->flags & val)
111
110
112
- #define IMX_PCIE_MAX_CLKS 6
113
111
#define IMX_PCIE_MAX_INSTANCES 2
114
112
115
113
struct imx_pcie ;
@@ -120,9 +118,6 @@ struct imx_pcie_drvdata {
120
118
u32 flags ;
121
119
int dbi_length ;
122
120
const char * gpr ;
123
- const char * const * clk_names ;
124
- const u32 clks_cnt ;
125
- const u32 clks_optional_cnt ;
126
121
const u32 ltssm_off ;
127
122
const u32 ltssm_mask ;
128
123
const u32 mode_off [IMX_PCIE_MAX_INSTANCES ];
@@ -137,7 +132,8 @@ struct imx_pcie_drvdata {
137
132
struct imx_pcie {
138
133
struct dw_pcie * pci ;
139
134
struct gpio_desc * reset_gpiod ;
140
- struct clk_bulk_data clks [IMX_PCIE_MAX_CLKS ];
135
+ struct clk_bulk_data * clks ;
136
+ int num_clks ;
141
137
struct regmap * iomuxc_gpr ;
142
138
u16 msi_ctrl ;
143
139
u32 controller_id ;
@@ -470,13 +466,14 @@ static int imx_setup_phy_mpll(struct imx_pcie *imx_pcie)
470
466
int mult , div ;
471
467
u16 val ;
472
468
int i ;
469
+ struct clk_bulk_data * clks = imx_pcie -> clks ;
473
470
474
471
if (!(imx_pcie -> drvdata -> flags & IMX_PCIE_FLAG_IMX_PHY ))
475
472
return 0 ;
476
473
477
- for (i = 0 ; i < imx_pcie -> drvdata -> clks_cnt ; i ++ )
478
- if (strncmp (imx_pcie -> clks [i ].id , "pcie_phy" , 8 ) == 0 )
479
- phy_rate = clk_get_rate (imx_pcie -> clks [i ].clk );
474
+ for (i = 0 ; i < imx_pcie -> num_clks ; i ++ )
475
+ if (strncmp (clks [i ].id , "pcie_phy" , 8 ) == 0 )
476
+ phy_rate = clk_get_rate (clks [i ].clk );
480
477
481
478
switch (phy_rate ) {
482
479
case 125000000 :
@@ -668,7 +665,7 @@ static int imx_pcie_clk_enable(struct imx_pcie *imx_pcie)
668
665
struct device * dev = pci -> dev ;
669
666
int ret ;
670
667
671
- ret = clk_bulk_prepare_enable (imx_pcie -> drvdata -> clks_cnt , imx_pcie -> clks );
668
+ ret = clk_bulk_prepare_enable (imx_pcie -> num_clks , imx_pcie -> clks );
672
669
if (ret )
673
670
return ret ;
674
671
@@ -685,7 +682,7 @@ static int imx_pcie_clk_enable(struct imx_pcie *imx_pcie)
685
682
return 0 ;
686
683
687
684
err_ref_clk :
688
- clk_bulk_disable_unprepare (imx_pcie -> drvdata -> clks_cnt , imx_pcie -> clks );
685
+ clk_bulk_disable_unprepare (imx_pcie -> num_clks , imx_pcie -> clks );
689
686
690
687
return ret ;
691
688
}
@@ -694,7 +691,7 @@ static void imx_pcie_clk_disable(struct imx_pcie *imx_pcie)
694
691
{
695
692
if (imx_pcie -> drvdata -> enable_ref_clk )
696
693
imx_pcie -> drvdata -> enable_ref_clk (imx_pcie , false);
697
- clk_bulk_disable_unprepare (imx_pcie -> drvdata -> clks_cnt , imx_pcie -> clks );
694
+ clk_bulk_disable_unprepare (imx_pcie -> num_clks , imx_pcie -> clks );
698
695
}
699
696
700
697
static int imx6sx_pcie_core_reset (struct imx_pcie * imx_pcie , bool assert )
@@ -1474,9 +1471,8 @@ static int imx_pcie_probe(struct platform_device *pdev)
1474
1471
struct dw_pcie * pci ;
1475
1472
struct imx_pcie * imx_pcie ;
1476
1473
struct device_node * np ;
1477
- struct resource * dbi_base ;
1478
1474
struct device_node * node = dev -> of_node ;
1479
- int i , ret , req_cnt ;
1475
+ int ret , domain ;
1480
1476
u16 val ;
1481
1477
1482
1478
imx_pcie = devm_kzalloc (dev , sizeof (* imx_pcie ), GFP_KERNEL );
@@ -1515,31 +1511,18 @@ static int imx_pcie_probe(struct platform_device *pdev)
1515
1511
return PTR_ERR (imx_pcie -> phy_base );
1516
1512
}
1517
1513
1518
- pci -> dbi_base = devm_platform_get_and_ioremap_resource (pdev , 0 , & dbi_base );
1519
- if (IS_ERR (pci -> dbi_base ))
1520
- return PTR_ERR (pci -> dbi_base );
1521
-
1522
1514
/* Fetch GPIOs */
1523
1515
imx_pcie -> reset_gpiod = devm_gpiod_get_optional (dev , "reset" , GPIOD_OUT_HIGH );
1524
1516
if (IS_ERR (imx_pcie -> reset_gpiod ))
1525
1517
return dev_err_probe (dev , PTR_ERR (imx_pcie -> reset_gpiod ),
1526
1518
"unable to get reset gpio\n" );
1527
1519
gpiod_set_consumer_name (imx_pcie -> reset_gpiod , "PCIe reset" );
1528
1520
1529
- if (imx_pcie -> drvdata -> clks_cnt >= IMX_PCIE_MAX_CLKS )
1530
- return dev_err_probe (dev , - ENOMEM , "clks_cnt is too big\n" );
1531
-
1532
- for (i = 0 ; i < imx_pcie -> drvdata -> clks_cnt ; i ++ )
1533
- imx_pcie -> clks [i ].id = imx_pcie -> drvdata -> clk_names [i ];
1534
-
1535
1521
/* Fetch clocks */
1536
- req_cnt = imx_pcie -> drvdata -> clks_cnt - imx_pcie -> drvdata -> clks_optional_cnt ;
1537
- ret = devm_clk_bulk_get (dev , req_cnt , imx_pcie -> clks );
1538
- if (ret )
1539
- return ret ;
1540
- imx_pcie -> clks [req_cnt ].clk = devm_clk_get_optional (dev , "ref" );
1541
- if (IS_ERR (imx_pcie -> clks [req_cnt ].clk ))
1542
- return PTR_ERR (imx_pcie -> clks [req_cnt ].clk );
1522
+ imx_pcie -> num_clks = devm_clk_bulk_get_all (dev , & imx_pcie -> clks );
1523
+ if (imx_pcie -> num_clks < 0 )
1524
+ return dev_err_probe (dev , imx_pcie -> num_clks ,
1525
+ "failed to get clocks\n" );
1543
1526
1544
1527
if (imx_check_flag (imx_pcie , IMX_PCIE_FLAG_HAS_PHYDRV )) {
1545
1528
imx_pcie -> phy = devm_phy_get (dev , "pcie-phy" );
@@ -1565,8 +1548,11 @@ static int imx_pcie_probe(struct platform_device *pdev)
1565
1548
switch (imx_pcie -> drvdata -> variant ) {
1566
1549
case IMX8MQ :
1567
1550
case IMX8MQ_EP :
1568
- if (dbi_base -> start == IMX8MQ_PCIE2_BASE_ADDR )
1569
- imx_pcie -> controller_id = 1 ;
1551
+ domain = of_get_pci_domain_nr (node );
1552
+ if (domain < 0 || domain > 1 )
1553
+ return dev_err_probe (dev , - ENODEV , "no \"linux,pci-domain\" property in devicetree\n" );
1554
+
1555
+ imx_pcie -> controller_id = domain ;
1570
1556
break ;
1571
1557
default :
1572
1558
break ;
@@ -1675,13 +1661,6 @@ static void imx_pcie_shutdown(struct platform_device *pdev)
1675
1661
imx_pcie_assert_core_reset (imx_pcie );
1676
1662
}
1677
1663
1678
- static const char * const imx6q_clks [] = {"pcie_bus" , "pcie" , "pcie_phy" };
1679
- static const char * const imx8mm_clks [] = {"pcie_bus" , "pcie" , "pcie_aux" };
1680
- static const char * const imx8mq_clks [] = {"pcie_bus" , "pcie" , "pcie_phy" , "pcie_aux" };
1681
- static const char * const imx6sx_clks [] = {"pcie_bus" , "pcie" , "pcie_phy" , "pcie_inbound_axi" };
1682
- static const char * const imx8q_clks [] = {"mstr" , "slv" , "dbi" };
1683
- static const char * const imx95_clks [] = {"pcie_bus" , "pcie" , "pcie_phy" , "pcie_aux" , "ref" };
1684
-
1685
1664
static const struct imx_pcie_drvdata drvdata [] = {
1686
1665
[IMX6Q ] = {
1687
1666
.variant = IMX6Q ,
@@ -1691,8 +1670,6 @@ static const struct imx_pcie_drvdata drvdata[] = {
1691
1670
IMX_PCIE_FLAG_SUPPORTS_SUSPEND ,
1692
1671
.dbi_length = 0x200 ,
1693
1672
.gpr = "fsl,imx6q-iomuxc-gpr" ,
1694
- .clk_names = imx6q_clks ,
1695
- .clks_cnt = ARRAY_SIZE (imx6q_clks ),
1696
1673
.ltssm_off = IOMUXC_GPR12 ,
1697
1674
.ltssm_mask = IMX6Q_GPR12_PCIE_CTL_2 ,
1698
1675
.mode_off [0 ] = IOMUXC_GPR12 ,
@@ -1707,8 +1684,6 @@ static const struct imx_pcie_drvdata drvdata[] = {
1707
1684
IMX_PCIE_FLAG_IMX_SPEED_CHANGE |
1708
1685
IMX_PCIE_FLAG_SUPPORTS_SUSPEND ,
1709
1686
.gpr = "fsl,imx6q-iomuxc-gpr" ,
1710
- .clk_names = imx6sx_clks ,
1711
- .clks_cnt = ARRAY_SIZE (imx6sx_clks ),
1712
1687
.ltssm_off = IOMUXC_GPR12 ,
1713
1688
.ltssm_mask = IMX6Q_GPR12_PCIE_CTL_2 ,
1714
1689
.mode_off [0 ] = IOMUXC_GPR12 ,
@@ -1725,8 +1700,6 @@ static const struct imx_pcie_drvdata drvdata[] = {
1725
1700
IMX_PCIE_FLAG_SUPPORTS_SUSPEND ,
1726
1701
.dbi_length = 0x200 ,
1727
1702
.gpr = "fsl,imx6q-iomuxc-gpr" ,
1728
- .clk_names = imx6q_clks ,
1729
- .clks_cnt = ARRAY_SIZE (imx6q_clks ),
1730
1703
.ltssm_off = IOMUXC_GPR12 ,
1731
1704
.ltssm_mask = IMX6Q_GPR12_PCIE_CTL_2 ,
1732
1705
.mode_off [0 ] = IOMUXC_GPR12 ,
@@ -1742,8 +1715,6 @@ static const struct imx_pcie_drvdata drvdata[] = {
1742
1715
IMX_PCIE_FLAG_HAS_APP_RESET |
1743
1716
IMX_PCIE_FLAG_HAS_PHY_RESET ,
1744
1717
.gpr = "fsl,imx7d-iomuxc-gpr" ,
1745
- .clk_names = imx6q_clks ,
1746
- .clks_cnt = ARRAY_SIZE (imx6q_clks ),
1747
1718
.mode_off [0 ] = IOMUXC_GPR12 ,
1748
1719
.mode_mask [0 ] = IMX6Q_GPR12_DEVICE_TYPE ,
1749
1720
.enable_ref_clk = imx7d_pcie_enable_ref_clk ,
@@ -1755,8 +1726,6 @@ static const struct imx_pcie_drvdata drvdata[] = {
1755
1726
IMX_PCIE_FLAG_HAS_PHY_RESET |
1756
1727
IMX_PCIE_FLAG_SUPPORTS_SUSPEND ,
1757
1728
.gpr = "fsl,imx8mq-iomuxc-gpr" ,
1758
- .clk_names = imx8mq_clks ,
1759
- .clks_cnt = ARRAY_SIZE (imx8mq_clks ),
1760
1729
.mode_off [0 ] = IOMUXC_GPR12 ,
1761
1730
.mode_mask [0 ] = IMX6Q_GPR12_DEVICE_TYPE ,
1762
1731
.mode_off [1 ] = IOMUXC_GPR12 ,
@@ -1770,8 +1739,6 @@ static const struct imx_pcie_drvdata drvdata[] = {
1770
1739
IMX_PCIE_FLAG_HAS_PHYDRV |
1771
1740
IMX_PCIE_FLAG_HAS_APP_RESET ,
1772
1741
.gpr = "fsl,imx8mm-iomuxc-gpr" ,
1773
- .clk_names = imx8mm_clks ,
1774
- .clks_cnt = ARRAY_SIZE (imx8mm_clks ),
1775
1742
.mode_off [0 ] = IOMUXC_GPR12 ,
1776
1743
.mode_mask [0 ] = IMX6Q_GPR12_DEVICE_TYPE ,
1777
1744
.enable_ref_clk = imx8mm_pcie_enable_ref_clk ,
@@ -1782,8 +1749,6 @@ static const struct imx_pcie_drvdata drvdata[] = {
1782
1749
IMX_PCIE_FLAG_HAS_PHYDRV |
1783
1750
IMX_PCIE_FLAG_HAS_APP_RESET ,
1784
1751
.gpr = "fsl,imx8mp-iomuxc-gpr" ,
1785
- .clk_names = imx8mm_clks ,
1786
- .clks_cnt = ARRAY_SIZE (imx8mm_clks ),
1787
1752
.mode_off [0 ] = IOMUXC_GPR12 ,
1788
1753
.mode_mask [0 ] = IMX6Q_GPR12_DEVICE_TYPE ,
1789
1754
.enable_ref_clk = imx8mm_pcie_enable_ref_clk ,
@@ -1793,17 +1758,12 @@ static const struct imx_pcie_drvdata drvdata[] = {
1793
1758
.flags = IMX_PCIE_FLAG_HAS_PHYDRV |
1794
1759
IMX_PCIE_FLAG_CPU_ADDR_FIXUP |
1795
1760
IMX_PCIE_FLAG_SUPPORTS_SUSPEND ,
1796
- .clk_names = imx8q_clks ,
1797
- .clks_cnt = ARRAY_SIZE (imx8q_clks ),
1798
1761
},
1799
1762
[IMX95 ] = {
1800
1763
.variant = IMX95 ,
1801
1764
.flags = IMX_PCIE_FLAG_HAS_SERDES |
1802
1765
IMX_PCIE_FLAG_HAS_LUT |
1803
1766
IMX_PCIE_FLAG_SUPPORTS_SUSPEND ,
1804
- .clk_names = imx95_clks ,
1805
- .clks_cnt = ARRAY_SIZE (imx95_clks ),
1806
- .clks_optional_cnt = 1 ,
1807
1767
.ltssm_off = IMX95_PE0_GEN_CTRL_3 ,
1808
1768
.ltssm_mask = IMX95_PCIE_LTSSM_EN ,
1809
1769
.mode_off [0 ] = IMX95_PE0_GEN_CTRL_1 ,
@@ -1816,8 +1776,6 @@ static const struct imx_pcie_drvdata drvdata[] = {
1816
1776
IMX_PCIE_FLAG_HAS_PHY_RESET ,
1817
1777
.mode = DW_PCIE_EP_TYPE ,
1818
1778
.gpr = "fsl,imx8mq-iomuxc-gpr" ,
1819
- .clk_names = imx8mq_clks ,
1820
- .clks_cnt = ARRAY_SIZE (imx8mq_clks ),
1821
1779
.mode_off [0 ] = IOMUXC_GPR12 ,
1822
1780
.mode_mask [0 ] = IMX6Q_GPR12_DEVICE_TYPE ,
1823
1781
.mode_off [1 ] = IOMUXC_GPR12 ,
@@ -1832,8 +1790,6 @@ static const struct imx_pcie_drvdata drvdata[] = {
1832
1790
IMX_PCIE_FLAG_HAS_PHYDRV ,
1833
1791
.mode = DW_PCIE_EP_TYPE ,
1834
1792
.gpr = "fsl,imx8mm-iomuxc-gpr" ,
1835
- .clk_names = imx8mm_clks ,
1836
- .clks_cnt = ARRAY_SIZE (imx8mm_clks ),
1837
1793
.mode_off [0 ] = IOMUXC_GPR12 ,
1838
1794
.mode_mask [0 ] = IMX6Q_GPR12_DEVICE_TYPE ,
1839
1795
.epc_features = & imx8m_pcie_epc_features ,
@@ -1845,8 +1801,6 @@ static const struct imx_pcie_drvdata drvdata[] = {
1845
1801
IMX_PCIE_FLAG_HAS_PHYDRV ,
1846
1802
.mode = DW_PCIE_EP_TYPE ,
1847
1803
.gpr = "fsl,imx8mp-iomuxc-gpr" ,
1848
- .clk_names = imx8mm_clks ,
1849
- .clks_cnt = ARRAY_SIZE (imx8mm_clks ),
1850
1804
.mode_off [0 ] = IOMUXC_GPR12 ,
1851
1805
.mode_mask [0 ] = IMX6Q_GPR12_DEVICE_TYPE ,
1852
1806
.epc_features = & imx8m_pcie_epc_features ,
@@ -1857,15 +1811,11 @@ static const struct imx_pcie_drvdata drvdata[] = {
1857
1811
.flags = IMX_PCIE_FLAG_HAS_PHYDRV ,
1858
1812
.mode = DW_PCIE_EP_TYPE ,
1859
1813
.epc_features = & imx8q_pcie_epc_features ,
1860
- .clk_names = imx8q_clks ,
1861
- .clks_cnt = ARRAY_SIZE (imx8q_clks ),
1862
1814
},
1863
1815
[IMX95_EP ] = {
1864
1816
.variant = IMX95_EP ,
1865
1817
.flags = IMX_PCIE_FLAG_HAS_SERDES |
1866
1818
IMX_PCIE_FLAG_SUPPORT_64BIT ,
1867
- .clk_names = imx8mq_clks ,
1868
- .clks_cnt = ARRAY_SIZE (imx8mq_clks ),
1869
1819
.ltssm_off = IMX95_PE0_GEN_CTRL_3 ,
1870
1820
.ltssm_mask = IMX95_PCIE_LTSSM_EN ,
1871
1821
.mode_off [0 ] = IMX95_PE0_GEN_CTRL_1 ,
0 commit comments