• Home
  • Raw
  • Download

Lines Matching +full:timing +full:-

3  * Author: Lin Huang <hl@rock-chips.com>
15 #include <linux/arm-smccc.h>
19 #include <linux/devfreq-event.h>
70 struct dram_timing timing; member
81 unsigned long old_clk_rate = dmcfreq->rate; in rk3399_dmcfreq_target()
93 if (dmcfreq->rate == target_rate) in rk3399_dmcfreq_target()
96 mutex_lock(&dmcfreq->lock); in rk3399_dmcfreq_target()
103 err = regulator_set_voltage(dmcfreq->vdd_center, target_volt, in rk3399_dmcfreq_target()
112 err = clk_set_rate(dmcfreq->dmc_clk, target_rate); in rk3399_dmcfreq_target()
116 regulator_set_voltage(dmcfreq->vdd_center, dmcfreq->volt, in rk3399_dmcfreq_target()
117 dmcfreq->volt); in rk3399_dmcfreq_target()
127 dmcfreq->rate = clk_get_rate(dmcfreq->dmc_clk); in rk3399_dmcfreq_target()
130 if (dmcfreq->rate != target_rate) { in rk3399_dmcfreq_target()
132 target_rate, dmcfreq->rate); in rk3399_dmcfreq_target()
133 regulator_set_voltage(dmcfreq->vdd_center, dmcfreq->volt, in rk3399_dmcfreq_target()
134 dmcfreq->volt); in rk3399_dmcfreq_target()
137 err = regulator_set_voltage(dmcfreq->vdd_center, target_volt, in rk3399_dmcfreq_target()
142 dmcfreq->rate = target_rate; in rk3399_dmcfreq_target()
143 dmcfreq->volt = target_volt; in rk3399_dmcfreq_target()
146 mutex_unlock(&dmcfreq->lock); in rk3399_dmcfreq_target()
157 ret = devfreq_event_get_event(dmcfreq->edev, &edata); in rk3399_dmcfreq_get_dev_status()
161 stat->current_frequency = dmcfreq->rate; in rk3399_dmcfreq_get_dev_status()
162 stat->busy_time = edata.load_count; in rk3399_dmcfreq_get_dev_status()
163 stat->total_time = edata.total_count; in rk3399_dmcfreq_get_dev_status()
172 *freq = dmcfreq->rate; in rk3399_dmcfreq_get_cur_freq()
189 ret = devfreq_event_disable_edev(dmcfreq->edev); in rk3399_dmcfreq_suspend()
191 dev_err(dev, "failed to disable the devfreq-event devices\n"); in rk3399_dmcfreq_suspend()
195 ret = devfreq_suspend_device(dmcfreq->devfreq); in rk3399_dmcfreq_suspend()
209 ret = devfreq_event_enable_edev(dmcfreq->edev); in rk3399_dmcfreq_resume()
211 dev_err(dev, "failed to enable the devfreq-event devices\n"); in rk3399_dmcfreq_resume()
215 ret = devfreq_resume_device(dmcfreq->devfreq); in rk3399_dmcfreq_resume()
226 static int of_get_ddr_timings(struct dram_timing *timing, in of_get_ddr_timings() argument
232 &timing->ddr3_speed_bin); in of_get_ddr_timings()
234 &timing->pd_idle); in of_get_ddr_timings()
236 &timing->sr_idle); in of_get_ddr_timings()
238 &timing->sr_mc_gate_idle); in of_get_ddr_timings()
240 &timing->srpd_lite_idle); in of_get_ddr_timings()
242 &timing->standby_idle); in of_get_ddr_timings()
244 &timing->auto_pd_dis_freq); in of_get_ddr_timings()
246 &timing->dram_dll_dis_freq); in of_get_ddr_timings()
248 &timing->phy_dll_dis_freq); in of_get_ddr_timings()
250 &timing->ddr3_odt_dis_freq); in of_get_ddr_timings()
252 &timing->ddr3_drv); in of_get_ddr_timings()
254 &timing->ddr3_odt); in of_get_ddr_timings()
256 &timing->phy_ddr3_ca_drv); in of_get_ddr_timings()
258 &timing->phy_ddr3_dq_drv); in of_get_ddr_timings()
260 &timing->phy_ddr3_odt); in of_get_ddr_timings()
262 &timing->lpddr3_odt_dis_freq); in of_get_ddr_timings()
264 &timing->lpddr3_drv); in of_get_ddr_timings()
266 &timing->lpddr3_odt); in of_get_ddr_timings()
268 &timing->phy_lpddr3_ca_drv); in of_get_ddr_timings()
270 &timing->phy_lpddr3_dq_drv); in of_get_ddr_timings()
272 &timing->phy_lpddr3_odt); in of_get_ddr_timings()
274 &timing->lpddr4_odt_dis_freq); in of_get_ddr_timings()
276 &timing->lpddr4_drv); in of_get_ddr_timings()
278 &timing->lpddr4_dq_odt); in of_get_ddr_timings()
280 &timing->lpddr4_ca_odt); in of_get_ddr_timings()
282 &timing->phy_lpddr4_ca_drv); in of_get_ddr_timings()
284 &timing->phy_lpddr4_ck_cs_drv); in of_get_ddr_timings()
286 &timing->phy_lpddr4_dq_drv); in of_get_ddr_timings()
288 &timing->phy_lpddr4_odt); in of_get_ddr_timings()
296 struct device *dev = &pdev->dev; in rk3399_dmcfreq_probe()
297 struct device_node *np = pdev->dev.of_node; in rk3399_dmcfreq_probe()
300 uint32_t *timing; in rk3399_dmcfreq_probe() local
305 return -ENOMEM; in rk3399_dmcfreq_probe()
307 mutex_init(&data->lock); in rk3399_dmcfreq_probe()
309 data->vdd_center = devm_regulator_get(dev, "center"); in rk3399_dmcfreq_probe()
310 if (IS_ERR(data->vdd_center)) { in rk3399_dmcfreq_probe()
311 if (PTR_ERR(data->vdd_center) == -EPROBE_DEFER) in rk3399_dmcfreq_probe()
312 return -EPROBE_DEFER; in rk3399_dmcfreq_probe()
315 return PTR_ERR(data->vdd_center); in rk3399_dmcfreq_probe()
318 data->dmc_clk = devm_clk_get(dev, "dmc_clk"); in rk3399_dmcfreq_probe()
319 if (IS_ERR(data->dmc_clk)) { in rk3399_dmcfreq_probe()
320 if (PTR_ERR(data->dmc_clk) == -EPROBE_DEFER) in rk3399_dmcfreq_probe()
321 return -EPROBE_DEFER; in rk3399_dmcfreq_probe()
324 return PTR_ERR(data->dmc_clk); in rk3399_dmcfreq_probe()
327 data->edev = devfreq_event_get_edev_by_phandle(dev, 0); in rk3399_dmcfreq_probe()
328 if (IS_ERR(data->edev)) in rk3399_dmcfreq_probe()
329 return -EPROBE_DEFER; in rk3399_dmcfreq_probe()
331 ret = devfreq_event_enable_edev(data->edev); in rk3399_dmcfreq_probe()
333 dev_err(dev, "failed to enable devfreq-event devices\n"); in rk3399_dmcfreq_probe()
338 * Get dram timing and pass it to arm trust firmware, in rk3399_dmcfreq_probe()
340 * timing and to do dram initial. in rk3399_dmcfreq_probe()
342 if (!of_get_ddr_timings(&data->timing, np)) { in rk3399_dmcfreq_probe()
343 timing = &data->timing.ddr3_speed_bin; in rk3399_dmcfreq_probe()
346 arm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ, *timing++, index, in rk3399_dmcfreq_probe()
352 return -EINVAL; in rk3399_dmcfreq_probe()
366 dev_err(dev, "Invalid operating-points in device tree.\n"); in rk3399_dmcfreq_probe()
367 return -EINVAL; in rk3399_dmcfreq_probe()
371 &data->ondemand_data.upthreshold); in rk3399_dmcfreq_probe()
373 &data->ondemand_data.downdifferential); in rk3399_dmcfreq_probe()
375 data->rate = clk_get_rate(data->dmc_clk); in rk3399_dmcfreq_probe()
377 opp = devfreq_recommended_opp(dev, &data->rate, 0); in rk3399_dmcfreq_probe()
383 data->rate = dev_pm_opp_get_freq(opp); in rk3399_dmcfreq_probe()
384 data->volt = dev_pm_opp_get_voltage(opp); in rk3399_dmcfreq_probe()
387 rk3399_devfreq_dmc_profile.initial_freq = data->rate; in rk3399_dmcfreq_probe()
389 data->devfreq = devm_devfreq_add_device(dev, in rk3399_dmcfreq_probe()
392 &data->ondemand_data); in rk3399_dmcfreq_probe()
393 if (IS_ERR(data->devfreq)) { in rk3399_dmcfreq_probe()
394 ret = PTR_ERR(data->devfreq); in rk3399_dmcfreq_probe()
398 devm_devfreq_register_opp_notifier(dev, data->devfreq); in rk3399_dmcfreq_probe()
400 data->dev = dev; in rk3399_dmcfreq_probe()
406 dev_pm_opp_of_remove_table(&pdev->dev); in rk3399_dmcfreq_probe()
412 struct rk3399_dmcfreq *dmcfreq = dev_get_drvdata(&pdev->dev); in rk3399_dmcfreq_remove()
417 devm_devfreq_unregister_opp_notifier(dmcfreq->dev, dmcfreq->devfreq); in rk3399_dmcfreq_remove()
418 dev_pm_opp_of_remove_table(dmcfreq->dev); in rk3399_dmcfreq_remove()
424 { .compatible = "rockchip,rk3399-dmc" },
433 .name = "rk3399-dmc-freq",
441 MODULE_AUTHOR("Lin Huang <hl@rock-chips.com>");