| 
									
										
										
										
											2011-06-17 04:01:32 -03:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (C) 2010 Texas Instruments Inc | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation version 2. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software | 
					
						
							|  |  |  |  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifndef _VPBE_H
 | 
					
						
							|  |  |  | #define _VPBE_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/videodev2.h>
 | 
					
						
							|  |  |  | #include <linux/i2c.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <media/v4l2-dev.h>
 | 
					
						
							|  |  |  | #include <media/v4l2-ioctl.h>
 | 
					
						
							|  |  |  | #include <media/v4l2-device.h>
 | 
					
						
							|  |  |  | #include <media/davinci/vpbe_osd.h>
 | 
					
						
							|  |  |  | #include <media/davinci/vpbe_venc.h>
 | 
					
						
							|  |  |  | #include <media/davinci/vpbe_types.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* OSD configuration info */ | 
					
						
							|  |  |  | struct osd_config_info { | 
					
						
							|  |  |  | 	char module_name[32]; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct vpbe_output { | 
					
						
							|  |  |  | 	struct v4l2_output output; | 
					
						
							|  |  |  | 	/*
 | 
					
						
							| 
									
										
										
										
											2012-10-01 11:39:46 -03:00
										 |  |  | 	 * If output capabilities include dv_timings, list supported timings | 
					
						
							| 
									
										
										
										
											2011-06-17 04:01:32 -03:00
										 |  |  | 	 * below | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	char *subdev_name; | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * defualt_mode identifies the default timings set at the venc or | 
					
						
							|  |  |  | 	 * external encoder. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	char *default_mode; | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * Fields below are used for supporting multiple modes. For example, | 
					
						
							|  |  |  | 	 * LCD panel might support different modes and they are listed here. | 
					
						
							|  |  |  | 	 * Similarly for supporting external encoders, lcd controller port | 
					
						
							|  |  |  | 	 * requires a set of non-standard timing values to be listed here for | 
					
						
							|  |  |  | 	 * each supported mode since venc is used in non-standard timing mode | 
					
						
							|  |  |  | 	 * for interfacing with external encoder similar to configuring lcd | 
					
						
							|  |  |  | 	 * panel timings | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	unsigned int num_modes; | 
					
						
							|  |  |  | 	struct vpbe_enc_mode_info *modes; | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * Bus configuration goes here for external encoders. Some encoders | 
					
						
							|  |  |  | 	 * may require multiple interface types for each of the output. For | 
					
						
							|  |  |  | 	 * example, SD modes would use YCC8 where as HD mode would use YCC16. | 
					
						
							|  |  |  | 	 * Not sure if this is needed on a per mode basis instead of per | 
					
						
							|  |  |  | 	 * output basis. If per mode is needed, we may have to move this to | 
					
						
							|  |  |  | 	 * mode_info structure | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2011-04-30 03:01:40 -03:00
										 |  |  | 	enum v4l2_mbus_pixelcode if_params; | 
					
						
							| 
									
										
										
										
											2011-06-17 04:01:32 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* encoder configuration info */ | 
					
						
							|  |  |  | struct encoder_config_info { | 
					
						
							|  |  |  | 	char module_name[32]; | 
					
						
							|  |  |  | 	/* Is this an i2c device ? */ | 
					
						
							|  |  |  | 	unsigned int is_i2c:1; | 
					
						
							|  |  |  | 	/* i2c subdevice board info */ | 
					
						
							|  |  |  | 	struct i2c_board_info board_info; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-30 03:01:40 -03:00
										 |  |  | /*amplifier configuration info */ | 
					
						
							|  |  |  | struct amp_config_info { | 
					
						
							|  |  |  | 	char module_name[32]; | 
					
						
							|  |  |  | 	/* Is this an i2c device ? */ | 
					
						
							|  |  |  | 	unsigned int is_i2c:1; | 
					
						
							|  |  |  | 	/* i2c subdevice board info */ | 
					
						
							|  |  |  | 	struct i2c_board_info board_info; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-17 04:01:32 -03:00
										 |  |  | /* structure for defining vpbe display subsystem components */ | 
					
						
							|  |  |  | struct vpbe_config { | 
					
						
							|  |  |  | 	char module_name[32]; | 
					
						
							|  |  |  | 	/* i2c bus adapter no */ | 
					
						
							|  |  |  | 	int i2c_adapter_id; | 
					
						
							|  |  |  | 	struct osd_config_info osd; | 
					
						
							|  |  |  | 	struct encoder_config_info venc; | 
					
						
							|  |  |  | 	/* external encoder information goes here */ | 
					
						
							|  |  |  | 	int num_ext_encoders; | 
					
						
							|  |  |  | 	struct encoder_config_info *ext_encoders; | 
					
						
							| 
									
										
										
										
											2011-04-30 03:01:40 -03:00
										 |  |  | 	/* amplifier information goes here */ | 
					
						
							|  |  |  | 	struct amp_config_info *amp; | 
					
						
							| 
									
										
										
										
											2011-06-17 04:01:32 -03:00
										 |  |  | 	int num_outputs; | 
					
						
							|  |  |  | 	/* Order is venc outputs followed by LCD and then external encoders */ | 
					
						
							|  |  |  | 	struct vpbe_output *outputs; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct vpbe_device; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct vpbe_device_ops { | 
					
						
							|  |  |  | 	/* crop cap for the display */ | 
					
						
							|  |  |  | 	int (*g_cropcap)(struct vpbe_device *vpbe_dev, | 
					
						
							|  |  |  | 			 struct v4l2_cropcap *cropcap); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Enumerate the outputs */ | 
					
						
							|  |  |  | 	int (*enum_outputs)(struct vpbe_device *vpbe_dev, | 
					
						
							|  |  |  | 			    struct v4l2_output *output); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Set output to the given index */ | 
					
						
							|  |  |  | 	int (*set_output)(struct vpbe_device *vpbe_dev, | 
					
						
							|  |  |  | 			 int index); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Get current output */ | 
					
						
							|  |  |  | 	unsigned int (*get_output)(struct vpbe_device *vpbe_dev); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Set DV preset at current output */ | 
					
						
							| 
									
										
										
										
											2012-10-01 11:39:46 -03:00
										 |  |  | 	int (*s_dv_timings)(struct vpbe_device *vpbe_dev, | 
					
						
							|  |  |  | 			   struct v4l2_dv_timings *dv_timings); | 
					
						
							| 
									
										
										
										
											2011-06-17 04:01:32 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* Get DV presets supported at the output */ | 
					
						
							| 
									
										
										
										
											2012-10-01 11:39:46 -03:00
										 |  |  | 	int (*g_dv_timings)(struct vpbe_device *vpbe_dev, | 
					
						
							|  |  |  | 			   struct v4l2_dv_timings *dv_timings); | 
					
						
							| 
									
										
										
										
											2011-06-17 04:01:32 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* Enumerate the DV Presets supported at the output */ | 
					
						
							| 
									
										
										
										
											2012-10-01 11:39:46 -03:00
										 |  |  | 	int (*enum_dv_timings)(struct vpbe_device *vpbe_dev, | 
					
						
							|  |  |  | 			       struct v4l2_enum_dv_timings *timings_info); | 
					
						
							| 
									
										
										
										
											2011-06-17 04:01:32 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* Set std at the output */ | 
					
						
							|  |  |  | 	int (*s_std)(struct vpbe_device *vpbe_dev, v4l2_std_id *std_id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Get the current std at the output */ | 
					
						
							|  |  |  | 	int (*g_std)(struct vpbe_device *vpbe_dev, v4l2_std_id *std_id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* initialize the device */ | 
					
						
							|  |  |  | 	int (*initialize)(struct device *dev, struct vpbe_device *vpbe_dev); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* De-initialize the device */ | 
					
						
							|  |  |  | 	void (*deinitialize)(struct device *dev, struct vpbe_device *vpbe_dev); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Get the current mode info */ | 
					
						
							|  |  |  | 	int (*get_mode_info)(struct vpbe_device *vpbe_dev, | 
					
						
							|  |  |  | 			     struct vpbe_enc_mode_info*); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * Set the current mode in the encoder. Alternate way of setting | 
					
						
							|  |  |  | 	 * standard or DV preset or custom timings in the encoder | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	int (*set_mode)(struct vpbe_device *vpbe_dev, | 
					
						
							|  |  |  | 			struct vpbe_enc_mode_info*); | 
					
						
							|  |  |  | 	/* Power management operations */ | 
					
						
							|  |  |  | 	int (*suspend)(struct vpbe_device *vpbe_dev); | 
					
						
							|  |  |  | 	int (*resume)(struct vpbe_device *vpbe_dev); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* struct for vpbe device */ | 
					
						
							|  |  |  | struct vpbe_device { | 
					
						
							|  |  |  | 	/* V4l2 device */ | 
					
						
							|  |  |  | 	struct v4l2_device v4l2_dev; | 
					
						
							|  |  |  | 	/* vpbe dispay controller cfg */ | 
					
						
							|  |  |  | 	struct vpbe_config *cfg; | 
					
						
							|  |  |  | 	/* parent device */ | 
					
						
							|  |  |  | 	struct device *pdev; | 
					
						
							|  |  |  | 	/* external encoder v4l2 sub devices */ | 
					
						
							|  |  |  | 	struct v4l2_subdev **encoders; | 
					
						
							|  |  |  | 	/* current encoder index */ | 
					
						
							|  |  |  | 	int current_sd_index; | 
					
						
							| 
									
										
										
										
											2011-04-30 03:01:40 -03:00
										 |  |  | 	/* external amplifier v4l2 subdevice */ | 
					
						
							|  |  |  | 	struct v4l2_subdev *amp; | 
					
						
							| 
									
										
										
										
											2011-06-17 04:01:32 -03:00
										 |  |  | 	struct mutex lock; | 
					
						
							|  |  |  | 	/* device initialized */ | 
					
						
							|  |  |  | 	int initialized; | 
					
						
							|  |  |  | 	/* vpbe dac clock */ | 
					
						
							|  |  |  | 	struct clk *dac_clk; | 
					
						
							|  |  |  | 	/* osd_device pointer */ | 
					
						
							|  |  |  | 	struct osd_state *osd_device; | 
					
						
							| 
									
										
										
										
											2011-04-30 03:01:40 -03:00
										 |  |  | 	/* venc device pointer */ | 
					
						
							|  |  |  | 	struct venc_platform_data *venc_device; | 
					
						
							| 
									
										
										
										
											2011-06-17 04:01:32 -03:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * fields below are accessed by users of vpbe_device. Not the | 
					
						
							|  |  |  | 	 * ones above | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* current output */ | 
					
						
							|  |  |  | 	int current_out_index; | 
					
						
							|  |  |  | 	/* lock used by caller to do atomic operation on vpbe device */ | 
					
						
							|  |  |  | 	/* current timings set in the controller */ | 
					
						
							|  |  |  | 	struct vpbe_enc_mode_info current_timings; | 
					
						
							|  |  |  | 	/* venc sub device */ | 
					
						
							|  |  |  | 	struct v4l2_subdev *venc; | 
					
						
							|  |  |  | 	/* device operations below */ | 
					
						
							|  |  |  | 	struct vpbe_device_ops ops; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |