xref: /OK3568_Linux_fs/kernel/include/soc/rockchip/rockchip_dvbm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (c) 2022 Rockchip Electronics Co., Ltd
4  */
5 #ifndef __SOC_ROCKCHIP_DVBM_H
6 #define __SOC_ROCKCHIP_DVBM_H
7 
8 #include <linux/dma-buf.h>
9 #include <linux/platform_device.h>
10 
11 enum dvbm_port_dir {
12 	DVBM_ISP_PORT,
13 	DVBM_VEPU_PORT,
14 };
15 
16 enum dvbm_cmd {
17 	DVBM_ISP_CMD_BASE   = 0,
18 	DVBM_ISP_SET_CFG,
19 	DVBM_ISP_FRM_START,
20 	DVBM_ISP_FRM_END,
21 	DVBM_ISP_FRM_QUARTER,
22 	DVBM_ISP_FRM_HALF,
23 	DVBM_ISP_FRM_THREE_QUARTERS,
24 	DVBM_ISP_CMD_BUTT,
25 
26 	DVBM_VEPU_CMD_BASE  = 0x10,
27 	DVBM_VEPU_SET_RESYNC,
28 	DVBM_VEPU_SET_CFG,
29 	DVBM_VEPU_GET_ADR,
30 	DVBM_VEPU_GET_FRAME_INFO,
31 	DVBM_VEPU_DUMP_REGS,
32 	DVBM_VEPU_CMD_BUTT,
33 };
34 
35 enum isp_frame_status {
36 	ISP_FRAME_START,
37 	ISP_FRAME_ONE_QUARTER,
38 	ISP_FRAME_HALF,
39 	ISP_FRAME_THREE_QUARTERS,
40 	ISP_FRAME_FINISH,
41 };
42 
43 enum dvbm_cb_event {
44 	DVBM_ISP_EVENT_BASE   = 0,
45 	DVBM_ISP_EVENT_BUTT,
46 
47 	DVBM_VEPU_EVENT_BASE  = 0x10,
48 	DVBM_VEPU_NOTIFY_ADDR,
49 	DVBM_VEPU_NOTIFY_DUMP,
50 	DVBM_VEPU_REQ_CONNECT,
51 	DVBM_VEPU_NOTIFY_FRM_STR,
52 	DVBM_VEPU_NOTIFY_FRM_END,
53 	DVBM_VEPU_NOTIFY_FRM_INFO,
54 	DVBM_VEPU_EVENT_BUTT,
55 };
56 
57 struct dvbm_port {
58 	enum dvbm_port_dir dir;
59 	u32 linked;
60 };
61 
62 struct dvbm_isp_cfg_t {
63 	u32 fmt;
64 	u32 timeout;
65 
66 	struct dmabuf *buf;
67 	dma_addr_t dma_addr;
68 	u32 ybuf_top;
69 	u32 ybuf_bot;
70 	u32 ybuf_lstd;
71 	u32 ybuf_fstd;
72 	u32 cbuf_top;
73 	u32 cbuf_bot;
74 	u32 cbuf_lstd;
75 	u32 cbuf_fstd;
76 };
77 
78 struct dvbm_isp_frm_cfg {
79 	s32 frm_idx;
80 	u32 ybuf_start;
81 	u32 cbuf_start;
82 };
83 
84 struct dvbm_isp_frm_info {
85 	u32 frame_cnt;
86 	u32 line_cnt;
87 	u32 wrap_line;
88 	u32 max_line_cnt;
89 };
90 
91 struct dvbm_addr_cfg {
92 	u32 ybuf_top;
93 	u32 ybuf_bot;
94 	u32 ybuf_sadr;
95 	u32 cbuf_top;
96 	u32 cbuf_bot;
97 	u32 cbuf_sadr;
98 	u32 frame_id;
99 	u32 line_cnt;
100 	u32 overflow;
101 };
102 
103 struct dvbm_vepu_cfg {
104 	u32 auto_resyn;
105 	u32 ignore_vepu_cnct_ack;
106 	u32 start_point_after_vepu_cnct;
107 };
108 
109 typedef int (*dvbm_callback)(void *ctx, enum dvbm_cb_event event, void *arg);
110 
111 struct dvbm_cb {
112 	dvbm_callback cb;
113 	void *ctx;
114 	int event;
115 };
116 
117 #if IS_ENABLED(CONFIG_ROCKCHIP_DVBM)
118 
119 struct dvbm_port *rk_dvbm_get_port(struct platform_device *pdev,
120 				   enum dvbm_port_dir dir);
121 int rk_dvbm_put(struct dvbm_port *port);
122 int rk_dvbm_link(struct dvbm_port *port);
123 int rk_dvbm_unlink(struct dvbm_port *port);
124 int rk_dvbm_set_cb(struct dvbm_port *port, struct dvbm_cb *cb);
125 int rk_dvbm_ctrl(struct dvbm_port *port, enum dvbm_cmd cmd, void *arg);
126 
127 #else
128 
rk_dvbm_get_port(struct platform_device * pdev,enum dvbm_port_dir dir)129 static inline struct dvbm_port *rk_dvbm_get_port(struct platform_device *pdev,
130 						 enum dvbm_port_dir dir)
131 {
132 	return ERR_PTR(-ENODEV);
133 }
134 
rk_dvbm_put(struct dvbm_port * port)135 static inline int rk_dvbm_put(struct dvbm_port *port)
136 {
137 	return -ENODEV;
138 }
139 
rk_dvbm_link(struct dvbm_port * port)140 static inline int rk_dvbm_link(struct dvbm_port *port)
141 {
142 	return -ENODEV;
143 }
rk_dvbm_unlink(struct dvbm_port * port)144 static inline int rk_dvbm_unlink(struct dvbm_port *port)
145 {
146 	return -ENODEV;
147 }
148 
rk_dvbm_set_cb(struct dvbm_port * port,struct dvbm_cb * cb)149 static inline int rk_dvbm_set_cb(struct dvbm_port *port, struct dvbm_cb *cb)
150 {
151 	return -ENODEV;
152 }
153 
rk_dvbm_ctrl(struct dvbm_port * port,enum dvbm_cmd cmd,void * arg)154 static inline int rk_dvbm_ctrl(struct dvbm_port *port, enum dvbm_cmd cmd, void *arg)
155 {
156 	return -ENODEV;
157 }
158 
159 #endif
160 
161 #endif
162