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