Lines Matching defs:di

123 static inline u32 ipu_di_read(struct ipu_di *di, unsigned offset)
125 return readl(di->base + offset);
128 static inline void ipu_di_write(struct ipu_di *di, u32 value, unsigned offset)
130 writel(value, di->base + offset);
133 static void ipu_di_data_wave_config(struct ipu_di *di,
140 ipu_di_write(di, reg, DI_DW_GEN(wave_gen));
143 static void ipu_di_data_pin_config(struct ipu_di *di, int wave_gen, int di_pin,
148 reg = ipu_di_read(di, DI_DW_GEN(wave_gen));
151 ipu_di_write(di, reg, DI_DW_GEN(wave_gen));
153 ipu_di_write(di, (down << 16) | up, DI_DW_SET(wave_gen, set));
156 static void ipu_di_sync_config(struct ipu_di *di, struct di_sync_config *config,
170 dev_err(di->ipu->dev, "DI%d counters out of range.\n",
171 di->id);
179 ipu_di_write(di, reg, DI_SW_GEN0(wave_gen));
193 ipu_di_write(di, reg, DI_SW_GEN1(wave_gen));
195 reg = ipu_di_read(di, DI_STP_REP(wave_gen));
198 ipu_di_write(di, reg, DI_STP_REP(wave_gen));
202 static void ipu_di_sync_config_interlaced(struct ipu_di *di,
260 ipu_di_sync_config(di, cfg, 0, ARRAY_SIZE(cfg));
262 ipu_di_write(di, v_total / 2 - 1, DI_SCR_CONF);
265 static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
382 ipu_di_write(di, v_total - 1, DI_SCR_CONF);
384 ipu_di_sync_config(di, cfg, 0, ARRAY_SIZE(cfg));
386 ipu_di_sync_config(di, cfg_vga, 0, ARRAY_SIZE(cfg_vga));
389 static void ipu_di_config_clock(struct ipu_di *di,
402 clk = di->clk_di;
443 clkrate = clk_get_rate(di->clk_ipu);
450 dev_dbg(di->ipu->dev, " IPU clock can give %lu with divider %u, error %c%d.%d%%\n",
456 clk = di->clk_ipu;
463 clk = di->clk_di;
475 di->clk_di_pixel = clk;
478 ipu_di_write(di, clkgen0, DI_BS_CLKGEN0);
486 ipu_di_write(di, (clkgen0 >> 4) << 16, DI_BS_CLKGEN1);
489 val = ipu_di_read(di, DI_GENERAL) & ~DI_GEN_DI_CLK_EXT;
490 if (clk == di->clk_di)
492 ipu_di_write(di, val, DI_GENERAL);
494 dev_dbg(di->ipu->dev, "Want %luHz IPU %luHz DI %luHz using %s, %luHz\n",
496 clk_get_rate(di->clk_ipu),
497 clk_get_rate(di->clk_di),
498 clk == di->clk_di ? "DI" : "IPU",
499 clk_get_rate(di->clk_di_pixel) / (clkgen0 >> 4));
506 int ipu_di_adjust_videomode(struct ipu_di *di, struct videomode *mode)
512 dev_err(di->ipu->dev, "hactive %d is not aligned to 8 and front porch is too small to compensate\n",
529 dev_warn(di->ipu->dev, "failed to adjust videomode\n");
533 dev_dbg(di->ipu->dev, "videomode adapted for IPU restrictions\n");
561 int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
567 dev_dbg(di->ipu->dev, "disp %d: panel size = %d x %d\n",
568 di->id, sig->mode.hactive, sig->mode.vactive);
570 dev_dbg(di->ipu->dev, "Clocks: IPU %luHz DI %luHz Needed %luHz\n",
571 clk_get_rate(di->clk_ipu),
572 clk_get_rate(di->clk_di),
577 ipu_di_config_clock(di, sig);
579 div = ipu_di_read(di, DI_BS_CLKGEN0) & 0xfff;
584 ipu_di_write(di, (div << 16), DI_BS_CLKGEN1);
586 ipu_di_data_wave_config(di, SYNC_WAVE, div - 1, div - 1);
587 ipu_di_data_pin_config(di, SYNC_WAVE, DI_PIN15, 3, 0, div * 2);
589 di_gen = ipu_di_read(di, DI_GENERAL) & DI_GEN_DI_CLK_EXT;
593 ipu_di_sync_config_interlaced(di, sig);
600 ipu_di_sync_config_noninterlaced(di, sig, div);
603 if (di->id == 1)
620 ipu_di_write(di, di_gen, DI_GENERAL);
622 ipu_di_write(di, (--vsync_cnt << DI_VSYNC_SEL_OFFSET) | 0x00000002,
625 reg = ipu_di_read(di, DI_POL);
633 ipu_di_write(di, reg, DI_POL);
641 int ipu_di_enable(struct ipu_di *di)
645 WARN_ON(IS_ERR(di->clk_di_pixel));
647 ret = clk_prepare_enable(di->clk_di_pixel);
651 ipu_module_enable(di->ipu, di->module);
657 int ipu_di_disable(struct ipu_di *di)
659 WARN_ON(IS_ERR(di->clk_di_pixel));
661 ipu_module_disable(di->ipu, di->module);
663 clk_disable_unprepare(di->clk_di_pixel);
669 int ipu_di_get_num(struct ipu_di *di)
671 return di->id;
679 struct ipu_di *di;
684 di = ipu->di_priv[disp];
688 if (di->inuse) {
689 di = ERR_PTR(-EBUSY);
693 di->inuse = true;
697 return di;
701 void ipu_di_put(struct ipu_di *di)
705 di->inuse = false;
715 struct ipu_di *di;
720 di = devm_kzalloc(dev, sizeof(*di), GFP_KERNEL);
721 if (!di)
724 ipu->di_priv[id] = di;
726 di->clk_di = devm_clk_get(dev, id ? "di1" : "di0");
727 if (IS_ERR(di->clk_di))
728 return PTR_ERR(di->clk_di);
730 di->module = module;
731 di->id = id;
732 di->clk_ipu = clk_ipu;
733 di->base = devm_ioremap(dev, base, PAGE_SIZE);
734 if (!di->base)
737 ipu_di_write(di, 0x10, DI_BS_CLKGEN0);
740 id, base, di->base);
741 di->inuse = false;
742 di->ipu = ipu;