17
17
#include <linux/slab.h>
18
18
#include <linux/list.h>
19
19
#include <linux/of.h>
20
+ #include <linux/of_device.h>
20
21
21
22
#include <soc/rockchip/rk3399_grf.h>
22
23
@@ -55,27 +56,21 @@ struct rockchip_dfi {
55
56
void __iomem * regs ;
56
57
struct regmap * regmap_pmu ;
57
58
struct clk * clk ;
59
+ u32 ddr_type ;
58
60
};
59
61
60
62
static void rockchip_dfi_start_hardware_counter (struct devfreq_event_dev * edev )
61
63
{
62
64
struct rockchip_dfi * dfi = devfreq_event_get_drvdata (edev );
63
65
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 ;
71
66
72
67
/* clear DDRMON_CTRL setting */
73
68
writel_relaxed (CLR_DDRMON_CTRL , dfi_regs + DDRMON_CTRL );
74
69
75
70
/* set ddr type to dfi */
76
- if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR3 )
71
+ if (dfi -> ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR3 )
77
72
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 )
79
74
writel_relaxed (LPDDR4_EN , dfi_regs + DDRMON_CTRL );
80
75
81
76
/* enable count, use software mode */
@@ -167,8 +162,26 @@ static const struct devfreq_event_ops rockchip_dfi_ops = {
167
162
.set_event = rockchip_dfi_set_event ,
168
163
};
169
164
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
+
170
183
static const struct of_device_id rockchip_dfi_id_match [] = {
171
- { .compatible = "rockchip,rk3399-dfi" },
184
+ { .compatible = "rockchip,rk3399-dfi" , . data = rk3399_dfi_init },
172
185
{ },
173
186
};
174
187
MODULE_DEVICE_TABLE (of , rockchip_dfi_id_match );
@@ -179,6 +192,12 @@ static int rockchip_dfi_probe(struct platform_device *pdev)
179
192
struct rockchip_dfi * dfi ;
180
193
struct devfreq_event_desc * desc ;
181
194
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 ;
182
201
183
202
dfi = devm_kzalloc (dev , sizeof (* dfi ), GFP_KERNEL );
184
203
if (!dfi )
@@ -188,11 +207,6 @@ static int rockchip_dfi_probe(struct platform_device *pdev)
188
207
if (IS_ERR (dfi -> regs ))
189
208
return PTR_ERR (dfi -> regs );
190
209
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
-
196
210
node = of_parse_phandle (np , "rockchip,pmu" , 0 );
197
211
if (!node )
198
212
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)
209
223
desc -> driver_data = dfi ;
210
224
desc -> name = np -> name ;
211
225
226
+ ret = soc_init (dfi );
227
+ if (ret )
228
+ return ret ;
229
+
212
230
dfi -> edev = devm_devfreq_event_add_edev (& pdev -> dev , desc );
213
231
if (IS_ERR (dfi -> edev )) {
214
232
dev_err (& pdev -> dev ,
0 commit comments