Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PM / devfreq: rk3399_dmc: remove wait for dcf irq event.

We have already wait dcf done in ATF, so don't need wait dcf irq
in kernel, besides, clear dcf irq in kernel will import competiton
between kernel and ATF, only handle dcf irq in ATF is a better way.

Signed-off-by: Lin Huang <hl@rock-chips.com>
Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Reviewed-by: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>

authored by

Enric Balletbo i Serra and committed by
MyungJoo Ham
90dd72e1 49502b23

+1 -52
+1 -52
drivers/devfreq/rk3399_dmc.c
··· 68 68 struct devfreq_event_dev *edev; 69 69 struct mutex lock; 70 70 struct dram_timing timing; 71 - 72 - /* 73 - * DDR Converser of Frequency (DCF) is used to implement DDR frequency 74 - * conversion without the participation of CPU, we will implement and 75 - * control it in arm trust firmware. 76 - */ 77 - wait_queue_head_t wait_dcf_queue; 78 - int irq; 79 - int wait_dcf_flag; 80 71 struct regulator *vdd_center; 81 72 unsigned long rate, target_rate; 82 73 unsigned long volt, target_volt; ··· 108 117 goto out; 109 118 } 110 119 } 111 - dmcfreq->wait_dcf_flag = 1; 112 120 113 121 err = clk_set_rate(dmcfreq->dmc_clk, target_rate); 114 122 if (err) { ··· 117 127 dmcfreq->volt); 118 128 goto out; 119 129 } 120 - 121 - /* 122 - * Wait until bcf irq happen, it means freq scaling finish in 123 - * arm trust firmware, use 100ms as timeout time. 124 - */ 125 - if (!wait_event_timeout(dmcfreq->wait_dcf_queue, 126 - !dmcfreq->wait_dcf_flag, HZ / 10)) 127 - dev_warn(dev, "Timeout waiting for dcf interrupt\n"); 128 130 129 131 /* 130 132 * Check the dpll rate, ··· 223 241 static SIMPLE_DEV_PM_OPS(rk3399_dmcfreq_pm, rk3399_dmcfreq_suspend, 224 242 rk3399_dmcfreq_resume); 225 243 226 - static irqreturn_t rk3399_dmc_irq(int irq, void *dev_id) 227 - { 228 - struct rk3399_dmcfreq *dmcfreq = dev_id; 229 - struct arm_smccc_res res; 230 - 231 - dmcfreq->wait_dcf_flag = 0; 232 - wake_up(&dmcfreq->wait_dcf_queue); 233 - 234 - /* Clear the DCF interrupt */ 235 - arm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ, 0, 0, 236 - ROCKCHIP_SIP_CONFIG_DRAM_CLR_IRQ, 237 - 0, 0, 0, 0, &res); 238 - 239 - return IRQ_HANDLED; 240 - } 241 - 242 244 static int of_get_ddr_timings(struct dram_timing *timing, 243 245 struct device_node *np) 244 246 { ··· 296 330 struct device *dev = &pdev->dev; 297 331 struct device_node *np = pdev->dev.of_node; 298 332 struct rk3399_dmcfreq *data; 299 - int ret, irq, index, size; 333 + int ret, index, size; 300 334 uint32_t *timing; 301 335 struct dev_pm_opp *opp; 302 336 303 - irq = platform_get_irq(pdev, 0); 304 - if (irq < 0) { 305 - dev_err(&pdev->dev, 306 - "Cannot get the dmc interrupt resource: %d\n", irq); 307 - return irq; 308 - } 309 337 data = devm_kzalloc(dev, sizeof(struct rk3399_dmcfreq), GFP_KERNEL); 310 338 if (!data) 311 339 return -ENOMEM; ··· 317 357 dev_err(dev, "Cannot get the clk dmc_clk\n"); 318 358 return PTR_ERR(data->dmc_clk); 319 359 }; 320 - 321 - data->irq = irq; 322 - ret = devm_request_irq(dev, irq, rk3399_dmc_irq, 0, 323 - dev_name(dev), data); 324 - if (ret) { 325 - dev_err(dev, "Failed to request dmc irq: %d\n", ret); 326 - return ret; 327 - } 328 - 329 - init_waitqueue_head(&data->wait_dcf_queue); 330 - data->wait_dcf_flag = 0; 331 360 332 361 data->edev = devfreq_event_get_edev_by_phandle(dev, 0); 333 362 if (IS_ERR(data->edev))