Lines Matching refs:di

128 static inline u32 ipu_di_read(struct ipu_di *di, unsigned offset)  in ipu_di_read()  argument
130 return readl(di->base + offset); in ipu_di_read()
133 static inline void ipu_di_write(struct ipu_di *di, u32 value, unsigned offset) in ipu_di_write() argument
135 writel(value, di->base + offset); in ipu_di_write()
138 static void ipu_di_data_wave_config(struct ipu_di *di, in ipu_di_data_wave_config() argument
145 ipu_di_write(di, reg, DI_DW_GEN(wave_gen)); in ipu_di_data_wave_config()
148 static void ipu_di_data_pin_config(struct ipu_di *di, int wave_gen, int di_pin, in ipu_di_data_pin_config() argument
153 reg = ipu_di_read(di, DI_DW_GEN(wave_gen)); in ipu_di_data_pin_config()
156 ipu_di_write(di, reg, DI_DW_GEN(wave_gen)); in ipu_di_data_pin_config()
158 ipu_di_write(di, (down << 16) | up, DI_DW_SET(wave_gen, set)); in ipu_di_data_pin_config()
161 static void ipu_di_sync_config(struct ipu_di *di, struct di_sync_config *config, in ipu_di_sync_config() argument
175 dev_err(di->ipu->dev, "DI%d counters out of range.\n", in ipu_di_sync_config()
176 di->id); in ipu_di_sync_config()
184 ipu_di_write(di, reg, DI_SW_GEN0(wave_gen)); in ipu_di_sync_config()
198 ipu_di_write(di, reg, DI_SW_GEN1(wave_gen)); in ipu_di_sync_config()
200 reg = ipu_di_read(di, DI_STP_REP(wave_gen)); in ipu_di_sync_config()
203 ipu_di_write(di, reg, DI_STP_REP(wave_gen)); in ipu_di_sync_config()
207 static void ipu_di_sync_config_interlaced(struct ipu_di *di, in ipu_di_sync_config_interlaced() argument
266 ipu_di_sync_config(di, cfg, 0, ARRAY_SIZE(cfg)); in ipu_di_sync_config_interlaced()
269 reg = ipu_di_read(di, DI_SW_GEN1(9)); in ipu_di_sync_config_interlaced()
272 ipu_di_write(di, reg, DI_SW_GEN1(9)); in ipu_di_sync_config_interlaced()
274 ipu_di_write(di, v_total / 2 - 1, DI_SCR_CONF); in ipu_di_sync_config_interlaced()
277 static void ipu_di_sync_config_noninterlaced(struct ipu_di *di, in ipu_di_sync_config_noninterlaced() argument
398 ipu_di_write(di, v_total - 1, DI_SCR_CONF); in ipu_di_sync_config_noninterlaced()
400 ipu_di_sync_config(di, cfg, 0, ARRAY_SIZE(cfg)); in ipu_di_sync_config_noninterlaced()
402 ipu_di_sync_config(di, cfg_vga, 0, ARRAY_SIZE(cfg_vga)); in ipu_di_sync_config_noninterlaced()
405 static void ipu_di_config_clock(struct ipu_di *di, in ipu_di_config_clock() argument
418 clk = di->clk_di; in ipu_di_config_clock()
459 clkrate = clk_get_rate(di->clk_ipu); in ipu_di_config_clock()
466 dev_dbg(di->ipu->dev, " IPU clock can give %lu with divider %u, error %d.%u%%\n", in ipu_di_config_clock()
471 clk = di->clk_ipu; in ipu_di_config_clock()
478 clk = di->clk_di; in ipu_di_config_clock()
490 di->clk_di_pixel = clk; in ipu_di_config_clock()
493 ipu_di_write(di, clkgen0, DI_BS_CLKGEN0); in ipu_di_config_clock()
501 ipu_di_write(di, (clkgen0 >> 4) << 16, DI_BS_CLKGEN1); in ipu_di_config_clock()
504 val = ipu_di_read(di, DI_GENERAL) & ~DI_GEN_DI_CLK_EXT; in ipu_di_config_clock()
505 if (clk == di->clk_di) in ipu_di_config_clock()
507 ipu_di_write(di, val, DI_GENERAL); in ipu_di_config_clock()
509 dev_dbg(di->ipu->dev, "Want %luHz IPU %luHz DI %luHz using %s, %luHz\n", in ipu_di_config_clock()
511 clk_get_rate(di->clk_ipu), in ipu_di_config_clock()
512 clk_get_rate(di->clk_di), in ipu_di_config_clock()
513 clk == di->clk_di ? "DI" : "IPU", in ipu_di_config_clock()
514 clk_get_rate(di->clk_di_pixel) / (clkgen0 >> 4)); in ipu_di_config_clock()
521 int ipu_di_adjust_videomode(struct ipu_di *di, struct videomode *mode) in ipu_di_adjust_videomode() argument
537 dev_warn(di->ipu->dev, "failed to adjust videomode\n"); in ipu_di_adjust_videomode()
541 dev_warn(di->ipu->dev, "videomode adapted for IPU restrictions\n"); in ipu_di_adjust_videomode()
546 int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig) in ipu_di_init_sync_panel() argument
552 dev_dbg(di->ipu->dev, "disp %d: panel size = %d x %d\n", in ipu_di_init_sync_panel()
553 di->id, sig->mode.hactive, sig->mode.vactive); in ipu_di_init_sync_panel()
558 dev_dbg(di->ipu->dev, "Clocks: IPU %luHz DI %luHz Needed %luHz\n", in ipu_di_init_sync_panel()
559 clk_get_rate(di->clk_ipu), in ipu_di_init_sync_panel()
560 clk_get_rate(di->clk_di), in ipu_di_init_sync_panel()
565 ipu_di_config_clock(di, sig); in ipu_di_init_sync_panel()
567 div = ipu_di_read(di, DI_BS_CLKGEN0) & 0xfff; in ipu_di_init_sync_panel()
572 ipu_di_write(di, (div << 16), DI_BS_CLKGEN1); in ipu_di_init_sync_panel()
574 ipu_di_data_wave_config(di, SYNC_WAVE, div - 1, div - 1); in ipu_di_init_sync_panel()
575 ipu_di_data_pin_config(di, SYNC_WAVE, DI_PIN15, 3, 0, div * 2); in ipu_di_init_sync_panel()
577 di_gen = ipu_di_read(di, DI_GENERAL) & DI_GEN_DI_CLK_EXT; in ipu_di_init_sync_panel()
581 ipu_di_sync_config_interlaced(di, sig); in ipu_di_init_sync_panel()
595 ipu_di_sync_config_noninterlaced(di, sig, div); in ipu_di_init_sync_panel()
598 if (di->id == 1) in ipu_di_init_sync_panel()
627 ipu_di_write(di, di_gen, DI_GENERAL); in ipu_di_init_sync_panel()
629 ipu_di_write(di, (--vsync_cnt << DI_VSYNC_SEL_OFFSET) | 0x00000002, in ipu_di_init_sync_panel()
632 reg = ipu_di_read(di, DI_POL); in ipu_di_init_sync_panel()
640 ipu_di_write(di, reg, DI_POL); in ipu_di_init_sync_panel()
648 int ipu_di_enable(struct ipu_di *di) in ipu_di_enable() argument
652 WARN_ON(IS_ERR(di->clk_di_pixel)); in ipu_di_enable()
654 ret = clk_prepare_enable(di->clk_di_pixel); in ipu_di_enable()
658 ipu_module_enable(di->ipu, di->module); in ipu_di_enable()
664 int ipu_di_disable(struct ipu_di *di) in ipu_di_disable() argument
666 WARN_ON(IS_ERR(di->clk_di_pixel)); in ipu_di_disable()
668 ipu_module_disable(di->ipu, di->module); in ipu_di_disable()
670 clk_disable_unprepare(di->clk_di_pixel); in ipu_di_disable()
676 int ipu_di_get_num(struct ipu_di *di) in ipu_di_get_num() argument
678 return di->id; in ipu_di_get_num()
686 struct ipu_di *di; in ipu_di_get() local
691 di = ipu->di_priv[disp]; in ipu_di_get()
695 if (di->inuse) { in ipu_di_get()
696 di = ERR_PTR(-EBUSY); in ipu_di_get()
700 di->inuse = true; in ipu_di_get()
704 return di; in ipu_di_get()
708 void ipu_di_put(struct ipu_di *di) in ipu_di_put() argument
712 di->inuse = false; in ipu_di_put()
722 struct ipu_di *di; in ipu_di_init() local
727 di = devm_kzalloc(dev, sizeof(*di), GFP_KERNEL); in ipu_di_init()
728 if (!di) in ipu_di_init()
731 ipu->di_priv[id] = di; in ipu_di_init()
733 di->clk_di = devm_clk_get(dev, id ? "di1" : "di0"); in ipu_di_init()
734 if (IS_ERR(di->clk_di)) in ipu_di_init()
735 return PTR_ERR(di->clk_di); in ipu_di_init()
737 di->module = module; in ipu_di_init()
738 di->id = id; in ipu_di_init()
739 di->clk_ipu = clk_ipu; in ipu_di_init()
740 di->base = devm_ioremap(dev, base, PAGE_SIZE); in ipu_di_init()
741 if (!di->base) in ipu_di_init()
744 ipu_di_write(di, 0x10, DI_BS_CLKGEN0); in ipu_di_init()
747 id, base, di->base); in ipu_di_init()
748 di->inuse = false; in ipu_di_init()
749 di->ipu = ipu; in ipu_di_init()