1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /* Copyright (C) 2022 Rockchip Electronics Co., Ltd */
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #define pr_fmt(fmt) "isp_rockit: %s:%d " fmt, __func__, __LINE__
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include <linux/of.h>
7*4882a593Smuzhiyun #include <linux/of_platform.h>
8*4882a593Smuzhiyun #include <soc/rockchip/rockchip_rockit.h>
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include "dev.h"
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun static struct rockit_rkcif_cfg *rockit_rkcif_cfg;
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun struct rkcif_rockit_buffer {
15*4882a593Smuzhiyun struct rkcif_buffer cif_buf;
16*4882a593Smuzhiyun struct dma_buf *dmabuf;
17*4882a593Smuzhiyun void *mpi_mem;
18*4882a593Smuzhiyun void *mpi_buf;
19*4882a593Smuzhiyun struct list_head queue;
20*4882a593Smuzhiyun int buf_id;
21*4882a593Smuzhiyun union {
22*4882a593Smuzhiyun u32 buff_addr;
23*4882a593Smuzhiyun void *vaddr;
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun
rkcif_rockit_get_stream(struct rockit_rkcif_cfg * input_rockit_cfg)27*4882a593Smuzhiyun static struct rkcif_stream *rkcif_rockit_get_stream(struct rockit_rkcif_cfg *input_rockit_cfg)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun struct rkcif_device *cif_dev = NULL;
30*4882a593Smuzhiyun struct rkcif_stream *stream = NULL;
31*4882a593Smuzhiyun u8 i;
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun if (!rockit_rkcif_cfg) {
34*4882a593Smuzhiyun pr_err("rockit_rkcif_cfg is null get stream failed\n");
35*4882a593Smuzhiyun return NULL;
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun if (!input_rockit_cfg) {
38*4882a593Smuzhiyun pr_err("input is null get stream failed\n");
39*4882a593Smuzhiyun return NULL;
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun for (i = 0; i < rockit_rkcif_cfg->cif_num; i++) {
43*4882a593Smuzhiyun if (!strcmp(rockit_rkcif_cfg->rkcif_dev_cfg[i].cif_name,
44*4882a593Smuzhiyun input_rockit_cfg->cur_name)) {
45*4882a593Smuzhiyun cif_dev = rockit_rkcif_cfg->rkcif_dev_cfg[i].cif_dev;
46*4882a593Smuzhiyun break;
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun if (cif_dev == NULL) {
51*4882a593Smuzhiyun pr_err("Can not find cif_dev!");
52*4882a593Smuzhiyun return NULL;
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun switch (input_rockit_cfg->nick_id) {
56*4882a593Smuzhiyun case 0:
57*4882a593Smuzhiyun stream = &cif_dev->stream[RKCIF_STREAM_MIPI_ID0];
58*4882a593Smuzhiyun break;
59*4882a593Smuzhiyun case 1:
60*4882a593Smuzhiyun stream = &cif_dev->stream[RKCIF_STREAM_MIPI_ID1];
61*4882a593Smuzhiyun break;
62*4882a593Smuzhiyun case 2:
63*4882a593Smuzhiyun stream = &cif_dev->stream[RKCIF_STREAM_MIPI_ID2];
64*4882a593Smuzhiyun break;
65*4882a593Smuzhiyun case 3:
66*4882a593Smuzhiyun stream = &cif_dev->stream[RKCIF_STREAM_MIPI_ID3];
67*4882a593Smuzhiyun break;
68*4882a593Smuzhiyun default:
69*4882a593Smuzhiyun stream = NULL;
70*4882a593Smuzhiyun break;
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun return stream;
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun
rkcif_rockit_buf_queue(struct rockit_rkcif_cfg * input_rockit_cfg)76*4882a593Smuzhiyun int rkcif_rockit_buf_queue(struct rockit_rkcif_cfg *input_rockit_cfg)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun struct rkcif_stream *stream = NULL;
79*4882a593Smuzhiyun struct rkcif_rockit_buffer *rkcif_buf = NULL;
80*4882a593Smuzhiyun struct rkcif_device *cif_dev = NULL;
81*4882a593Smuzhiyun const struct vb2_mem_ops *g_ops = NULL;
82*4882a593Smuzhiyun int i, ret, offset, dev_id;
83*4882a593Smuzhiyun struct rkcif_stream_cfg *stream_cfg = NULL;
84*4882a593Smuzhiyun void *mem = NULL;
85*4882a593Smuzhiyun struct sg_table *sg_tbl;
86*4882a593Smuzhiyun unsigned long lock_flags = 0;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun stream = rkcif_rockit_get_stream(input_rockit_cfg);
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun if (stream == NULL) {
91*4882a593Smuzhiyun pr_err("the stream is NULL");
92*4882a593Smuzhiyun return -EINVAL;
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun cif_dev = stream->cifdev;
96*4882a593Smuzhiyun dev_id = cif_dev->csi_host_idx;
97*4882a593Smuzhiyun g_ops = cif_dev->hw_dev->mem_ops;
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun if (stream->id >= RKCIF_MAX_STREAM_MIPI)
100*4882a593Smuzhiyun return -EINVAL;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun stream_cfg = &rockit_rkcif_cfg->rkcif_dev_cfg[dev_id].rkcif_stream_cfg[stream->id];
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun stream_cfg->node = input_rockit_cfg->node;
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun if (!input_rockit_cfg->buf)
107*4882a593Smuzhiyun return -EINVAL;
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun for (i = 0; i < ROCKIT_BUF_NUM_MAX; i++) {
110*4882a593Smuzhiyun if (stream_cfg->buff_id[i] == input_rockit_cfg->mpi_id) {
111*4882a593Smuzhiyun input_rockit_cfg->is_alloc = 0;
112*4882a593Smuzhiyun break;
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun if (input_rockit_cfg->is_alloc) {
117*4882a593Smuzhiyun for (i = 0; i < ROCKIT_BUF_NUM_MAX; i++) {
118*4882a593Smuzhiyun if (stream_cfg->buff_id[i] == 0) {
119*4882a593Smuzhiyun stream_cfg->rkcif_buff[i] =
120*4882a593Smuzhiyun kzalloc(sizeof(struct rkcif_rockit_buffer), GFP_KERNEL);
121*4882a593Smuzhiyun if (stream_cfg->rkcif_buff[i] == NULL) {
122*4882a593Smuzhiyun pr_err("rkisp_buff alloc failed!\n");
123*4882a593Smuzhiyun return -EINVAL;
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun stream_cfg->buff_id[i] = input_rockit_cfg->mpi_id;
126*4882a593Smuzhiyun break;
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun if (i == ROCKIT_BUF_NUM_MAX)
130*4882a593Smuzhiyun return -EINVAL;
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun rkcif_buf = stream_cfg->rkcif_buff[i];
133*4882a593Smuzhiyun rkcif_buf->mpi_buf = input_rockit_cfg->mpibuf;
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun mem = g_ops->attach_dmabuf(stream->cifdev->hw_dev->dev,
136*4882a593Smuzhiyun input_rockit_cfg->buf,
137*4882a593Smuzhiyun input_rockit_cfg->buf->size,
138*4882a593Smuzhiyun DMA_BIDIRECTIONAL);
139*4882a593Smuzhiyun if (IS_ERR(mem))
140*4882a593Smuzhiyun pr_err("the g_ops->attach_dmabuf is error!\n");
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun rkcif_buf->mpi_mem = mem;
143*4882a593Smuzhiyun rkcif_buf->dmabuf = input_rockit_cfg->buf;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun ret = g_ops->map_dmabuf(mem);
146*4882a593Smuzhiyun if (ret)
147*4882a593Smuzhiyun pr_err("the g_ops->map_dmabuf is error!\n");
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun if (stream->cifdev->hw_dev->is_dma_sg_ops) {
150*4882a593Smuzhiyun sg_tbl = (struct sg_table *)g_ops->cookie(mem);
151*4882a593Smuzhiyun rkcif_buf->buff_addr = sg_dma_address(sg_tbl->sgl);
152*4882a593Smuzhiyun } else {
153*4882a593Smuzhiyun rkcif_buf->buff_addr = *((u32 *)g_ops->cookie(mem));
154*4882a593Smuzhiyun }
155*4882a593Smuzhiyun get_dma_buf(input_rockit_cfg->buf);
156*4882a593Smuzhiyun } else {
157*4882a593Smuzhiyun for (i = 0; i < ROCKIT_BUF_NUM_MAX; i++) {
158*4882a593Smuzhiyun rkcif_buf = stream_cfg->rkcif_buff[i];
159*4882a593Smuzhiyun if (stream_cfg->buff_id[i] == input_rockit_cfg->mpi_id)
160*4882a593Smuzhiyun break;
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun for (i = 0; i < stream->cif_fmt_out->mplanes; i++)
165*4882a593Smuzhiyun rkcif_buf->cif_buf.buff_addr[i] = rkcif_buf->buff_addr;
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun if (stream->cif_fmt_out->mplanes == 1) {
168*4882a593Smuzhiyun for (i = 0; i < stream->cif_fmt_out->cplanes - 1; i++) {
169*4882a593Smuzhiyun offset = stream->pixm.plane_fmt[i].bytesperline * stream->pixm.height;
170*4882a593Smuzhiyun rkcif_buf->cif_buf.buff_addr[i + 1] =
171*4882a593Smuzhiyun rkcif_buf->cif_buf.buff_addr[i] + offset;
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun v4l2_dbg(2, rkcif_debug, &cif_dev->v4l2_dev,
176*4882a593Smuzhiyun "stream:%d rockit_queue buf:0x%x\n",
177*4882a593Smuzhiyun stream->id, rkcif_buf->cif_buf.buff_addr[0]);
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun if (stream_cfg->is_discard)
180*4882a593Smuzhiyun return -EINVAL;
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun spin_lock_irqsave(&stream->vbq_lock, lock_flags);
183*4882a593Smuzhiyun list_add_tail(&rkcif_buf->cif_buf.queue, &stream->rockit_buf_head);
184*4882a593Smuzhiyun spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun return 0;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun
rkcif_rockit_buf_done(struct rkcif_stream * stream,struct rkcif_buffer * buf)189*4882a593Smuzhiyun int rkcif_rockit_buf_done(struct rkcif_stream *stream, struct rkcif_buffer *buf)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun struct rkcif_device *dev = stream->cifdev;
192*4882a593Smuzhiyun struct rkcif_rockit_buffer *rkcif_buf = NULL;
193*4882a593Smuzhiyun struct rkcif_stream_cfg *stream_cfg = NULL;
194*4882a593Smuzhiyun u32 dev_id = stream->cifdev->csi_host_idx;
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun if (!rockit_rkcif_cfg ||
197*4882a593Smuzhiyun !rockit_rkcif_cfg->rkcif_rockit_mpibuf_done ||
198*4882a593Smuzhiyun stream->id >= RKCIF_MAX_STREAM_MIPI)
199*4882a593Smuzhiyun return -EINVAL;
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun stream_cfg = &rockit_rkcif_cfg->rkcif_dev_cfg[dev_id].rkcif_stream_cfg[stream->id];
202*4882a593Smuzhiyun rkcif_buf =
203*4882a593Smuzhiyun container_of(buf, struct rkcif_rockit_buffer, cif_buf);
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun rockit_rkcif_cfg->mpibuf = rkcif_buf->mpi_buf;
206*4882a593Smuzhiyun rockit_rkcif_cfg->buf = rkcif_buf->dmabuf;
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun rockit_rkcif_cfg->frame.u64PTS = buf->vb.vb2_buf.timestamp;
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun rockit_rkcif_cfg->frame.u32TimeRef = buf->vb.sequence;
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun rockit_rkcif_cfg->frame.u32Height = stream->pixm.height;
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun rockit_rkcif_cfg->frame.u32Width = stream->pixm.width;
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun rockit_rkcif_cfg->frame.enPixelFormat = stream->pixm.pixelformat;
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun rockit_rkcif_cfg->frame.u32VirWidth = stream->pixm.width;
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun rockit_rkcif_cfg->frame.u32VirHeight = stream->pixm.height;
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun rockit_rkcif_cfg->cur_name = dev_name(dev->dev);
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun rockit_rkcif_cfg->node = stream_cfg->node;
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun if (list_empty(&stream->rockit_buf_head))
227*4882a593Smuzhiyun rockit_rkcif_cfg->is_empty = true;
228*4882a593Smuzhiyun else
229*4882a593Smuzhiyun rockit_rkcif_cfg->is_empty = false;
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun if (rockit_rkcif_cfg->rkcif_rockit_mpibuf_done)
232*4882a593Smuzhiyun rockit_rkcif_cfg->rkcif_rockit_mpibuf_done(rockit_rkcif_cfg);
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun return 0;
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun
rkcif_rockit_buf_free(struct rkcif_stream * stream)237*4882a593Smuzhiyun static int rkcif_rockit_buf_free(struct rkcif_stream *stream)
238*4882a593Smuzhiyun {
239*4882a593Smuzhiyun struct rkcif_rockit_buffer *rkcif_buf = NULL;
240*4882a593Smuzhiyun u32 i = 0, dev_id = stream->cifdev->csi_host_idx;
241*4882a593Smuzhiyun const struct vb2_mem_ops *g_ops = stream->cifdev->hw_dev->mem_ops;
242*4882a593Smuzhiyun struct rkcif_stream_cfg *stream_cfg = NULL;
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun if (!rockit_rkcif_cfg || stream->id >= RKCIF_MAX_STREAM_MIPI)
245*4882a593Smuzhiyun return -EINVAL;
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun stream_cfg = &rockit_rkcif_cfg->rkcif_dev_cfg[dev_id].rkcif_stream_cfg[stream->id];
248*4882a593Smuzhiyun stream_cfg->is_discard = false;
249*4882a593Smuzhiyun for (i = 0; i < ROCKIT_BUF_NUM_MAX; i++) {
250*4882a593Smuzhiyun if (stream_cfg->rkcif_buff[i]) {
251*4882a593Smuzhiyun rkcif_buf = (struct rkcif_rockit_buffer *)stream_cfg->rkcif_buff[i];
252*4882a593Smuzhiyun if (rkcif_buf->mpi_mem) {
253*4882a593Smuzhiyun g_ops->unmap_dmabuf(rkcif_buf->mpi_mem);
254*4882a593Smuzhiyun g_ops->detach_dmabuf(rkcif_buf->mpi_mem);
255*4882a593Smuzhiyun dma_buf_put(rkcif_buf->dmabuf);
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun kfree(stream_cfg->rkcif_buff[i]);
258*4882a593Smuzhiyun stream_cfg->rkcif_buff[i] = NULL;
259*4882a593Smuzhiyun stream_cfg->buff_id[i] = 0;
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun stream->curr_buf_rockit = NULL;
263*4882a593Smuzhiyun stream->next_buf_rockit = NULL;
264*4882a593Smuzhiyun INIT_LIST_HEAD(&stream->rockit_buf_head);
265*4882a593Smuzhiyun return 0;
266*4882a593Smuzhiyun }
267*4882a593Smuzhiyun
rkcif_rockit_pause_stream(struct rockit_rkcif_cfg * input_rockit_cfg)268*4882a593Smuzhiyun int rkcif_rockit_pause_stream(struct rockit_rkcif_cfg *input_rockit_cfg)
269*4882a593Smuzhiyun {
270*4882a593Smuzhiyun struct rkcif_stream *stream = NULL;
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun stream = rkcif_rockit_get_stream(input_rockit_cfg);
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun if (stream == NULL) {
275*4882a593Smuzhiyun pr_err("the stream is NULL");
276*4882a593Smuzhiyun return -EINVAL;
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun rkcif_do_stop_stream(stream, RKCIF_STREAM_MODE_ROCKIT);
280*4882a593Smuzhiyun rkcif_rockit_buf_free(stream);
281*4882a593Smuzhiyun return 0;
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun EXPORT_SYMBOL(rkcif_rockit_pause_stream);
284*4882a593Smuzhiyun
rkcif_rockit_config_stream(struct rockit_rkcif_cfg * input_rockit_cfg,int width,int height,int v4l2_fmt)285*4882a593Smuzhiyun int rkcif_rockit_config_stream(struct rockit_rkcif_cfg *input_rockit_cfg,
286*4882a593Smuzhiyun int width, int height, int v4l2_fmt)
287*4882a593Smuzhiyun {
288*4882a593Smuzhiyun struct rkcif_stream *stream = NULL;
289*4882a593Smuzhiyun int ret;
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun stream = rkcif_rockit_get_stream(input_rockit_cfg);
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun if (stream == NULL) {
294*4882a593Smuzhiyun pr_err("the stream is NULL");
295*4882a593Smuzhiyun return -EINVAL;
296*4882a593Smuzhiyun }
297*4882a593Smuzhiyun stream->pixm.pixelformat = v4l2_fmt;
298*4882a593Smuzhiyun stream->pixm.width = width;
299*4882a593Smuzhiyun stream->pixm.height = height;
300*4882a593Smuzhiyun stream->pixm.plane_fmt[0].bytesperline = 0;
301*4882a593Smuzhiyun ret = rkcif_set_fmt(stream, &stream->pixm, false);
302*4882a593Smuzhiyun if (ret < 0) {
303*4882a593Smuzhiyun pr_err("stream id %d config failed\n", stream->id);
304*4882a593Smuzhiyun return -EINVAL;
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun return 0;
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun EXPORT_SYMBOL(rkcif_rockit_config_stream);
310*4882a593Smuzhiyun
rkcif_rockit_resume_stream(struct rockit_rkcif_cfg * input_rockit_cfg)311*4882a593Smuzhiyun int rkcif_rockit_resume_stream(struct rockit_rkcif_cfg *input_rockit_cfg)
312*4882a593Smuzhiyun {
313*4882a593Smuzhiyun struct rkcif_stream *stream = NULL;
314*4882a593Smuzhiyun int ret = 0;
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun stream = rkcif_rockit_get_stream(input_rockit_cfg);
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun if (stream == NULL) {
319*4882a593Smuzhiyun pr_err("the stream is NULL");
320*4882a593Smuzhiyun return -EINVAL;
321*4882a593Smuzhiyun }
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun ret = rkcif_do_start_stream(stream, RKCIF_STREAM_MODE_ROCKIT);
324*4882a593Smuzhiyun if (ret < 0) {
325*4882a593Smuzhiyun pr_err("stream id %d start failed\n", stream->id);
326*4882a593Smuzhiyun return -EINVAL;
327*4882a593Smuzhiyun }
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun return 0;
330*4882a593Smuzhiyun }
331*4882a593Smuzhiyun EXPORT_SYMBOL(rkcif_rockit_resume_stream);
332*4882a593Smuzhiyun
rkcif_rockit_dev_init(struct rkcif_device * dev)333*4882a593Smuzhiyun void rkcif_rockit_dev_init(struct rkcif_device *dev)
334*4882a593Smuzhiyun {
335*4882a593Smuzhiyun int i;
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun if (rockit_rkcif_cfg == NULL) {
338*4882a593Smuzhiyun rockit_rkcif_cfg = kzalloc(sizeof(struct rockit_rkcif_cfg), GFP_KERNEL);
339*4882a593Smuzhiyun if (rockit_rkcif_cfg == NULL)
340*4882a593Smuzhiyun return;
341*4882a593Smuzhiyun }
342*4882a593Smuzhiyun rockit_rkcif_cfg->cif_num = dev->hw_dev->dev_num;
343*4882a593Smuzhiyun for (i = 0; i < rockit_rkcif_cfg->cif_num; i++) {
344*4882a593Smuzhiyun if (dev->hw_dev->cif_dev[i]) {
345*4882a593Smuzhiyun rockit_rkcif_cfg->rkcif_dev_cfg[i].cif_name = dev_name(dev->hw_dev->cif_dev[i]->dev);
346*4882a593Smuzhiyun rockit_rkcif_cfg->rkcif_dev_cfg[i].cif_dev =
347*4882a593Smuzhiyun dev->hw_dev->cif_dev[i];
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun }
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun
rkcif_rockit_dev_deinit(void)352*4882a593Smuzhiyun void rkcif_rockit_dev_deinit(void)
353*4882a593Smuzhiyun {
354*4882a593Smuzhiyun kfree(rockit_rkcif_cfg);
355*4882a593Smuzhiyun rockit_rkcif_cfg = NULL;
356*4882a593Smuzhiyun }
357*4882a593Smuzhiyun
rkcif_rockit_function_register(void * function,int cmd)358*4882a593Smuzhiyun void *rkcif_rockit_function_register(void *function, int cmd)
359*4882a593Smuzhiyun {
360*4882a593Smuzhiyun if (rockit_rkcif_cfg == NULL) {
361*4882a593Smuzhiyun pr_err("rockit_cfg is null function register failed");
362*4882a593Smuzhiyun return NULL;
363*4882a593Smuzhiyun }
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun switch (cmd) {
366*4882a593Smuzhiyun case ROCKIT_BUF_QUE:
367*4882a593Smuzhiyun function = rkcif_rockit_buf_queue;
368*4882a593Smuzhiyun break;
369*4882a593Smuzhiyun case ROCKIT_MPIBUF_DONE:
370*4882a593Smuzhiyun rockit_rkcif_cfg->rkcif_rockit_mpibuf_done = function;
371*4882a593Smuzhiyun if (!rockit_rkcif_cfg->rkcif_rockit_mpibuf_done)
372*4882a593Smuzhiyun pr_err("get rkcif_rockit_mpibuf_done failed!");
373*4882a593Smuzhiyun break;
374*4882a593Smuzhiyun default:
375*4882a593Smuzhiyun break;
376*4882a593Smuzhiyun }
377*4882a593Smuzhiyun return function;
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun EXPORT_SYMBOL(rkcif_rockit_function_register);
380*4882a593Smuzhiyun
rkcif_rockit_get_cifdev(char ** name)381*4882a593Smuzhiyun int rkcif_rockit_get_cifdev(char **name)
382*4882a593Smuzhiyun {
383*4882a593Smuzhiyun int i = 0;
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun if (rockit_rkcif_cfg == NULL) {
386*4882a593Smuzhiyun pr_err("rockit_cfg is null");
387*4882a593Smuzhiyun return -EINVAL;
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun if (name == NULL) {
391*4882a593Smuzhiyun pr_err("the name is null");
392*4882a593Smuzhiyun return -EINVAL;
393*4882a593Smuzhiyun }
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun for (i = 0; i < rockit_rkcif_cfg->cif_num; i++)
396*4882a593Smuzhiyun name[i] = (char *)rockit_rkcif_cfg->rkcif_dev_cfg[i].cif_name;
397*4882a593Smuzhiyun if (name[0] == NULL)
398*4882a593Smuzhiyun return -EINVAL;
399*4882a593Smuzhiyun else
400*4882a593Smuzhiyun return 0;
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun EXPORT_SYMBOL(rkcif_rockit_get_cifdev);
403