static int mdp3_dmap_config(struct mdp3_dma *dma, struct mdp3_dma_source *source_config, struct mdp3_dma_output_config *output_config) { u32 dma_p_cfg_reg, dma_p_size, dma_p_out_xy; dma_p_cfg_reg = source_config->format << 25; if (output_config->dither_en) dma_p_cfg_reg |= BIT(24); dma_p_cfg_reg |= output_config->out_sel << 19; dma_p_cfg_reg |= output_config->bit_mask_polarity << 18; dma_p_cfg_reg |= output_config->color_components_flip << 14; dma_p_cfg_reg |= output_config->pack_pattern << 8; dma_p_cfg_reg |= output_config->pack_align << 7; dma_p_cfg_reg |= output_config->color_comp_out_bits; dma_p_size = source_config->width | (source_config->height << 16); dma_p_out_xy = source_config->x | (source_config->y << 16); MDP3_REG_WRITE(MDP3_REG_DMA_P_CONFIG, dma_p_cfg_reg); MDP3_REG_WRITE(MDP3_REG_DMA_P_SIZE, dma_p_size); MDP3_REG_WRITE(MDP3_REG_DMA_P_IBUF_ADDR, (u32)source_config->buf); MDP3_REG_WRITE(MDP3_REG_DMA_P_IBUF_Y_STRIDE, source_config->stride); MDP3_REG_WRITE(MDP3_REG_DMA_P_OUT_XY, dma_p_out_xy); MDP3_REG_WRITE(MDP3_REG_DMA_P_FETCH_CFG, 0x40); dma->source_config = *source_config; dma->output_config = *output_config; mdp3_dma_sync_config(dma, source_config); mdp3_irq_enable(MDP3_INTR_LCDC_UNDERFLOW); mdp3_dma_callback_setup(dma); return 0; }
static int mdp3_dmas_config(struct mdp3_dma *dma, struct mdp3_dma_source *source_config, struct mdp3_dma_output_config *output_config) { u32 dma_s_cfg_reg, dma_s_size, dma_s_out_xy; dma_s_cfg_reg = source_config->format << 25; if (output_config->dither_en) dma_s_cfg_reg |= BIT(24); dma_s_cfg_reg |= output_config->out_sel << 19; dma_s_cfg_reg |= output_config->bit_mask_polarity << 18; dma_s_cfg_reg |= output_config->color_components_flip << 14; dma_s_cfg_reg |= output_config->pack_pattern << 8; dma_s_cfg_reg |= output_config->pack_align << 7; dma_s_cfg_reg |= output_config->color_comp_out_bits; dma_s_size = source_config->width | (source_config->height << 16); dma_s_out_xy = source_config->x | (source_config->y << 16); MDP3_REG_WRITE(MDP3_REG_DMA_S_CONFIG, dma_s_cfg_reg); MDP3_REG_WRITE(MDP3_REG_DMA_S_SIZE, dma_s_size); MDP3_REG_WRITE(MDP3_REG_DMA_S_IBUF_ADDR, (u32)source_config->buf); MDP3_REG_WRITE(MDP3_REG_DMA_S_IBUF_Y_STRIDE, source_config->stride); MDP3_REG_WRITE(MDP3_REG_DMA_S_OUT_XY, dma_s_out_xy); MDP3_REG_WRITE(MDP3_REG_SECONDARY_RD_PTR_IRQ, 0x10); dma->source_config = *source_config; dma->output_config = *output_config; mdp3_dma_callback_setup(dma); return 0; }
static int mdp3_dmap_config(struct mdp3_dma *dma, struct mdp3_dma_source *source_config, struct mdp3_dma_output_config *output_config) { u32 dma_p_cfg_reg, dma_p_size, dma_p_out_xy; dma_p_cfg_reg = source_config->format << 25; if (output_config->dither_en) dma_p_cfg_reg |= BIT(24); dma_p_cfg_reg |= output_config->out_sel << 19; dma_p_cfg_reg |= output_config->bit_mask_polarity << 18; dma_p_cfg_reg |= output_config->color_components_flip << 14; dma_p_cfg_reg |= output_config->pack_pattern << 8; dma_p_cfg_reg |= output_config->pack_align << 7; dma_p_cfg_reg |= output_config->color_comp_out_bits; dma_p_size = source_config->width | (source_config->height << 16); dma_p_out_xy = source_config->x | (source_config->y << 16); MDP3_REG_WRITE(MDP3_REG_DMA_P_CONFIG, dma_p_cfg_reg); MDP3_REG_WRITE(MDP3_REG_DMA_P_SIZE, dma_p_size); MDP3_REG_WRITE(MDP3_REG_DMA_P_IBUF_ADDR, (u32)source_config->buf); MDP3_REG_WRITE(MDP3_REG_DMA_P_IBUF_Y_STRIDE, source_config->stride); MDP3_REG_WRITE(MDP3_REG_DMA_P_OUT_XY, dma_p_out_xy); /* * NOTE: MDP_DMA_P_FETCH_CFG: max_burst_size need to use value 4, not * the default 16 for MDP hang issue workaround */ //MDP3_REG_WRITE(MDP3_REG_DMA_P_FETCH_CFG, 0x20); //to solve the blue flicker of display MDP3_REG_WRITE(MDP3_REG_DMA_P_FETCH_CFG, 0x40); MDP3_REG_WRITE(MDP3_REG_PRIMARY_RD_PTR_IRQ, 0x10); dma->source_config = *source_config; dma->output_config = *output_config; mdp3_dma_sync_config(dma, source_config); mdp3_irq_enable(MDP3_INTR_LCDC_UNDERFLOW); mdp3_dma_callback_setup(dma); return 0; }