| b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | /* |
| 3 | * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ |
| 4 | */ |
| 5 | #ifndef VPBE_DISPLAY_H |
| 6 | #define VPBE_DISPLAY_H |
| 7 | |
| 8 | /* Header files */ |
| 9 | #include <linux/videodev2.h> |
| 10 | #include <media/v4l2-common.h> |
| 11 | #include <media/v4l2-fh.h> |
| 12 | #include <media/videobuf2-v4l2.h> |
| 13 | #include <media/videobuf2-dma-contig.h> |
| 14 | #include <media/davinci/vpbe_types.h> |
| 15 | #include <media/davinci/vpbe_osd.h> |
| 16 | #include <media/davinci/vpbe.h> |
| 17 | |
| 18 | #define VPBE_DISPLAY_MAX_DEVICES 2 |
| 19 | |
| 20 | enum vpbe_display_device_id { |
| 21 | VPBE_DISPLAY_DEVICE_0, |
| 22 | VPBE_DISPLAY_DEVICE_1 |
| 23 | }; |
| 24 | |
| 25 | #define VPBE_DISPLAY_DRV_NAME "vpbe-display" |
| 26 | |
| 27 | #define VPBE_DISPLAY_MAJOR_RELEASE 1 |
| 28 | #define VPBE_DISPLAY_MINOR_RELEASE 0 |
| 29 | #define VPBE_DISPLAY_BUILD 1 |
| 30 | #define VPBE_DISPLAY_VERSION_CODE ((VPBE_DISPLAY_MAJOR_RELEASE << 16) | \ |
| 31 | (VPBE_DISPLAY_MINOR_RELEASE << 8) | \ |
| 32 | VPBE_DISPLAY_BUILD) |
| 33 | |
| 34 | #define VPBE_DISPLAY_VALID_FIELD(field) ((V4L2_FIELD_NONE == field) || \ |
| 35 | (V4L2_FIELD_ANY == field) || (V4L2_FIELD_INTERLACED == field)) |
| 36 | |
| 37 | /* Exp ratio numerator and denominator constants */ |
| 38 | #define VPBE_DISPLAY_H_EXP_RATIO_N 9 |
| 39 | #define VPBE_DISPLAY_H_EXP_RATIO_D 8 |
| 40 | #define VPBE_DISPLAY_V_EXP_RATIO_N 6 |
| 41 | #define VPBE_DISPLAY_V_EXP_RATIO_D 5 |
| 42 | |
| 43 | /* Zoom multiplication factor */ |
| 44 | #define VPBE_DISPLAY_ZOOM_4X 4 |
| 45 | #define VPBE_DISPLAY_ZOOM_2X 2 |
| 46 | |
| 47 | /* Structures */ |
| 48 | struct display_layer_info { |
| 49 | int enable; |
| 50 | /* Layer ID used by Display Manager */ |
| 51 | enum osd_layer id; |
| 52 | struct osd_layer_config config; |
| 53 | enum osd_zoom_factor h_zoom; |
| 54 | enum osd_zoom_factor v_zoom; |
| 55 | enum osd_h_exp_ratio h_exp; |
| 56 | enum osd_v_exp_ratio v_exp; |
| 57 | }; |
| 58 | |
| 59 | struct vpbe_disp_buffer { |
| 60 | struct vb2_v4l2_buffer vb; |
| 61 | struct list_head list; |
| 62 | }; |
| 63 | |
| 64 | /* vpbe display object structure */ |
| 65 | struct vpbe_layer { |
| 66 | /* Pointer to the vpbe_display */ |
| 67 | struct vpbe_display *disp_dev; |
| 68 | /* Pointer pointing to current v4l2_buffer */ |
| 69 | struct vpbe_disp_buffer *cur_frm; |
| 70 | /* Pointer pointing to next v4l2_buffer */ |
| 71 | struct vpbe_disp_buffer *next_frm; |
| 72 | /* videobuf specific parameters |
| 73 | * Buffer queue used in video-buf |
| 74 | */ |
| 75 | struct vb2_queue buffer_queue; |
| 76 | /* Queue of filled frames */ |
| 77 | struct list_head dma_queue; |
| 78 | /* Used in video-buf */ |
| 79 | spinlock_t irqlock; |
| 80 | /* V4l2 specific parameters */ |
| 81 | /* Identifies video device for this layer */ |
| 82 | struct video_device video_dev; |
| 83 | /* Used to store pixel format */ |
| 84 | struct v4l2_pix_format pix_fmt; |
| 85 | enum v4l2_field buf_field; |
| 86 | /* Video layer configuration params */ |
| 87 | struct display_layer_info layer_info; |
| 88 | /* vpbe specific parameters |
| 89 | * enable window for display |
| 90 | */ |
| 91 | unsigned char window_enable; |
| 92 | /* number of open instances of the layer */ |
| 93 | unsigned int usrs; |
| 94 | /* Indicates id of the field which is being displayed */ |
| 95 | unsigned int field_id; |
| 96 | /* Identifies device object */ |
| 97 | enum vpbe_display_device_id device_id; |
| 98 | /* facilitation of ioctl ops lock by v4l2*/ |
| 99 | struct mutex opslock; |
| 100 | u8 layer_first_int; |
| 101 | }; |
| 102 | |
| 103 | /* vpbe device structure */ |
| 104 | struct vpbe_display { |
| 105 | /* layer specific parameters */ |
| 106 | /* lock for isr updates to buf layers*/ |
| 107 | spinlock_t dma_queue_lock; |
| 108 | /* C-Plane offset from start of y-plane */ |
| 109 | unsigned int cbcr_ofst; |
| 110 | struct vpbe_layer *dev[VPBE_DISPLAY_MAX_DEVICES]; |
| 111 | struct vpbe_device *vpbe_dev; |
| 112 | struct osd_state *osd_device; |
| 113 | }; |
| 114 | |
| 115 | struct buf_config_params { |
| 116 | unsigned char min_numbuffers; |
| 117 | unsigned char numbuffers[VPBE_DISPLAY_MAX_DEVICES]; |
| 118 | unsigned int min_bufsize[VPBE_DISPLAY_MAX_DEVICES]; |
| 119 | unsigned int layer_bufsize[VPBE_DISPLAY_MAX_DEVICES]; |
| 120 | }; |
| 121 | |
| 122 | #endif /* VPBE_DISPLAY_H */ |