136 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0-or-later */
 | 
						|
/*
 | 
						|
 * ST stm32 DMA2D - 2D Graphics Accelerator Driver
 | 
						|
 *
 | 
						|
 * Copyright (c) 2021 Dillon Min
 | 
						|
 * Dillon Min, <dillon.minfei@gmail.com>
 | 
						|
 *
 | 
						|
 * based on s5p-g2d
 | 
						|
 *
 | 
						|
 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
 | 
						|
 * Kamil Debski, <k.debski@samsung.com>
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef __DMA2D_H__
 | 
						|
#define __DMA2D_H__
 | 
						|
 | 
						|
#include <linux/platform_device.h>
 | 
						|
#include <media/v4l2-device.h>
 | 
						|
#include <media/v4l2-ctrls.h>
 | 
						|
 | 
						|
#define DMA2D_NAME "stm-dma2d"
 | 
						|
#define BUS_INFO "platform:stm-dma2d"
 | 
						|
enum dma2d_op_mode {
 | 
						|
	DMA2D_MODE_M2M,
 | 
						|
	DMA2D_MODE_M2M_FPC,
 | 
						|
	DMA2D_MODE_M2M_BLEND,
 | 
						|
	DMA2D_MODE_R2M
 | 
						|
};
 | 
						|
 | 
						|
enum dma2d_cmode {
 | 
						|
	/* output pfc cmode from ARGB888 to ARGB4444 */
 | 
						|
	DMA2D_CMODE_ARGB8888,
 | 
						|
	DMA2D_CMODE_RGB888,
 | 
						|
	DMA2D_CMODE_RGB565,
 | 
						|
	DMA2D_CMODE_ARGB1555,
 | 
						|
	DMA2D_CMODE_ARGB4444,
 | 
						|
	/* bg or fg pfc cmode from L8 to A4 */
 | 
						|
	DMA2D_CMODE_L8,
 | 
						|
	DMA2D_CMODE_AL44,
 | 
						|
	DMA2D_CMODE_AL88,
 | 
						|
	DMA2D_CMODE_L4,
 | 
						|
	DMA2D_CMODE_A8,
 | 
						|
	DMA2D_CMODE_A4
 | 
						|
};
 | 
						|
 | 
						|
enum dma2d_alpha_mode {
 | 
						|
	DMA2D_ALPHA_MODE_NO_MODIF,
 | 
						|
	DMA2D_ALPHA_MODE_REPLACE,
 | 
						|
	DMA2D_ALPHA_MODE_COMBINE
 | 
						|
};
 | 
						|
 | 
						|
struct dma2d_fmt {
 | 
						|
	u32	fourcc;
 | 
						|
	int	depth;
 | 
						|
	enum dma2d_cmode cmode;
 | 
						|
};
 | 
						|
 | 
						|
struct dma2d_frame {
 | 
						|
	/* Original dimensions */
 | 
						|
	u32	width;
 | 
						|
	u32	height;
 | 
						|
	/* Crop size */
 | 
						|
	u32	c_width;
 | 
						|
	u32	c_height;
 | 
						|
	/* Offset */
 | 
						|
	u32	o_width;
 | 
						|
	u32	o_height;
 | 
						|
	u32	bottom;
 | 
						|
	u32	right;
 | 
						|
	u16	line_offset;
 | 
						|
	/* Image format */
 | 
						|
	struct dma2d_fmt *fmt;
 | 
						|
	/* [0]: blue
 | 
						|
	 * [1]: green
 | 
						|
	 * [2]: red
 | 
						|
	 * [3]: alpha
 | 
						|
	 */
 | 
						|
	u8	a_rgb[4];
 | 
						|
	/*
 | 
						|
	 * AM[1:0] of DMA2D_FGPFCCR
 | 
						|
	 */
 | 
						|
	enum dma2d_alpha_mode a_mode;
 | 
						|
	u32 size;
 | 
						|
	unsigned int	sequence;
 | 
						|
};
 | 
						|
 | 
						|
struct dma2d_ctx {
 | 
						|
	struct v4l2_fh fh;
 | 
						|
	struct dma2d_dev	*dev;
 | 
						|
	struct dma2d_frame	cap;
 | 
						|
	struct dma2d_frame	out;
 | 
						|
	struct dma2d_frame	bg;
 | 
						|
	/* fb_buf always point to bg address */
 | 
						|
	struct v4l2_framebuffer	fb_buf;
 | 
						|
	/*
 | 
						|
	 * MODE[17:16] of DMA2D_CR
 | 
						|
	 */
 | 
						|
	enum dma2d_op_mode	op_mode;
 | 
						|
	struct v4l2_ctrl_handler ctrl_handler;
 | 
						|
	enum v4l2_colorspace	colorspace;
 | 
						|
	enum v4l2_ycbcr_encoding ycbcr_enc;
 | 
						|
	enum v4l2_xfer_func	xfer_func;
 | 
						|
	enum v4l2_quantization	quant;
 | 
						|
};
 | 
						|
 | 
						|
struct dma2d_dev {
 | 
						|
	struct v4l2_device	v4l2_dev;
 | 
						|
	struct v4l2_m2m_dev	*m2m_dev;
 | 
						|
	struct video_device	*vfd;
 | 
						|
	/* for device open/close etc */
 | 
						|
	struct mutex		mutex;
 | 
						|
	/* to avoid the conflict with device running and user setting
 | 
						|
	 * at the same time
 | 
						|
	 */
 | 
						|
	spinlock_t		ctrl_lock;
 | 
						|
	atomic_t		num_inst;
 | 
						|
	void __iomem		*regs;
 | 
						|
	struct clk		*gate;
 | 
						|
	struct dma2d_ctx	*curr;
 | 
						|
	int irq;
 | 
						|
};
 | 
						|
 | 
						|
void dma2d_start(struct dma2d_dev *d);
 | 
						|
u32 dma2d_get_int(struct dma2d_dev *d);
 | 
						|
void dma2d_clear_int(struct dma2d_dev *d);
 | 
						|
void dma2d_config_out(struct dma2d_dev *d, struct dma2d_frame *frm,
 | 
						|
		      dma_addr_t o_addr);
 | 
						|
void dma2d_config_fg(struct dma2d_dev *d, struct dma2d_frame *frm,
 | 
						|
		     dma_addr_t f_addr);
 | 
						|
void dma2d_config_bg(struct dma2d_dev *d, struct dma2d_frame *frm,
 | 
						|
		     dma_addr_t b_addr);
 | 
						|
void dma2d_config_common(struct dma2d_dev *d, enum dma2d_op_mode op_mode,
 | 
						|
			 u16 width, u16 height);
 | 
						|
 | 
						|
#endif /* __DMA2D_H__ */
 |