166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli/* 266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * Copyright (C) 2010 Texas Instruments Inc 366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * 466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * This program is free software; you can redistribute it and/or modify 566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * it under the terms of the GNU General Public License as published by 666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * the Free Software Foundation version 2. 766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * 866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * This program is distributed in the hope that it will be useful, 966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * but WITHOUT ANY WARRANTY; without even the implied warranty of 1066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * GNU General Public License for more details. 1266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * 1366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * You should have received a copy of the GNU General Public License 1466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * along with this program; if not, write to the Free Software 1566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 1666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli */ 1766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli#ifndef _VPBE_H 1866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli#define _VPBE_H 1966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 2066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli#include <linux/videodev2.h> 2166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli#include <linux/i2c.h> 2266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 2366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli#include <media/v4l2-dev.h> 2466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli#include <media/v4l2-ioctl.h> 2566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli#include <media/v4l2-device.h> 2666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli#include <media/davinci/vpbe_osd.h> 2766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli#include <media/davinci/vpbe_venc.h> 2866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli#include <media/davinci/vpbe_types.h> 2966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 3066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli/* OSD configuration info */ 3166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadlistruct osd_config_info { 3266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli char module_name[32]; 3366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli}; 3466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 3566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadlistruct vpbe_output { 3666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct v4l2_output output; 3766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* 3866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * If output capabilities include dv_preset, list supported presets 3966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * below 4066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli */ 4166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli char *subdev_name; 4266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* 4366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * defualt_mode identifies the default timings set at the venc or 4466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * external encoder. 4566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli */ 4666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli char *default_mode; 4766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* 4866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * Fields below are used for supporting multiple modes. For example, 4966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * LCD panel might support different modes and they are listed here. 5066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * Similarly for supporting external encoders, lcd controller port 5166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * requires a set of non-standard timing values to be listed here for 5266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * each supported mode since venc is used in non-standard timing mode 5366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * for interfacing with external encoder similar to configuring lcd 5466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * panel timings 5566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli */ 5666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli unsigned int num_modes; 5766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct vpbe_enc_mode_info *modes; 5866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* 5966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * Bus configuration goes here for external encoders. Some encoders 6066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * may require multiple interface types for each of the output. For 6166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * example, SD modes would use YCC8 where as HD mode would use YCC16. 6266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * Not sure if this is needed on a per mode basis instead of per 6366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * output basis. If per mode is needed, we may have to move this to 6466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * mode_info structure 6566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli */ 669a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli enum v4l2_mbus_pixelcode if_params; 6766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli}; 6866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 6966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli/* encoder configuration info */ 7066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadlistruct encoder_config_info { 7166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli char module_name[32]; 7266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* Is this an i2c device ? */ 7366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli unsigned int is_i2c:1; 7466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* i2c subdevice board info */ 7566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct i2c_board_info board_info; 7666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli}; 7766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 789a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli/*amplifier configuration info */ 799a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadlistruct amp_config_info { 809a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli char module_name[32]; 819a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli /* Is this an i2c device ? */ 829a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli unsigned int is_i2c:1; 839a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli /* i2c subdevice board info */ 849a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli struct i2c_board_info board_info; 859a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli}; 869a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli 8766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli/* structure for defining vpbe display subsystem components */ 8866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadlistruct vpbe_config { 8966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli char module_name[32]; 9066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* i2c bus adapter no */ 9166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int i2c_adapter_id; 9266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct osd_config_info osd; 9366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct encoder_config_info venc; 9466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* external encoder information goes here */ 9566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int num_ext_encoders; 9666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct encoder_config_info *ext_encoders; 979a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli /* amplifier information goes here */ 989a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli struct amp_config_info *amp; 9966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int num_outputs; 10066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* Order is venc outputs followed by LCD and then external encoders */ 10166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct vpbe_output *outputs; 10266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli}; 10366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 10466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadlistruct vpbe_device; 10566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 10666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadlistruct vpbe_device_ops { 10766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* crop cap for the display */ 10866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int (*g_cropcap)(struct vpbe_device *vpbe_dev, 10966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct v4l2_cropcap *cropcap); 11066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 11166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* Enumerate the outputs */ 11266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int (*enum_outputs)(struct vpbe_device *vpbe_dev, 11366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct v4l2_output *output); 11466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 11566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* Set output to the given index */ 11666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int (*set_output)(struct vpbe_device *vpbe_dev, 11766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int index); 11866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 11966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* Get current output */ 12066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli unsigned int (*get_output)(struct vpbe_device *vpbe_dev); 12166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 12266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* Set DV preset at current output */ 12366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int (*s_dv_preset)(struct vpbe_device *vpbe_dev, 12466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct v4l2_dv_preset *dv_preset); 12566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 12666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* Get DV presets supported at the output */ 12766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int (*g_dv_preset)(struct vpbe_device *vpbe_dev, 12866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct v4l2_dv_preset *dv_preset); 12966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 13066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* Enumerate the DV Presets supported at the output */ 13166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int (*enum_dv_presets)(struct vpbe_device *vpbe_dev, 13266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct v4l2_dv_enum_preset *preset_info); 13366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 13466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* Set std at the output */ 13566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int (*s_std)(struct vpbe_device *vpbe_dev, v4l2_std_id *std_id); 13666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 13766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* Get the current std at the output */ 13866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int (*g_std)(struct vpbe_device *vpbe_dev, v4l2_std_id *std_id); 13966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 14066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* initialize the device */ 14166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int (*initialize)(struct device *dev, struct vpbe_device *vpbe_dev); 14266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 14366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* De-initialize the device */ 14466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli void (*deinitialize)(struct device *dev, struct vpbe_device *vpbe_dev); 14566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 14666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* Get the current mode info */ 14766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int (*get_mode_info)(struct vpbe_device *vpbe_dev, 14866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct vpbe_enc_mode_info*); 14966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 15066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* 15166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * Set the current mode in the encoder. Alternate way of setting 15266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * standard or DV preset or custom timings in the encoder 15366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli */ 15466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int (*set_mode)(struct vpbe_device *vpbe_dev, 15566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct vpbe_enc_mode_info*); 15666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* Power management operations */ 15766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int (*suspend)(struct vpbe_device *vpbe_dev); 15866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int (*resume)(struct vpbe_device *vpbe_dev); 15966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli}; 16066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 16166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli/* struct for vpbe device */ 16266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadlistruct vpbe_device { 16366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* V4l2 device */ 16466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct v4l2_device v4l2_dev; 16566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* vpbe dispay controller cfg */ 16666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct vpbe_config *cfg; 16766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* parent device */ 16866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct device *pdev; 16966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* external encoder v4l2 sub devices */ 17066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct v4l2_subdev **encoders; 17166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* current encoder index */ 17266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int current_sd_index; 1739a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli /* external amplifier v4l2 subdevice */ 1749a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli struct v4l2_subdev *amp; 17566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct mutex lock; 17666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* device initialized */ 17766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int initialized; 17866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* vpbe dac clock */ 17966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct clk *dac_clk; 18066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* osd_device pointer */ 18166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct osd_state *osd_device; 1829a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli /* venc device pointer */ 1839a7f95ad1c946efdd7a7a72df27db738260a0fd8Manjunath Hadli struct venc_platform_data *venc_device; 18466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* 18566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * fields below are accessed by users of vpbe_device. Not the 18666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli * ones above 18766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli */ 18866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 18966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* current output */ 19066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli int current_out_index; 19166715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* lock used by caller to do atomic operation on vpbe device */ 19266715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* current timings set in the controller */ 19366715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct vpbe_enc_mode_info current_timings; 19466715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* venc sub device */ 19566715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct v4l2_subdev *venc; 19666715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli /* device operations below */ 19766715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli struct vpbe_device_ops ops; 19866715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli}; 19966715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli 20066715cdc3224a4e241c1a92856b9a4af3b70e06dManjunath Hadli#endif 201