Lines Matching +full:pre +full:- +full:filled
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2016-2017 Lucas Stach, Pengutronix
11 #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
17 #include <video/imx-ipu-v3.h>
19 #include "ipu-prv.h"
87 struct device_node *prg_node = of_parse_phandle(dev->of_node, in ipu_prg_lookup_by_phandle()
93 if (prg_node == prg->dev->of_node) { in ipu_prg_lookup_by_phandle()
95 device_link_add(dev, prg->dev, in ipu_prg_lookup_by_phandle()
97 prg->id = ipu_id; in ipu_prg_lookup_by_phandle()
117 if (ipu->prg_priv) in ipu_prg_present()
129 if (info->num_planes != 1) in ipu_prg_format_supported()
145 struct ipu_prg *prg = ipu->prg_priv; in ipu_prg_enable()
150 return pm_runtime_get_sync(prg->dev); in ipu_prg_enable()
156 struct ipu_prg *prg = ipu->prg_priv; in ipu_prg_disable()
161 pm_runtime_put(prg->dev); in ipu_prg_disable()
185 return -EINVAL; in ipu_prg_ipu_to_prg_chan()
195 ret = ipu_pre_get(prg->pres[0]); in ipu_prg_get_pre()
198 prg->chan[prg_chan].used_pre = 0; in ipu_prg_get_pre()
203 ret = ipu_pre_get(prg->pres[i]); in ipu_prg_get_pre()
208 prg->chan[prg_chan].used_pre = i; in ipu_prg_get_pre()
210 /* configure the PRE to PRG channel mux */ in ipu_prg_get_pre()
212 mux = (prg->id << 1) | (prg_chan - 1); in ipu_prg_get_pre()
213 regmap_update_bits(prg->iomuxc_gpr, IOMUXC_GPR5, in ipu_prg_get_pre()
218 regmap_read(prg->iomuxc_gpr, IOMUXC_GPR5, &val); in ipu_prg_get_pre()
220 regmap_update_bits(prg->iomuxc_gpr, IOMUXC_GPR5, in ipu_prg_get_pre()
230 dev_err(prg->dev, "could not get PRE for PRG chan %d", prg_chan); in ipu_prg_get_pre()
236 struct ipu_prg_channel *chan = &prg->chan[prg_chan]; in ipu_prg_put_pre()
238 ipu_pre_put(prg->pres[chan->used_pre]); in ipu_prg_put_pre()
239 chan->used_pre = -1; in ipu_prg_put_pre()
244 int prg_chan = ipu_prg_ipu_to_prg_chan(ipu_chan->num); in ipu_prg_channel_disable()
245 struct ipu_prg *prg = ipu_chan->ipu->prg_priv; in ipu_prg_channel_disable()
252 chan = &prg->chan[prg_chan]; in ipu_prg_channel_disable()
253 if (!chan->enabled) in ipu_prg_channel_disable()
256 pm_runtime_get_sync(prg->dev); in ipu_prg_channel_disable()
258 val = readl(prg->regs + IPU_PRG_CTL); in ipu_prg_channel_disable()
260 writel(val, prg->regs + IPU_PRG_CTL); in ipu_prg_channel_disable()
263 writel(val, prg->regs + IPU_PRG_REG_UPDATE); in ipu_prg_channel_disable()
265 pm_runtime_put(prg->dev); in ipu_prg_channel_disable()
269 chan->enabled = false; in ipu_prg_channel_disable()
278 int prg_chan = ipu_prg_ipu_to_prg_chan(ipu_chan->num); in ipu_prg_channel_configure()
279 struct ipu_prg *prg = ipu_chan->ipu->prg_priv; in ipu_prg_channel_configure()
287 chan = &prg->chan[prg_chan]; in ipu_prg_channel_configure()
289 if (chan->enabled) { in ipu_prg_channel_configure()
290 ipu_pre_update(prg->pres[chan->used_pre], *eba); in ipu_prg_channel_configure()
298 ipu_pre_configure(prg->pres[chan->used_pre], in ipu_prg_channel_configure()
302 pm_runtime_get_sync(prg->dev); in ipu_prg_channel_configure()
304 val = (stride - 1) & IPU_PRG_STRIDE_STRIDE_MASK; in ipu_prg_channel_configure()
305 writel(val, prg->regs + IPU_PRG_STRIDE(prg_chan)); in ipu_prg_channel_configure()
311 writel(val, prg->regs + IPU_PRG_HEIGHT(prg_chan)); in ipu_prg_channel_configure()
313 val = ipu_pre_get_baddr(prg->pres[chan->used_pre]); in ipu_prg_channel_configure()
315 writel(val, prg->regs + IPU_PRG_BADDR(prg_chan)); in ipu_prg_channel_configure()
317 val = readl(prg->regs + IPU_PRG_CTL); in ipu_prg_channel_configure()
324 writel(val, prg->regs + IPU_PRG_CTL); in ipu_prg_channel_configure()
327 writel(val, prg->regs + IPU_PRG_REG_UPDATE); in ipu_prg_channel_configure()
329 /* wait for both double buffers to be filled */ in ipu_prg_channel_configure()
330 readl_poll_timeout(prg->regs + IPU_PRG_STATUS, val, in ipu_prg_channel_configure()
335 pm_runtime_put(prg->dev); in ipu_prg_channel_configure()
337 chan->enabled = true; in ipu_prg_channel_configure()
344 int prg_chan = ipu_prg_ipu_to_prg_chan(ipu_chan->num); in ipu_prg_channel_configure_pending()
345 struct ipu_prg *prg = ipu_chan->ipu->prg_priv; in ipu_prg_channel_configure_pending()
351 chan = &prg->chan[prg_chan]; in ipu_prg_channel_configure_pending()
352 WARN_ON(!chan->enabled); in ipu_prg_channel_configure_pending()
354 return ipu_pre_update_pending(prg->pres[chan->used_pre]); in ipu_prg_channel_configure_pending()
360 struct device *dev = &pdev->dev; in ipu_prg_probe()
368 return -ENOMEM; in ipu_prg_probe()
371 prg->regs = devm_ioremap_resource(&pdev->dev, res); in ipu_prg_probe()
372 if (IS_ERR(prg->regs)) in ipu_prg_probe()
373 return PTR_ERR(prg->regs); in ipu_prg_probe()
376 prg->clk_ipg = devm_clk_get(dev, "ipg"); in ipu_prg_probe()
377 if (IS_ERR(prg->clk_ipg)) in ipu_prg_probe()
378 return PTR_ERR(prg->clk_ipg); in ipu_prg_probe()
380 prg->clk_axi = devm_clk_get(dev, "axi"); in ipu_prg_probe()
381 if (IS_ERR(prg->clk_axi)) in ipu_prg_probe()
382 return PTR_ERR(prg->clk_axi); in ipu_prg_probe()
384 prg->iomuxc_gpr = in ipu_prg_probe()
385 syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr"); in ipu_prg_probe()
386 if (IS_ERR(prg->iomuxc_gpr)) in ipu_prg_probe()
387 return PTR_ERR(prg->iomuxc_gpr); in ipu_prg_probe()
390 prg->pres[i] = ipu_pre_lookup_by_phandle(dev, "fsl,pres", i); in ipu_prg_probe()
391 if (!prg->pres[i]) in ipu_prg_probe()
392 return -EPROBE_DEFER; in ipu_prg_probe()
395 ret = clk_prepare_enable(prg->clk_ipg); in ipu_prg_probe()
399 ret = clk_prepare_enable(prg->clk_axi); in ipu_prg_probe()
401 clk_disable_unprepare(prg->clk_ipg); in ipu_prg_probe()
406 val = readl(prg->regs + IPU_PRG_CTL); in ipu_prg_probe()
408 writel(val, prg->regs + IPU_PRG_CTL); in ipu_prg_probe()
411 writel(0xffffffff, prg->regs + IPU_PRG_THD); in ipu_prg_probe()
416 prg->dev = dev; in ipu_prg_probe()
419 list_add(&prg->list, &ipu_prg_list); in ipu_prg_probe()
430 list_del(&prg->list); in ipu_prg_remove()
441 clk_disable_unprepare(prg->clk_axi); in prg_suspend()
442 clk_disable_unprepare(prg->clk_ipg); in prg_suspend()
452 ret = clk_prepare_enable(prg->clk_ipg); in prg_resume()
456 ret = clk_prepare_enable(prg->clk_axi); in prg_resume()
458 clk_disable_unprepare(prg->clk_ipg); in prg_resume()
471 { .compatible = "fsl,imx6qp-prg", },
479 .name = "imx-ipu-prg",