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