xref: /linux/drivers/media/cec/usb/extron-da-hd-4k-plus/extron-da-hd-4k-plus.h (revision 3a39d672e7f48b8d6b91a09afa4b55352773b4b5)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 /*
4  * Copyright 2021-2024 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
5  */
6 
7 #ifndef _EXTRON_DA_HD_4K_PLUS_H_
8 #define _EXTRON_DA_HD_4K_PLUS_H_
9 
10 #include <linux/kthread.h>
11 #include <linux/serio.h>
12 #include <linux/workqueue.h>
13 #include <media/cec.h>
14 #include <media/v4l2-ctrls.h>
15 #include <media/v4l2-dev.h>
16 #include <media/v4l2-device.h>
17 #include <media/v4l2-dv-timings.h>
18 #include <media/v4l2-event.h>
19 #include <media/v4l2-fh.h>
20 #include <media/v4l2-ioctl.h>
21 
22 #include "cec-splitter.h"
23 
24 #define DATA_SIZE 256
25 
26 #define PING_PERIOD	(15 * HZ)
27 
28 #define NUM_MSGS CEC_MAX_MSG_RX_QUEUE_SZ
29 
30 #define MAX_PORTS (1 + 6)
31 
32 #define MAX_EDID_BLOCKS 2
33 
34 struct extron;
35 
36 struct extron_port {
37 	struct cec_splitter_port port;
38 	struct device *dev;
39 	struct cec_adapter *adap;
40 	struct video_device vdev;
41 	struct v4l2_ctrl_handler hdl;
42 	struct v4l2_ctrl *ctrl_rx_power_present;
43 	struct v4l2_ctrl *ctrl_tx_hotplug;
44 	struct v4l2_ctrl *ctrl_tx_edid_present;
45 	bool is_input;
46 	char direction;
47 	char name[26];
48 	unsigned char edid[MAX_EDID_BLOCKS * 128];
49 	unsigned char edid_tmp[MAX_EDID_BLOCKS * 128];
50 	unsigned int edid_blocks;
51 	bool read_edid;
52 	struct extron *extron;
53 	struct work_struct irq_work;
54 	struct completion cmd_done;
55 	const char *response;
56 	unsigned int cmd_error;
57 	struct cec_msg rx_msg[NUM_MSGS];
58 	unsigned int rx_msg_cur_idx, rx_msg_num;
59 	/* protect rx_msg_cur_idx and rx_msg_num */
60 	spinlock_t msg_lock;
61 	u32 tx_done_status;
62 	bool update_phys_addr;
63 	u16 phys_addr;
64 	bool cec_was_registered;
65 	bool disconnected;
66 	bool update_has_signal;
67 	bool has_signal;
68 	bool update_has_edid;
69 	bool has_edid;
70 	bool has_4kp30;
71 	bool has_4kp60;
72 	bool has_qy;
73 	bool has_qs;
74 	u8 est_i, est_ii;
75 
76 	/* locks access to the video_device */
77 	struct mutex video_lock;
78 };
79 
80 struct extron {
81 	struct cec_splitter splitter;
82 	struct device *dev;
83 	struct serio *serio;
84 	/* locks access to serio */
85 	struct mutex serio_lock;
86 	unsigned int num_ports;
87 	unsigned int num_in_ports;
88 	unsigned int num_out_ports;
89 	char unit_name[32];
90 	char unit_type[64];
91 	char unit_fw_version[32];
92 	char unit_cec_engine_version[32];
93 	struct extron_port *ports[MAX_PORTS];
94 	struct cec_splitter_port *splitter_ports[MAX_PORTS];
95 	struct v4l2_device v4l2_dev;
96 	bool hpd_never_low;
97 	struct task_struct *kthread_setup;
98 	struct delayed_work work_update_edid;
99 
100 	/* serializes EDID reading */
101 	struct mutex edid_lock;
102 	unsigned int edid_bytes_read;
103 	struct extron_port *edid_port;
104 	struct completion edid_completion;
105 	bool edid_reading;
106 	bool is_ready;
107 
108 	struct completion cmd_done;
109 	const char *response;
110 	unsigned int cmd_error;
111 	char data[DATA_SIZE];
112 	unsigned int len;
113 	char reply[DATA_SIZE];
114 	char buf[DATA_SIZE];
115 	unsigned int idx;
116 };
117 
118 #endif
119