/* * Copyright (C) 2014-2015 Freescale Semiconductor, Inc. * * The code contained herein is licensed under the GNU General Public * License. You may obtain a copy of the GNU General Public License * Version 2 or later at the following locations: * * http://www.opensource.org/licenses/gpl-license.html * http://www.gnu.org/copyleft/gpl.html */ #ifndef __LINUX_IPU_V3_PRE_H_ #define __LINUX_IPU_V3_PRE_H_ #define IPU_PRE_MAX_WIDTH 1920 #define IPU_PRE_MAX_BPP 4 #define IPU_PRE_SMALL_LINE 9 /* to workaround errata ERR009624*/ struct ipu_rect { int left; int top; int width; int height; }; struct ipu_pre_context { bool repeat; bool vflip; bool handshake_en; bool hsk_abort_en; unsigned int hsk_line_num; bool sdw_update; unsigned int block_size; unsigned int interlaced; unsigned int prefetch_mode; unsigned long cur_buf; unsigned long next_buf; unsigned int tile_fmt; unsigned int read_burst; unsigned int prefetch_input_bpp; unsigned int prefetch_input_pixel_fmt; unsigned int prefetch_shift_offset; unsigned int prefetch_shift_width; bool shift_bypass; bool field_inverse; bool tpr_coor_offset_en; /* the output of prefetch is * also the input of store */ struct ipu_rect prefetch_output_size; unsigned int prefetch_input_active_width; unsigned int prefetch_input_width; unsigned int prefetch_input_height; unsigned int store_pitch; int interlace_offset; bool store_en; unsigned int write_burst; unsigned int store_output_bpp; unsigned int sec_buf_off; unsigned int trd_buf_off; /* return for IPU fb caller */ unsigned long store_addr; }; /* * In order to workaround the PRE SoC bug recorded by errata ERR009624, * the software cannot write the PRE_CTRL register when the PRE writes * the PRE_CTRL register automatically to set the ENABLE bit(bit0) to 1 * in the PRE repeat mode. * The software mechanism to set the PRE_CTRL register is different for * PRE Y resolution higher than 9 lines and lower or equal to 9 lines. * Use this helper to check the Y resolution. */ static inline bool ipu_pre_yres_is_small(unsigned int yres) { return yres <= IPU_PRE_SMALL_LINE; } #ifdef CONFIG_MXC_IPU_V3_PRE int ipu_pre_alloc(int ipu_id, ipu_channel_t ipu_ch); void ipu_pre_free(unsigned int *id); unsigned long ipu_pre_alloc_double_buffer(unsigned int id, unsigned int size); void ipu_pre_free_double_buffer(unsigned int id); int ipu_pre_config(int id, struct ipu_pre_context *config); int ipu_pre_set_ctrl(unsigned int id, struct ipu_pre_context *config); int ipu_pre_enable(int id); void ipu_pre_disable(int id); int ipu_pre_set_fb_buffer(int id, bool resolve, unsigned long fb_paddr, unsigned int y_res, unsigned int x_crop, unsigned int y_crop, unsigned int sec_buf_off, unsigned int trd_buf_off); int ipu_pre_sdw_update(int id); #else int ipu_pre_alloc(int ipu_id, ipu_channel_t channel) { return -ENODEV; } void ipu_pre_free(unsigned int *id) { } unsigned long ipu_pre_alloc_double_buffer(unsigned int id, unsigned int size) { return -ENODEV; } void ipu_pre_free_double_buffer(unsigned int id) { } int ipu_pre_config(int id, struct ipu_pre_context *config) { return -ENODEV; } int ipu_pre_set_ctrl(unsigned int id, struct ipu_pre_context *config) { return -ENODEV; } int ipu_pre_enable(int id) { return -ENODEV; } void ipu_pre_disable(int id) { return; } int ipu_pre_set_fb_buffer(int id, bool resolve, unsigned long fb_paddr, unsigned int y_res, unsigned int x_crop, unsigned int y_crop, unsigned int sec_buf_off, unsigned int trd_buf_off) { return -ENODEV; } int ipu_pre_sdw_update(int id) { return -ENODEV; } #endif #endif /* __LINUX_IPU_V3_PRE_H_ */