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