cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vpbe.h (5298B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (C) 2010 Texas Instruments Inc
      4 */
      5#ifndef _VPBE_H
      6#define _VPBE_H
      7
      8#include <linux/videodev2.h>
      9#include <linux/i2c.h>
     10
     11#include <media/v4l2-dev.h>
     12#include <media/v4l2-ioctl.h>
     13#include <media/v4l2-device.h>
     14#include <media/davinci/vpbe_osd.h>
     15#include <media/davinci/vpbe_venc.h>
     16#include <media/davinci/vpbe_types.h>
     17
     18/* OSD configuration info */
     19struct osd_config_info {
     20	char module_name[32];
     21};
     22
     23struct vpbe_output {
     24	struct v4l2_output output;
     25	/*
     26	 * If output capabilities include dv_timings, list supported timings
     27	 * below
     28	 */
     29	char *subdev_name;
     30	/*
     31	 * defualt_mode identifies the default timings set at the venc or
     32	 * external encoder.
     33	 */
     34	char *default_mode;
     35	/*
     36	 * Fields below are used for supporting multiple modes. For example,
     37	 * LCD panel might support different modes and they are listed here.
     38	 * Similarly for supporting external encoders, lcd controller port
     39	 * requires a set of non-standard timing values to be listed here for
     40	 * each supported mode since venc is used in non-standard timing mode
     41	 * for interfacing with external encoder similar to configuring lcd
     42	 * panel timings
     43	 */
     44	unsigned int num_modes;
     45	struct vpbe_enc_mode_info *modes;
     46	/*
     47	 * Bus configuration goes here for external encoders. Some encoders
     48	 * may require multiple interface types for each of the output. For
     49	 * example, SD modes would use YCC8 where as HD mode would use YCC16.
     50	 * Not sure if this is needed on a per mode basis instead of per
     51	 * output basis. If per mode is needed, we may have to move this to
     52	 * mode_info structure
     53	 */
     54	u32 if_params;
     55};
     56
     57/* encoder configuration info */
     58struct encoder_config_info {
     59	char module_name[32];
     60	/* Is this an i2c device ? */
     61	unsigned int is_i2c:1;
     62	/* i2c subdevice board info */
     63	struct i2c_board_info board_info;
     64};
     65
     66/*amplifier configuration info */
     67struct amp_config_info {
     68	char module_name[32];
     69	/* Is this an i2c device ? */
     70	unsigned int is_i2c:1;
     71	/* i2c subdevice board info */
     72	struct i2c_board_info board_info;
     73};
     74
     75/* structure for defining vpbe display subsystem components */
     76struct vpbe_config {
     77	char module_name[32];
     78	/* i2c bus adapter no */
     79	int i2c_adapter_id;
     80	struct osd_config_info osd;
     81	struct encoder_config_info venc;
     82	/* external encoder information goes here */
     83	int num_ext_encoders;
     84	struct encoder_config_info *ext_encoders;
     85	/* amplifier information goes here */
     86	struct amp_config_info *amp;
     87	unsigned int num_outputs;
     88	/* Order is venc outputs followed by LCD and then external encoders */
     89	struct vpbe_output *outputs;
     90};
     91
     92struct vpbe_device;
     93
     94struct vpbe_device_ops {
     95	/* Enumerate the outputs */
     96	int (*enum_outputs)(struct vpbe_device *vpbe_dev,
     97			    struct v4l2_output *output);
     98
     99	/* Set output to the given index */
    100	int (*set_output)(struct vpbe_device *vpbe_dev,
    101			 int index);
    102
    103	/* Get current output */
    104	unsigned int (*get_output)(struct vpbe_device *vpbe_dev);
    105
    106	/* Set DV preset at current output */
    107	int (*s_dv_timings)(struct vpbe_device *vpbe_dev,
    108			   struct v4l2_dv_timings *dv_timings);
    109
    110	/* Get DV presets supported at the output */
    111	int (*g_dv_timings)(struct vpbe_device *vpbe_dev,
    112			   struct v4l2_dv_timings *dv_timings);
    113
    114	/* Enumerate the DV Presets supported at the output */
    115	int (*enum_dv_timings)(struct vpbe_device *vpbe_dev,
    116			       struct v4l2_enum_dv_timings *timings_info);
    117
    118	/* Set std at the output */
    119	int (*s_std)(struct vpbe_device *vpbe_dev, v4l2_std_id std_id);
    120
    121	/* Get the current std at the output */
    122	int (*g_std)(struct vpbe_device *vpbe_dev, v4l2_std_id *std_id);
    123
    124	/* initialize the device */
    125	int (*initialize)(struct device *dev, struct vpbe_device *vpbe_dev);
    126
    127	/* De-initialize the device */
    128	void (*deinitialize)(struct device *dev, struct vpbe_device *vpbe_dev);
    129
    130	/* Get the current mode info */
    131	int (*get_mode_info)(struct vpbe_device *vpbe_dev,
    132			     struct vpbe_enc_mode_info*);
    133
    134	/*
    135	 * Set the current mode in the encoder. Alternate way of setting
    136	 * standard or DV preset or custom timings in the encoder
    137	 */
    138	int (*set_mode)(struct vpbe_device *vpbe_dev,
    139			struct vpbe_enc_mode_info*);
    140	/* Power management operations */
    141	int (*suspend)(struct vpbe_device *vpbe_dev);
    142	int (*resume)(struct vpbe_device *vpbe_dev);
    143};
    144
    145/* struct for vpbe device */
    146struct vpbe_device {
    147	/* V4l2 device */
    148	struct v4l2_device v4l2_dev;
    149	/* vpbe dispay controller cfg */
    150	struct vpbe_config *cfg;
    151	/* parent device */
    152	struct device *pdev;
    153	/* external encoder v4l2 sub devices */
    154	struct v4l2_subdev **encoders;
    155	/* current encoder index */
    156	int current_sd_index;
    157	/* external amplifier v4l2 subdevice */
    158	struct v4l2_subdev *amp;
    159	struct mutex lock;
    160	/* device initialized */
    161	int initialized;
    162	/* vpbe dac clock */
    163	struct clk *dac_clk;
    164	/* osd_device pointer */
    165	struct osd_state *osd_device;
    166	/* venc device pointer */
    167	struct venc_platform_data *venc_device;
    168	/*
    169	 * fields below are accessed by users of vpbe_device. Not the
    170	 * ones above
    171	 */
    172
    173	/* current output */
    174	int current_out_index;
    175	/* lock used by caller to do atomic operation on vpbe device */
    176	/* current timings set in the controller */
    177	struct vpbe_enc_mode_info current_timings;
    178	/* venc sub device */
    179	struct v4l2_subdev *venc;
    180	/* device operations below */
    181	struct vpbe_device_ops ops;
    182};
    183
    184#endif