]> git.karo-electronics.de Git - mv-sheeva.git/blob - drivers/media/video/sh_mobile_ceu_camera.c
[media] V4L: sh_mobile_ceu_camera: implement .stop_streaming()
[mv-sheeva.git] / drivers / media / video / sh_mobile_ceu_camera.c
1 /*
2  * V4L2 Driver for SuperH Mobile CEU interface
3  *
4  * Copyright (C) 2008 Magnus Damm
5  *
6  * Based on V4L2 Driver for PXA camera host - "pxa_camera.c",
7  *
8  * Copyright (C) 2006, Sascha Hauer, Pengutronix
9  * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  */
16
17 #include <linux/init.h>
18 #include <linux/module.h>
19 #include <linux/io.h>
20 #include <linux/delay.h>
21 #include <linux/dma-mapping.h>
22 #include <linux/errno.h>
23 #include <linux/fs.h>
24 #include <linux/interrupt.h>
25 #include <linux/kernel.h>
26 #include <linux/mm.h>
27 #include <linux/moduleparam.h>
28 #include <linux/time.h>
29 #include <linux/version.h>
30 #include <linux/slab.h>
31 #include <linux/device.h>
32 #include <linux/platform_device.h>
33 #include <linux/videodev2.h>
34 #include <linux/pm_runtime.h>
35 #include <linux/sched.h>
36
37 #include <media/v4l2-common.h>
38 #include <media/v4l2-dev.h>
39 #include <media/soc_camera.h>
40 #include <media/sh_mobile_ceu.h>
41 #include <media/videobuf2-dma-contig.h>
42 #include <media/v4l2-mediabus.h>
43 #include <media/soc_mediabus.h>
44
45 /* register offsets for sh7722 / sh7723 */
46
47 #define CAPSR  0x00 /* Capture start register */
48 #define CAPCR  0x04 /* Capture control register */
49 #define CAMCR  0x08 /* Capture interface control register */
50 #define CMCYR  0x0c /* Capture interface cycle  register */
51 #define CAMOR  0x10 /* Capture interface offset register */
52 #define CAPWR  0x14 /* Capture interface width register */
53 #define CAIFR  0x18 /* Capture interface input format register */
54 #define CSTCR  0x20 /* Camera strobe control register (<= sh7722) */
55 #define CSECR  0x24 /* Camera strobe emission count register (<= sh7722) */
56 #define CRCNTR 0x28 /* CEU register control register */
57 #define CRCMPR 0x2c /* CEU register forcible control register */
58 #define CFLCR  0x30 /* Capture filter control register */
59 #define CFSZR  0x34 /* Capture filter size clip register */
60 #define CDWDR  0x38 /* Capture destination width register */
61 #define CDAYR  0x3c /* Capture data address Y register */
62 #define CDACR  0x40 /* Capture data address C register */
63 #define CDBYR  0x44 /* Capture data bottom-field address Y register */
64 #define CDBCR  0x48 /* Capture data bottom-field address C register */
65 #define CBDSR  0x4c /* Capture bundle destination size register */
66 #define CFWCR  0x5c /* Firewall operation control register */
67 #define CLFCR  0x60 /* Capture low-pass filter control register */
68 #define CDOCR  0x64 /* Capture data output control register */
69 #define CDDCR  0x68 /* Capture data complexity level register */
70 #define CDDAR  0x6c /* Capture data complexity level address register */
71 #define CEIER  0x70 /* Capture event interrupt enable register */
72 #define CETCR  0x74 /* Capture event flag clear register */
73 #define CSTSR  0x7c /* Capture status register */
74 #define CSRTR  0x80 /* Capture software reset register */
75 #define CDSSR  0x84 /* Capture data size register */
76 #define CDAYR2 0x90 /* Capture data address Y register 2 */
77 #define CDACR2 0x94 /* Capture data address C register 2 */
78 #define CDBYR2 0x98 /* Capture data bottom-field address Y register 2 */
79 #define CDBCR2 0x9c /* Capture data bottom-field address C register 2 */
80
81 #undef DEBUG_GEOMETRY
82 #ifdef DEBUG_GEOMETRY
83 #define dev_geo dev_info
84 #else
85 #define dev_geo dev_dbg
86 #endif
87
88 /* per video frame buffer */
89 struct sh_mobile_ceu_buffer {
90         struct vb2_buffer vb; /* v4l buffer must be first */
91         struct list_head queue;
92         enum v4l2_mbus_pixelcode code;
93 };
94
95 struct sh_mobile_ceu_dev {
96         struct soc_camera_host ici;
97         struct soc_camera_device *icd;
98
99         unsigned int irq;
100         void __iomem *base;
101         unsigned long video_limit;
102
103         spinlock_t lock;                /* Protects video buffer lists */
104         struct list_head capture;
105         struct vb2_buffer *active;
106         struct vb2_alloc_ctx *alloc_ctx;
107
108         struct sh_mobile_ceu_info *pdata;
109
110         u32 cflcr;
111
112         enum v4l2_field field;
113         int sequence;
114
115         unsigned int image_mode:1;
116         unsigned int is_16bit:1;
117 };
118
119 struct sh_mobile_ceu_cam {
120         /* CEU offsets within scaled by the CEU camera output */
121         unsigned int ceu_left;
122         unsigned int ceu_top;
123         /* Client output, as seen by the CEU */
124         unsigned int width;
125         unsigned int height;
126         /*
127          * User window from S_CROP / G_CROP, produced by client cropping and
128          * scaling, CEU scaling and CEU cropping, mapped back onto the client
129          * input window
130          */
131         struct v4l2_rect subrect;
132         /* Camera cropping rectangle */
133         struct v4l2_rect rect;
134         const struct soc_mbus_pixelfmt *extra_fmt;
135         enum v4l2_mbus_pixelcode code;
136 };
137
138 static struct sh_mobile_ceu_buffer *to_ceu_vb(struct vb2_buffer *vb)
139 {
140         return container_of(vb, struct sh_mobile_ceu_buffer, vb);
141 }
142
143 static unsigned long make_bus_param(struct sh_mobile_ceu_dev *pcdev)
144 {
145         unsigned long flags;
146
147         flags = SOCAM_MASTER |
148                 SOCAM_PCLK_SAMPLE_RISING |
149                 SOCAM_HSYNC_ACTIVE_HIGH |
150                 SOCAM_HSYNC_ACTIVE_LOW |
151                 SOCAM_VSYNC_ACTIVE_HIGH |
152                 SOCAM_VSYNC_ACTIVE_LOW |
153                 SOCAM_DATA_ACTIVE_HIGH;
154
155         if (pcdev->pdata->flags & SH_CEU_FLAG_USE_8BIT_BUS)
156                 flags |= SOCAM_DATAWIDTH_8;
157
158         if (pcdev->pdata->flags & SH_CEU_FLAG_USE_16BIT_BUS)
159                 flags |= SOCAM_DATAWIDTH_16;
160
161         if (flags & SOCAM_DATAWIDTH_MASK)
162                 return flags;
163
164         return 0;
165 }
166
167 static void ceu_write(struct sh_mobile_ceu_dev *priv,
168                       unsigned long reg_offs, u32 data)
169 {
170         iowrite32(data, priv->base + reg_offs);
171 }
172
173 static u32 ceu_read(struct sh_mobile_ceu_dev *priv, unsigned long reg_offs)
174 {
175         return ioread32(priv->base + reg_offs);
176 }
177
178 static int sh_mobile_ceu_soft_reset(struct sh_mobile_ceu_dev *pcdev)
179 {
180         int i, success = 0;
181         struct soc_camera_device *icd = pcdev->icd;
182
183         ceu_write(pcdev, CAPSR, 1 << 16); /* reset */
184
185         /* wait CSTSR.CPTON bit */
186         for (i = 0; i < 1000; i++) {
187                 if (!(ceu_read(pcdev, CSTSR) & 1)) {
188                         success++;
189                         break;
190                 }
191                 udelay(1);
192         }
193
194         /* wait CAPSR.CPKIL bit */
195         for (i = 0; i < 1000; i++) {
196                 if (!(ceu_read(pcdev, CAPSR) & (1 << 16))) {
197                         success++;
198                         break;
199                 }
200                 udelay(1);
201         }
202
203
204         if (2 != success) {
205                 dev_warn(&icd->dev, "soft reset time out\n");
206                 return -EIO;
207         }
208
209         return 0;
210 }
211
212 /*
213  *  Videobuf operations
214  */
215 static int sh_mobile_ceu_videobuf_setup(struct vb2_queue *vq,
216                         unsigned int *count, unsigned int *num_planes,
217                         unsigned long sizes[], void *alloc_ctxs[])
218 {
219         struct soc_camera_device *icd = container_of(vq, struct soc_camera_device, vb2_vidq);
220         struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
221         struct sh_mobile_ceu_dev *pcdev = ici->priv;
222         int bytes_per_line = soc_mbus_bytes_per_line(icd->user_width,
223                                                 icd->current_fmt->host_fmt);
224
225         if (bytes_per_line < 0)
226                 return bytes_per_line;
227
228         *num_planes = 1;
229
230         pcdev->sequence = 0;
231         sizes[0] = bytes_per_line * icd->user_height;
232         alloc_ctxs[0] = pcdev->alloc_ctx;
233
234         if (!*count)
235                 *count = 2;
236
237         if (pcdev->video_limit) {
238                 if (PAGE_ALIGN(sizes[0]) * *count > pcdev->video_limit)
239                         *count = pcdev->video_limit / PAGE_ALIGN(sizes[0]);
240         }
241
242         dev_dbg(icd->dev.parent, "count=%d, size=%lu\n", *count, sizes[0]);
243
244         return 0;
245 }
246
247 #define CEU_CETCR_MAGIC 0x0317f313 /* acknowledge magical interrupt sources */
248 #define CEU_CETCR_IGRW (1 << 4) /* prohibited register access interrupt bit */
249 #define CEU_CEIER_CPEIE (1 << 0) /* one-frame capture end interrupt */
250 #define CEU_CEIER_VBP   (1 << 20) /* vbp error */
251 #define CEU_CAPCR_CTNCP (1 << 16) /* continuous capture mode (if set) */
252 #define CEU_CEIER_MASK (CEU_CEIER_CPEIE | CEU_CEIER_VBP)
253
254
255 /*
256  * return value doesn't reflex the success/failure to queue the new buffer,
257  * but rather the status of the previous buffer.
258  */
259 static int sh_mobile_ceu_capture(struct sh_mobile_ceu_dev *pcdev)
260 {
261         struct soc_camera_device *icd = pcdev->icd;
262         dma_addr_t phys_addr_top, phys_addr_bottom;
263         unsigned long top1, top2;
264         unsigned long bottom1, bottom2;
265         u32 status;
266         int ret = 0;
267
268         /*
269          * The hardware is _very_ picky about this sequence. Especially
270          * the CEU_CETCR_MAGIC value. It seems like we need to acknowledge
271          * several not-so-well documented interrupt sources in CETCR.
272          */
273         ceu_write(pcdev, CEIER, ceu_read(pcdev, CEIER) & ~CEU_CEIER_MASK);
274         status = ceu_read(pcdev, CETCR);
275         ceu_write(pcdev, CETCR, ~status & CEU_CETCR_MAGIC);
276         ceu_write(pcdev, CEIER, ceu_read(pcdev, CEIER) | CEU_CEIER_MASK);
277         ceu_write(pcdev, CAPCR, ceu_read(pcdev, CAPCR) & ~CEU_CAPCR_CTNCP);
278         ceu_write(pcdev, CETCR, CEU_CETCR_MAGIC ^ CEU_CETCR_IGRW);
279
280         /*
281          * When a VBP interrupt occurs, a capture end interrupt does not occur
282          * and the image of that frame is not captured correctly. So, soft reset
283          * is needed here.
284          */
285         if (status & CEU_CEIER_VBP) {
286                 sh_mobile_ceu_soft_reset(pcdev);
287                 ret = -EIO;
288         }
289
290         if (!pcdev->active)
291                 return ret;
292
293         if (V4L2_FIELD_INTERLACED_BT == pcdev->field) {
294                 top1    = CDBYR;
295                 top2    = CDBCR;
296                 bottom1 = CDAYR;
297                 bottom2 = CDACR;
298         } else {
299                 top1    = CDAYR;
300                 top2    = CDACR;
301                 bottom1 = CDBYR;
302                 bottom2 = CDBCR;
303         }
304
305         phys_addr_top = vb2_dma_contig_plane_paddr(pcdev->active, 0);
306
307         ceu_write(pcdev, top1, phys_addr_top);
308         if (V4L2_FIELD_NONE != pcdev->field) {
309                 phys_addr_bottom = phys_addr_top + icd->user_width;
310                 ceu_write(pcdev, bottom1, phys_addr_bottom);
311         }
312
313         switch (icd->current_fmt->host_fmt->fourcc) {
314         case V4L2_PIX_FMT_NV12:
315         case V4L2_PIX_FMT_NV21:
316         case V4L2_PIX_FMT_NV16:
317         case V4L2_PIX_FMT_NV61:
318                 phys_addr_top += icd->user_width *
319                         icd->user_height;
320                 ceu_write(pcdev, top2, phys_addr_top);
321                 if (V4L2_FIELD_NONE != pcdev->field) {
322                         phys_addr_bottom = phys_addr_top + icd->user_width;
323                         ceu_write(pcdev, bottom2, phys_addr_bottom);
324                 }
325         }
326
327         ceu_write(pcdev, CAPSR, 0x1); /* start capture */
328
329         return ret;
330 }
331
332 static int sh_mobile_ceu_videobuf_prepare(struct vb2_buffer *vb)
333 {
334         struct soc_camera_device *icd = container_of(vb->vb2_queue, struct soc_camera_device, vb2_vidq);
335         struct sh_mobile_ceu_buffer *buf;
336         int bytes_per_line = soc_mbus_bytes_per_line(icd->user_width,
337                                                 icd->current_fmt->host_fmt);
338         unsigned long size;
339
340         if (bytes_per_line < 0)
341                 return bytes_per_line;
342
343         buf = to_ceu_vb(vb);
344
345         dev_dbg(icd->dev.parent, "%s (vb=0x%p) 0x%p %lu\n", __func__,
346                 vb, vb2_plane_vaddr(vb, 0), vb2_get_plane_payload(vb, 0));
347
348         /* Added list head initialization on alloc */
349         WARN(!list_empty(&buf->queue), "Buffer %p on queue!\n", vb);
350
351 #ifdef DEBUG
352         /*
353          * This can be useful if you want to see if we actually fill
354          * the buffer with something
355          */
356         if (vb2_plane_vaddr(vb, 0))
357                 memset(vb2_plane_vaddr(vb, 0), 0xaa, vb2_get_plane_payload(vb, 0));
358 #endif
359
360         BUG_ON(NULL == icd->current_fmt);
361
362         size = icd->user_height * bytes_per_line;
363
364         if (vb2_plane_size(vb, 0) < size) {
365                 dev_err(icd->dev.parent, "Buffer too small (%lu < %lu)\n",
366                         vb2_plane_size(vb, 0), size);
367                 return -ENOBUFS;
368         }
369
370         vb2_set_plane_payload(vb, 0, size);
371
372         return 0;
373 }
374
375 static void sh_mobile_ceu_videobuf_queue(struct vb2_buffer *vb)
376 {
377         struct soc_camera_device *icd = container_of(vb->vb2_queue, struct soc_camera_device, vb2_vidq);
378         struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
379         struct sh_mobile_ceu_dev *pcdev = ici->priv;
380         struct sh_mobile_ceu_buffer *buf = to_ceu_vb(vb);
381         unsigned long flags;
382
383         dev_dbg(icd->dev.parent, "%s (vb=0x%p) 0x%p %lu\n", __func__,
384                 vb, vb2_plane_vaddr(vb, 0), vb2_get_plane_payload(vb, 0));
385
386         spin_lock_irqsave(&pcdev->lock, flags);
387         list_add_tail(&buf->queue, &pcdev->capture);
388
389         if (!pcdev->active) {
390                 /*
391                  * Because there were no active buffer at this moment,
392                  * we are not interested in the return value of
393                  * sh_mobile_ceu_capture here.
394                  */
395                 pcdev->active = vb;
396                 sh_mobile_ceu_capture(pcdev);
397         }
398         spin_unlock_irqrestore(&pcdev->lock, flags);
399 }
400
401 static void sh_mobile_ceu_videobuf_release(struct vb2_buffer *vb)
402 {
403         struct soc_camera_device *icd = container_of(vb->vb2_queue, struct soc_camera_device, vb2_vidq);
404         struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
405         struct sh_mobile_ceu_buffer *buf = to_ceu_vb(vb);
406         struct sh_mobile_ceu_dev *pcdev = ici->priv;
407         unsigned long flags;
408
409         spin_lock_irqsave(&pcdev->lock, flags);
410
411         if (pcdev->active == vb) {
412                 /* disable capture (release DMA buffer), reset */
413                 ceu_write(pcdev, CAPSR, 1 << 16);
414                 pcdev->active = NULL;
415         }
416
417         /* Doesn't hurt also if the list is empty */
418         list_del_init(&buf->queue);
419
420         spin_unlock_irqrestore(&pcdev->lock, flags);
421 }
422
423 static int sh_mobile_ceu_videobuf_init(struct vb2_buffer *vb)
424 {
425         /* This is for locking debugging only */
426         INIT_LIST_HEAD(&to_ceu_vb(vb)->queue);
427         return 0;
428 }
429
430 static int sh_mobile_ceu_stop_streaming(struct vb2_queue *q)
431 {
432         struct soc_camera_device *icd = container_of(q, struct soc_camera_device, vb2_vidq);
433         struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
434         struct sh_mobile_ceu_dev *pcdev = ici->priv;
435         struct list_head *buf_head, *tmp;
436         unsigned long flags;
437
438         spin_lock_irqsave(&pcdev->lock, flags);
439
440         pcdev->active = NULL;
441
442         list_for_each_safe(buf_head, tmp, &pcdev->capture)
443                 list_del_init(buf_head);
444
445         spin_unlock_irqrestore(&pcdev->lock, flags);
446
447         return sh_mobile_ceu_soft_reset(pcdev);
448 }
449
450 static struct vb2_ops sh_mobile_ceu_videobuf_ops = {
451         .queue_setup    = sh_mobile_ceu_videobuf_setup,
452         .buf_prepare    = sh_mobile_ceu_videobuf_prepare,
453         .buf_queue      = sh_mobile_ceu_videobuf_queue,
454         .buf_cleanup    = sh_mobile_ceu_videobuf_release,
455         .buf_init       = sh_mobile_ceu_videobuf_init,
456         .wait_prepare   = soc_camera_unlock,
457         .wait_finish    = soc_camera_lock,
458         .stop_streaming = sh_mobile_ceu_stop_streaming,
459 };
460
461 static irqreturn_t sh_mobile_ceu_irq(int irq, void *data)
462 {
463         struct sh_mobile_ceu_dev *pcdev = data;
464         struct vb2_buffer *vb;
465         int ret;
466
467         spin_lock(&pcdev->lock);
468
469         vb = pcdev->active;
470         if (!vb)
471                 /* Stale interrupt from a released buffer */
472                 goto out;
473
474         list_del_init(&to_ceu_vb(vb)->queue);
475
476         if (!list_empty(&pcdev->capture))
477                 pcdev->active = &list_entry(pcdev->capture.next,
478                                             struct sh_mobile_ceu_buffer, queue)->vb;
479         else
480                 pcdev->active = NULL;
481
482         ret = sh_mobile_ceu_capture(pcdev);
483         do_gettimeofday(&vb->v4l2_buf.timestamp);
484         if (!ret) {
485                 vb->v4l2_buf.field = pcdev->field;
486                 vb->v4l2_buf.sequence = pcdev->sequence++;
487         }
488         vb2_buffer_done(vb, ret < 0 ? VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE);
489
490 out:
491         spin_unlock(&pcdev->lock);
492
493         return IRQ_HANDLED;
494 }
495
496 /* Called with .video_lock held */
497 static int sh_mobile_ceu_add_device(struct soc_camera_device *icd)
498 {
499         struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
500         struct sh_mobile_ceu_dev *pcdev = ici->priv;
501         int ret;
502
503         if (pcdev->icd)
504                 return -EBUSY;
505
506         dev_info(icd->dev.parent,
507                  "SuperH Mobile CEU driver attached to camera %d\n",
508                  icd->devnum);
509
510         pm_runtime_get_sync(ici->v4l2_dev.dev);
511
512         ret = sh_mobile_ceu_soft_reset(pcdev);
513         if (!ret)
514                 pcdev->icd = icd;
515
516         return ret;
517 }
518
519 /* Called with .video_lock held */
520 static void sh_mobile_ceu_remove_device(struct soc_camera_device *icd)
521 {
522         struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
523         struct sh_mobile_ceu_dev *pcdev = ici->priv;
524         unsigned long flags;
525
526         BUG_ON(icd != pcdev->icd);
527
528         /* disable capture, disable interrupts */
529         ceu_write(pcdev, CEIER, 0);
530         sh_mobile_ceu_soft_reset(pcdev);
531
532         /* make sure active buffer is canceled */
533         spin_lock_irqsave(&pcdev->lock, flags);
534         if (pcdev->active) {
535                 list_del_init(&to_ceu_vb(pcdev->active)->queue);
536                 vb2_buffer_done(pcdev->active, VB2_BUF_STATE_ERROR);
537                 pcdev->active = NULL;
538         }
539         spin_unlock_irqrestore(&pcdev->lock, flags);
540
541         pm_runtime_put_sync(ici->v4l2_dev.dev);
542
543         dev_info(icd->dev.parent,
544                  "SuperH Mobile CEU driver detached from camera %d\n",
545                  icd->devnum);
546
547         pcdev->icd = NULL;
548 }
549
550 /*
551  * See chapter 29.4.12 "Capture Filter Control Register (CFLCR)"
552  * in SH7722 Hardware Manual
553  */
554 static unsigned int size_dst(unsigned int src, unsigned int scale)
555 {
556         unsigned int mant_pre = scale >> 12;
557         if (!src || !scale)
558                 return src;
559         return ((mant_pre + 2 * (src - 1)) / (2 * mant_pre) - 1) *
560                 mant_pre * 4096 / scale + 1;
561 }
562
563 static u16 calc_scale(unsigned int src, unsigned int *dst)
564 {
565         u16 scale;
566
567         if (src == *dst)
568                 return 0;
569
570         scale = (src * 4096 / *dst) & ~7;
571
572         while (scale > 4096 && size_dst(src, scale) < *dst)
573                 scale -= 8;
574
575         *dst = size_dst(src, scale);
576
577         return scale;
578 }
579
580 /* rect is guaranteed to not exceed the scaled camera rectangle */
581 static void sh_mobile_ceu_set_rect(struct soc_camera_device *icd)
582 {
583         struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
584         struct sh_mobile_ceu_cam *cam = icd->host_priv;
585         struct sh_mobile_ceu_dev *pcdev = ici->priv;
586         unsigned int height, width, cdwdr_width, in_width, in_height;
587         unsigned int left_offset, top_offset;
588         u32 camor;
589
590         dev_geo(icd->dev.parent, "Crop %ux%u@%u:%u\n",
591                 icd->user_width, icd->user_height, cam->ceu_left, cam->ceu_top);
592
593         left_offset     = cam->ceu_left;
594         top_offset      = cam->ceu_top;
595
596         /* CEU cropping (CFSZR) is applied _after_ the scaling filter (CFLCR) */
597         if (pcdev->image_mode) {
598                 in_width = cam->width;
599                 if (!pcdev->is_16bit) {
600                         in_width *= 2;
601                         left_offset *= 2;
602                 }
603                 width = icd->user_width;
604                 cdwdr_width = icd->user_width;
605         } else {
606                 int bytes_per_line = soc_mbus_bytes_per_line(icd->user_width,
607                                                 icd->current_fmt->host_fmt);
608                 unsigned int w_factor;
609
610                 width = icd->user_width;
611
612                 switch (icd->current_fmt->host_fmt->packing) {
613                 case SOC_MBUS_PACKING_2X8_PADHI:
614                         w_factor = 2;
615                         break;
616                 default:
617                         w_factor = 1;
618                 }
619
620                 in_width = cam->width * w_factor;
621                 left_offset = left_offset * w_factor;
622
623                 if (bytes_per_line < 0)
624                         cdwdr_width = icd->user_width;
625                 else
626                         cdwdr_width = bytes_per_line;
627         }
628
629         height = icd->user_height;
630         in_height = cam->height;
631         if (V4L2_FIELD_NONE != pcdev->field) {
632                 height /= 2;
633                 in_height /= 2;
634                 top_offset /= 2;
635                 cdwdr_width *= 2;
636         }
637
638         /* CSI2 special configuration */
639         if (pcdev->pdata->csi2_dev) {
640                 in_width = ((in_width - 2) * 2);
641                 left_offset *= 2;
642         }
643
644         /* Set CAMOR, CAPWR, CFSZR, take care of CDWDR */
645         camor = left_offset | (top_offset << 16);
646
647         dev_geo(icd->dev.parent,
648                 "CAMOR 0x%x, CAPWR 0x%x, CFSZR 0x%x, CDWDR 0x%x\n", camor,
649                 (in_height << 16) | in_width, (height << 16) | width,
650                 cdwdr_width);
651
652         ceu_write(pcdev, CAMOR, camor);
653         ceu_write(pcdev, CAPWR, (in_height << 16) | in_width);
654         ceu_write(pcdev, CFSZR, (height << 16) | width);
655         ceu_write(pcdev, CDWDR, cdwdr_width);
656 }
657
658 static u32 capture_save_reset(struct sh_mobile_ceu_dev *pcdev)
659 {
660         u32 capsr = ceu_read(pcdev, CAPSR);
661         ceu_write(pcdev, CAPSR, 1 << 16); /* reset, stop capture */
662         return capsr;
663 }
664
665 static void capture_restore(struct sh_mobile_ceu_dev *pcdev, u32 capsr)
666 {
667         unsigned long timeout = jiffies + 10 * HZ;
668
669         /*
670          * Wait until the end of the current frame. It can take a long time,
671          * but if it has been aborted by a CAPSR reset, it shoule exit sooner.
672          */
673         while ((ceu_read(pcdev, CSTSR) & 1) && time_before(jiffies, timeout))
674                 msleep(1);
675
676         if (time_after(jiffies, timeout)) {
677                 dev_err(pcdev->ici.v4l2_dev.dev,
678                         "Timeout waiting for frame end! Interface problem?\n");
679                 return;
680         }
681
682         /* Wait until reset clears, this shall not hang... */
683         while (ceu_read(pcdev, CAPSR) & (1 << 16))
684                 udelay(10);
685
686         /* Anything to restore? */
687         if (capsr & ~(1 << 16))
688                 ceu_write(pcdev, CAPSR, capsr);
689 }
690
691 /* Capture is not running, no interrupts, no locking needed */
692 static int sh_mobile_ceu_set_bus_param(struct soc_camera_device *icd,
693                                        __u32 pixfmt)
694 {
695         struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
696         struct sh_mobile_ceu_dev *pcdev = ici->priv;
697         int ret;
698         unsigned long camera_flags, common_flags, value;
699         int yuv_lineskip;
700         struct sh_mobile_ceu_cam *cam = icd->host_priv;
701         u32 capsr = capture_save_reset(pcdev);
702
703         camera_flags = icd->ops->query_bus_param(icd);
704         common_flags = soc_camera_bus_param_compatible(camera_flags,
705                                                        make_bus_param(pcdev));
706         if (!common_flags)
707                 return -EINVAL;
708
709         /* Make choises, based on platform preferences */
710         if ((common_flags & SOCAM_HSYNC_ACTIVE_HIGH) &&
711             (common_flags & SOCAM_HSYNC_ACTIVE_LOW)) {
712                 if (pcdev->pdata->flags & SH_CEU_FLAG_HSYNC_LOW)
713                         common_flags &= ~SOCAM_HSYNC_ACTIVE_HIGH;
714                 else
715                         common_flags &= ~SOCAM_HSYNC_ACTIVE_LOW;
716         }
717
718         if ((common_flags & SOCAM_VSYNC_ACTIVE_HIGH) &&
719             (common_flags & SOCAM_VSYNC_ACTIVE_LOW)) {
720                 if (pcdev->pdata->flags & SH_CEU_FLAG_VSYNC_LOW)
721                         common_flags &= ~SOCAM_VSYNC_ACTIVE_HIGH;
722                 else
723                         common_flags &= ~SOCAM_VSYNC_ACTIVE_LOW;
724         }
725
726         ret = icd->ops->set_bus_param(icd, common_flags);
727         if (ret < 0)
728                 return ret;
729
730         switch (common_flags & SOCAM_DATAWIDTH_MASK) {
731         case SOCAM_DATAWIDTH_8:
732                 pcdev->is_16bit = 0;
733                 break;
734         case SOCAM_DATAWIDTH_16:
735                 pcdev->is_16bit = 1;
736                 break;
737         default:
738                 return -EINVAL;
739         }
740
741         ceu_write(pcdev, CRCNTR, 0);
742         ceu_write(pcdev, CRCMPR, 0);
743
744         value = 0x00000010; /* data fetch by default */
745         yuv_lineskip = 0;
746
747         switch (icd->current_fmt->host_fmt->fourcc) {
748         case V4L2_PIX_FMT_NV12:
749         case V4L2_PIX_FMT_NV21:
750                 yuv_lineskip = 1; /* skip for NV12/21, no skip for NV16/61 */
751                 /* fall-through */
752         case V4L2_PIX_FMT_NV16:
753         case V4L2_PIX_FMT_NV61:
754                 switch (cam->code) {
755                 case V4L2_MBUS_FMT_UYVY8_2X8:
756                         value = 0x00000000; /* Cb0, Y0, Cr0, Y1 */
757                         break;
758                 case V4L2_MBUS_FMT_VYUY8_2X8:
759                         value = 0x00000100; /* Cr0, Y0, Cb0, Y1 */
760                         break;
761                 case V4L2_MBUS_FMT_YUYV8_2X8:
762                         value = 0x00000200; /* Y0, Cb0, Y1, Cr0 */
763                         break;
764                 case V4L2_MBUS_FMT_YVYU8_2X8:
765                         value = 0x00000300; /* Y0, Cr0, Y1, Cb0 */
766                         break;
767                 default:
768                         BUG();
769                 }
770         }
771
772         if (icd->current_fmt->host_fmt->fourcc == V4L2_PIX_FMT_NV21 ||
773             icd->current_fmt->host_fmt->fourcc == V4L2_PIX_FMT_NV61)
774                 value ^= 0x00000100; /* swap U, V to change from NV1x->NVx1 */
775
776         value |= common_flags & SOCAM_VSYNC_ACTIVE_LOW ? 1 << 1 : 0;
777         value |= common_flags & SOCAM_HSYNC_ACTIVE_LOW ? 1 << 0 : 0;
778         value |= pcdev->is_16bit ? 1 << 12 : 0;
779
780         /* CSI2 mode */
781         if (pcdev->pdata->csi2_dev)
782                 value |= 3 << 12;
783
784         ceu_write(pcdev, CAMCR, value);
785
786         ceu_write(pcdev, CAPCR, 0x00300000);
787
788         switch (pcdev->field) {
789         case V4L2_FIELD_INTERLACED_TB:
790                 value = 0x101;
791                 break;
792         case V4L2_FIELD_INTERLACED_BT:
793                 value = 0x102;
794                 break;
795         default:
796                 value = 0;
797                 break;
798         }
799         ceu_write(pcdev, CAIFR, value);
800
801         sh_mobile_ceu_set_rect(icd);
802         mdelay(1);
803
804         dev_geo(icd->dev.parent, "CFLCR 0x%x\n", pcdev->cflcr);
805         ceu_write(pcdev, CFLCR, pcdev->cflcr);
806
807         /*
808          * A few words about byte order (observed in Big Endian mode)
809          *
810          * In data fetch mode bytes are received in chunks of 8 bytes.
811          * D0, D1, D2, D3, D4, D5, D6, D7 (D0 received first)
812          *
813          * The data is however by default written to memory in reverse order:
814          * D7, D6, D5, D4, D3, D2, D1, D0 (D7 written to lowest byte)
815          *
816          * The lowest three bits of CDOCR allows us to do swapping,
817          * using 7 we swap the data bytes to match the incoming order:
818          * D0, D1, D2, D3, D4, D5, D6, D7
819          */
820         value = 0x00000017;
821         if (yuv_lineskip)
822                 value &= ~0x00000010; /* convert 4:2:2 -> 4:2:0 */
823
824         ceu_write(pcdev, CDOCR, value);
825         ceu_write(pcdev, CFWCR, 0); /* keep "datafetch firewall" disabled */
826
827         dev_dbg(icd->dev.parent, "S_FMT successful for %c%c%c%c %ux%u\n",
828                 pixfmt & 0xff, (pixfmt >> 8) & 0xff,
829                 (pixfmt >> 16) & 0xff, (pixfmt >> 24) & 0xff,
830                 icd->user_width, icd->user_height);
831
832         capture_restore(pcdev, capsr);
833
834         /* not in bundle mode: skip CBDSR, CDAYR2, CDACR2, CDBYR2, CDBCR2 */
835         return 0;
836 }
837
838 static int sh_mobile_ceu_try_bus_param(struct soc_camera_device *icd,
839                                        unsigned char buswidth)
840 {
841         struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
842         struct sh_mobile_ceu_dev *pcdev = ici->priv;
843         unsigned long camera_flags, common_flags;
844
845         camera_flags = icd->ops->query_bus_param(icd);
846         common_flags = soc_camera_bus_param_compatible(camera_flags,
847                                                        make_bus_param(pcdev));
848         if (!common_flags || buswidth > 16 ||
849             (buswidth > 8 && !(common_flags & SOCAM_DATAWIDTH_16)))
850                 return -EINVAL;
851
852         return 0;
853 }
854
855 static const struct soc_mbus_pixelfmt sh_mobile_ceu_formats[] = {
856         {
857                 .fourcc                 = V4L2_PIX_FMT_NV12,
858                 .name                   = "NV12",
859                 .bits_per_sample        = 12,
860                 .packing                = SOC_MBUS_PACKING_NONE,
861                 .order                  = SOC_MBUS_ORDER_LE,
862         }, {
863                 .fourcc                 = V4L2_PIX_FMT_NV21,
864                 .name                   = "NV21",
865                 .bits_per_sample        = 12,
866                 .packing                = SOC_MBUS_PACKING_NONE,
867                 .order                  = SOC_MBUS_ORDER_LE,
868         }, {
869                 .fourcc                 = V4L2_PIX_FMT_NV16,
870                 .name                   = "NV16",
871                 .bits_per_sample        = 16,
872                 .packing                = SOC_MBUS_PACKING_NONE,
873                 .order                  = SOC_MBUS_ORDER_LE,
874         }, {
875                 .fourcc                 = V4L2_PIX_FMT_NV61,
876                 .name                   = "NV61",
877                 .bits_per_sample        = 16,
878                 .packing                = SOC_MBUS_PACKING_NONE,
879                 .order                  = SOC_MBUS_ORDER_LE,
880         },
881 };
882
883 /* This will be corrected as we get more formats */
884 static bool sh_mobile_ceu_packing_supported(const struct soc_mbus_pixelfmt *fmt)
885 {
886         return  fmt->packing == SOC_MBUS_PACKING_NONE ||
887                 (fmt->bits_per_sample == 8 &&
888                  fmt->packing == SOC_MBUS_PACKING_2X8_PADHI) ||
889                 (fmt->bits_per_sample > 8 &&
890                  fmt->packing == SOC_MBUS_PACKING_EXTEND16);
891 }
892
893 static int client_g_rect(struct v4l2_subdev *sd, struct v4l2_rect *rect);
894
895 static int sh_mobile_ceu_get_formats(struct soc_camera_device *icd, unsigned int idx,
896                                      struct soc_camera_format_xlate *xlate)
897 {
898         struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
899         struct device *dev = icd->dev.parent;
900         struct soc_camera_host *ici = to_soc_camera_host(dev);
901         struct sh_mobile_ceu_dev *pcdev = ici->priv;
902         int ret, k, n;
903         int formats = 0;
904         struct sh_mobile_ceu_cam *cam;
905         enum v4l2_mbus_pixelcode code;
906         const struct soc_mbus_pixelfmt *fmt;
907
908         ret = v4l2_subdev_call(sd, video, enum_mbus_fmt, idx, &code);
909         if (ret < 0)
910                 /* No more formats */
911                 return 0;
912
913         fmt = soc_mbus_get_fmtdesc(code);
914         if (!fmt) {
915                 dev_err(dev, "Invalid format code #%u: %d\n", idx, code);
916                 return -EINVAL;
917         }
918
919         if (!pcdev->pdata->csi2_dev) {
920                 ret = sh_mobile_ceu_try_bus_param(icd, fmt->bits_per_sample);
921                 if (ret < 0)
922                         return 0;
923         }
924
925         if (!icd->host_priv) {
926                 struct v4l2_mbus_framefmt mf;
927                 struct v4l2_rect rect;
928                 int shift = 0;
929
930                 /* FIXME: subwindow is lost between close / open */
931
932                 /* Cache current client geometry */
933                 ret = client_g_rect(sd, &rect);
934                 if (ret < 0)
935                         return ret;
936
937                 /* First time */
938                 ret = v4l2_subdev_call(sd, video, g_mbus_fmt, &mf);
939                 if (ret < 0)
940                         return ret;
941
942                 while ((mf.width > 2560 || mf.height > 1920) && shift < 4) {
943                         /* Try 2560x1920, 1280x960, 640x480, 320x240 */
944                         mf.width        = 2560 >> shift;
945                         mf.height       = 1920 >> shift;
946                         ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
947                                                          s_mbus_fmt, &mf);
948                         if (ret < 0)
949                                 return ret;
950                         shift++;
951                 }
952
953                 if (shift == 4) {
954                         dev_err(dev, "Failed to configure the client below %ux%x\n",
955                                 mf.width, mf.height);
956                         return -EIO;
957                 }
958
959                 dev_geo(dev, "camera fmt %ux%u\n", mf.width, mf.height);
960
961                 cam = kzalloc(sizeof(*cam), GFP_KERNEL);
962                 if (!cam)
963                         return -ENOMEM;
964
965                 /* We are called with current camera crop, initialise subrect with it */
966                 cam->rect       = rect;
967                 cam->subrect    = rect;
968
969                 cam->width      = mf.width;
970                 cam->height     = mf.height;
971
972                 cam->width      = mf.width;
973                 cam->height     = mf.height;
974
975                 icd->host_priv = cam;
976         } else {
977                 cam = icd->host_priv;
978         }
979
980         /* Beginning of a pass */
981         if (!idx)
982                 cam->extra_fmt = NULL;
983
984         switch (code) {
985         case V4L2_MBUS_FMT_UYVY8_2X8:
986         case V4L2_MBUS_FMT_VYUY8_2X8:
987         case V4L2_MBUS_FMT_YUYV8_2X8:
988         case V4L2_MBUS_FMT_YVYU8_2X8:
989                 if (cam->extra_fmt)
990                         break;
991
992                 /*
993                  * Our case is simple so far: for any of the above four camera
994                  * formats we add all our four synthesized NV* formats, so,
995                  * just marking the device with a single flag suffices. If
996                  * the format generation rules are more complex, you would have
997                  * to actually hang your already added / counted formats onto
998                  * the host_priv pointer and check whether the format you're
999                  * going to add now is already there.
1000                  */
1001                 cam->extra_fmt = sh_mobile_ceu_formats;
1002
1003                 n = ARRAY_SIZE(sh_mobile_ceu_formats);
1004                 formats += n;
1005                 for (k = 0; xlate && k < n; k++) {
1006                         xlate->host_fmt = &sh_mobile_ceu_formats[k];
1007                         xlate->code     = code;
1008                         xlate++;
1009                         dev_dbg(dev, "Providing format %s using code %d\n",
1010                                 sh_mobile_ceu_formats[k].name, code);
1011                 }
1012                 break;
1013         default:
1014                 if (!sh_mobile_ceu_packing_supported(fmt))
1015                         return 0;
1016         }
1017
1018         /* Generic pass-through */
1019         formats++;
1020         if (xlate) {
1021                 xlate->host_fmt = fmt;
1022                 xlate->code     = code;
1023                 xlate++;
1024                 dev_dbg(dev, "Providing format %s in pass-through mode\n",
1025                         fmt->name);
1026         }
1027
1028         return formats;
1029 }
1030
1031 static void sh_mobile_ceu_put_formats(struct soc_camera_device *icd)
1032 {
1033         kfree(icd->host_priv);
1034         icd->host_priv = NULL;
1035 }
1036
1037 /* Check if any dimension of r1 is smaller than respective one of r2 */
1038 static bool is_smaller(struct v4l2_rect *r1, struct v4l2_rect *r2)
1039 {
1040         return r1->width < r2->width || r1->height < r2->height;
1041 }
1042
1043 /* Check if r1 fails to cover r2 */
1044 static bool is_inside(struct v4l2_rect *r1, struct v4l2_rect *r2)
1045 {
1046         return r1->left > r2->left || r1->top > r2->top ||
1047                 r1->left + r1->width < r2->left + r2->width ||
1048                 r1->top + r1->height < r2->top + r2->height;
1049 }
1050
1051 static unsigned int scale_down(unsigned int size, unsigned int scale)
1052 {
1053         return (size * 4096 + scale / 2) / scale;
1054 }
1055
1056 static unsigned int calc_generic_scale(unsigned int input, unsigned int output)
1057 {
1058         return (input * 4096 + output / 2) / output;
1059 }
1060
1061 /* Get and store current client crop */
1062 static int client_g_rect(struct v4l2_subdev *sd, struct v4l2_rect *rect)
1063 {
1064         struct v4l2_crop crop;
1065         struct v4l2_cropcap cap;
1066         int ret;
1067
1068         crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1069
1070         ret = v4l2_subdev_call(sd, video, g_crop, &crop);
1071         if (!ret) {
1072                 *rect = crop.c;
1073                 return ret;
1074         }
1075
1076         /* Camera driver doesn't support .g_crop(), assume default rectangle */
1077         cap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1078
1079         ret = v4l2_subdev_call(sd, video, cropcap, &cap);
1080         if (!ret)
1081                 *rect = cap.defrect;
1082
1083         return ret;
1084 }
1085
1086 /* Client crop has changed, update our sub-rectangle to remain within the area */
1087 static void update_subrect(struct sh_mobile_ceu_cam *cam)
1088 {
1089         struct v4l2_rect *rect = &cam->rect, *subrect = &cam->subrect;
1090
1091         if (rect->width < subrect->width)
1092                 subrect->width = rect->width;
1093
1094         if (rect->height < subrect->height)
1095                 subrect->height = rect->height;
1096
1097         if (rect->left > subrect->left)
1098                 subrect->left = rect->left;
1099         else if (rect->left + rect->width >
1100                  subrect->left + subrect->width)
1101                 subrect->left = rect->left + rect->width -
1102                         subrect->width;
1103
1104         if (rect->top > subrect->top)
1105                 subrect->top = rect->top;
1106         else if (rect->top + rect->height >
1107                  subrect->top + subrect->height)
1108                 subrect->top = rect->top + rect->height -
1109                         subrect->height;
1110 }
1111
1112 /*
1113  * The common for both scaling and cropping iterative approach is:
1114  * 1. try if the client can produce exactly what requested by the user
1115  * 2. if (1) failed, try to double the client image until we get one big enough
1116  * 3. if (2) failed, try to request the maximum image
1117  */
1118 static int client_s_crop(struct soc_camera_device *icd, struct v4l2_crop *crop,
1119                          struct v4l2_crop *cam_crop)
1120 {
1121         struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1122         struct v4l2_rect *rect = &crop->c, *cam_rect = &cam_crop->c;
1123         struct device *dev = sd->v4l2_dev->dev;
1124         struct sh_mobile_ceu_cam *cam = icd->host_priv;
1125         struct v4l2_cropcap cap;
1126         int ret;
1127         unsigned int width, height;
1128
1129         v4l2_subdev_call(sd, video, s_crop, crop);
1130         ret = client_g_rect(sd, cam_rect);
1131         if (ret < 0)
1132                 return ret;
1133
1134         /*
1135          * Now cam_crop contains the current camera input rectangle, and it must
1136          * be within camera cropcap bounds
1137          */
1138         if (!memcmp(rect, cam_rect, sizeof(*rect))) {
1139                 /* Even if camera S_CROP failed, but camera rectangle matches */
1140                 dev_dbg(dev, "Camera S_CROP successful for %dx%d@%d:%d\n",
1141                         rect->width, rect->height, rect->left, rect->top);
1142                 cam->rect = *cam_rect;
1143                 return 0;
1144         }
1145
1146         /* Try to fix cropping, that camera hasn't managed to set */
1147         dev_geo(dev, "Fix camera S_CROP for %dx%d@%d:%d to %dx%d@%d:%d\n",
1148                 cam_rect->width, cam_rect->height,
1149                 cam_rect->left, cam_rect->top,
1150                 rect->width, rect->height, rect->left, rect->top);
1151
1152         /* We need sensor maximum rectangle */
1153         ret = v4l2_subdev_call(sd, video, cropcap, &cap);
1154         if (ret < 0)
1155                 return ret;
1156
1157         /* Put user requested rectangle within sensor bounds */
1158         soc_camera_limit_side(&rect->left, &rect->width, cap.bounds.left, 2,
1159                               cap.bounds.width);
1160         soc_camera_limit_side(&rect->top, &rect->height, cap.bounds.top, 4,
1161                               cap.bounds.height);
1162
1163         /*
1164          * Popular special case - some cameras can only handle fixed sizes like
1165          * QVGA, VGA,... Take care to avoid infinite loop.
1166          */
1167         width = max(cam_rect->width, 2);
1168         height = max(cam_rect->height, 2);
1169
1170         /*
1171          * Loop as long as sensor is not covering the requested rectangle and
1172          * is still within its bounds
1173          */
1174         while (!ret && (is_smaller(cam_rect, rect) ||
1175                         is_inside(cam_rect, rect)) &&
1176                (cap.bounds.width > width || cap.bounds.height > height)) {
1177
1178                 width *= 2;
1179                 height *= 2;
1180
1181                 cam_rect->width = width;
1182                 cam_rect->height = height;
1183
1184                 /*
1185                  * We do not know what capabilities the camera has to set up
1186                  * left and top borders. We could try to be smarter in iterating
1187                  * them, e.g., if camera current left is to the right of the
1188                  * target left, set it to the middle point between the current
1189                  * left and minimum left. But that would add too much
1190                  * complexity: we would have to iterate each border separately.
1191                  * Instead we just drop to the left and top bounds.
1192                  */
1193                 if (cam_rect->left > rect->left)
1194                         cam_rect->left = cap.bounds.left;
1195
1196                 if (cam_rect->left + cam_rect->width < rect->left + rect->width)
1197                         cam_rect->width = rect->left + rect->width -
1198                                 cam_rect->left;
1199
1200                 if (cam_rect->top > rect->top)
1201                         cam_rect->top = cap.bounds.top;
1202
1203                 if (cam_rect->top + cam_rect->height < rect->top + rect->height)
1204                         cam_rect->height = rect->top + rect->height -
1205                                 cam_rect->top;
1206
1207                 v4l2_subdev_call(sd, video, s_crop, cam_crop);
1208                 ret = client_g_rect(sd, cam_rect);
1209                 dev_geo(dev, "Camera S_CROP %d for %dx%d@%d:%d\n", ret,
1210                         cam_rect->width, cam_rect->height,
1211                         cam_rect->left, cam_rect->top);
1212         }
1213
1214         /* S_CROP must not modify the rectangle */
1215         if (is_smaller(cam_rect, rect) || is_inside(cam_rect, rect)) {
1216                 /*
1217                  * The camera failed to configure a suitable cropping,
1218                  * we cannot use the current rectangle, set to max
1219                  */
1220                 *cam_rect = cap.bounds;
1221                 v4l2_subdev_call(sd, video, s_crop, cam_crop);
1222                 ret = client_g_rect(sd, cam_rect);
1223                 dev_geo(dev, "Camera S_CROP %d for max %dx%d@%d:%d\n", ret,
1224                         cam_rect->width, cam_rect->height,
1225                         cam_rect->left, cam_rect->top);
1226         }
1227
1228         if (!ret) {
1229                 cam->rect = *cam_rect;
1230                 update_subrect(cam);
1231         }
1232
1233         return ret;
1234 }
1235
1236 /* Iterative s_mbus_fmt, also updates cached client crop on success */
1237 static int client_s_fmt(struct soc_camera_device *icd,
1238                         struct v4l2_mbus_framefmt *mf, bool ceu_can_scale)
1239 {
1240         struct sh_mobile_ceu_cam *cam = icd->host_priv;
1241         struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1242         struct device *dev = icd->dev.parent;
1243         unsigned int width = mf->width, height = mf->height, tmp_w, tmp_h;
1244         unsigned int max_width, max_height;
1245         struct v4l2_cropcap cap;
1246         int ret;
1247
1248         ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
1249                                          s_mbus_fmt, mf);
1250         if (ret < 0)
1251                 return ret;
1252
1253         dev_geo(dev, "camera scaled to %ux%u\n", mf->width, mf->height);
1254
1255         if ((width == mf->width && height == mf->height) || !ceu_can_scale)
1256                 goto update_cache;
1257
1258         cap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1259
1260         ret = v4l2_subdev_call(sd, video, cropcap, &cap);
1261         if (ret < 0)
1262                 return ret;
1263
1264         max_width = min(cap.bounds.width, 2560);
1265         max_height = min(cap.bounds.height, 1920);
1266
1267         /* Camera set a format, but geometry is not precise, try to improve */
1268         tmp_w = mf->width;
1269         tmp_h = mf->height;
1270
1271         /* width <= max_width && height <= max_height - guaranteed by try_fmt */
1272         while ((width > tmp_w || height > tmp_h) &&
1273                tmp_w < max_width && tmp_h < max_height) {
1274                 tmp_w = min(2 * tmp_w, max_width);
1275                 tmp_h = min(2 * tmp_h, max_height);
1276                 mf->width = tmp_w;
1277                 mf->height = tmp_h;
1278                 ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
1279                                                  s_mbus_fmt, mf);
1280                 dev_geo(dev, "Camera scaled to %ux%u\n",
1281                         mf->width, mf->height);
1282                 if (ret < 0) {
1283                         /* This shouldn't happen */
1284                         dev_err(dev, "Client failed to set format: %d\n", ret);
1285                         return ret;
1286                 }
1287         }
1288
1289 update_cache:
1290         /* Update cache */
1291         ret = client_g_rect(sd, &cam->rect);
1292         if (ret < 0)
1293                 return ret;
1294
1295         update_subrect(cam);
1296
1297         return 0;
1298 }
1299
1300 /**
1301  * @width       - on output: user width, mapped back to input
1302  * @height      - on output: user height, mapped back to input
1303  * @mf          - in- / output camera output window
1304  */
1305 static int client_scale(struct soc_camera_device *icd,
1306                         struct v4l2_mbus_framefmt *mf,
1307                         unsigned int *width, unsigned int *height,
1308                         bool ceu_can_scale)
1309 {
1310         struct sh_mobile_ceu_cam *cam = icd->host_priv;
1311         struct device *dev = icd->dev.parent;
1312         struct v4l2_mbus_framefmt mf_tmp = *mf;
1313         unsigned int scale_h, scale_v;
1314         int ret;
1315
1316         /*
1317          * 5. Apply iterative camera S_FMT for camera user window (also updates
1318          *    client crop cache and the imaginary sub-rectangle).
1319          */
1320         ret = client_s_fmt(icd, &mf_tmp, ceu_can_scale);
1321         if (ret < 0)
1322                 return ret;
1323
1324         dev_geo(dev, "5: camera scaled to %ux%u\n",
1325                 mf_tmp.width, mf_tmp.height);
1326
1327         /* 6. Retrieve camera output window (g_fmt) */
1328
1329         /* unneeded - it is already in "mf_tmp" */
1330
1331         /* 7. Calculate new client scales. */
1332         scale_h = calc_generic_scale(cam->rect.width, mf_tmp.width);
1333         scale_v = calc_generic_scale(cam->rect.height, mf_tmp.height);
1334
1335         mf->width       = mf_tmp.width;
1336         mf->height      = mf_tmp.height;
1337         mf->colorspace  = mf_tmp.colorspace;
1338
1339         /*
1340          * 8. Calculate new CEU crop - apply camera scales to previously
1341          *    updated "effective" crop.
1342          */
1343         *width = scale_down(cam->subrect.width, scale_h);
1344         *height = scale_down(cam->subrect.height, scale_v);
1345
1346         dev_geo(dev, "8: new client sub-window %ux%u\n", *width, *height);
1347
1348         return 0;
1349 }
1350
1351 /*
1352  * CEU can scale and crop, but we don't want to waste bandwidth and kill the
1353  * framerate by always requesting the maximum image from the client. See
1354  * Documentation/video4linux/sh_mobile_camera_ceu.txt for a description of
1355  * scaling and cropping algorithms and for the meaning of referenced here steps.
1356  */
1357 static int sh_mobile_ceu_set_crop(struct soc_camera_device *icd,
1358                                   struct v4l2_crop *a)
1359 {
1360         struct v4l2_rect *rect = &a->c;
1361         struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
1362         struct sh_mobile_ceu_dev *pcdev = ici->priv;
1363         struct v4l2_crop cam_crop;
1364         struct sh_mobile_ceu_cam *cam = icd->host_priv;
1365         struct v4l2_rect *cam_rect = &cam_crop.c;
1366         struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1367         struct device *dev = icd->dev.parent;
1368         struct v4l2_mbus_framefmt mf;
1369         unsigned int scale_cam_h, scale_cam_v, scale_ceu_h, scale_ceu_v,
1370                 out_width, out_height;
1371         int interm_width, interm_height;
1372         u32 capsr, cflcr;
1373         int ret;
1374
1375         dev_geo(dev, "S_CROP(%ux%u@%u:%u)\n", rect->width, rect->height,
1376                 rect->left, rect->top);
1377
1378         /* During camera cropping its output window can change too, stop CEU */
1379         capsr = capture_save_reset(pcdev);
1380         dev_dbg(dev, "CAPSR 0x%x, CFLCR 0x%x\n", capsr, pcdev->cflcr);
1381
1382         /* 1. - 2. Apply iterative camera S_CROP for new input window. */
1383         ret = client_s_crop(icd, a, &cam_crop);
1384         if (ret < 0)
1385                 return ret;
1386
1387         dev_geo(dev, "1-2: camera cropped to %ux%u@%u:%u\n",
1388                 cam_rect->width, cam_rect->height,
1389                 cam_rect->left, cam_rect->top);
1390
1391         /* On success cam_crop contains current camera crop */
1392
1393         /* 3. Retrieve camera output window */
1394         ret = v4l2_subdev_call(sd, video, g_mbus_fmt, &mf);
1395         if (ret < 0)
1396                 return ret;
1397
1398         if (mf.width > 2560 || mf.height > 1920)
1399                 return -EINVAL;
1400
1401         /* Cache camera output window */
1402         cam->width      = mf.width;
1403         cam->height     = mf.height;
1404
1405         /* 4. Calculate camera scales */
1406         scale_cam_h     = calc_generic_scale(cam_rect->width, mf.width);
1407         scale_cam_v     = calc_generic_scale(cam_rect->height, mf.height);
1408
1409         /* Calculate intermediate window */
1410         interm_width    = scale_down(rect->width, scale_cam_h);
1411         interm_height   = scale_down(rect->height, scale_cam_v);
1412
1413         if (pcdev->image_mode) {
1414                 out_width       = min(interm_width, icd->user_width);
1415                 out_height      = min(interm_height, icd->user_height);
1416         } else {
1417                 out_width       = interm_width;
1418                 out_height      = interm_height;
1419         }
1420
1421         /*
1422          * 5. Calculate CEU scales from camera scales from results of (5) and
1423          *    the user window
1424          */
1425         scale_ceu_h     = calc_scale(interm_width, &out_width);
1426         scale_ceu_v     = calc_scale(interm_height, &out_height);
1427
1428         dev_geo(dev, "5: CEU scales %u:%u\n", scale_ceu_h, scale_ceu_v);
1429
1430         /* Apply CEU scales. */
1431         cflcr = scale_ceu_h | (scale_ceu_v << 16);
1432         if (cflcr != pcdev->cflcr) {
1433                 pcdev->cflcr = cflcr;
1434                 ceu_write(pcdev, CFLCR, cflcr);
1435         }
1436
1437         icd->user_width  = out_width;
1438         icd->user_height = out_height;
1439         cam->ceu_left    = scale_down(rect->left - cam_rect->left, scale_cam_h) & ~1;
1440         cam->ceu_top     = scale_down(rect->top - cam_rect->top, scale_cam_v) & ~1;
1441
1442         /* 6. Use CEU cropping to crop to the new window. */
1443         sh_mobile_ceu_set_rect(icd);
1444
1445         cam->subrect = *rect;
1446
1447         dev_geo(dev, "6: CEU cropped to %ux%u@%u:%u\n",
1448                 icd->user_width, icd->user_height,
1449                 cam->ceu_left, cam->ceu_top);
1450
1451         /* Restore capture. The CE bit can be cleared by the hardware */
1452         if (pcdev->active)
1453                 capsr |= 1;
1454         capture_restore(pcdev, capsr);
1455
1456         /* Even if only camera cropping succeeded */
1457         return ret;
1458 }
1459
1460 static int sh_mobile_ceu_get_crop(struct soc_camera_device *icd,
1461                                   struct v4l2_crop *a)
1462 {
1463         struct sh_mobile_ceu_cam *cam = icd->host_priv;
1464
1465         a->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1466         a->c = cam->subrect;
1467
1468         return 0;
1469 }
1470
1471 /*
1472  * Calculate real client output window by applying new scales to the current
1473  * client crop. New scales are calculated from the requested output format and
1474  * CEU crop, mapped backed onto the client input (subrect).
1475  */
1476 static void calculate_client_output(struct soc_camera_device *icd,
1477                 struct v4l2_pix_format *pix, struct v4l2_mbus_framefmt *mf)
1478 {
1479         struct sh_mobile_ceu_cam *cam = icd->host_priv;
1480         struct device *dev = icd->dev.parent;
1481         struct v4l2_rect *cam_subrect = &cam->subrect;
1482         unsigned int scale_v, scale_h;
1483
1484         if (cam_subrect->width == cam->rect.width &&
1485             cam_subrect->height == cam->rect.height) {
1486                 /* No sub-cropping */
1487                 mf->width       = pix->width;
1488                 mf->height      = pix->height;
1489                 return;
1490         }
1491
1492         /* 1.-2. Current camera scales and subwin - cached. */
1493
1494         dev_geo(dev, "2: subwin %ux%u@%u:%u\n",
1495                 cam_subrect->width, cam_subrect->height,
1496                 cam_subrect->left, cam_subrect->top);
1497
1498         /*
1499          * 3. Calculate new combined scales from input sub-window to requested
1500          *    user window.
1501          */
1502
1503         /*
1504          * TODO: CEU cannot scale images larger than VGA to smaller than SubQCIF
1505          * (128x96) or larger than VGA
1506          */
1507         scale_h = calc_generic_scale(cam_subrect->width, pix->width);
1508         scale_v = calc_generic_scale(cam_subrect->height, pix->height);
1509
1510         dev_geo(dev, "3: scales %u:%u\n", scale_h, scale_v);
1511
1512         /*
1513          * 4. Calculate client output window by applying combined scales to real
1514          *    input window.
1515          */
1516         mf->width       = scale_down(cam->rect.width, scale_h);
1517         mf->height      = scale_down(cam->rect.height, scale_v);
1518 }
1519
1520 /* Similar to set_crop multistage iterative algorithm */
1521 static int sh_mobile_ceu_set_fmt(struct soc_camera_device *icd,
1522                                  struct v4l2_format *f)
1523 {
1524         struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
1525         struct sh_mobile_ceu_dev *pcdev = ici->priv;
1526         struct sh_mobile_ceu_cam *cam = icd->host_priv;
1527         struct v4l2_pix_format *pix = &f->fmt.pix;
1528         struct v4l2_mbus_framefmt mf;
1529         struct device *dev = icd->dev.parent;
1530         __u32 pixfmt = pix->pixelformat;
1531         const struct soc_camera_format_xlate *xlate;
1532         /* Keep Compiler Happy */
1533         unsigned int ceu_sub_width = 0, ceu_sub_height = 0;
1534         u16 scale_v, scale_h;
1535         int ret;
1536         bool image_mode;
1537         enum v4l2_field field;
1538
1539         dev_geo(dev, "S_FMT(pix=0x%x, %ux%u)\n", pixfmt, pix->width, pix->height);
1540
1541         switch (pix->field) {
1542         default:
1543                 pix->field = V4L2_FIELD_NONE;
1544                 /* fall-through */
1545         case V4L2_FIELD_INTERLACED_TB:
1546         case V4L2_FIELD_INTERLACED_BT:
1547         case V4L2_FIELD_NONE:
1548                 field = pix->field;
1549                 break;
1550         case V4L2_FIELD_INTERLACED:
1551                 field = V4L2_FIELD_INTERLACED_TB;
1552                 break;
1553         }
1554
1555         xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
1556         if (!xlate) {
1557                 dev_warn(dev, "Format %x not found\n", pixfmt);
1558                 return -EINVAL;
1559         }
1560
1561         /* 1.-4. Calculate client output geometry */
1562         calculate_client_output(icd, &f->fmt.pix, &mf);
1563         mf.field        = pix->field;
1564         mf.colorspace   = pix->colorspace;
1565         mf.code         = xlate->code;
1566
1567         switch (pixfmt) {
1568         case V4L2_PIX_FMT_NV12:
1569         case V4L2_PIX_FMT_NV21:
1570         case V4L2_PIX_FMT_NV16:
1571         case V4L2_PIX_FMT_NV61:
1572                 image_mode = true;
1573                 break;
1574         default:
1575                 image_mode = false;
1576         }
1577
1578         dev_geo(dev, "4: request camera output %ux%u\n", mf.width, mf.height);
1579
1580         /* 5. - 9. */
1581         ret = client_scale(icd, &mf, &ceu_sub_width, &ceu_sub_height,
1582                            image_mode && V4L2_FIELD_NONE == field);
1583
1584         dev_geo(dev, "5-9: client scale return %d\n", ret);
1585
1586         /* Done with the camera. Now see if we can improve the result */
1587
1588         dev_geo(dev, "fmt %ux%u, requested %ux%u\n",
1589                 mf.width, mf.height, pix->width, pix->height);
1590         if (ret < 0)
1591                 return ret;
1592
1593         if (mf.code != xlate->code)
1594                 return -EINVAL;
1595
1596         /* 9. Prepare CEU crop */
1597         cam->width = mf.width;
1598         cam->height = mf.height;
1599
1600         /* 10. Use CEU scaling to scale to the requested user window. */
1601
1602         /* We cannot scale up */
1603         if (pix->width > ceu_sub_width)
1604                 ceu_sub_width = pix->width;
1605
1606         if (pix->height > ceu_sub_height)
1607                 ceu_sub_height = pix->height;
1608
1609         pix->colorspace = mf.colorspace;
1610
1611         if (image_mode) {
1612                 /* Scale pix->{width x height} down to width x height */
1613                 scale_h         = calc_scale(ceu_sub_width, &pix->width);
1614                 scale_v         = calc_scale(ceu_sub_height, &pix->height);
1615         } else {
1616                 pix->width      = ceu_sub_width;
1617                 pix->height     = ceu_sub_height;
1618                 scale_h         = 0;
1619                 scale_v         = 0;
1620         }
1621
1622         pcdev->cflcr = scale_h | (scale_v << 16);
1623
1624         /*
1625          * We have calculated CFLCR, the actual configuration will be performed
1626          * in sh_mobile_ceu_set_bus_param()
1627          */
1628
1629         dev_geo(dev, "10: W: %u : 0x%x = %u, H: %u : 0x%x = %u\n",
1630                 ceu_sub_width, scale_h, pix->width,
1631                 ceu_sub_height, scale_v, pix->height);
1632
1633         cam->code               = xlate->code;
1634         icd->current_fmt        = xlate;
1635
1636         pcdev->field = field;
1637         pcdev->image_mode = image_mode;
1638
1639         return 0;
1640 }
1641
1642 static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd,
1643                                  struct v4l2_format *f)
1644 {
1645         const struct soc_camera_format_xlate *xlate;
1646         struct v4l2_pix_format *pix = &f->fmt.pix;
1647         struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1648         struct v4l2_mbus_framefmt mf;
1649         __u32 pixfmt = pix->pixelformat;
1650         int width, height;
1651         int ret;
1652
1653         dev_geo(icd->dev.parent, "TRY_FMT(pix=0x%x, %ux%u)\n",
1654                  pixfmt, pix->width, pix->height);
1655
1656         xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
1657         if (!xlate) {
1658                 dev_warn(icd->dev.parent, "Format %x not found\n", pixfmt);
1659                 return -EINVAL;
1660         }
1661
1662         /* FIXME: calculate using depth and bus width */
1663
1664         v4l_bound_align_image(&pix->width, 2, 2560, 1,
1665                               &pix->height, 4, 1920, 2, 0);
1666
1667         width = pix->width;
1668         height = pix->height;
1669
1670         pix->bytesperline = soc_mbus_bytes_per_line(width, xlate->host_fmt);
1671         if ((int)pix->bytesperline < 0)
1672                 return pix->bytesperline;
1673         pix->sizeimage = height * pix->bytesperline;
1674
1675         /* limit to sensor capabilities */
1676         mf.width        = pix->width;
1677         mf.height       = pix->height;
1678         mf.field        = pix->field;
1679         mf.code         = xlate->code;
1680         mf.colorspace   = pix->colorspace;
1681
1682         ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, try_mbus_fmt, &mf);
1683         if (ret < 0)
1684                 return ret;
1685
1686         pix->width      = mf.width;
1687         pix->height     = mf.height;
1688         pix->field      = mf.field;
1689         pix->colorspace = mf.colorspace;
1690
1691         switch (pixfmt) {
1692         case V4L2_PIX_FMT_NV12:
1693         case V4L2_PIX_FMT_NV21:
1694         case V4L2_PIX_FMT_NV16:
1695         case V4L2_PIX_FMT_NV61:
1696                 /* FIXME: check against rect_max after converting soc-camera */
1697                 /* We can scale precisely, need a bigger image from camera */
1698                 if (pix->width < width || pix->height < height) {
1699                         /*
1700                          * We presume, the sensor behaves sanely, i.e., if
1701                          * requested a bigger rectangle, it will not return a
1702                          * smaller one.
1703                          */
1704                         mf.width = 2560;
1705                         mf.height = 1920;
1706                         ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
1707                                                          try_mbus_fmt, &mf);
1708                         if (ret < 0) {
1709                                 /* Shouldn't actually happen... */
1710                                 dev_err(icd->dev.parent,
1711                                         "FIXME: client try_fmt() = %d\n", ret);
1712                                 return ret;
1713                         }
1714                 }
1715                 /* We will scale exactly */
1716                 if (mf.width > width)
1717                         pix->width = width;
1718                 if (mf.height > height)
1719                         pix->height = height;
1720         }
1721
1722         dev_geo(icd->dev.parent, "%s(): return %d, fmt 0x%x, %ux%u\n",
1723                 __func__, ret, pix->pixelformat, pix->width, pix->height);
1724
1725         return ret;
1726 }
1727
1728 static unsigned int sh_mobile_ceu_poll(struct file *file, poll_table *pt)
1729 {
1730         struct soc_camera_device *icd = file->private_data;
1731
1732         return vb2_poll(&icd->vb2_vidq, file, pt);
1733 }
1734
1735 static int sh_mobile_ceu_querycap(struct soc_camera_host *ici,
1736                                   struct v4l2_capability *cap)
1737 {
1738         strlcpy(cap->card, "SuperH_Mobile_CEU", sizeof(cap->card));
1739         cap->version = KERNEL_VERSION(0, 0, 5);
1740         cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
1741         return 0;
1742 }
1743
1744 static int sh_mobile_ceu_init_videobuf(struct vb2_queue *q,
1745                                        struct soc_camera_device *icd)
1746 {
1747         q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1748         q->io_modes = VB2_MMAP | VB2_USERPTR;
1749         q->drv_priv = icd;
1750         q->ops = &sh_mobile_ceu_videobuf_ops;
1751         q->mem_ops = &vb2_dma_contig_memops;
1752         q->buf_struct_size = sizeof(struct sh_mobile_ceu_buffer);
1753
1754         return vb2_queue_init(q);
1755 }
1756
1757 static int sh_mobile_ceu_get_ctrl(struct soc_camera_device *icd,
1758                                   struct v4l2_control *ctrl)
1759 {
1760         struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
1761         struct sh_mobile_ceu_dev *pcdev = ici->priv;
1762         u32 val;
1763
1764         switch (ctrl->id) {
1765         case V4L2_CID_SHARPNESS:
1766                 val = ceu_read(pcdev, CLFCR);
1767                 ctrl->value = val ^ 1;
1768                 return 0;
1769         }
1770         return -ENOIOCTLCMD;
1771 }
1772
1773 static int sh_mobile_ceu_set_ctrl(struct soc_camera_device *icd,
1774                                   struct v4l2_control *ctrl)
1775 {
1776         struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
1777         struct sh_mobile_ceu_dev *pcdev = ici->priv;
1778
1779         switch (ctrl->id) {
1780         case V4L2_CID_SHARPNESS:
1781                 switch (icd->current_fmt->host_fmt->fourcc) {
1782                 case V4L2_PIX_FMT_NV12:
1783                 case V4L2_PIX_FMT_NV21:
1784                 case V4L2_PIX_FMT_NV16:
1785                 case V4L2_PIX_FMT_NV61:
1786                         ceu_write(pcdev, CLFCR, !ctrl->value);
1787                         return 0;
1788                 }
1789                 return -EINVAL;
1790         }
1791         return -ENOIOCTLCMD;
1792 }
1793
1794 static const struct v4l2_queryctrl sh_mobile_ceu_controls[] = {
1795         {
1796                 .id             = V4L2_CID_SHARPNESS,
1797                 .type           = V4L2_CTRL_TYPE_BOOLEAN,
1798                 .name           = "Low-pass filter",
1799                 .minimum        = 0,
1800                 .maximum        = 1,
1801                 .step           = 1,
1802                 .default_value  = 0,
1803         },
1804 };
1805
1806 static struct soc_camera_host_ops sh_mobile_ceu_host_ops = {
1807         .owner          = THIS_MODULE,
1808         .add            = sh_mobile_ceu_add_device,
1809         .remove         = sh_mobile_ceu_remove_device,
1810         .get_formats    = sh_mobile_ceu_get_formats,
1811         .put_formats    = sh_mobile_ceu_put_formats,
1812         .get_crop       = sh_mobile_ceu_get_crop,
1813         .set_crop       = sh_mobile_ceu_set_crop,
1814         .set_fmt        = sh_mobile_ceu_set_fmt,
1815         .try_fmt        = sh_mobile_ceu_try_fmt,
1816         .set_ctrl       = sh_mobile_ceu_set_ctrl,
1817         .get_ctrl       = sh_mobile_ceu_get_ctrl,
1818         .poll           = sh_mobile_ceu_poll,
1819         .querycap       = sh_mobile_ceu_querycap,
1820         .set_bus_param  = sh_mobile_ceu_set_bus_param,
1821         .init_videobuf2 = sh_mobile_ceu_init_videobuf,
1822         .controls       = sh_mobile_ceu_controls,
1823         .num_controls   = ARRAY_SIZE(sh_mobile_ceu_controls),
1824 };
1825
1826 struct bus_wait {
1827         struct notifier_block   notifier;
1828         struct completion       completion;
1829         struct device           *dev;
1830 };
1831
1832 static int bus_notify(struct notifier_block *nb,
1833                       unsigned long action, void *data)
1834 {
1835         struct device *dev = data;
1836         struct bus_wait *wait = container_of(nb, struct bus_wait, notifier);
1837
1838         if (wait->dev != dev)
1839                 return NOTIFY_DONE;
1840
1841         switch (action) {
1842         case BUS_NOTIFY_UNBOUND_DRIVER:
1843                 /* Protect from module unloading */
1844                 wait_for_completion(&wait->completion);
1845                 return NOTIFY_OK;
1846         }
1847         return NOTIFY_DONE;
1848 }
1849
1850 static int __devinit sh_mobile_ceu_probe(struct platform_device *pdev)
1851 {
1852         struct sh_mobile_ceu_dev *pcdev;
1853         struct resource *res;
1854         void __iomem *base;
1855         unsigned int irq;
1856         int err = 0;
1857         struct bus_wait wait = {
1858                 .completion = COMPLETION_INITIALIZER_ONSTACK(wait.completion),
1859                 .notifier.notifier_call = bus_notify,
1860         };
1861         struct device *csi2;
1862
1863         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1864         irq = platform_get_irq(pdev, 0);
1865         if (!res || (int)irq <= 0) {
1866                 dev_err(&pdev->dev, "Not enough CEU platform resources.\n");
1867                 err = -ENODEV;
1868                 goto exit;
1869         }
1870
1871         pcdev = kzalloc(sizeof(*pcdev), GFP_KERNEL);
1872         if (!pcdev) {
1873                 dev_err(&pdev->dev, "Could not allocate pcdev\n");
1874                 err = -ENOMEM;
1875                 goto exit;
1876         }
1877
1878         INIT_LIST_HEAD(&pcdev->capture);
1879         spin_lock_init(&pcdev->lock);
1880
1881         pcdev->pdata = pdev->dev.platform_data;
1882         if (!pcdev->pdata) {
1883                 err = -EINVAL;
1884                 dev_err(&pdev->dev, "CEU platform data not set.\n");
1885                 goto exit_kfree;
1886         }
1887
1888         base = ioremap_nocache(res->start, resource_size(res));
1889         if (!base) {
1890                 err = -ENXIO;
1891                 dev_err(&pdev->dev, "Unable to ioremap CEU registers.\n");
1892                 goto exit_kfree;
1893         }
1894
1895         pcdev->irq = irq;
1896         pcdev->base = base;
1897         pcdev->video_limit = 0; /* only enabled if second resource exists */
1898
1899         res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1900         if (res) {
1901                 err = dma_declare_coherent_memory(&pdev->dev, res->start,
1902                                                   res->start,
1903                                                   resource_size(res),
1904                                                   DMA_MEMORY_MAP |
1905                                                   DMA_MEMORY_EXCLUSIVE);
1906                 if (!err) {
1907                         dev_err(&pdev->dev, "Unable to declare CEU memory.\n");
1908                         err = -ENXIO;
1909                         goto exit_iounmap;
1910                 }
1911
1912                 pcdev->video_limit = resource_size(res);
1913         }
1914
1915         /* request irq */
1916         err = request_irq(pcdev->irq, sh_mobile_ceu_irq, IRQF_DISABLED,
1917                           dev_name(&pdev->dev), pcdev);
1918         if (err) {
1919                 dev_err(&pdev->dev, "Unable to register CEU interrupt.\n");
1920                 goto exit_release_mem;
1921         }
1922
1923         pm_suspend_ignore_children(&pdev->dev, true);
1924         pm_runtime_enable(&pdev->dev);
1925         pm_runtime_resume(&pdev->dev);
1926
1927         pcdev->ici.priv = pcdev;
1928         pcdev->ici.v4l2_dev.dev = &pdev->dev;
1929         pcdev->ici.nr = pdev->id;
1930         pcdev->ici.drv_name = dev_name(&pdev->dev);
1931         pcdev->ici.ops = &sh_mobile_ceu_host_ops;
1932
1933         /* CSI2 interfacing */
1934         csi2 = pcdev->pdata->csi2_dev;
1935         if (csi2) {
1936                 wait.dev = csi2;
1937
1938                 err = bus_register_notifier(&platform_bus_type, &wait.notifier);
1939                 if (err < 0)
1940                         goto exit_free_clk;
1941
1942                 /*
1943                  * From this point the driver module will not unload, until
1944                  * we complete the completion.
1945                  */
1946
1947                 if (!csi2->driver) {
1948                         complete(&wait.completion);
1949                         /* Either too late, or probing failed */
1950                         bus_unregister_notifier(&platform_bus_type, &wait.notifier);
1951                         err = -ENXIO;
1952                         goto exit_free_clk;
1953                 }
1954
1955                 /*
1956                  * The module is still loaded, in the worst case it is hanging
1957                  * in device release on our completion. So, _now_ dereferencing
1958                  * the "owner" is safe!
1959                  */
1960
1961                 err = try_module_get(csi2->driver->owner);
1962
1963                 /* Let notifier complete, if it has been locked */
1964                 complete(&wait.completion);
1965                 bus_unregister_notifier(&platform_bus_type, &wait.notifier);
1966                 if (!err) {
1967                         err = -ENODEV;
1968                         goto exit_free_clk;
1969                 }
1970         }
1971
1972         pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev);
1973         if (IS_ERR(pcdev->alloc_ctx)) {
1974                 err = PTR_ERR(pcdev->alloc_ctx);
1975                 goto exit_module_put;
1976         }
1977
1978         err = soc_camera_host_register(&pcdev->ici);
1979         if (err)
1980                 goto exit_free_ctx;
1981
1982         return 0;
1983
1984 exit_free_ctx:
1985         vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
1986 exit_module_put:
1987         if (csi2 && csi2->driver)
1988                 module_put(csi2->driver->owner);
1989 exit_free_clk:
1990         pm_runtime_disable(&pdev->dev);
1991         free_irq(pcdev->irq, pcdev);
1992 exit_release_mem:
1993         if (platform_get_resource(pdev, IORESOURCE_MEM, 1))
1994                 dma_release_declared_memory(&pdev->dev);
1995 exit_iounmap:
1996         iounmap(base);
1997 exit_kfree:
1998         kfree(pcdev);
1999 exit:
2000         return err;
2001 }
2002
2003 static int __devexit sh_mobile_ceu_remove(struct platform_device *pdev)
2004 {
2005         struct soc_camera_host *soc_host = to_soc_camera_host(&pdev->dev);
2006         struct sh_mobile_ceu_dev *pcdev = container_of(soc_host,
2007                                         struct sh_mobile_ceu_dev, ici);
2008         struct device *csi2 = pcdev->pdata->csi2_dev;
2009
2010         soc_camera_host_unregister(soc_host);
2011         pm_runtime_disable(&pdev->dev);
2012         free_irq(pcdev->irq, pcdev);
2013         if (platform_get_resource(pdev, IORESOURCE_MEM, 1))
2014                 dma_release_declared_memory(&pdev->dev);
2015         iounmap(pcdev->base);
2016         vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
2017         if (csi2 && csi2->driver)
2018                 module_put(csi2->driver->owner);
2019         kfree(pcdev);
2020
2021         return 0;
2022 }
2023
2024 static int sh_mobile_ceu_runtime_nop(struct device *dev)
2025 {
2026         /* Runtime PM callback shared between ->runtime_suspend()
2027          * and ->runtime_resume(). Simply returns success.
2028          *
2029          * This driver re-initializes all registers after
2030          * pm_runtime_get_sync() anyway so there is no need
2031          * to save and restore registers here.
2032          */
2033         return 0;
2034 }
2035
2036 static const struct dev_pm_ops sh_mobile_ceu_dev_pm_ops = {
2037         .runtime_suspend = sh_mobile_ceu_runtime_nop,
2038         .runtime_resume = sh_mobile_ceu_runtime_nop,
2039 };
2040
2041 static struct platform_driver sh_mobile_ceu_driver = {
2042         .driver         = {
2043                 .name   = "sh_mobile_ceu",
2044                 .pm     = &sh_mobile_ceu_dev_pm_ops,
2045         },
2046         .probe          = sh_mobile_ceu_probe,
2047         .remove         = __devexit_p(sh_mobile_ceu_remove),
2048 };
2049
2050 static int __init sh_mobile_ceu_init(void)
2051 {
2052         /* Whatever return code */
2053         request_module("sh_mobile_csi2");
2054         return platform_driver_register(&sh_mobile_ceu_driver);
2055 }
2056
2057 static void __exit sh_mobile_ceu_exit(void)
2058 {
2059         platform_driver_unregister(&sh_mobile_ceu_driver);
2060 }
2061
2062 module_init(sh_mobile_ceu_init);
2063 module_exit(sh_mobile_ceu_exit);
2064
2065 MODULE_DESCRIPTION("SuperH Mobile CEU driver");
2066 MODULE_AUTHOR("Magnus Damm");
2067 MODULE_LICENSE("GPL");
2068 MODULE_ALIAS("platform:sh_mobile_ceu");