brintos

brintos / linux-shallow public Read only

0
0
Text · 6.9 KiB · 50c3c79 Raw
289 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright (C) 2013 - 2014 Texas Instruments, Inc.4 *5 * Benoit Parrot <bparrot@ti.com>6 * Lad, Prabhakar <prabhakar.csengg@gmail.com>7 */8 9#ifndef AM437X_VPFE_H10#define AM437X_VPFE_H11 12#include <linux/am437x-vpfe.h>13#include <linux/clk.h>14#include <linux/completion.h>15#include <linux/device.h>16#include <linux/io.h>17#include <linux/i2c.h>18#include <linux/videodev2.h>19 20#include <media/v4l2-dev.h>21#include <media/v4l2-device.h>22#include <media/v4l2-ioctl.h>23#include <media/videobuf2-v4l2.h>24#include <media/videobuf2-dma-contig.h>25 26#include "am437x-vpfe_regs.h"27 28enum vpfe_pin_pol {29	VPFE_PINPOL_POSITIVE = 0,30	VPFE_PINPOL_NEGATIVE,31};32 33enum vpfe_hw_if_type {34	/* Raw Bayer */35	VPFE_RAW_BAYER = 0,36	/* BT656 - 8 bit */37	VPFE_BT656,38	/* BT656 - 10 bit */39	VPFE_BT656_10BIT,40	/* YCbCr - 8 bit with external sync */41	VPFE_YCBCR_SYNC_8,42	/* YCbCr - 16 bit with external sync */43	VPFE_YCBCR_SYNC_16,44};45 46/* interface description */47struct vpfe_hw_if_param {48	enum vpfe_hw_if_type if_type;49	enum vpfe_pin_pol hdpol;50	enum vpfe_pin_pol vdpol;51	unsigned int bus_width;52};53 54#define VPFE_MAX_SUBDEV		155#define VPFE_MAX_INPUTS		156 57struct vpfe_std_info {58	int active_pixels;59	int active_lines;60	/* current frame format */61	int frame_format;62};63 64struct vpfe_route {65	u32 input;66	u32 output;67};68 69struct vpfe_subdev_info {70	/* Sub device group id */71	int grp_id;72	/* inputs available at the sub device */73	struct v4l2_input inputs[VPFE_MAX_INPUTS];74	/* Sub dev routing information for each input */75	struct vpfe_route *routes;76	/* check if sub dev supports routing */77	int can_route;78	/* ccdc bus/interface configuration */79	struct vpfe_hw_if_param vpfe_param;80	struct v4l2_subdev *sd;81};82 83struct vpfe_config {84	/* information about each subdev */85	struct vpfe_subdev_info sub_devs[VPFE_MAX_SUBDEV];86	/* Flat array, arranged in groups */87	struct v4l2_async_connection *asd[VPFE_MAX_SUBDEV];88};89 90struct vpfe_cap_buffer {91	struct vb2_v4l2_buffer vb;92	struct list_head list;93};94 95enum ccdc_pixfmt {96	CCDC_PIXFMT_RAW = 0,97	CCDC_PIXFMT_YCBCR_16BIT,98	CCDC_PIXFMT_YCBCR_8BIT,99};100 101enum ccdc_frmfmt {102	CCDC_FRMFMT_PROGRESSIVE = 0,103	CCDC_FRMFMT_INTERLACED,104};105 106/* PIXEL ORDER IN MEMORY from LSB to MSB */107/* only applicable for 8-bit input mode  */108enum ccdc_pixorder {109	CCDC_PIXORDER_YCBYCR,110	CCDC_PIXORDER_CBYCRY,111};112 113enum ccdc_buftype {114	CCDC_BUFTYPE_FLD_INTERLEAVED,115	CCDC_BUFTYPE_FLD_SEPARATED116};117 118 119/* returns the highest bit used for the gamma */120static inline u8 ccdc_gamma_width_max_bit(enum vpfe_ccdc_gamma_width width)121{122	return 15 - width;123}124 125/* returns the highest bit used for this data size */126static inline u8 ccdc_data_size_max_bit(enum vpfe_ccdc_data_size sz)127{128	return sz == VPFE_CCDC_DATA_8BITS ? 7 : 15 - sz;129}130 131/* Structure for CCDC configuration parameters for raw capture mode */132struct ccdc_params_raw {133	/* pixel format */134	enum ccdc_pixfmt pix_fmt;135	/* progressive or interlaced frame */136	enum ccdc_frmfmt frm_fmt;137	struct v4l2_rect win;138	/* Current Format Bytes Per Pixels */139	unsigned int bytesperpixel;140	/* Current Format Bytes per Lines141	 * (Aligned to 32 bytes) used for HORZ_INFO142	 */143	unsigned int bytesperline;144	/* field id polarity */145	enum vpfe_pin_pol fid_pol;146	/* vertical sync polarity */147	enum vpfe_pin_pol vd_pol;148	/* horizontal sync polarity */149	enum vpfe_pin_pol hd_pol;150	/* interleaved or separated fields */151	enum ccdc_buftype buf_type;152	/*153	 * enable to store the image in inverse154	 * order in memory(bottom to top)155	 */156	unsigned char image_invert_enable;157	/* configurable parameters */158	struct vpfe_ccdc_config_params_raw config_params;159};160 161struct ccdc_params_ycbcr {162	/* pixel format */163	enum ccdc_pixfmt pix_fmt;164	/* progressive or interlaced frame */165	enum ccdc_frmfmt frm_fmt;166	struct v4l2_rect win;167	/* Current Format Bytes Per Pixels */168	unsigned int bytesperpixel;169	/* Current Format Bytes per Lines170	 * (Aligned to 32 bytes) used for HORZ_INFO171	 */172	unsigned int bytesperline;173	/* field id polarity */174	enum vpfe_pin_pol fid_pol;175	/* vertical sync polarity */176	enum vpfe_pin_pol vd_pol;177	/* horizontal sync polarity */178	enum vpfe_pin_pol hd_pol;179	/* enable BT.656 embedded sync mode */180	int bt656_enable;181	/* cb:y:cr:y or y:cb:y:cr in memory */182	enum ccdc_pixorder pix_order;183	/* interleaved or separated fields  */184	enum ccdc_buftype buf_type;185};186 187/*188 * CCDC operational configuration189 */190struct ccdc_config {191	/* CCDC interface type */192	enum vpfe_hw_if_type if_type;193	/* Raw Bayer configuration */194	struct ccdc_params_raw bayer;195	/* YCbCr configuration */196	struct ccdc_params_ycbcr ycbcr;197	/* ccdc base address */198	void __iomem *base_addr;199};200 201struct vpfe_ccdc {202	struct ccdc_config ccdc_cfg;203	u32 ccdc_ctx[VPFE_REG_END / sizeof(u32)];204};205 206/*207 * struct vpfe_fmt - VPFE media bus format information208 * fourcc: V4L2 pixel format code209 * code: V4L2 media bus format code210 * bitsperpixel: Bits per pixel over the bus211 */212struct vpfe_fmt {213	u32 fourcc;214	u32 code;215	u32 bitsperpixel;216};217 218/*219 * When formats[] is modified make sure to adjust this value also.220 * Expect compile time warnings if VPFE_NUM_FORMATS is smaller then221 * the number of elements in formats[].222 */223#define VPFE_NUM_FORMATS	10224 225struct vpfe_device {226	/* V4l2 specific parameters */227	/* Identifies video device for this channel */228	struct video_device video_dev;229	/* sub devices */230	struct v4l2_subdev **sd;231	/* vpfe cfg */232	struct vpfe_config *cfg;233	/* V4l2 device */234	struct v4l2_device v4l2_dev;235	/* parent device */236	struct device *pdev;237	/* subdevice async Notifier */238	struct v4l2_async_notifier notifier;239	/* Indicates id of the field which is being displayed */240	unsigned field;241	unsigned sequence;242	/* current interface type */243	struct vpfe_hw_if_param vpfe_if_params;244	/* ptr to currently selected sub device */245	struct vpfe_subdev_info *current_subdev;246	/* current input at the sub device */247	int current_input;248	/* Keeps track of the information about the standard */249	struct vpfe_std_info std_info;250	/* std index into std table */251	int std_index;252	/* IRQs used when CCDC output to SDRAM */253	unsigned int irq;254	/* Pointer pointing to current v4l2_buffer */255	struct vpfe_cap_buffer *cur_frm;256	/* Pointer pointing to next v4l2_buffer */257	struct vpfe_cap_buffer *next_frm;258	/* Used to store pixel format */259	struct v4l2_format fmt;260	/* Used to keep a reference to the current vpfe_fmt */261	struct vpfe_fmt *current_vpfe_fmt;262	struct vpfe_fmt	*active_fmt[VPFE_NUM_FORMATS];263	unsigned int num_active_fmt;264 265	/*266	 * used when IMP is chained to store the crop window which267	 * is different from the image window268	 */269	struct v4l2_rect crop;270	/* Buffer queue used in vb2 */271	struct vb2_queue buffer_queue;272	/* Queue of filled frames */273	struct list_head dma_queue;274	/* IRQ lock for DMA queue */275	spinlock_t dma_queue_lock;276	/* lock used to access this structure */277	struct mutex lock;278	/*279	 * offset where second field starts from the starting of the280	 * buffer for field separated YCbCr formats281	 */282	u32 field_off;283	struct vpfe_ccdc ccdc;284	int stopping;285	struct completion capture_stop;286};287 288#endif	/* AM437X_VPFE_H */289