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

gpu: ipu-v3: pre: only use internal clock gating

By setting the SFTRST bit, the PRE will be held in the lowest power state
with clocks to the internal blocks gated. When external clock gating is
used (from the external clock controller, or by setting the CLKGATE bit)
the PRE will sporadically fail to start.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Fixes: d2a34232580a ("gpu: ipu-v3: add driver for Prefetch Resolve Engine")
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>

authored by

Lucas Stach and committed by
Philipp Zabel
47c298f7 3c2993b8

+5 -8
+5 -8
drivers/gpu/ipu-v3/ipu-pre.c
··· 131 131 if (pre->in_use) 132 132 return -EBUSY; 133 133 134 - clk_prepare_enable(pre->clk_axi); 135 - 136 134 /* first get the engine out of reset and remove clock gating */ 137 135 writel(0, pre->regs + IPU_PRE_CTRL); 138 136 ··· 147 149 148 150 void ipu_pre_put(struct ipu_pre *pre) 149 151 { 150 - u32 val; 151 - 152 - val = IPU_PRE_CTRL_SFTRST | IPU_PRE_CTRL_CLKGATE; 153 - writel(val, pre->regs + IPU_PRE_CTRL); 154 - 155 - clk_disable_unprepare(pre->clk_axi); 152 + writel(IPU_PRE_CTRL_SFTRST, pre->regs + IPU_PRE_CTRL); 156 153 157 154 pre->in_use = false; 158 155 } ··· 242 249 if (!pre->buffer_virt) 243 250 return -ENOMEM; 244 251 252 + clk_prepare_enable(pre->clk_axi); 253 + 245 254 pre->dev = dev; 246 255 platform_set_drvdata(pdev, pre); 247 256 mutex_lock(&ipu_pre_list_mutex); ··· 262 267 list_del(&pre->list); 263 268 available_pres--; 264 269 mutex_unlock(&ipu_pre_list_mutex); 270 + 271 + clk_disable_unprepare(pre->clk_axi); 265 272 266 273 if (pre->buffer_virt) 267 274 gen_pool_free(pre->iram, (unsigned long)pre->buffer_virt,