]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/media/platform/mxc/capture/ipu_prp_enc.c
c16312761d7dbd0a14740f2c9b35541921156bda
[karo-tx-linux.git] / drivers / media / platform / mxc / capture / ipu_prp_enc.c
1 /*
2  * Copyright 2004-2013 Freescale Semiconductor, Inc. All Rights Reserved.
3  */
4
5 /*
6  * The code contained herein is licensed under the GNU General Public
7  * License. You may obtain a copy of the GNU General Public License
8  * Version 2 or later at the following locations:
9  *
10  * http://www.opensource.org/licenses/gpl-license.html
11  * http://www.gnu.org/copyleft/gpl.html
12  */
13
14 /*!
15  * @file ipu_prp_enc.c
16  *
17  * @brief IPU Use case for PRP-ENC
18  *
19  * @ingroup IPU
20  */
21
22 #include <linux/module.h>
23 #include <linux/dma-mapping.h>
24 #include <linux/platform_device.h>
25 #include <linux/ipu.h>
26 #include <linux/mipi_csi2.h>
27 #include "mxc_v4l2_capture.h"
28 #include "ipu_prp_sw.h"
29
30 #ifdef CAMERA_DBG
31         #define CAMERA_TRACE(x) (printk)x
32 #else
33         #define CAMERA_TRACE(x)
34 #endif
35
36 static ipu_rotate_mode_t grotation = IPU_ROTATE_NONE;
37
38 /*
39  * Function definitions
40  */
41
42 /*!
43  * IPU ENC callback function.
44  *
45  * @param irq       int irq line
46  * @param dev_id    void * device id
47  *
48  * @return status   IRQ_HANDLED for handled
49  */
50 static irqreturn_t prp_enc_callback(int irq, void *dev_id)
51 {
52         cam_data *cam = (cam_data *) dev_id;
53
54         if (cam->enc_callback == NULL)
55                 return IRQ_HANDLED;
56
57         cam->enc_callback(irq, dev_id);
58
59         return IRQ_HANDLED;
60 }
61
62 /*!
63  * PrpENC enable channel setup function
64  *
65  * @param cam       struct cam_data * mxc capture instance
66  *
67  * @return  status
68  */
69 static int prp_enc_setup(cam_data *cam)
70 {
71         ipu_channel_params_t enc;
72         int err = 0;
73         dma_addr_t dummy = cam->dummy_frame.buffer.m.offset;
74 #ifdef CONFIG_MXC_MIPI_CSI2
75         void *mipi_csi2_info;
76         int ipu_id;
77         int csi_id;
78 #endif
79
80         CAMERA_TRACE("In prp_enc_setup\n");
81         if (!cam) {
82                 printk(KERN_ERR "cam private is NULL\n");
83                 return -ENXIO;
84         }
85         memset(&enc, 0, sizeof(ipu_channel_params_t));
86
87         ipu_csi_get_window_size(cam->ipu, &enc.csi_prp_enc_mem.in_width,
88                                 &enc.csi_prp_enc_mem.in_height, cam->csi);
89
90         enc.csi_prp_enc_mem.in_pixel_fmt = IPU_PIX_FMT_UYVY;
91         enc.csi_prp_enc_mem.out_width = cam->v2f.fmt.pix.width;
92         enc.csi_prp_enc_mem.out_height = cam->v2f.fmt.pix.height;
93         enc.csi_prp_enc_mem.csi = cam->csi;
94         if (cam->rotation >= IPU_ROTATE_90_RIGHT) {
95                 enc.csi_prp_enc_mem.out_width = cam->v2f.fmt.pix.height;
96                 enc.csi_prp_enc_mem.out_height = cam->v2f.fmt.pix.width;
97         }
98
99         if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV420) {
100                 enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_YUV420P;
101                 pr_info("YUV420\n");
102         } else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YVU420) {
103                 enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_YVU420P;
104                 pr_info("YVU420\n");
105         } else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV422P) {
106                 enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_YUV422P;
107                 pr_info("YUV422P\n");
108         } else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV) {
109                 enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_YUYV;
110                 pr_info("YUYV\n");
111         } else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_UYVY) {
112                 enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_UYVY;
113                 pr_info("UYVY\n");
114         } else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_NV12) {
115                 enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_NV12;
116                 pr_info("NV12\n");
117         } else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_BGR24) {
118                 enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_BGR24;
119                 pr_info("BGR24\n");
120         } else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_RGB24) {
121                 enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_RGB24;
122                 pr_info("RGB24\n");
123         } else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_RGB565) {
124                 enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_RGB565;
125                 pr_info("RGB565\n");
126         } else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_BGR32) {
127                 enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_BGR32;
128                 pr_info("BGR32\n");
129         } else if (cam->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_RGB32) {
130                 enc.csi_prp_enc_mem.out_pixel_fmt = IPU_PIX_FMT_RGB32;
131                 pr_info("RGB32\n");
132         } else {
133                 printk(KERN_ERR "format not supported\n");
134                 return -EINVAL;
135         }
136
137 #ifdef CONFIG_MXC_MIPI_CSI2
138         mipi_csi2_info = mipi_csi2_get_info();
139
140         if (mipi_csi2_info) {
141                 if (mipi_csi2_get_status(mipi_csi2_info)) {
142                         ipu_id = mipi_csi2_get_bind_ipu(mipi_csi2_info);
143                         csi_id = mipi_csi2_get_bind_csi(mipi_csi2_info);
144
145                         if (cam->ipu == ipu_get_soc(ipu_id)
146                                 && cam->csi == csi_id) {
147                                 enc.csi_prp_enc_mem.mipi_en = true;
148                                 enc.csi_prp_enc_mem.mipi_vc =
149                                 mipi_csi2_get_virtual_channel(mipi_csi2_info);
150                                 enc.csi_prp_enc_mem.mipi_id =
151                                 mipi_csi2_get_datatype(mipi_csi2_info);
152
153                                 mipi_csi2_pixelclk_enable(mipi_csi2_info);
154                         } else {
155                                 enc.csi_prp_enc_mem.mipi_en = false;
156                                 enc.csi_prp_enc_mem.mipi_vc = 0;
157                                 enc.csi_prp_enc_mem.mipi_id = 0;
158                         }
159                 } else {
160                         enc.csi_prp_enc_mem.mipi_en = false;
161                         enc.csi_prp_enc_mem.mipi_vc = 0;
162                         enc.csi_prp_enc_mem.mipi_id = 0;
163                 }
164         } else {
165                 printk(KERN_ERR "%s() in %s: Fail to get mipi_csi2_info!\n",
166                        __func__, __FILE__);
167                 return -EPERM;
168         }
169 #endif
170
171         err = ipu_init_channel(cam->ipu, CSI_PRP_ENC_MEM, &enc);
172         if (err != 0) {
173                 printk(KERN_ERR "ipu_init_channel %d\n", err);
174                 return err;
175         }
176
177         grotation = cam->rotation;
178         if (cam->rotation >= IPU_ROTATE_90_RIGHT) {
179                 if (cam->rot_enc_bufs_vaddr[0]) {
180                         dma_free_coherent(0, cam->rot_enc_buf_size[0],
181                                           cam->rot_enc_bufs_vaddr[0],
182                                           cam->rot_enc_bufs[0]);
183                 }
184                 if (cam->rot_enc_bufs_vaddr[1]) {
185                         dma_free_coherent(0, cam->rot_enc_buf_size[1],
186                                           cam->rot_enc_bufs_vaddr[1],
187                                           cam->rot_enc_bufs[1]);
188                 }
189                 cam->rot_enc_buf_size[0] =
190                     PAGE_ALIGN(cam->v2f.fmt.pix.sizeimage);
191                 cam->rot_enc_bufs_vaddr[0] =
192                     (void *)dma_alloc_coherent(0, cam->rot_enc_buf_size[0],
193                                                &cam->rot_enc_bufs[0],
194                                                GFP_DMA | GFP_KERNEL);
195                 if (!cam->rot_enc_bufs_vaddr[0]) {
196                         printk(KERN_ERR "alloc enc_bufs0\n");
197                         return -ENOMEM;
198                 }
199                 cam->rot_enc_buf_size[1] =
200                     PAGE_ALIGN(cam->v2f.fmt.pix.sizeimage);
201                 cam->rot_enc_bufs_vaddr[1] =
202                     (void *)dma_alloc_coherent(0, cam->rot_enc_buf_size[1],
203                                                &cam->rot_enc_bufs[1],
204                                                GFP_DMA | GFP_KERNEL);
205                 if (!cam->rot_enc_bufs_vaddr[1]) {
206                         dma_free_coherent(0, cam->rot_enc_buf_size[0],
207                                           cam->rot_enc_bufs_vaddr[0],
208                                           cam->rot_enc_bufs[0]);
209                         cam->rot_enc_bufs_vaddr[0] = NULL;
210                         cam->rot_enc_bufs[0] = 0;
211                         printk(KERN_ERR "alloc enc_bufs1\n");
212                         return -ENOMEM;
213                 }
214
215                 err = ipu_init_channel_buffer(cam->ipu, CSI_PRP_ENC_MEM,
216                                               IPU_OUTPUT_BUFFER,
217                                               enc.csi_prp_enc_mem.out_pixel_fmt,
218                                               enc.csi_prp_enc_mem.out_width,
219                                               enc.csi_prp_enc_mem.out_height,
220                                               enc.csi_prp_enc_mem.out_width,
221                                               IPU_ROTATE_NONE,
222                                               cam->rot_enc_bufs[0],
223                                               cam->rot_enc_bufs[1], 0, 0, 0);
224                 if (err != 0) {
225                         printk(KERN_ERR "CSI_PRP_ENC_MEM err\n");
226                         return err;
227                 }
228
229                 err = ipu_init_channel(cam->ipu, MEM_ROT_ENC_MEM, NULL);
230                 if (err != 0) {
231                         printk(KERN_ERR "MEM_ROT_ENC_MEM channel err\n");
232                         return err;
233                 }
234
235                 err = ipu_init_channel_buffer(cam->ipu, MEM_ROT_ENC_MEM,
236                                               IPU_INPUT_BUFFER,
237                                               enc.csi_prp_enc_mem.out_pixel_fmt,
238                                               enc.csi_prp_enc_mem.out_width,
239                                               enc.csi_prp_enc_mem.out_height,
240                                               enc.csi_prp_enc_mem.out_width,
241                                               cam->rotation,
242                                               cam->rot_enc_bufs[0],
243                                               cam->rot_enc_bufs[1], 0, 0, 0);
244                 if (err != 0) {
245                         printk(KERN_ERR "MEM_ROT_ENC_MEM input buffer\n");
246                         return err;
247                 }
248
249                 err =
250                     ipu_init_channel_buffer(cam->ipu, MEM_ROT_ENC_MEM,
251                                             IPU_OUTPUT_BUFFER,
252                                             enc.csi_prp_enc_mem.out_pixel_fmt,
253                                             enc.csi_prp_enc_mem.out_height,
254                                             enc.csi_prp_enc_mem.out_width,
255                                             cam->v2f.fmt.pix.bytesperline /
256                                             bytes_per_pixel(enc.csi_prp_enc_mem.
257                                                             out_pixel_fmt),
258                                             IPU_ROTATE_NONE,
259                                             dummy, dummy, 0,
260                                             cam->offset.u_offset,
261                                             cam->offset.v_offset);
262                 if (err != 0) {
263                         printk(KERN_ERR "MEM_ROT_ENC_MEM output buffer\n");
264                         return err;
265                 }
266
267                 err = ipu_link_channels(cam->ipu,
268                                         CSI_PRP_ENC_MEM, MEM_ROT_ENC_MEM);
269                 if (err < 0) {
270                         printk(KERN_ERR
271                                "link CSI_PRP_ENC_MEM-MEM_ROT_ENC_MEM\n");
272                         return err;
273                 }
274
275                 err = ipu_enable_channel(cam->ipu, CSI_PRP_ENC_MEM);
276                 if (err < 0) {
277                         printk(KERN_ERR "ipu_enable_channel CSI_PRP_ENC_MEM\n");
278                         return err;
279                 }
280                 err = ipu_enable_channel(cam->ipu, MEM_ROT_ENC_MEM);
281                 if (err < 0) {
282                         printk(KERN_ERR "ipu_enable_channel MEM_ROT_ENC_MEM\n");
283                         return err;
284                 }
285
286                 ipu_select_buffer(cam->ipu, CSI_PRP_ENC_MEM,
287                                   IPU_OUTPUT_BUFFER, 0);
288                 ipu_select_buffer(cam->ipu, CSI_PRP_ENC_MEM,
289                                   IPU_OUTPUT_BUFFER, 1);
290         } else {
291                 err =
292                     ipu_init_channel_buffer(cam->ipu, CSI_PRP_ENC_MEM,
293                                             IPU_OUTPUT_BUFFER,
294                                             enc.csi_prp_enc_mem.out_pixel_fmt,
295                                             enc.csi_prp_enc_mem.out_width,
296                                             enc.csi_prp_enc_mem.out_height,
297                                             cam->v2f.fmt.pix.bytesperline /
298                                             bytes_per_pixel(enc.csi_prp_enc_mem.
299                                                             out_pixel_fmt),
300                                             cam->rotation,
301                                             dummy, dummy, 0,
302                                             cam->offset.u_offset,
303                                             cam->offset.v_offset);
304                 if (err != 0) {
305                         printk(KERN_ERR "CSI_PRP_ENC_MEM output buffer\n");
306                         return err;
307                 }
308                 err = ipu_enable_channel(cam->ipu, CSI_PRP_ENC_MEM);
309                 if (err < 0) {
310                         printk(KERN_ERR "ipu_enable_channel CSI_PRP_ENC_MEM\n");
311                         return err;
312                 }
313         }
314
315         return err;
316 }
317
318 /*!
319  * function to update physical buffer address for encorder IDMA channel
320  *
321  * @param eba         physical buffer address for encorder IDMA channel
322  * @param buffer_num  int buffer 0 or buffer 1
323  *
324  * @return  status
325  */
326 static int prp_enc_eba_update(struct ipu_soc *ipu, dma_addr_t eba,
327                               int *buffer_num)
328 {
329         int err = 0;
330
331         pr_debug("eba %x\n", eba);
332         if (grotation >= IPU_ROTATE_90_RIGHT) {
333                 err = ipu_update_channel_buffer(ipu, MEM_ROT_ENC_MEM,
334                                                 IPU_OUTPUT_BUFFER, *buffer_num,
335                                                 eba);
336         } else {
337                 err = ipu_update_channel_buffer(ipu, CSI_PRP_ENC_MEM,
338                                                 IPU_OUTPUT_BUFFER, *buffer_num,
339                                                 eba);
340         }
341         if (err != 0) {
342                 if (grotation >= IPU_ROTATE_90_RIGHT) {
343                         ipu_clear_buffer_ready(ipu, MEM_ROT_ENC_MEM,
344                                                IPU_OUTPUT_BUFFER,
345                                                *buffer_num);
346                         err = ipu_update_channel_buffer(ipu, MEM_ROT_ENC_MEM,
347                                                         IPU_OUTPUT_BUFFER,
348                                                         *buffer_num,
349                                                         eba);
350                 } else {
351                         ipu_clear_buffer_ready(ipu, CSI_PRP_ENC_MEM,
352                                                IPU_OUTPUT_BUFFER,
353                                                *buffer_num);
354                         err = ipu_update_channel_buffer(ipu, CSI_PRP_ENC_MEM,
355                                                         IPU_OUTPUT_BUFFER,
356                                                         *buffer_num,
357                                                         eba);
358                 }
359
360                 if (err != 0) {
361                         pr_err("ERROR: v4l2 capture: fail to update "
362                                "buf%d\n", *buffer_num);
363                         return err;
364                 }
365         }
366
367         if (grotation >= IPU_ROTATE_90_RIGHT) {
368                 ipu_select_buffer(ipu, MEM_ROT_ENC_MEM, IPU_OUTPUT_BUFFER,
369                                   *buffer_num);
370         } else {
371                 ipu_select_buffer(ipu, CSI_PRP_ENC_MEM, IPU_OUTPUT_BUFFER,
372                                   *buffer_num);
373         }
374
375         *buffer_num = (*buffer_num == 0) ? 1 : 0;
376         return 0;
377 }
378
379 /*!
380  * Enable encoder task
381  * @param private       struct cam_data * mxc capture instance
382  *
383  * @return  status
384  */
385 static int prp_enc_enabling_tasks(void *private)
386 {
387         cam_data *cam = (cam_data *) private;
388         int err = 0;
389         CAMERA_TRACE("IPU:In prp_enc_enabling_tasks\n");
390
391         cam->dummy_frame.vaddress = dma_alloc_coherent(0,
392                                PAGE_ALIGN(cam->v2f.fmt.pix.sizeimage),
393                                &cam->dummy_frame.paddress,
394                                GFP_DMA | GFP_KERNEL);
395         if (cam->dummy_frame.vaddress == 0) {
396                 pr_err("ERROR: v4l2 capture: Allocate dummy frame "
397                        "failed.\n");
398                 return -ENOBUFS;
399         }
400         cam->dummy_frame.buffer.type = V4L2_BUF_TYPE_PRIVATE;
401         cam->dummy_frame.buffer.length =
402             PAGE_ALIGN(cam->v2f.fmt.pix.sizeimage);
403         cam->dummy_frame.buffer.m.offset = cam->dummy_frame.paddress;
404
405         if (cam->rotation >= IPU_ROTATE_90_RIGHT) {
406                 err = ipu_request_irq(cam->ipu, IPU_IRQ_PRP_ENC_ROT_OUT_EOF,
407                                       prp_enc_callback, 0, "Mxc Camera", cam);
408         } else {
409                 err = ipu_request_irq(cam->ipu, IPU_IRQ_PRP_ENC_OUT_EOF,
410                                       prp_enc_callback, 0, "Mxc Camera", cam);
411         }
412         if (err != 0) {
413                 printk(KERN_ERR "Error registering rot irq\n");
414                 return err;
415         }
416
417         err = prp_enc_setup(cam);
418         if (err != 0) {
419                 printk(KERN_ERR "prp_enc_setup %d\n", err);
420                 return err;
421         }
422
423         return err;
424 }
425
426 /*!
427  * Disable encoder task
428  * @param private       struct cam_data * mxc capture instance
429  *
430  * @return  int
431  */
432 static int prp_enc_disabling_tasks(void *private)
433 {
434         cam_data *cam = (cam_data *) private;
435         int err = 0;
436 #ifdef CONFIG_MXC_MIPI_CSI2
437         void *mipi_csi2_info;
438         int ipu_id;
439         int csi_id;
440 #endif
441
442         if (cam->rotation >= IPU_ROTATE_90_RIGHT) {
443                 ipu_free_irq(cam->ipu, IPU_IRQ_PRP_ENC_ROT_OUT_EOF, cam);
444                 ipu_unlink_channels(cam->ipu, CSI_PRP_ENC_MEM, MEM_ROT_ENC_MEM);
445         }
446
447         err = ipu_disable_channel(cam->ipu, CSI_PRP_ENC_MEM, true);
448         if (cam->rotation >= IPU_ROTATE_90_RIGHT)
449                 err |= ipu_disable_channel(cam->ipu, MEM_ROT_ENC_MEM, true);
450
451         ipu_uninit_channel(cam->ipu, CSI_PRP_ENC_MEM);
452         if (cam->rotation >= IPU_ROTATE_90_RIGHT)
453                 ipu_uninit_channel(cam->ipu, MEM_ROT_ENC_MEM);
454
455         if (cam->dummy_frame.vaddress != 0) {
456                 dma_free_coherent(0, cam->dummy_frame.buffer.length,
457                                   cam->dummy_frame.vaddress,
458                                   cam->dummy_frame.paddress);
459                 cam->dummy_frame.vaddress = 0;
460         }
461
462 #ifdef CONFIG_MXC_MIPI_CSI2
463         mipi_csi2_info = mipi_csi2_get_info();
464
465         if (mipi_csi2_info) {
466                 if (mipi_csi2_get_status(mipi_csi2_info)) {
467                         ipu_id = mipi_csi2_get_bind_ipu(mipi_csi2_info);
468                         csi_id = mipi_csi2_get_bind_csi(mipi_csi2_info);
469
470                         if (cam->ipu == ipu_get_soc(ipu_id)
471                                 && cam->csi == csi_id)
472                                 mipi_csi2_pixelclk_disable(mipi_csi2_info);
473                 }
474         } else {
475                 printk(KERN_ERR "%s() in %s: Fail to get mipi_csi2_info!\n",
476                        __func__, __FILE__);
477                 return -EPERM;
478         }
479 #endif
480
481         return err;
482 }
483
484 /*!
485  * Enable csi
486  * @param private       struct cam_data * mxc capture instance
487  *
488  * @return  status
489  */
490 static int prp_enc_enable_csi(void *private)
491 {
492         cam_data *cam = (cam_data *) private;
493
494         return ipu_enable_csi(cam->ipu, cam->csi);
495 }
496
497 /*!
498  * Disable csi
499  * @param private       struct cam_data * mxc capture instance
500  *
501  * @return  status
502  */
503 static int prp_enc_disable_csi(void *private)
504 {
505         cam_data *cam = (cam_data *) private;
506
507         /* free csi eof irq firstly.
508          * when disable csi, wait for idmac eof.
509          * it requests eof irq again */
510         if (cam->rotation < IPU_ROTATE_90_RIGHT)
511                 ipu_free_irq(cam->ipu, IPU_IRQ_PRP_ENC_OUT_EOF, cam);
512
513         return ipu_disable_csi(cam->ipu, cam->csi);
514 }
515
516 /*!
517  * function to select PRP-ENC as the working path
518  *
519  * @param private       struct cam_data * mxc capture instance
520  *
521  * @return  int
522  */
523 int prp_enc_select(void *private)
524 {
525         cam_data *cam = (cam_data *) private;
526         int err = 0;
527
528         if (cam) {
529                 cam->enc_update_eba = prp_enc_eba_update;
530                 cam->enc_enable = prp_enc_enabling_tasks;
531                 cam->enc_disable = prp_enc_disabling_tasks;
532                 cam->enc_enable_csi = prp_enc_enable_csi;
533                 cam->enc_disable_csi = prp_enc_disable_csi;
534         } else {
535                 err = -EIO;
536         }
537
538         return err;
539 }
540 EXPORT_SYMBOL(prp_enc_select);
541
542 /*!
543  * function to de-select PRP-ENC as the working path
544  *
545  * @param private       struct cam_data * mxc capture instance
546  *
547  * @return  int
548  */
549 int prp_enc_deselect(void *private)
550 {
551         cam_data *cam = (cam_data *) private;
552         int err = 0;
553
554         if (cam) {
555                 cam->enc_update_eba = NULL;
556                 cam->enc_enable = NULL;
557                 cam->enc_disable = NULL;
558                 cam->enc_enable_csi = NULL;
559                 cam->enc_disable_csi = NULL;
560                 if (cam->rot_enc_bufs_vaddr[0]) {
561                         dma_free_coherent(0, cam->rot_enc_buf_size[0],
562                                           cam->rot_enc_bufs_vaddr[0],
563                                           cam->rot_enc_bufs[0]);
564                         cam->rot_enc_bufs_vaddr[0] = NULL;
565                         cam->rot_enc_bufs[0] = 0;
566                 }
567                 if (cam->rot_enc_bufs_vaddr[1]) {
568                         dma_free_coherent(0, cam->rot_enc_buf_size[1],
569                                           cam->rot_enc_bufs_vaddr[1],
570                                           cam->rot_enc_bufs[1]);
571                         cam->rot_enc_bufs_vaddr[1] = NULL;
572                         cam->rot_enc_bufs[1] = 0;
573                 }
574         }
575
576         return err;
577 }
578 EXPORT_SYMBOL(prp_enc_deselect);
579
580 /*!
581  * Init the Encorder channels
582  *
583  * @return  Error code indicating success or failure
584  */
585 __init int prp_enc_init(void)
586 {
587         return 0;
588 }
589
590 /*!
591  * Deinit the Encorder channels
592  *
593  */
594 void __exit prp_enc_exit(void)
595 {
596 }
597
598 module_init(prp_enc_init);
599 module_exit(prp_enc_exit);
600
601 MODULE_AUTHOR("Freescale Semiconductor, Inc.");
602 MODULE_DESCRIPTION("IPU PRP ENC Driver");
603 MODULE_LICENSE("GPL");