1717#include <linux/slab.h>
1818#include <linux/list.h>
1919#include <linux/of.h>
20+ #include <linux/of_device.h>
2021
2122#include <soc/rockchip/rk3399_grf.h>
2223
@@ -55,27 +56,21 @@ struct rockchip_dfi {
5556 void __iomem * regs ;
5657 struct regmap * regmap_pmu ;
5758 struct clk * clk ;
59+ u32 ddr_type ;
5860};
5961
6062static void rockchip_dfi_start_hardware_counter (struct devfreq_event_dev * edev )
6163{
6264 struct rockchip_dfi * dfi = devfreq_event_get_drvdata (edev );
6365 void __iomem * dfi_regs = dfi -> regs ;
64- u32 val ;
65- u32 ddr_type ;
66-
67- /* get ddr type */
68- regmap_read (dfi -> regmap_pmu , RK3399_PMUGRF_OS_REG2 , & val );
69- ddr_type = (val >> RK3399_PMUGRF_DDRTYPE_SHIFT ) &
70- RK3399_PMUGRF_DDRTYPE_MASK ;
7166
7267 /* clear DDRMON_CTRL setting */
7368 writel_relaxed (CLR_DDRMON_CTRL , dfi_regs + DDRMON_CTRL );
7469
7570 /* set ddr type to dfi */
76- if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR3 )
71+ if (dfi -> ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR3 )
7772 writel_relaxed (LPDDR3_EN , dfi_regs + DDRMON_CTRL );
78- else if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR4 )
73+ else if (dfi -> ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR4 )
7974 writel_relaxed (LPDDR4_EN , dfi_regs + DDRMON_CTRL );
8075
8176 /* enable count, use software mode */
@@ -167,8 +162,26 @@ static const struct devfreq_event_ops rockchip_dfi_ops = {
167162 .set_event = rockchip_dfi_set_event ,
168163};
169164
165+ static int rk3399_dfi_init (struct rockchip_dfi * dfi )
166+ {
167+ struct regmap * regmap_pmu = dfi -> regmap_pmu ;
168+ u32 val ;
169+
170+ dfi -> clk = devm_clk_get (dfi -> dev , "pclk_ddr_mon" );
171+ if (IS_ERR (dfi -> clk ))
172+ return dev_err_probe (dfi -> dev , PTR_ERR (dfi -> clk ),
173+ "Cannot get the clk pclk_ddr_mon\n" );
174+
175+ /* get ddr type */
176+ regmap_read (regmap_pmu , RK3399_PMUGRF_OS_REG2 , & val );
177+ dfi -> ddr_type = (val >> RK3399_PMUGRF_DDRTYPE_SHIFT ) &
178+ RK3399_PMUGRF_DDRTYPE_MASK ;
179+
180+ return 0 ;
181+ };
182+
170183static const struct of_device_id rockchip_dfi_id_match [] = {
171- { .compatible = "rockchip,rk3399-dfi" },
184+ { .compatible = "rockchip,rk3399-dfi" , . data = rk3399_dfi_init },
172185 { },
173186};
174187MODULE_DEVICE_TABLE (of , rockchip_dfi_id_match );
@@ -179,6 +192,12 @@ static int rockchip_dfi_probe(struct platform_device *pdev)
179192 struct rockchip_dfi * dfi ;
180193 struct devfreq_event_desc * desc ;
181194 struct device_node * np = pdev -> dev .of_node , * node ;
195+ int (* soc_init )(struct rockchip_dfi * dfi );
196+ int ret ;
197+
198+ soc_init = of_device_get_match_data (& pdev -> dev );
199+ if (!soc_init )
200+ return - EINVAL ;
182201
183202 dfi = devm_kzalloc (dev , sizeof (* dfi ), GFP_KERNEL );
184203 if (!dfi )
@@ -188,11 +207,6 @@ static int rockchip_dfi_probe(struct platform_device *pdev)
188207 if (IS_ERR (dfi -> regs ))
189208 return PTR_ERR (dfi -> regs );
190209
191- dfi -> clk = devm_clk_get (dev , "pclk_ddr_mon" );
192- if (IS_ERR (dfi -> clk ))
193- return dev_err_probe (dev , PTR_ERR (dfi -> clk ),
194- "Cannot get the clk pclk_ddr_mon\n" );
195-
196210 node = of_parse_phandle (np , "rockchip,pmu" , 0 );
197211 if (!node )
198212 return dev_err_probe (& pdev -> dev , - ENODEV , "Can't find pmu_grf registers\n" );
@@ -209,6 +223,10 @@ static int rockchip_dfi_probe(struct platform_device *pdev)
209223 desc -> driver_data = dfi ;
210224 desc -> name = np -> name ;
211225
226+ ret = soc_init (dfi );
227+ if (ret )
228+ return ret ;
229+
212230 dfi -> edev = devm_devfreq_event_add_edev (& pdev -> dev , desc );
213231 if (IS_ERR (dfi -> edev )) {
214232 dev_err (& pdev -> dev ,
0 commit comments