mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
5.2 KiB
184 lines
5.2 KiB
/* SPDX-License-Identifier: GPL-2.0-only */ |
|
/* |
|
* Copyright (C) 2010 Texas Instruments Inc |
|
*/ |
|
#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; |
|
/* |
|
* If output capabilities include dv_timings, list supported timings |
|
* 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 |
|
*/ |
|
u32 if_params; |
|
}; |
|
|
|
/* 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; |
|
}; |
|
|
|
/*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; |
|
}; |
|
|
|
/* 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; |
|
/* amplifier information goes here */ |
|
struct amp_config_info *amp; |
|
unsigned 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 { |
|
/* 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 */ |
|
int (*s_dv_timings)(struct vpbe_device *vpbe_dev, |
|
struct v4l2_dv_timings *dv_timings); |
|
|
|
/* Get DV presets supported at the output */ |
|
int (*g_dv_timings)(struct vpbe_device *vpbe_dev, |
|
struct v4l2_dv_timings *dv_timings); |
|
|
|
/* Enumerate the DV Presets supported at the output */ |
|
int (*enum_dv_timings)(struct vpbe_device *vpbe_dev, |
|
struct v4l2_enum_dv_timings *timings_info); |
|
|
|
/* 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; |
|
/* external amplifier v4l2 subdevice */ |
|
struct v4l2_subdev *amp; |
|
struct mutex lock; |
|
/* device initialized */ |
|
int initialized; |
|
/* vpbe dac clock */ |
|
struct clk *dac_clk; |
|
/* osd_device pointer */ |
|
struct osd_state *osd_device; |
|
/* venc device pointer */ |
|
struct venc_platform_data *venc_device; |
|
/* |
|
* 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
|
|
|