Lines Matching refs:ipu
43 void (*set_coefs)(struct ingenic_ipu *ipu, unsigned int reg,
119 static void jz4760_set_coefs(struct ingenic_ipu *ipu, unsigned int reg, in jz4760_set_coefs() argument
163 regmap_write(ipu->map, reg, val); in jz4760_set_coefs()
168 regmap_write(ipu->map, reg, val); in jz4760_set_coefs()
171 static void jz4725b_set_coefs(struct ingenic_ipu *ipu, unsigned int reg, in jz4725b_set_coefs() argument
187 regmap_write(ipu->map, reg, val); in jz4725b_set_coefs()
191 regmap_write(ipu->map, reg, JZ4725B_IPU_RSZ_LUT_IN_EN); in jz4725b_set_coefs()
195 static void ingenic_ipu_set_downscale_coefs(struct ingenic_ipu *ipu, in ingenic_ipu_set_downscale_coefs() argument
208 ipu->soc_info->set_coefs(ipu, reg, ipu->sharpness, in ingenic_ipu_set_downscale_coefs()
213 static void ingenic_ipu_set_integer_upscale_coefs(struct ingenic_ipu *ipu, in ingenic_ipu_set_integer_upscale_coefs() argument
224 ipu->soc_info->set_coefs(ipu, reg, 0, false, 512, i == num - 1); in ingenic_ipu_set_integer_upscale_coefs()
227 static void ingenic_ipu_set_upscale_coefs(struct ingenic_ipu *ipu, in ingenic_ipu_set_upscale_coefs() argument
242 ipu->soc_info->set_coefs(ipu, reg, ipu->sharpness, in ingenic_ipu_set_upscale_coefs()
247 static void ingenic_ipu_set_coefs(struct ingenic_ipu *ipu, unsigned int reg, in ingenic_ipu_set_coefs() argument
251 regmap_write(ipu->map, reg, -1); in ingenic_ipu_set_coefs()
254 ingenic_ipu_set_downscale_coefs(ipu, reg, num, denom); in ingenic_ipu_set_coefs()
256 ingenic_ipu_set_integer_upscale_coefs(ipu, reg, num); in ingenic_ipu_set_coefs()
258 ingenic_ipu_set_upscale_coefs(ipu, reg, num, denom); in ingenic_ipu_set_coefs()
290 struct ingenic_ipu *ipu = plane_to_ingenic_ipu(plane); in ingenic_ipu_plane_atomic_update() local
303 if (!ipu->clk_enabled) { in ingenic_ipu_plane_atomic_update()
304 err = clk_enable(ipu->clk); in ingenic_ipu_plane_atomic_update()
306 dev_err(ipu->dev, "Unable to enable clock: %d\n", err); in ingenic_ipu_plane_atomic_update()
310 ipu->clk_enabled = true; in ingenic_ipu_plane_atomic_update()
316 regmap_set_bits(ipu->map, JZ_REG_IPU_CTRL, JZ_IPU_CTRL_RST); in ingenic_ipu_plane_atomic_update()
319 regmap_set_bits(ipu->map, JZ_REG_IPU_CTRL, in ingenic_ipu_plane_atomic_update()
323 if (ingenic_drm_map_noncoherent(ipu->master)) in ingenic_ipu_plane_atomic_update()
324 drm_fb_cma_sync_non_coherent(ipu->drm, oldstate, newstate); in ingenic_ipu_plane_atomic_update()
327 ipu->addr_y = drm_fb_cma_get_gem_addr(newstate->fb, newstate, 0); in ingenic_ipu_plane_atomic_update()
329 ipu->addr_u = drm_fb_cma_get_gem_addr(newstate->fb, newstate, in ingenic_ipu_plane_atomic_update()
332 ipu->addr_v = drm_fb_cma_get_gem_addr(newstate->fb, newstate, in ingenic_ipu_plane_atomic_update()
339 regmap_write(ipu->map, JZ_REG_IPU_Y_ADDR, ipu->addr_y); in ingenic_ipu_plane_atomic_update()
340 regmap_write(ipu->map, JZ_REG_IPU_U_ADDR, ipu->addr_u); in ingenic_ipu_plane_atomic_update()
341 regmap_write(ipu->map, JZ_REG_IPU_V_ADDR, ipu->addr_v); in ingenic_ipu_plane_atomic_update()
344 regmap_set_bits(ipu->map, JZ_REG_IPU_CTRL, JZ_IPU_CTRL_SPKG_SEL); in ingenic_ipu_plane_atomic_update()
346 ingenic_drm_plane_config(ipu->master, plane, DRM_FORMAT_XRGB8888); in ingenic_ipu_plane_atomic_update()
357 regmap_write(ipu->map, JZ_REG_IPU_UV_STRIDE, stride); in ingenic_ipu_plane_atomic_update()
360 regmap_write(ipu->map, JZ_REG_IPU_Y_STRIDE, stride); in ingenic_ipu_plane_atomic_update()
362 regmap_write(ipu->map, JZ_REG_IPU_IN_GS, in ingenic_ipu_plane_atomic_update()
429 regmap_write(ipu->map, JZ_REG_IPU_D_FMT, format); in ingenic_ipu_plane_atomic_update()
432 regmap_write(ipu->map, JZ_REG_IPU_OUT_GS, in ingenic_ipu_plane_atomic_update()
435 regmap_write(ipu->map, JZ_REG_IPU_OUT_STRIDE, newstate->crtc_w * 4); in ingenic_ipu_plane_atomic_update()
438 regmap_set_bits(ipu->map, JZ_REG_IPU_CTRL, JZ_IPU_CTRL_CSC_EN); in ingenic_ipu_plane_atomic_update()
446 regmap_write(ipu->map, JZ_REG_IPU_CSC_OFFSET, in ingenic_ipu_plane_atomic_update()
456 regmap_write(ipu->map, JZ_REG_IPU_CSC_C0_COEF, 0x4a8); in ingenic_ipu_plane_atomic_update()
457 regmap_write(ipu->map, JZ_REG_IPU_CSC_C1_COEF, 0x662); in ingenic_ipu_plane_atomic_update()
458 regmap_write(ipu->map, JZ_REG_IPU_CSC_C2_COEF, 0x191); in ingenic_ipu_plane_atomic_update()
459 regmap_write(ipu->map, JZ_REG_IPU_CSC_C3_COEF, 0x341); in ingenic_ipu_plane_atomic_update()
460 regmap_write(ipu->map, JZ_REG_IPU_CSC_C4_COEF, 0x811); in ingenic_ipu_plane_atomic_update()
470 if (ipu->soc_info->has_bicubic) in ingenic_ipu_plane_atomic_update()
473 upscaling_w = ipu->num_w > ipu->denom_w; in ingenic_ipu_plane_atomic_update()
477 if (ipu->num_w != 1 || ipu->denom_w != 1) { in ingenic_ipu_plane_atomic_update()
478 if (!ipu->soc_info->has_bicubic && !upscaling_w) in ingenic_ipu_plane_atomic_update()
479 coef_index |= (ipu->denom_w - 1) << 16; in ingenic_ipu_plane_atomic_update()
481 coef_index |= (ipu->num_w - 1) << 16; in ingenic_ipu_plane_atomic_update()
485 upscaling_h = ipu->num_h > ipu->denom_h; in ingenic_ipu_plane_atomic_update()
489 if (ipu->num_h != 1 || ipu->denom_h != 1) { in ingenic_ipu_plane_atomic_update()
490 if (!ipu->soc_info->has_bicubic && !upscaling_h) in ingenic_ipu_plane_atomic_update()
491 coef_index |= ipu->denom_h - 1; in ingenic_ipu_plane_atomic_update()
493 coef_index |= ipu->num_h - 1; in ingenic_ipu_plane_atomic_update()
497 regmap_update_bits(ipu->map, JZ_REG_IPU_CTRL, JZ_IPU_CTRL_ZOOM_SEL | in ingenic_ipu_plane_atomic_update()
502 regmap_write(ipu->map, JZ_REG_IPU_RSZ_COEF_INDEX, coef_index); in ingenic_ipu_plane_atomic_update()
504 if (ipu->num_w != 1 || ipu->denom_w != 1) in ingenic_ipu_plane_atomic_update()
505 ingenic_ipu_set_coefs(ipu, JZ_REG_IPU_HRSZ_COEF_LUT, in ingenic_ipu_plane_atomic_update()
506 ipu->num_w, ipu->denom_w); in ingenic_ipu_plane_atomic_update()
508 if (ipu->num_h != 1 || ipu->denom_h != 1) in ingenic_ipu_plane_atomic_update()
509 ingenic_ipu_set_coefs(ipu, JZ_REG_IPU_VRSZ_COEF_LUT, in ingenic_ipu_plane_atomic_update()
510 ipu->num_h, ipu->denom_h); in ingenic_ipu_plane_atomic_update()
513 regmap_write(ipu->map, JZ_REG_IPU_STATUS, 0); in ingenic_ipu_plane_atomic_update()
516 regmap_set_bits(ipu->map, JZ_REG_IPU_CTRL, in ingenic_ipu_plane_atomic_update()
519 dev_dbg(ipu->dev, "Scaling %ux%u to %ux%u (%u:%u horiz, %u:%u vert)\n", in ingenic_ipu_plane_atomic_update()
522 ipu->num_w, ipu->denom_w, ipu->num_h, ipu->denom_h); in ingenic_ipu_plane_atomic_update()
533 struct ingenic_ipu *ipu = plane_to_ingenic_ipu(plane); in ingenic_ipu_plane_atomic_check() local
596 ipu->num_w = num_w; in ingenic_ipu_plane_atomic_check()
597 ipu->num_h = num_h; in ingenic_ipu_plane_atomic_check()
598 ipu->denom_w = denom_w; in ingenic_ipu_plane_atomic_check()
599 ipu->denom_h = denom_h; in ingenic_ipu_plane_atomic_check()
602 if (ingenic_drm_map_noncoherent(ipu->master)) in ingenic_ipu_plane_atomic_check()
611 struct ingenic_ipu *ipu = plane_to_ingenic_ipu(plane); in ingenic_ipu_plane_atomic_disable() local
613 regmap_set_bits(ipu->map, JZ_REG_IPU_CTRL, JZ_IPU_CTRL_STOP); in ingenic_ipu_plane_atomic_disable()
614 regmap_clear_bits(ipu->map, JZ_REG_IPU_CTRL, JZ_IPU_CTRL_CHIP_EN); in ingenic_ipu_plane_atomic_disable()
616 ingenic_drm_plane_disable(ipu->master, plane); in ingenic_ipu_plane_atomic_disable()
618 if (ipu->clk_enabled) { in ingenic_ipu_plane_atomic_disable()
619 clk_disable(ipu->clk); in ingenic_ipu_plane_atomic_disable()
620 ipu->clk_enabled = false; in ingenic_ipu_plane_atomic_disable()
635 struct ingenic_ipu *ipu = plane_to_ingenic_ipu(plane); in ingenic_ipu_plane_atomic_get_property() local
637 if (property != ipu->sharpness_prop) in ingenic_ipu_plane_atomic_get_property()
640 *val = ipu->sharpness; in ingenic_ipu_plane_atomic_get_property()
650 struct ingenic_ipu *ipu = plane_to_ingenic_ipu(plane); in ingenic_ipu_plane_atomic_set_property() local
653 if (property != ipu->sharpness_prop) in ingenic_ipu_plane_atomic_set_property()
656 ipu->sharpness = val; in ingenic_ipu_plane_atomic_set_property()
684 struct ingenic_ipu *ipu = arg; in ingenic_ipu_irq_handler() local
685 struct drm_crtc *crtc = drm_crtc_from_index(ipu->drm, 0); in ingenic_ipu_irq_handler()
689 if (ipu->soc_info->manual_restart) in ingenic_ipu_irq_handler()
690 regmap_read(ipu->map, JZ_REG_IPU_STATUS, &dummy); in ingenic_ipu_irq_handler()
693 regmap_write(ipu->map, JZ_REG_IPU_STATUS, 0); in ingenic_ipu_irq_handler()
696 regmap_write(ipu->map, JZ_REG_IPU_Y_ADDR, ipu->addr_y); in ingenic_ipu_irq_handler()
697 regmap_write(ipu->map, JZ_REG_IPU_U_ADDR, ipu->addr_u); in ingenic_ipu_irq_handler()
698 regmap_write(ipu->map, JZ_REG_IPU_V_ADDR, ipu->addr_v); in ingenic_ipu_irq_handler()
701 if (ipu->soc_info->manual_restart) in ingenic_ipu_irq_handler()
702 regmap_set_bits(ipu->map, JZ_REG_IPU_CTRL, JZ_IPU_CTRL_RUN); in ingenic_ipu_irq_handler()
723 struct ingenic_ipu *ipu; in ingenic_ipu_bind() local
728 ipu = devm_kzalloc(dev, sizeof(*ipu), GFP_KERNEL); in ingenic_ipu_bind()
729 if (!ipu) in ingenic_ipu_bind()
738 ipu->dev = dev; in ingenic_ipu_bind()
739 ipu->drm = drm; in ingenic_ipu_bind()
740 ipu->master = master; in ingenic_ipu_bind()
741 ipu->soc_info = soc_info; in ingenic_ipu_bind()
749 ipu->map = devm_regmap_init_mmio(dev, base, &ingenic_ipu_regmap_config); in ingenic_ipu_bind()
750 if (IS_ERR(ipu->map)) { in ingenic_ipu_bind()
752 return PTR_ERR(ipu->map); in ingenic_ipu_bind()
759 ipu->clk = devm_clk_get(dev, "ipu"); in ingenic_ipu_bind()
760 if (IS_ERR(ipu->clk)) { in ingenic_ipu_bind()
762 return PTR_ERR(ipu->clk); in ingenic_ipu_bind()
766 dev_name(dev), ipu); in ingenic_ipu_bind()
772 plane = &ipu->plane; in ingenic_ipu_bind()
795 ipu->sharpness_prop = drm_property_create_range(drm, 0, "sharpness", in ingenic_ipu_bind()
797 if (!ipu->sharpness_prop) { in ingenic_ipu_bind()
803 ipu->sharpness = soc_info->has_bicubic ? 8 : 1; in ingenic_ipu_bind()
804 drm_object_attach_property(&plane->base, ipu->sharpness_prop, in ingenic_ipu_bind()
805 ipu->sharpness); in ingenic_ipu_bind()
807 err = clk_prepare(ipu->clk); in ingenic_ipu_bind()
819 struct ingenic_ipu *ipu = dev_get_drvdata(dev); in ingenic_ipu_unbind() local
821 clk_unprepare(ipu->clk); in ingenic_ipu_unbind()