sh_mobile_ceu_camera.c 60.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * V4L2 Driver for SuperH Mobile CEU interface
 *
 * Copyright (C) 2008 Magnus Damm
 *
 * Based on V4L2 Driver for PXA camera host - "pxa_camera.c",
 *
 * Copyright (C) 2006, Sascha Hauer, Pengutronix
 * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/io.h>
20
#include <linux/completion.h>
21 22 23 24 25 26 27 28 29
#include <linux/delay.h>
#include <linux/dma-mapping.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/moduleparam.h>
#include <linux/time.h>
30
#include <linux/slab.h>
31 32 33
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/videodev2.h>
34
#include <linux/pm_runtime.h>
35
#include <linux/sched.h>
36 37 38 39 40

#include <media/v4l2-common.h>
#include <media/v4l2-dev.h>
#include <media/soc_camera.h>
#include <media/sh_mobile_ceu.h>
41
#include <media/sh_mobile_csi2.h>
42
#include <media/videobuf2-dma-contig.h>
43 44
#include <media/v4l2-mediabus.h>
#include <media/soc_mediabus.h>
45 46 47

/* register offsets for sh7722 / sh7723 */

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
#define CAPSR  0x00 /* Capture start register */
#define CAPCR  0x04 /* Capture control register */
#define CAMCR  0x08 /* Capture interface control register */
#define CMCYR  0x0c /* Capture interface cycle  register */
#define CAMOR  0x10 /* Capture interface offset register */
#define CAPWR  0x14 /* Capture interface width register */
#define CAIFR  0x18 /* Capture interface input format register */
#define CSTCR  0x20 /* Camera strobe control register (<= sh7722) */
#define CSECR  0x24 /* Camera strobe emission count register (<= sh7722) */
#define CRCNTR 0x28 /* CEU register control register */
#define CRCMPR 0x2c /* CEU register forcible control register */
#define CFLCR  0x30 /* Capture filter control register */
#define CFSZR  0x34 /* Capture filter size clip register */
#define CDWDR  0x38 /* Capture destination width register */
#define CDAYR  0x3c /* Capture data address Y register */
#define CDACR  0x40 /* Capture data address C register */
#define CDBYR  0x44 /* Capture data bottom-field address Y register */
#define CDBCR  0x48 /* Capture data bottom-field address C register */
#define CBDSR  0x4c /* Capture bundle destination size register */
#define CFWCR  0x5c /* Firewall operation control register */
#define CLFCR  0x60 /* Capture low-pass filter control register */
#define CDOCR  0x64 /* Capture data output control register */
#define CDDCR  0x68 /* Capture data complexity level register */
#define CDDAR  0x6c /* Capture data complexity level address register */
#define CEIER  0x70 /* Capture event interrupt enable register */
#define CETCR  0x74 /* Capture event flag clear register */
#define CSTSR  0x7c /* Capture status register */
#define CSRTR  0x80 /* Capture software reset register */
#define CDSSR  0x84 /* Capture data size register */
#define CDAYR2 0x90 /* Capture data address Y register 2 */
#define CDACR2 0x94 /* Capture data address C register 2 */
#define CDBYR2 0x98 /* Capture data bottom-field address Y register 2 */
#define CDBCR2 0x9c /* Capture data bottom-field address C register 2 */
81

82 83 84 85 86 87 88
#undef DEBUG_GEOMETRY
#ifdef DEBUG_GEOMETRY
#define dev_geo	dev_info
#else
#define dev_geo	dev_dbg
#endif

89 90
/* per video frame buffer */
struct sh_mobile_ceu_buffer {
91 92
	struct vb2_buffer vb; /* v4l buffer must be first */
	struct list_head queue;
93
	enum v4l2_mbus_pixelcode code;
94 95 96 97 98
};

struct sh_mobile_ceu_dev {
	struct soc_camera_host ici;
	struct soc_camera_device *icd;
99
	struct platform_device *csi2_pdev;
100 101 102 103 104

	unsigned int irq;
	void __iomem *base;
	unsigned long video_limit;

105
	spinlock_t lock;		/* Protects video buffer lists */
106
	struct list_head capture;
107 108
	struct vb2_buffer *active;
	struct vb2_alloc_ctx *alloc_ctx;
109 110

	struct sh_mobile_ceu_info *pdata;
111
	struct completion complete;
112

113 114
	u32 cflcr;

115
	enum v4l2_field field;
116
	int sequence;
117

118 119
	unsigned int image_mode:1;
	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 126 127 128 129 130 131 132 133 134 135 136 137
	unsigned int ceu_left;
	unsigned int ceu_top;
	/* Client output, as seen by the CEU */
	unsigned int width;
	unsigned int height;
	/*
	 * User window from S_CROP / G_CROP, produced by client cropping and
	 * scaling, CEU scaling and CEU cropping, mapped back onto the client
	 * input window
	 */
	struct v4l2_rect subrect;
	/* Camera cropping rectangle */
	struct v4l2_rect rect;
138 139
	const struct soc_mbus_pixelfmt *extra_fmt;
	enum v4l2_mbus_pixelcode code;
140 141
};

142 143 144 145 146
static struct sh_mobile_ceu_buffer *to_ceu_vb(struct vb2_buffer *vb)
{
	return container_of(vb, struct sh_mobile_ceu_buffer, vb);
}

147
static void ceu_write(struct sh_mobile_ceu_dev *priv,
148
		      unsigned long reg_offs, u32 data)
149 150 151 152
{
	iowrite32(data, priv->base + reg_offs);
}

153
static u32 ceu_read(struct sh_mobile_ceu_dev *priv, unsigned long reg_offs)
154 155 156 157
{
	return ioread32(priv->base + reg_offs);
}

158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
static int sh_mobile_ceu_soft_reset(struct sh_mobile_ceu_dev *pcdev)
{
	int i, success = 0;
	struct soc_camera_device *icd = pcdev->icd;

	ceu_write(pcdev, CAPSR, 1 << 16); /* reset */

	/* wait CSTSR.CPTON bit */
	for (i = 0; i < 1000; i++) {
		if (!(ceu_read(pcdev, CSTSR) & 1)) {
			success++;
			break;
		}
		udelay(1);
	}

	/* wait CAPSR.CPKIL bit */
	for (i = 0; i < 1000; i++) {
		if (!(ceu_read(pcdev, CAPSR) & (1 << 16))) {
			success++;
			break;
		}
		udelay(1);
	}


	if (2 != success) {
185
		dev_warn(icd->pdev, "soft reset time out\n");
186 187 188 189 190 191
		return -EIO;
	}

	return 0;
}

192 193 194
/*
 *  Videobuf operations
 */
195 196
static int sh_mobile_ceu_videobuf_setup(struct vb2_queue *vq,
			unsigned int *count, unsigned int *num_planes,
197
			unsigned int sizes[], void *alloc_ctxs[])
198
{
199
	struct soc_camera_device *icd = container_of(vq, struct soc_camera_device, vb2_vidq);
200
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
201
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
202 203
	int bytes_per_line = soc_mbus_bytes_per_line(icd->user_width,
						icd->current_fmt->host_fmt);
204

205 206 207
	if (bytes_per_line < 0)
		return bytes_per_line;

208 209 210 211 212
	*num_planes = 1;

	pcdev->sequence = 0;
	sizes[0] = bytes_per_line * icd->user_height;
	alloc_ctxs[0] = pcdev->alloc_ctx;
213

214
	if (!*count)
215 216 217
		*count = 2;

	if (pcdev->video_limit) {
218 219
		if (PAGE_ALIGN(sizes[0]) * *count > pcdev->video_limit)
			*count = pcdev->video_limit / PAGE_ALIGN(sizes[0]);
220 221
	}

222
	dev_dbg(icd->parent, "count=%d, size=%u\n", *count, sizes[0]);
223 224 225 226

	return 0;
}

227 228 229
#define CEU_CETCR_MAGIC 0x0317f313 /* acknowledge magical interrupt sources */
#define CEU_CETCR_IGRW (1 << 4) /* prohibited register access interrupt bit */
#define CEU_CEIER_CPEIE (1 << 0) /* one-frame capture end interrupt */
230
#define CEU_CEIER_VBP   (1 << 20) /* vbp error */
231
#define CEU_CAPCR_CTNCP (1 << 16) /* continuous capture mode (if set) */
232
#define CEU_CEIER_MASK (CEU_CEIER_CPEIE | CEU_CEIER_VBP)
233 234


235 236 237 238 239
/*
 * return value doesn't reflex the success/failure to queue the new buffer,
 * but rather the status of the previous buffer.
 */
static int sh_mobile_ceu_capture(struct sh_mobile_ceu_dev *pcdev)
240
{
241
	struct soc_camera_device *icd = pcdev->icd;
242
	dma_addr_t phys_addr_top, phys_addr_bottom;
243 244
	unsigned long top1, top2;
	unsigned long bottom1, bottom2;
245
	u32 status;
246
	bool planar;
247
	int ret = 0;
248

249 250
	/*
	 * The hardware is _very_ picky about this sequence. Especially
251 252 253
	 * the CEU_CETCR_MAGIC value. It seems like we need to acknowledge
	 * several not-so-well documented interrupt sources in CETCR.
	 */
254 255 256
	ceu_write(pcdev, CEIER, ceu_read(pcdev, CEIER) & ~CEU_CEIER_MASK);
	status = ceu_read(pcdev, CETCR);
	ceu_write(pcdev, CETCR, ~status & CEU_CETCR_MAGIC);
257 258
	if (!pcdev->frozen)
		ceu_write(pcdev, CEIER, ceu_read(pcdev, CEIER) | CEU_CEIER_MASK);
259 260
	ceu_write(pcdev, CAPCR, ceu_read(pcdev, CAPCR) & ~CEU_CAPCR_CTNCP);
	ceu_write(pcdev, CETCR, CEU_CETCR_MAGIC ^ CEU_CETCR_IGRW);
261

262 263 264 265 266 267 268 269 270 271
	/*
	 * When a VBP interrupt occurs, a capture end interrupt does not occur
	 * and the image of that frame is not captured correctly. So, soft reset
	 * is needed here.
	 */
	if (status & CEU_CEIER_VBP) {
		sh_mobile_ceu_soft_reset(pcdev);
		ret = -EIO;
	}

272 273 274 275 276
	if (pcdev->frozen) {
		complete(&pcdev->complete);
		return ret;
	}

277
	if (!pcdev->active)
278
		return ret;
279

280 281 282 283 284 285 286 287 288 289 290 291
	if (V4L2_FIELD_INTERLACED_BT == pcdev->field) {
		top1	= CDBYR;
		top2	= CDBCR;
		bottom1	= CDAYR;
		bottom2	= CDACR;
	} else {
		top1	= CDAYR;
		top2	= CDACR;
		bottom1	= CDBYR;
		bottom2	= CDBCR;
	}

292
	phys_addr_top = vb2_dma_contig_plane_dma_addr(pcdev->active, 0);
293

294
	switch (icd->current_fmt->host_fmt->fourcc) {
295 296
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
297 298
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
		planar = true;
		break;
	default:
		planar = false;
	}

	ceu_write(pcdev, top1, phys_addr_top);
	if (V4L2_FIELD_NONE != pcdev->field) {
		if (planar)
			phys_addr_bottom = phys_addr_top + icd->user_width;
		else
			phys_addr_bottom = phys_addr_top +
				soc_mbus_bytes_per_line(icd->user_width,
							icd->current_fmt->host_fmt);
		ceu_write(pcdev, bottom1, phys_addr_bottom);
	}

	if (planar) {
317 318
		phys_addr_top += icd->user_width *
			icd->user_height;
319 320 321 322
		ceu_write(pcdev, top2, phys_addr_top);
		if (V4L2_FIELD_NONE != pcdev->field) {
			phys_addr_bottom = phys_addr_top + icd->user_width;
			ceu_write(pcdev, bottom2, phys_addr_bottom);
323
		}
324
	}
325 326

	ceu_write(pcdev, CAPSR, 0x1); /* start capture */
327 328

	return ret;
329 330
}

331
static int sh_mobile_ceu_videobuf_prepare(struct vb2_buffer *vb)
332
{
333
	struct soc_camera_device *icd = container_of(vb->vb2_queue, struct soc_camera_device, vb2_vidq);
334
	struct sh_mobile_ceu_buffer *buf;
335 336
	int bytes_per_line = soc_mbus_bytes_per_line(icd->user_width,
						icd->current_fmt->host_fmt);
337
	unsigned long size;
338

339 340 341
	if (bytes_per_line < 0)
		return bytes_per_line;

342
	buf = to_ceu_vb(vb);
343

344
	dev_dbg(icd->parent, "%s (vb=0x%p) 0x%p %lu\n", __func__,
345
		vb, vb2_plane_vaddr(vb, 0), vb2_get_plane_payload(vb, 0));
346 347

	/* Added list head initialization on alloc */
348
	WARN(!list_empty(&buf->queue), "Buffer %p on queue!\n", vb);
349 350

#ifdef DEBUG
351 352 353 354
	/*
	 * This can be useful if you want to see if we actually fill
	 * the buffer with something
	 */
355 356
	if (vb2_plane_vaddr(vb, 0))
		memset(vb2_plane_vaddr(vb, 0), 0xaa, vb2_get_plane_payload(vb, 0));
357 358 359 360
#endif

	BUG_ON(NULL == icd->current_fmt);

361
	size = icd->user_height * bytes_per_line;
362

363
	if (vb2_plane_size(vb, 0) < size) {
364
		dev_err(icd->parent, "Buffer too small (%lu < %lu)\n",
365 366
			vb2_plane_size(vb, 0), size);
		return -ENOBUFS;
367 368
	}

369
	vb2_set_plane_payload(vb, 0, size);
370 371 372 373

	return 0;
}

374
static void sh_mobile_ceu_videobuf_queue(struct vb2_buffer *vb)
375
{
376
	struct soc_camera_device *icd = container_of(vb->vb2_queue, struct soc_camera_device, vb2_vidq);
377
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
378
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
379
	struct sh_mobile_ceu_buffer *buf = to_ceu_vb(vb);
380

381
	dev_dbg(icd->parent, "%s (vb=0x%p) 0x%p %lu\n", __func__,
382
		vb, vb2_plane_vaddr(vb, 0), vb2_get_plane_payload(vb, 0));
383

384
	spin_lock_irq(&pcdev->lock);
385
	list_add_tail(&buf->queue, &pcdev->capture);
386 387

	if (!pcdev->active) {
388 389 390 391 392
		/*
		 * Because there were no active buffer at this moment,
		 * we are not interested in the return value of
		 * sh_mobile_ceu_capture here.
		 */
393 394 395
		pcdev->active = vb;
		sh_mobile_ceu_capture(pcdev);
	}
396
	spin_unlock_irq(&pcdev->lock);
397 398
}

399
static void sh_mobile_ceu_videobuf_release(struct vb2_buffer *vb)
400
{
401
	struct soc_camera_device *icd = container_of(vb->vb2_queue, struct soc_camera_device, vb2_vidq);
402
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
403
	struct sh_mobile_ceu_buffer *buf = to_ceu_vb(vb);
404 405
	struct sh_mobile_ceu_dev *pcdev = ici->priv;

406
	spin_lock_irq(&pcdev->lock);
407 408 409 410 411 412 413

	if (pcdev->active == vb) {
		/* disable capture (release DMA buffer), reset */
		ceu_write(pcdev, CAPSR, 1 << 16);
		pcdev->active = NULL;
	}

414 415 416 417 418 419
	/*
	 * Doesn't hurt also if the list is empty, but it hurts, if queuing the
	 * buffer failed, and .buf_init() hasn't been called
	 */
	if (buf->queue.next)
		list_del_init(&buf->queue);
420

421
	spin_unlock_irq(&pcdev->lock);
422
}
423

424 425 426 427 428
static int sh_mobile_ceu_videobuf_init(struct vb2_buffer *vb)
{
	/* This is for locking debugging only */
	INIT_LIST_HEAD(&to_ceu_vb(vb)->queue);
	return 0;
429 430
}

431 432 433
static int sh_mobile_ceu_stop_streaming(struct vb2_queue *q)
{
	struct soc_camera_device *icd = container_of(q, struct soc_camera_device, vb2_vidq);
434
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
435 436 437
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
	struct list_head *buf_head, *tmp;

438
	spin_lock_irq(&pcdev->lock);
439 440 441 442 443 444

	pcdev->active = NULL;

	list_for_each_safe(buf_head, tmp, &pcdev->capture)
		list_del_init(buf_head);

445
	spin_unlock_irq(&pcdev->lock);
446 447 448 449

	return sh_mobile_ceu_soft_reset(pcdev);
}

450 451 452 453 454 455 456 457
static struct vb2_ops sh_mobile_ceu_videobuf_ops = {
	.queue_setup	= sh_mobile_ceu_videobuf_setup,
	.buf_prepare	= sh_mobile_ceu_videobuf_prepare,
	.buf_queue	= sh_mobile_ceu_videobuf_queue,
	.buf_cleanup	= sh_mobile_ceu_videobuf_release,
	.buf_init	= sh_mobile_ceu_videobuf_init,
	.wait_prepare	= soc_camera_unlock,
	.wait_finish	= soc_camera_lock,
458
	.stop_streaming	= sh_mobile_ceu_stop_streaming,
459 460 461 462 463
};

static irqreturn_t sh_mobile_ceu_irq(int irq, void *data)
{
	struct sh_mobile_ceu_dev *pcdev = data;
464 465
	struct vb2_buffer *vb;
	int ret;
466

467
	spin_lock(&pcdev->lock);
468 469

	vb = pcdev->active;
470 471 472 473
	if (!vb)
		/* Stale interrupt from a released buffer */
		goto out;

474
	list_del_init(&to_ceu_vb(vb)->queue);
475 476

	if (!list_empty(&pcdev->capture))
477 478
		pcdev->active = &list_entry(pcdev->capture.next,
					    struct sh_mobile_ceu_buffer, queue)->vb;
479 480 481
	else
		pcdev->active = NULL;

482 483 484 485 486 487 488
	ret = sh_mobile_ceu_capture(pcdev);
	do_gettimeofday(&vb->v4l2_buf.timestamp);
	if (!ret) {
		vb->v4l2_buf.field = pcdev->field;
		vb->v4l2_buf.sequence = pcdev->sequence++;
	}
	vb2_buffer_done(vb, ret < 0 ? VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE);
489 490

out:
491
	spin_unlock(&pcdev->lock);
492 493 494 495

	return IRQ_HANDLED;
}

496 497 498 499 500 501 502 503 504 505 506 507 508 509
static struct v4l2_subdev *find_csi2(struct sh_mobile_ceu_dev *pcdev)
{
	struct v4l2_subdev *sd;

	if (!pcdev->csi2_pdev)
		return NULL;

	v4l2_device_for_each_subdev(sd, &pcdev->ici.v4l2_dev)
		if (&pcdev->csi2_pdev->dev == v4l2_get_subdevdata(sd))
			return sd;

	return NULL;
}

510
/* Called with .video_lock held */
511 512
static int sh_mobile_ceu_add_device(struct soc_camera_device *icd)
{
513
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
514
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
515
	struct v4l2_subdev *csi2_sd;
516
	int ret;
517 518

	if (pcdev->icd)
519
		return -EBUSY;
520

521
	dev_info(icd->parent,
522 523 524
		 "SuperH Mobile CEU driver attached to camera %d\n",
		 icd->devnum);

525
	pm_runtime_get_sync(ici->v4l2_dev.dev);
526

527
	ret = sh_mobile_ceu_soft_reset(pcdev);
528 529 530 531 532 533 534

	csi2_sd = find_csi2(pcdev);

	ret = v4l2_subdev_call(csi2_sd, core, s_power, 1);
	if (ret != -ENODEV && ret != -ENOIOCTLCMD && ret < 0) {
		pm_runtime_put_sync(ici->v4l2_dev.dev);
	} else {
535
		pcdev->icd = icd;
536 537
		ret = 0;
	}
538

539
	return ret;
540 541
}

542
/* Called with .video_lock held */
543 544
static void sh_mobile_ceu_remove_device(struct soc_camera_device *icd)
{
545
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
546
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
547
	struct v4l2_subdev *csi2_sd = find_csi2(pcdev);
548 549 550

	BUG_ON(icd != pcdev->icd);

551
	v4l2_subdev_call(csi2_sd, core, s_power, 0);
552 553
	/* disable capture, disable interrupts */
	ceu_write(pcdev, CEIER, 0);
554
	sh_mobile_ceu_soft_reset(pcdev);
555 556

	/* make sure active buffer is canceled */
557
	spin_lock_irq(&pcdev->lock);
558
	if (pcdev->active) {
559 560
		list_del_init(&to_ceu_vb(pcdev->active)->queue);
		vb2_buffer_done(pcdev->active, VB2_BUF_STATE_ERROR);
561 562
		pcdev->active = NULL;
	}
563
	spin_unlock_irq(&pcdev->lock);
564

565
	pm_runtime_put_sync(ici->v4l2_dev.dev);
566

567
	dev_info(icd->parent,
568 569 570 571 572 573
		 "SuperH Mobile CEU driver detached from camera %d\n",
		 icd->devnum);

	pcdev->icd = NULL;
}

574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604
/*
 * See chapter 29.4.12 "Capture Filter Control Register (CFLCR)"
 * in SH7722 Hardware Manual
 */
static unsigned int size_dst(unsigned int src, unsigned int scale)
{
	unsigned int mant_pre = scale >> 12;
	if (!src || !scale)
		return src;
	return ((mant_pre + 2 * (src - 1)) / (2 * mant_pre) - 1) *
		mant_pre * 4096 / scale + 1;
}

static u16 calc_scale(unsigned int src, unsigned int *dst)
{
	u16 scale;

	if (src == *dst)
		return 0;

	scale = (src * 4096 / *dst) & ~7;

	while (scale > 4096 && size_dst(src, scale) < *dst)
		scale -= 8;

	*dst = size_dst(src, scale);

	return scale;
}

/* rect is guaranteed to not exceed the scaled camera rectangle */
605
static void sh_mobile_ceu_set_rect(struct soc_camera_device *icd)
606
{
607
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
608 609
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
610 611
	unsigned int height, width, cdwdr_width, in_width, in_height;
	unsigned int left_offset, top_offset;
612 613
	u32 camor;

614
	dev_geo(icd->parent, "Crop %ux%u@%u:%u\n",
615
		icd->user_width, icd->user_height, cam->ceu_left, cam->ceu_top);
616

617 618
	left_offset	= cam->ceu_left;
	top_offset	= cam->ceu_top;
619

620 621 622 623
	WARN_ON(icd->user_width & 3 || icd->user_height & 3);

	width = icd->user_width;

624
	if (pcdev->image_mode) {
625
		in_width = cam->width;
626 627 628 629
		if (!pcdev->is_16bit) {
			in_width *= 2;
			left_offset *= 2;
		}
630
		cdwdr_width = width;
631
	} else {
632
		int bytes_per_line = soc_mbus_bytes_per_line(width,
633 634
						icd->current_fmt->host_fmt);
		unsigned int w_factor;
635

636 637 638 639 640 641 642
		switch (icd->current_fmt->host_fmt->packing) {
		case SOC_MBUS_PACKING_2X8_PADHI:
			w_factor = 2;
			break;
		default:
			w_factor = 1;
		}
643

644
		in_width = cam->width * w_factor;
645
		left_offset *= w_factor;
646

647
		if (bytes_per_line < 0)
648
			cdwdr_width = width;
649 650
		else
			cdwdr_width = bytes_per_line;
651 652
	}

653 654
	height = icd->user_height;
	in_height = cam->height;
655
	if (V4L2_FIELD_NONE != pcdev->field) {
656
		height = (height / 2) & ~3;
657 658
		in_height /= 2;
		top_offset /= 2;
659 660 661
		cdwdr_width *= 2;
	}

662
	/* CSI2 special configuration */
663
	if (pcdev->pdata->csi2) {
664 665 666 667
		in_width = ((in_width - 2) * 2);
		left_offset *= 2;
	}

668
	/* Set CAMOR, CAPWR, CFSZR, take care of CDWDR */
669
	camor = left_offset | (top_offset << 16);
670

671
	dev_geo(icd->parent,
672 673 674 675
		"CAMOR 0x%x, CAPWR 0x%x, CFSZR 0x%x, CDWDR 0x%x\n", camor,
		(in_height << 16) | in_width, (height << 16) | width,
		cdwdr_width);

676
	ceu_write(pcdev, CAMOR, camor);
677
	ceu_write(pcdev, CAPWR, (in_height << 16) | in_width);
678
	/* CFSZR clipping is applied _after_ the scaling filter (CFLCR) */
679
	ceu_write(pcdev, CFSZR, (height << 16) | width);
680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715
	ceu_write(pcdev, CDWDR, cdwdr_width);
}

static u32 capture_save_reset(struct sh_mobile_ceu_dev *pcdev)
{
	u32 capsr = ceu_read(pcdev, CAPSR);
	ceu_write(pcdev, CAPSR, 1 << 16); /* reset, stop capture */
	return capsr;
}

static void capture_restore(struct sh_mobile_ceu_dev *pcdev, u32 capsr)
{
	unsigned long timeout = jiffies + 10 * HZ;

	/*
	 * Wait until the end of the current frame. It can take a long time,
	 * but if it has been aborted by a CAPSR reset, it shoule exit sooner.
	 */
	while ((ceu_read(pcdev, CSTSR) & 1) && time_before(jiffies, timeout))
		msleep(1);

	if (time_after(jiffies, timeout)) {
		dev_err(pcdev->ici.v4l2_dev.dev,
			"Timeout waiting for frame end! Interface problem?\n");
		return;
	}

	/* Wait until reset clears, this shall not hang... */
	while (ceu_read(pcdev, CAPSR) & (1 << 16))
		udelay(10);

	/* Anything to restore? */
	if (capsr & ~(1 << 16))
		ceu_write(pcdev, CAPSR, capsr);
}

716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733
/* Find the bus subdevice driver, e.g., CSI2 */
static struct v4l2_subdev *find_bus_subdev(struct sh_mobile_ceu_dev *pcdev,
					   struct soc_camera_device *icd)
{
	if (!pcdev->csi2_pdev)
		return soc_camera_to_subdev(icd);

	return find_csi2(pcdev);
}

#define CEU_BUS_FLAGS (V4L2_MBUS_MASTER |	\
		V4L2_MBUS_PCLK_SAMPLE_RISING |	\
		V4L2_MBUS_HSYNC_ACTIVE_HIGH |	\
		V4L2_MBUS_HSYNC_ACTIVE_LOW |	\
		V4L2_MBUS_VSYNC_ACTIVE_HIGH |	\
		V4L2_MBUS_VSYNC_ACTIVE_LOW |	\
		V4L2_MBUS_DATA_ACTIVE_HIGH)

734
/* Capture is not running, no interrupts, no locking needed */
735 736 737
static int sh_mobile_ceu_set_bus_param(struct soc_camera_device *icd,
				       __u32 pixfmt)
{
738
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
739
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
740
	struct v4l2_subdev *sd = find_bus_subdev(pcdev, icd);
741
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
742 743
	struct v4l2_mbus_config cfg = {.type = V4L2_MBUS_PARALLEL,};
	unsigned long value, common_flags = CEU_BUS_FLAGS;
744
	u32 capsr = capture_save_reset(pcdev);
745 746
	unsigned int yuv_lineskip;
	int ret;
747

748 749 750 751 752 753 754 755 756 757 758 759 760
	/*
	 * If the client doesn't implement g_mbus_config, we just use our
	 * platform data
	 */
	ret = v4l2_subdev_call(sd, video, g_mbus_config, &cfg);
	if (!ret) {
		common_flags = soc_mbus_config_compatible(&cfg,
							  common_flags);
		if (!common_flags)
			return -EINVAL;
	} else if (ret != -ENOIOCTLCMD) {
		return ret;
	}
761

762
	/* Make choises, based on platform preferences */
763 764
	if ((common_flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH) &&
	    (common_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)) {
765
		if (pcdev->pdata->flags & SH_CEU_FLAG_HSYNC_LOW)
766
			common_flags &= ~V4L2_MBUS_HSYNC_ACTIVE_HIGH;
767
		else
768
			common_flags &= ~V4L2_MBUS_HSYNC_ACTIVE_LOW;
769 770
	}

771 772
	if ((common_flags & V4L2_MBUS_VSYNC_ACTIVE_HIGH) &&
	    (common_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)) {
773
		if (pcdev->pdata->flags & SH_CEU_FLAG_VSYNC_LOW)
774
			common_flags &= ~V4L2_MBUS_VSYNC_ACTIVE_HIGH;
775
		else
776
			common_flags &= ~V4L2_MBUS_VSYNC_ACTIVE_LOW;
777 778
	}

779 780 781
	cfg.flags = common_flags;
	ret = v4l2_subdev_call(sd, video, s_mbus_config, &cfg);
	if (ret < 0 && ret != -ENOIOCTLCMD)
782 783
		return ret;

784
	if (icd->current_fmt->host_fmt->bits_per_sample > 8)
785
		pcdev->is_16bit = 1;
786 787
	else
		pcdev->is_16bit = 0;
788 789 790 791

	ceu_write(pcdev, CRCNTR, 0);
	ceu_write(pcdev, CRCMPR, 0);

792
	value = 0x00000010; /* data fetch by default */
793
	yuv_lineskip = 0x10;
794

795
	switch (icd->current_fmt->host_fmt->fourcc) {
796 797
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
798 799
		/* convert 4:2:2 -> 4:2:0 */
		yuv_lineskip = 0; /* skip for NV12/21, no skip for NV16/61 */
800 801 802
		/* fall-through */
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
803
		switch (cam->code) {
804
		case V4L2_MBUS_FMT_UYVY8_2X8:
805 806
			value = 0x00000000; /* Cb0, Y0, Cr0, Y1 */
			break;
807
		case V4L2_MBUS_FMT_VYUY8_2X8:
808 809
			value = 0x00000100; /* Cr0, Y0, Cb0, Y1 */
			break;
810
		case V4L2_MBUS_FMT_YUYV8_2X8:
811 812
			value = 0x00000200; /* Y0, Cb0, Y1, Cr0 */
			break;
813
		case V4L2_MBUS_FMT_YVYU8_2X8:
814 815 816 817 818 819 820
			value = 0x00000300; /* Y0, Cr0, Y1, Cb0 */
			break;
		default:
			BUG();
		}
	}

821 822
	if (icd->current_fmt->host_fmt->fourcc == V4L2_PIX_FMT_NV21 ||
	    icd->current_fmt->host_fmt->fourcc == V4L2_PIX_FMT_NV61)
823
		value ^= 0x00000100; /* swap U, V to change from NV1x->NVx1 */
824

825 826
	value |= common_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW ? 1 << 1 : 0;
	value |= common_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW ? 1 << 0 : 0;
827
	value |= pcdev->is_16bit ? 1 << 12 : 0;
828 829

	/* CSI2 mode */
830
	if (pcdev->pdata->csi2)
831 832
		value |= 3 << 12;

833 834 835
	ceu_write(pcdev, CAMCR, value);

	ceu_write(pcdev, CAPCR, 0x00300000);
836 837 838 839 840 841 842 843 844 845 846 847 848

	switch (pcdev->field) {
	case V4L2_FIELD_INTERLACED_TB:
		value = 0x101;
		break;
	case V4L2_FIELD_INTERLACED_BT:
		value = 0x102;
		break;
	default:
		value = 0;
		break;
	}
	ceu_write(pcdev, CAIFR, value);
849

850
	sh_mobile_ceu_set_rect(icd);
851 852
	mdelay(1);

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 860 861 862 863 864 865
	 *
	 * In data fetch mode bytes are received in chunks of 8 bytes.
	 * D0, D1, D2, D3, D4, D5, D6, D7 (D0 received first)
	 *
	 * The data is however by default written to memory in reverse order:
	 * D7, D6, D5, D4, D3, D2, D1, D0 (D7 written to lowest byte)
	 *
	 * The lowest three bits of CDOCR allows us to do swapping,
866 867
	 * using 7 we swap the data bytes to match the incoming order:
	 * D0, D1, D2, D3, D4, D5, D6, D7
868
	 */
869
	value = 0x00000007 | yuv_lineskip;
870 871

	ceu_write(pcdev, CDOCR, value);
872 873
	ceu_write(pcdev, CFWCR, 0); /* keep "datafetch firewall" disabled */

874
	dev_dbg(icd->parent, "S_FMT successful for %c%c%c%c %ux%u\n",
875 876
		pixfmt & 0xff, (pixfmt >> 8) & 0xff,
		(pixfmt >> 16) & 0xff, (pixfmt >> 24) & 0xff,
877
		icd->user_width, icd->user_height);
878 879 880

	capture_restore(pcdev, capsr);

881 882 883 884
	/* not in bundle mode: skip CBDSR, CDAYR2, CDACR2, CDBYR2, CDBCR2 */
	return 0;
}

885 886
static int sh_mobile_ceu_try_bus_param(struct soc_camera_device *icd,
				       unsigned char buswidth)
887
{
888
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
889
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
890 891 892 893
	struct v4l2_subdev *sd = find_bus_subdev(pcdev, icd);
	unsigned long common_flags = CEU_BUS_FLAGS;
	struct v4l2_mbus_config cfg = {.type = V4L2_MBUS_PARALLEL,};
	int ret;
894

895 896 897 898 899 900 901 902
	ret = v4l2_subdev_call(sd, video, g_mbus_config, &cfg);
	if (!ret)
		common_flags = soc_mbus_config_compatible(&cfg,
							  common_flags);
	else if (ret != -ENOIOCTLCMD)
		return ret;

	if (!common_flags || buswidth > 16)
903 904 905 906 907
		return -EINVAL;

	return 0;
}

908
static const struct soc_mbus_pixelfmt sh_mobile_ceu_formats[] = {
909
	{
910 911
		.fourcc			= V4L2_PIX_FMT_NV12,
		.name			= "NV12",
912 913
		.bits_per_sample	= 8,
		.packing		= SOC_MBUS_PACKING_1_5X8,
914 915 916 917
		.order			= SOC_MBUS_ORDER_LE,
	}, {
		.fourcc			= V4L2_PIX_FMT_NV21,
		.name			= "NV21",
918 919
		.bits_per_sample	= 8,
		.packing		= SOC_MBUS_PACKING_1_5X8,
920 921 922 923
		.order			= SOC_MBUS_ORDER_LE,
	}, {
		.fourcc			= V4L2_PIX_FMT_NV16,
		.name			= "NV16",
924 925
		.bits_per_sample	= 8,
		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
926 927 928 929
		.order			= SOC_MBUS_ORDER_LE,
	}, {
		.fourcc			= V4L2_PIX_FMT_NV61,
		.name			= "NV61",
930 931
		.bits_per_sample	= 8,
		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
932
		.order			= SOC_MBUS_ORDER_LE,
933
	},
934 935
};

936 937 938 939
/* This will be corrected as we get more formats */
static bool sh_mobile_ceu_packing_supported(const struct soc_mbus_pixelfmt *fmt)
{
	return	fmt->packing == SOC_MBUS_PACKING_NONE ||
940 941
		(fmt->bits_per_sample == 8 &&
		 fmt->packing == SOC_MBUS_PACKING_1_5X8) ||
942 943 944 945 946 947
		(fmt->bits_per_sample == 8 &&
		 fmt->packing == SOC_MBUS_PACKING_2X8_PADHI) ||
		(fmt->bits_per_sample > 8 &&
		 fmt->packing == SOC_MBUS_PACKING_EXTEND16);
}

948 949
static int client_g_rect(struct v4l2_subdev *sd, struct v4l2_rect *rect);

950
static int sh_mobile_ceu_get_formats(struct soc_camera_device *icd, unsigned int idx,
951 952
				     struct soc_camera_format_xlate *xlate)
{
953
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
954
	struct device *dev = icd->parent;
955 956
	struct soc_camera_host *ici = to_soc_camera_host(dev);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
957
	int ret, k, n;
958
	int formats = 0;
959
	struct sh_mobile_ceu_cam *cam;
960 961
	enum v4l2_mbus_pixelcode code;
	const struct soc_mbus_pixelfmt *fmt;
962

963 964 965 966 967 968 969
	ret = v4l2_subdev_call(sd, video, enum_mbus_fmt, idx, &code);
	if (ret < 0)
		/* No more formats */
		return 0;

	fmt = soc_mbus_get_fmtdesc(code);
	if (!fmt) {
970 971
		dev_warn(dev, "unsupported format code #%u: %d\n", idx, code);
		return 0;
972 973
	}

974
	if (!pcdev->pdata->csi2) {
975
		/* Are there any restrictions in the CSI-2 case? */
976 977 978 979
		ret = sh_mobile_ceu_try_bus_param(icd, fmt->bits_per_sample);
		if (ret < 0)
			return 0;
	}
980

981
	if (!icd->host_priv) {
982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001
		struct v4l2_mbus_framefmt mf;
		struct v4l2_rect rect;
		int shift = 0;

		/* FIXME: subwindow is lost between close / open */

		/* Cache current client geometry */
		ret = client_g_rect(sd, &rect);
		if (ret < 0)
			return ret;

		/* First time */
		ret = v4l2_subdev_call(sd, video, g_mbus_fmt, &mf);
		if (ret < 0)
			return ret;

		while ((mf.width > 2560 || mf.height > 1920) && shift < 4) {
			/* Try 2560x1920, 1280x960, 640x480, 320x240 */
			mf.width	= 2560 >> shift;
			mf.height	= 1920 >> shift;
1002
			ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
1003
							 s_mbus_fmt, &mf);
1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016
			if (ret < 0)
				return ret;
			shift++;
		}

		if (shift == 4) {
			dev_err(dev, "Failed to configure the client below %ux%x\n",
				mf.width, mf.height);
			return -EIO;
		}

		dev_geo(dev, "camera fmt %ux%u\n", mf.width, mf.height);

1017 1018 1019 1020
		cam = kzalloc(sizeof(*cam), GFP_KERNEL);
		if (!cam)
			return -ENOMEM;

1021 1022 1023 1024 1025 1026 1027
		/* We are called with current camera crop, initialise subrect with it */
		cam->rect	= rect;
		cam->subrect	= rect;

		cam->width	= mf.width;
		cam->height	= mf.height;

1028 1029 1030 1031 1032
		icd->host_priv = cam;
	} else {
		cam = icd->host_priv;
	}

1033 1034
	/* Beginning of a pass */
	if (!idx)
1035
		cam->extra_fmt = NULL;
1036

1037
	switch (code) {
1038 1039 1040 1041
	case V4L2_MBUS_FMT_UYVY8_2X8:
	case V4L2_MBUS_FMT_VYUY8_2X8:
	case V4L2_MBUS_FMT_YUYV8_2X8:
	case V4L2_MBUS_FMT_YVYU8_2X8:
1042
		if (cam->extra_fmt)
1043
			break;
1044 1045 1046 1047 1048 1049 1050 1051 1052 1053

		/*
		 * Our case is simple so far: for any of the above four camera
		 * formats we add all our four synthesized NV* formats, so,
		 * just marking the device with a single flag suffices. If
		 * the format generation rules are more complex, you would have
		 * to actually hang your already added / counted formats onto
		 * the host_priv pointer and check whether the format you're
		 * going to add now is already there.
		 */
1054
		cam->extra_fmt = sh_mobile_ceu_formats;
1055

1056 1057 1058
		n = ARRAY_SIZE(sh_mobile_ceu_formats);
		formats += n;
		for (k = 0; xlate && k < n; k++) {
1059 1060
			xlate->host_fmt	= &sh_mobile_ceu_formats[k];
			xlate->code	= code;
1061
			xlate++;
1062 1063
			dev_dbg(dev, "Providing format %s using code %d\n",
				sh_mobile_ceu_formats[k].name, code);
1064
		}
1065
		break;
1066
	default:
1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077
		if (!sh_mobile_ceu_packing_supported(fmt))
			return 0;
	}

	/* Generic pass-through */
	formats++;
	if (xlate) {
		xlate->host_fmt	= fmt;
		xlate->code	= code;
		xlate++;
		dev_dbg(dev, "Providing format %s in pass-through mode\n",
1078
			fmt->name);
1079 1080 1081 1082 1083
	}

	return formats;
}

1084 1085 1086 1087 1088 1089
static void sh_mobile_ceu_put_formats(struct soc_camera_device *icd)
{
	kfree(icd->host_priv);
	icd->host_priv = NULL;
}

1090
/* Check if any dimension of r1 is smaller than respective one of r2 */
1091 1092 1093 1094 1095
static bool is_smaller(struct v4l2_rect *r1, struct v4l2_rect *r2)
{
	return r1->width < r2->width || r1->height < r2->height;
}

1096 1097 1098 1099 1100 1101 1102 1103
/* Check if r1 fails to cover r2 */
static bool is_inside(struct v4l2_rect *r1, struct v4l2_rect *r2)
{
	return r1->left > r2->left || r1->top > r2->top ||
		r1->left + r1->width < r2->left + r2->width ||
		r1->top + r1->height < r2->top + r2->height;
}

1104 1105 1106 1107 1108 1109 1110 1111 1112 1113
static unsigned int scale_down(unsigned int size, unsigned int scale)
{
	return (size * 4096 + scale / 2) / scale;
}

static unsigned int calc_generic_scale(unsigned int input, unsigned int output)
{
	return (input * 4096 + output / 2) / output;
}

1114
/* Get and store current client crop */
1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132
static int client_g_rect(struct v4l2_subdev *sd, struct v4l2_rect *rect)
{
	struct v4l2_crop crop;
	struct v4l2_cropcap cap;
	int ret;

	crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

	ret = v4l2_subdev_call(sd, video, g_crop, &crop);
	if (!ret) {
		*rect = crop.c;
		return ret;
	}

	/* Camera driver doesn't support .g_crop(), assume default rectangle */
	cap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

	ret = v4l2_subdev_call(sd, video, cropcap, &cap);
1133 1134
	if (!ret)
		*rect = cap.defrect;
1135 1136 1137 1138

	return ret;
}

1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164
/* Client crop has changed, update our sub-rectangle to remain within the area */
static void update_subrect(struct sh_mobile_ceu_cam *cam)
{
	struct v4l2_rect *rect = &cam->rect, *subrect = &cam->subrect;

	if (rect->width < subrect->width)
		subrect->width = rect->width;

	if (rect->height < subrect->height)
		subrect->height = rect->height;

	if (rect->left > subrect->left)
		subrect->left = rect->left;
	else if (rect->left + rect->width >
		 subrect->left + subrect->width)
		subrect->left = rect->left + rect->width -
			subrect->width;

	if (rect->top > subrect->top)
		subrect->top = rect->top;
	else if (rect->top + rect->height >
		 subrect->top + subrect->height)
		subrect->top = rect->top + rect->height -
			subrect->height;
}

1165
/*
1166
 * The common for both scaling and cropping iterative approach is:
1167 1168 1169 1170
 * 1. try if the client can produce exactly what requested by the user
 * 2. if (1) failed, try to double the client image until we get one big enough
 * 3. if (2) failed, try to request the maximum image
 */
1171
static int client_s_crop(struct soc_camera_device *icd, struct v4l2_crop *crop,
1172
			 struct v4l2_crop *cam_crop)
1173
{
1174
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1175 1176
	struct v4l2_rect *rect = &crop->c, *cam_rect = &cam_crop->c;
	struct device *dev = sd->v4l2_dev->dev;
1177
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1178
	struct v4l2_cropcap cap;
1179
	int ret;
1180
	unsigned int width, height;
1181

1182 1183 1184 1185
	v4l2_subdev_call(sd, video, s_crop, crop);
	ret = client_g_rect(sd, cam_rect);
	if (ret < 0)
		return ret;
1186

1187 1188 1189 1190 1191 1192
	/*
	 * Now cam_crop contains the current camera input rectangle, and it must
	 * be within camera cropcap bounds
	 */
	if (!memcmp(rect, cam_rect, sizeof(*rect))) {
		/* Even if camera S_CROP failed, but camera rectangle matches */
1193
		dev_dbg(dev, "Camera S_CROP successful for %dx%d@%d:%d\n",
1194
			rect->width, rect->height, rect->left, rect->top);
1195
		cam->rect = *cam_rect;
1196
		return 0;
1197 1198
	}

1199
	/* Try to fix cropping, that camera hasn't managed to set */
1200
	dev_geo(dev, "Fix camera S_CROP for %dx%d@%d:%d to %dx%d@%d:%d\n",
1201
		cam_rect->width, cam_rect->height,
1202
		cam_rect->left, cam_rect->top,
1203 1204 1205 1206 1207 1208 1209
		rect->width, rect->height, rect->left, rect->top);

	/* We need sensor maximum rectangle */
	ret = v4l2_subdev_call(sd, video, cropcap, &cap);
	if (ret < 0)
		return ret;

1210
	/* Put user requested rectangle within sensor bounds */
1211 1212 1213 1214
	soc_camera_limit_side(&rect->left, &rect->width, cap.bounds.left, 2,
			      cap.bounds.width);
	soc_camera_limit_side(&rect->top, &rect->height, cap.bounds.top, 4,
			      cap.bounds.height);
1215 1216 1217 1218 1219

	/*
	 * Popular special case - some cameras can only handle fixed sizes like
	 * QVGA, VGA,... Take care to avoid infinite loop.
	 */
1220 1221 1222
	width = max(cam_rect->width, 2);
	height = max(cam_rect->height, 2);

1223 1224 1225 1226
	/*
	 * Loop as long as sensor is not covering the requested rectangle and
	 * is still within its bounds
	 */
1227 1228 1229
	while (!ret && (is_smaller(cam_rect, rect) ||
			is_inside(cam_rect, rect)) &&
	       (cap.bounds.width > width || cap.bounds.height > height)) {
1230 1231 1232

		width *= 2;
		height *= 2;
1233

1234 1235
		cam_rect->width = width;
		cam_rect->height = height;
1236

1237 1238 1239 1240 1241 1242 1243
		/*
		 * We do not know what capabilities the camera has to set up
		 * left and top borders. We could try to be smarter in iterating
		 * them, e.g., if camera current left is to the right of the
		 * target left, set it to the middle point between the current
		 * left and minimum left. But that would add too much
		 * complexity: we would have to iterate each border separately.
1244
		 * Instead we just drop to the left and top bounds.
1245 1246 1247
		 */
		if (cam_rect->left > rect->left)
			cam_rect->left = cap.bounds.left;
1248

1249 1250
		if (cam_rect->left + cam_rect->width < rect->left + rect->width)
			cam_rect->width = rect->left + rect->width -
1251
				cam_rect->left;
1252

1253 1254
		if (cam_rect->top > rect->top)
			cam_rect->top = cap.bounds.top;
1255

1256 1257
		if (cam_rect->top + cam_rect->height < rect->top + rect->height)
			cam_rect->height = rect->top + rect->height -
1258
				cam_rect->top;
1259

1260 1261
		v4l2_subdev_call(sd, video, s_crop, cam_crop);
		ret = client_g_rect(sd, cam_rect);
1262
		dev_geo(dev, "Camera S_CROP %d for %dx%d@%d:%d\n", ret,
1263
			cam_rect->width, cam_rect->height,
1264
			cam_rect->left, cam_rect->top);
1265 1266
	}

1267 1268
	/* S_CROP must not modify the rectangle */
	if (is_smaller(cam_rect, rect) || is_inside(cam_rect, rect)) {
1269 1270 1271 1272
		/*
		 * The camera failed to configure a suitable cropping,
		 * we cannot use the current rectangle, set to max
		 */
1273 1274 1275
		*cam_rect = cap.bounds;
		v4l2_subdev_call(sd, video, s_crop, cam_crop);
		ret = client_g_rect(sd, cam_rect);
1276
		dev_geo(dev, "Camera S_CROP %d for max %dx%d@%d:%d\n", ret,
1277
			cam_rect->width, cam_rect->height,
1278
			cam_rect->left, cam_rect->top);
1279 1280
	}

1281 1282 1283
	if (!ret) {
		cam->rect = *cam_rect;
		update_subrect(cam);
1284 1285
	}

1286
	return ret;
1287 1288
}

1289
/* Iterative s_mbus_fmt, also updates cached client crop on success */
1290 1291
static int client_s_fmt(struct soc_camera_device *icd,
			struct v4l2_mbus_framefmt *mf, bool ceu_can_scale)
1292
{
1293
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1294
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1295
	struct device *dev = icd->parent;
1296
	unsigned int width = mf->width, height = mf->height, tmp_w, tmp_h;
1297 1298
	unsigned int max_width, max_height;
	struct v4l2_cropcap cap;
1299
	bool ceu_1to1;
1300 1301
	int ret;

1302
	ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
1303
					 s_mbus_fmt, mf);
1304 1305 1306 1307 1308
	if (ret < 0)
		return ret;

	dev_geo(dev, "camera scaled to %ux%u\n", mf->width, mf->height);

1309 1310 1311 1312 1313 1314 1315 1316
	if (width == mf->width && height == mf->height) {
		/* Perfect! The client has done it all. */
		ceu_1to1 = true;
		goto update_cache;
	}

	ceu_1to1 = false;
	if (!ceu_can_scale)
1317 1318
		goto update_cache;

1319 1320 1321 1322 1323 1324 1325 1326 1327 1328
	cap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

	ret = v4l2_subdev_call(sd, video, cropcap, &cap);
	if (ret < 0)
		return ret;

	max_width = min(cap.bounds.width, 2560);
	max_height = min(cap.bounds.height, 1920);

	/* Camera set a format, but geometry is not precise, try to improve */
1329 1330
	tmp_w = mf->width;
	tmp_h = mf->height;
1331 1332 1333 1334 1335 1336

	/* width <= max_width && height <= max_height - guaranteed by try_fmt */
	while ((width > tmp_w || height > tmp_h) &&
	       tmp_w < max_width && tmp_h < max_height) {
		tmp_w = min(2 * tmp_w, max_width);
		tmp_h = min(2 * tmp_h, max_height);
1337 1338
		mf->width = tmp_w;
		mf->height = tmp_h;
1339
		ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
1340
						 s_mbus_fmt, mf);
1341
		dev_geo(dev, "Camera scaled to %ux%u\n",
1342
			mf->width, mf->height);
1343 1344 1345 1346 1347 1348 1349
		if (ret < 0) {
			/* This shouldn't happen */
			dev_err(dev, "Client failed to set format: %d\n", ret);
			return ret;
		}
	}

1350 1351 1352 1353 1354 1355
update_cache:
	/* Update cache */
	ret = client_g_rect(sd, &cam->rect);
	if (ret < 0)
		return ret;

1356 1357 1358 1359
	if (ceu_1to1)
		cam->subrect = cam->rect;
	else
		update_subrect(cam);
1360

1361 1362 1363 1364
	return 0;
}

/**
1365 1366 1367
 * @width	- on output: user width, mapped back to input
 * @height	- on output: user height, mapped back to input
 * @mf		- in- / output camera output window
1368
 */
1369 1370 1371 1372
static int client_scale(struct soc_camera_device *icd,
			struct v4l2_mbus_framefmt *mf,
			unsigned int *width, unsigned int *height,
			bool ceu_can_scale)
1373 1374
{
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1375
	struct device *dev = icd->parent;
1376
	struct v4l2_mbus_framefmt mf_tmp = *mf;
1377 1378 1379
	unsigned int scale_h, scale_v;
	int ret;

1380 1381 1382 1383
	/*
	 * 5. Apply iterative camera S_FMT for camera user window (also updates
	 *    client crop cache and the imaginary sub-rectangle).
	 */
1384
	ret = client_s_fmt(icd, &mf_tmp, ceu_can_scale);
1385 1386 1387 1388
	if (ret < 0)
		return ret;

	dev_geo(dev, "5: camera scaled to %ux%u\n",
1389
		mf_tmp.width, mf_tmp.height);
1390 1391 1392

	/* 6. Retrieve camera output window (g_fmt) */

1393
	/* unneeded - it is already in "mf_tmp" */
1394

1395 1396 1397
	/* 7. Calculate new client scales. */
	scale_h = calc_generic_scale(cam->rect.width, mf_tmp.width);
	scale_v = calc_generic_scale(cam->rect.height, mf_tmp.height);
1398

1399 1400 1401
	mf->width	= mf_tmp.width;
	mf->height	= mf_tmp.height;
	mf->colorspace	= mf_tmp.colorspace;
1402 1403

	/*
1404
	 * 8. Calculate new CEU crop - apply camera scales to previously
1405
	 *    updated "effective" crop.
1406
	 */
1407 1408
	*width = scale_down(cam->subrect.width, scale_h);
	*height = scale_down(cam->subrect.height, scale_v);
1409

1410
	dev_geo(dev, "8: new client sub-window %ux%u\n", *width, *height);
1411 1412 1413 1414 1415 1416 1417

	return 0;
}

/*
 * CEU can scale and crop, but we don't want to waste bandwidth and kill the
 * framerate by always requesting the maximum image from the client. See
1418
 * Documentation/video4linux/sh_mobile_ceu_camera.txt for a description of
1419 1420 1421 1422 1423 1424
 * scaling and cropping algorithms and for the meaning of referenced here steps.
 */
static int sh_mobile_ceu_set_crop(struct soc_camera_device *icd,
				  struct v4l2_crop *a)
{
	struct v4l2_rect *rect = &a->c;
1425 1426
	struct device *dev = icd->parent;
	struct soc_camera_host *ici = to_soc_camera_host(dev);
1427 1428 1429
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
	struct v4l2_crop cam_crop;
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1430
	struct v4l2_rect *cam_rect = &cam_crop.c;
1431
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1432
	struct v4l2_mbus_framefmt mf;
1433
	unsigned int scale_cam_h, scale_cam_v, scale_ceu_h, scale_ceu_v,
1434
		out_width, out_height;
1435
	int interm_width, interm_height;
1436 1437 1438
	u32 capsr, cflcr;
	int ret;

1439 1440
	dev_geo(dev, "S_CROP(%ux%u@%u:%u)\n", rect->width, rect->height,
		rect->left, rect->top);
1441

1442 1443 1444
	/* During camera cropping its output window can change too, stop CEU */
	capsr = capture_save_reset(pcdev);
	dev_dbg(dev, "CAPSR 0x%x, CFLCR 0x%x\n", capsr, pcdev->cflcr);
1445

1446 1447 1448 1449
	/*
	 * 1. - 2. Apply iterative camera S_CROP for new input window, read back
	 * actual camera rectangle.
	 */
1450
	ret = client_s_crop(icd, a, &cam_crop);
1451 1452 1453
	if (ret < 0)
		return ret;

1454
	dev_geo(dev, "1-2: camera cropped to %ux%u@%u:%u\n",
1455 1456 1457 1458 1459
		cam_rect->width, cam_rect->height,
		cam_rect->left, cam_rect->top);

	/* On success cam_crop contains current camera crop */

1460 1461 1462 1463
	/* 3. Retrieve camera output window */
	ret = v4l2_subdev_call(sd, video, g_mbus_fmt, &mf);
	if (ret < 0)
		return ret;
1464

1465 1466
	if (mf.width > 2560 || mf.height > 1920)
		return -EINVAL;
1467

1468 1469 1470
	/* 4. Calculate camera scales */
	scale_cam_h	= calc_generic_scale(cam_rect->width, mf.width);
	scale_cam_v	= calc_generic_scale(cam_rect->height, mf.height);
1471

1472 1473 1474
	/* Calculate intermediate window */
	interm_width	= scale_down(rect->width, scale_cam_h);
	interm_height	= scale_down(rect->height, scale_cam_v);
1475

1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508
	if (interm_width < icd->user_width) {
		u32 new_scale_h;

		new_scale_h = calc_generic_scale(rect->width, icd->user_width);

		mf.width = scale_down(cam_rect->width, new_scale_h);
	}

	if (interm_height < icd->user_height) {
		u32 new_scale_v;

		new_scale_v = calc_generic_scale(rect->height, icd->user_height);

		mf.height = scale_down(cam_rect->height, new_scale_v);
	}

	if (interm_width < icd->user_width || interm_height < icd->user_height) {
		ret = v4l2_device_call_until_err(sd->v4l2_dev, (int)icd, video,
						 s_mbus_fmt, &mf);
		if (ret < 0)
			return ret;

		dev_geo(dev, "New camera output %ux%u\n", mf.width, mf.height);
		scale_cam_h	= calc_generic_scale(cam_rect->width, mf.width);
		scale_cam_v	= calc_generic_scale(cam_rect->height, mf.height);
		interm_width	= scale_down(rect->width, scale_cam_h);
		interm_height	= scale_down(rect->height, scale_cam_v);
	}

	/* Cache camera output window */
	cam->width	= mf.width;
	cam->height	= mf.height;

1509 1510 1511 1512 1513 1514 1515
	if (pcdev->image_mode) {
		out_width	= min(interm_width, icd->user_width);
		out_height	= min(interm_height, icd->user_height);
	} else {
		out_width	= interm_width;
		out_height	= interm_height;
	}
1516 1517

	/*
1518 1519
	 * 5. Calculate CEU scales from camera scales from results of (5) and
	 *    the user window
1520
	 */
1521 1522
	scale_ceu_h	= calc_scale(interm_width, &out_width);
	scale_ceu_v	= calc_scale(interm_height, &out_height);
1523

1524 1525 1526
	dev_geo(dev, "5: CEU scales %u:%u\n", scale_ceu_h, scale_ceu_v);

	/* Apply CEU scales. */
1527 1528 1529 1530 1531 1532
	cflcr = scale_ceu_h | (scale_ceu_v << 16);
	if (cflcr != pcdev->cflcr) {
		pcdev->cflcr = cflcr;
		ceu_write(pcdev, CFLCR, cflcr);
	}

1533 1534 1535
	icd->user_width	 = out_width & ~3;
	icd->user_height = out_height & ~3;
	/* Offsets are applied at the CEU scaling filter input */
1536 1537
	cam->ceu_left	 = scale_down(rect->left - cam_rect->left, scale_cam_h) & ~1;
	cam->ceu_top	 = scale_down(rect->top - cam_rect->top, scale_cam_v) & ~1;
1538 1539 1540 1541 1542 1543 1544 1545 1546 1547

	/* 6. Use CEU cropping to crop to the new window. */
	sh_mobile_ceu_set_rect(icd);

	cam->subrect = *rect;

	dev_geo(dev, "6: CEU cropped to %ux%u@%u:%u\n",
		icd->user_width, icd->user_height,
		cam->ceu_left, cam->ceu_top);

1548
	/* Restore capture. The CE bit can be cleared by the hardware */
1549 1550 1551 1552 1553 1554
	if (pcdev->active)
		capsr |= 1;
	capture_restore(pcdev, capsr);

	/* Even if only camera cropping succeeded */
	return ret;
1555 1556
}

1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573
static int sh_mobile_ceu_get_crop(struct soc_camera_device *icd,
				  struct v4l2_crop *a)
{
	struct sh_mobile_ceu_cam *cam = icd->host_priv;

	a->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	a->c = cam->subrect;

	return 0;
}

/*
 * Calculate real client output window by applying new scales to the current
 * client crop. New scales are calculated from the requested output format and
 * CEU crop, mapped backed onto the client input (subrect).
 */
static void calculate_client_output(struct soc_camera_device *icd,
1574
		const struct v4l2_pix_format *pix, struct v4l2_mbus_framefmt *mf)
1575 1576
{
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1577
	struct device *dev = icd->parent;
1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609
	struct v4l2_rect *cam_subrect = &cam->subrect;
	unsigned int scale_v, scale_h;

	if (cam_subrect->width == cam->rect.width &&
	    cam_subrect->height == cam->rect.height) {
		/* No sub-cropping */
		mf->width	= pix->width;
		mf->height	= pix->height;
		return;
	}

	/* 1.-2. Current camera scales and subwin - cached. */

	dev_geo(dev, "2: subwin %ux%u@%u:%u\n",
		cam_subrect->width, cam_subrect->height,
		cam_subrect->left, cam_subrect->top);

	/*
	 * 3. Calculate new combined scales from input sub-window to requested
	 *    user window.
	 */

	/*
	 * TODO: CEU cannot scale images larger than VGA to smaller than SubQCIF
	 * (128x96) or larger than VGA
	 */
	scale_h = calc_generic_scale(cam_subrect->width, pix->width);
	scale_v = calc_generic_scale(cam_subrect->height, pix->height);

	dev_geo(dev, "3: scales %u:%u\n", scale_h, scale_v);

	/*
1610 1611
	 * 4. Calculate desired client output window by applying combined scales
	 *    to client (real) input window.
1612 1613 1614 1615 1616
	 */
	mf->width	= scale_down(cam->rect.width, scale_h);
	mf->height	= scale_down(cam->rect.height, scale_v);
}

1617
/* Similar to set_crop multistage iterative algorithm */
1618
static int sh_mobile_ceu_set_fmt(struct soc_camera_device *icd,
1619
				 struct v4l2_format *f)
1620
{
1621 1622
	struct device *dev = icd->parent;
	struct soc_camera_host *ici = to_soc_camera_host(dev);
1623
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
1624 1625
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	struct v4l2_pix_format *pix = &f->fmt.pix;
1626
	struct v4l2_mbus_framefmt mf;
1627
	__u32 pixfmt = pix->pixelformat;
1628
	const struct soc_camera_format_xlate *xlate;
1629 1630
	/* Keep Compiler Happy */
	unsigned int ceu_sub_width = 0, ceu_sub_height = 0;
1631 1632
	u16 scale_v, scale_h;
	int ret;
1633 1634
	bool image_mode;
	enum v4l2_field field;
1635 1636 1637 1638 1639

	switch (pix->field) {
	default:
		pix->field = V4L2_FIELD_NONE;
		/* fall-through */
1640 1641
	case V4L2_FIELD_INTERLACED_TB:
	case V4L2_FIELD_INTERLACED_BT:
1642
	case V4L2_FIELD_NONE:
1643 1644 1645 1646
		field = pix->field;
		break;
	case V4L2_FIELD_INTERLACED:
		field = V4L2_FIELD_INTERLACED_TB;
1647 1648
		break;
	}
1649

1650 1651
	xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
	if (!xlate) {
1652
		dev_warn(dev, "Format %x not found\n", pixfmt);
1653
		return -EINVAL;
1654 1655
	}

1656
	/* 1.-4. Calculate desired client output geometry */
1657
	calculate_client_output(icd, pix, &mf);
1658 1659 1660
	mf.field	= pix->field;
	mf.colorspace	= pix->colorspace;
	mf.code		= xlate->code;
1661

1662 1663 1664 1665 1666
	switch (pixfmt) {
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
1667
		image_mode = true;
1668 1669
		break;
	default:
1670
		image_mode = false;
1671
	}
1672

1673 1674 1675
	dev_info(dev, "S_FMT(pix=0x%x, fld 0x%x, code 0x%x, %ux%u)\n", pixfmt, mf.field, mf.code,
		pix->width, pix->height);

1676
	dev_geo(dev, "4: request camera output %ux%u\n", mf.width, mf.height);
1677

1678
	/* 5. - 9. */
1679
	ret = client_scale(icd, &mf, &ceu_sub_width, &ceu_sub_height,
1680
			   image_mode && V4L2_FIELD_NONE == field);
1681

1682
	dev_geo(dev, "5-9: client scale return %d\n", ret);
1683 1684 1685

	/* Done with the camera. Now see if we can improve the result */

1686 1687
	dev_geo(dev, "fmt %ux%u, requested %ux%u\n",
		mf.width, mf.height, pix->width, pix->height);
1688 1689 1690
	if (ret < 0)
		return ret;

1691 1692 1693
	if (mf.code != xlate->code)
		return -EINVAL;

1694 1695 1696 1697
	/* 9. Prepare CEU crop */
	cam->width = mf.width;
	cam->height = mf.height;

1698
	/* 10. Use CEU scaling to scale to the requested user window. */
1699 1700

	/* We cannot scale up */
1701 1702
	if (pix->width > ceu_sub_width)
		ceu_sub_width = pix->width;
1703

1704 1705
	if (pix->height > ceu_sub_height)
		ceu_sub_height = pix->height;
1706

1707 1708 1709 1710
	pix->colorspace = mf.colorspace;

	if (image_mode) {
		/* Scale pix->{width x height} down to width x height */
1711 1712
		scale_h		= calc_scale(ceu_sub_width, &pix->width);
		scale_v		= calc_scale(ceu_sub_height, &pix->height);
1713
	} else {
1714 1715 1716 1717
		pix->width	= ceu_sub_width;
		pix->height	= ceu_sub_height;
		scale_h		= 0;
		scale_v		= 0;
1718
	}
1719

1720 1721 1722 1723 1724 1725 1726
	pcdev->cflcr = scale_h | (scale_v << 16);

	/*
	 * We have calculated CFLCR, the actual configuration will be performed
	 * in sh_mobile_ceu_set_bus_param()
	 */

1727
	dev_geo(dev, "10: W: %u : 0x%x = %u, H: %u : 0x%x = %u\n",
1728 1729
		ceu_sub_width, scale_h, pix->width,
		ceu_sub_height, scale_v, pix->height);
1730

1731 1732
	cam->code		= xlate->code;
	icd->current_fmt	= xlate;
1733

1734
	pcdev->field = field;
1735
	pcdev->image_mode = image_mode;
1736

1737 1738 1739 1740
	/* CFSZR requirement */
	pix->width	&= ~3;
	pix->height	&= ~3;

1741
	return 0;
1742 1743
}

1744 1745
static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd,
				 struct v4l2_format *f)
1746
{
1747
	const struct soc_camera_format_xlate *xlate;
1748
	struct v4l2_pix_format *pix = &f->fmt.pix;
1749
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1750
	struct v4l2_mbus_framefmt mf;
1751
	__u32 pixfmt = pix->pixelformat;
1752
	int width, height;
1753
	int ret;
1754

1755
	dev_geo(icd->parent, "TRY_FMT(pix=0x%x, %ux%u)\n",
1756 1757
		 pixfmt, pix->width, pix->height);

1758 1759
	xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
	if (!xlate) {
1760
		dev_warn(icd->parent, "Format %x not found\n", pixfmt);
1761
		return -EINVAL;
1762
	}
1763

1764 1765
	/* FIXME: calculate using depth and bus width */

1766 1767
	/* CFSZR requires height and width to be 4-pixel aligned */
	v4l_bound_align_image(&pix->width, 2, 2560, 2,
1768
			      &pix->height, 4, 1920, 2, 0);
1769

1770 1771 1772
	width = pix->width;
	height = pix->height;

1773
	/* limit to sensor capabilities */
1774 1775 1776 1777 1778 1779
	mf.width	= pix->width;
	mf.height	= pix->height;
	mf.field	= pix->field;
	mf.code		= xlate->code;
	mf.colorspace	= pix->colorspace;

1780
	ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, try_mbus_fmt, &mf);
1781 1782 1783
	if (ret < 0)
		return ret;

1784 1785 1786 1787 1788
	pix->width	= mf.width;
	pix->height	= mf.height;
	pix->field	= mf.field;
	pix->colorspace	= mf.colorspace;

1789 1790 1791 1792 1793 1794 1795 1796
	switch (pixfmt) {
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
		/* FIXME: check against rect_max after converting soc-camera */
		/* We can scale precisely, need a bigger image from camera */
		if (pix->width < width || pix->height < height) {
1797 1798 1799 1800 1801 1802 1803
			/*
			 * We presume, the sensor behaves sanely, i.e., if
			 * requested a bigger rectangle, it will not return a
			 * smaller one.
			 */
			mf.width = 2560;
			mf.height = 1920;
1804
			ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
1805
							 try_mbus_fmt, &mf);
1806 1807
			if (ret < 0) {
				/* Shouldn't actually happen... */
1808
				dev_err(icd->parent,
1809 1810
					"FIXME: client try_fmt() = %d\n", ret);
				return ret;
1811 1812
			}
		}
1813 1814
		/* We will scale exactly */
		if (mf.width > width)
1815
			pix->width = width;
1816
		if (mf.height > height)
1817
			pix->height = height;
1818 1819
	}

1820 1821 1822
	pix->width	&= ~3;
	pix->height	&= ~3;

1823
	dev_geo(icd->parent, "%s(): return %d, fmt 0x%x, %ux%u\n",
1824 1825
		__func__, ret, pix->pixelformat, pix->width, pix->height);

1826
	return ret;
1827 1828
}

1829 1830 1831 1832
static int sh_mobile_ceu_set_livecrop(struct soc_camera_device *icd,
				      struct v4l2_crop *a)
{
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1833
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
	u32 out_width = icd->user_width, out_height = icd->user_height;
	int ret;

	/* Freeze queue */
	pcdev->frozen = 1;
	/* Wait for frame */
	ret = wait_for_completion_interruptible(&pcdev->complete);
	/* Stop the client */
	ret = v4l2_subdev_call(sd, video, s_stream, 0);
	if (ret < 0)
1845
		dev_warn(icd->parent,
1846 1847 1848 1849 1850
			 "Client failed to stop the stream: %d\n", ret);
	else
		/* Do the crop, if it fails, there's nothing more we can do */
		sh_mobile_ceu_set_crop(icd, a);

1851
	dev_geo(icd->parent, "Output after crop: %ux%u\n", icd->user_width, icd->user_height);
1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868

	if (icd->user_width != out_width || icd->user_height != out_height) {
		struct v4l2_format f = {
			.type	= V4L2_BUF_TYPE_VIDEO_CAPTURE,
			.fmt.pix	= {
				.width		= out_width,
				.height		= out_height,
				.pixelformat	= icd->current_fmt->host_fmt->fourcc,
				.field		= pcdev->field,
				.colorspace	= icd->colorspace,
			},
		};
		ret = sh_mobile_ceu_set_fmt(icd, &f);
		if (!ret && (out_width != f.fmt.pix.width ||
			     out_height != f.fmt.pix.height))
			ret = -EINVAL;
		if (!ret) {
1869 1870
			icd->user_width		= out_width & ~3;
			icd->user_height	= out_height & ~3;
1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885
			ret = sh_mobile_ceu_set_bus_param(icd,
					icd->current_fmt->host_fmt->fourcc);
		}
	}

	/* Thaw the queue */
	pcdev->frozen = 0;
	spin_lock_irq(&pcdev->lock);
	sh_mobile_ceu_capture(pcdev);
	spin_unlock_irq(&pcdev->lock);
	/* Start the client */
	ret = v4l2_subdev_call(sd, video, s_stream, 1);
	return ret;
}

1886 1887
static unsigned int sh_mobile_ceu_poll(struct file *file, poll_table *pt)
{
1888
	struct soc_camera_device *icd = file->private_data;
1889

1890
	return vb2_poll(&icd->vb2_vidq, file, pt);
1891 1892 1893 1894 1895 1896 1897 1898 1899 1900
}

static int sh_mobile_ceu_querycap(struct soc_camera_host *ici,
				  struct v4l2_capability *cap)
{
	strlcpy(cap->card, "SuperH_Mobile_CEU", sizeof(cap->card));
	cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
	return 0;
}

1901 1902
static int sh_mobile_ceu_init_videobuf(struct vb2_queue *q,
				       struct soc_camera_device *icd)
1903
{
1904 1905 1906 1907 1908 1909 1910 1911
	q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	q->io_modes = VB2_MMAP | VB2_USERPTR;
	q->drv_priv = icd;
	q->ops = &sh_mobile_ceu_videobuf_ops;
	q->mem_ops = &vb2_dma_contig_memops;
	q->buf_struct_size = sizeof(struct sh_mobile_ceu_buffer);

	return vb2_queue_init(q);
1912 1913
}

1914 1915 1916
static int sh_mobile_ceu_get_ctrl(struct soc_camera_device *icd,
				  struct v4l2_control *ctrl)
{
1917
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
	u32 val;

	switch (ctrl->id) {
	case V4L2_CID_SHARPNESS:
		val = ceu_read(pcdev, CLFCR);
		ctrl->value = val ^ 1;
		return 0;
	}
	return -ENOIOCTLCMD;
}

static int sh_mobile_ceu_set_ctrl(struct soc_camera_device *icd,
				  struct v4l2_control *ctrl)
{
1933
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
1934 1935 1936 1937
	struct sh_mobile_ceu_dev *pcdev = ici->priv;

	switch (ctrl->id) {
	case V4L2_CID_SHARPNESS:
1938
		switch (icd->current_fmt->host_fmt->fourcc) {
1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962
		case V4L2_PIX_FMT_NV12:
		case V4L2_PIX_FMT_NV21:
		case V4L2_PIX_FMT_NV16:
		case V4L2_PIX_FMT_NV61:
			ceu_write(pcdev, CLFCR, !ctrl->value);
			return 0;
		}
		return -EINVAL;
	}
	return -ENOIOCTLCMD;
}

static const struct v4l2_queryctrl sh_mobile_ceu_controls[] = {
	{
		.id		= V4L2_CID_SHARPNESS,
		.type		= V4L2_CTRL_TYPE_BOOLEAN,
		.name		= "Low-pass filter",
		.minimum	= 0,
		.maximum	= 1,
		.step		= 1,
		.default_value	= 0,
	},
};

1963 1964 1965 1966
static struct soc_camera_host_ops sh_mobile_ceu_host_ops = {
	.owner		= THIS_MODULE,
	.add		= sh_mobile_ceu_add_device,
	.remove		= sh_mobile_ceu_remove_device,
1967
	.get_formats	= sh_mobile_ceu_get_formats,
1968
	.put_formats	= sh_mobile_ceu_put_formats,
1969
	.get_crop	= sh_mobile_ceu_get_crop,
1970
	.set_crop	= sh_mobile_ceu_set_crop,
1971
	.set_livecrop	= sh_mobile_ceu_set_livecrop,
1972 1973
	.set_fmt	= sh_mobile_ceu_set_fmt,
	.try_fmt	= sh_mobile_ceu_try_fmt,
1974 1975
	.set_ctrl	= sh_mobile_ceu_set_ctrl,
	.get_ctrl	= sh_mobile_ceu_get_ctrl,
1976 1977 1978
	.poll		= sh_mobile_ceu_poll,
	.querycap	= sh_mobile_ceu_querycap,
	.set_bus_param	= sh_mobile_ceu_set_bus_param,
1979
	.init_videobuf2	= sh_mobile_ceu_init_videobuf,
1980 1981
	.controls	= sh_mobile_ceu_controls,
	.num_controls	= ARRAY_SIZE(sh_mobile_ceu_controls),
1982 1983
};

1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007
struct bus_wait {
	struct notifier_block	notifier;
	struct completion	completion;
	struct device		*dev;
};

static int bus_notify(struct notifier_block *nb,
		      unsigned long action, void *data)
{
	struct device *dev = data;
	struct bus_wait *wait = container_of(nb, struct bus_wait, notifier);

	if (wait->dev != dev)
		return NOTIFY_DONE;

	switch (action) {
	case BUS_NOTIFY_UNBOUND_DRIVER:
		/* Protect from module unloading */
		wait_for_completion(&wait->completion);
		return NOTIFY_OK;
	}
	return NOTIFY_DONE;
}

2008
static int __devinit sh_mobile_ceu_probe(struct platform_device *pdev)
2009 2010 2011 2012 2013 2014
{
	struct sh_mobile_ceu_dev *pcdev;
	struct resource *res;
	void __iomem *base;
	unsigned int irq;
	int err = 0;
2015 2016 2017 2018
	struct bus_wait wait = {
		.completion = COMPLETION_INITIALIZER_ONSTACK(wait.completion),
		.notifier.notifier_call = bus_notify,
	};
2019
	struct sh_mobile_ceu_companion *csi2;
2020 2021 2022

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	irq = platform_get_irq(pdev, 0);
2023
	if (!res || (int)irq <= 0) {
2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037
		dev_err(&pdev->dev, "Not enough CEU platform resources.\n");
		err = -ENODEV;
		goto exit;
	}

	pcdev = kzalloc(sizeof(*pcdev), GFP_KERNEL);
	if (!pcdev) {
		dev_err(&pdev->dev, "Could not allocate pcdev\n");
		err = -ENOMEM;
		goto exit;
	}

	INIT_LIST_HEAD(&pcdev->capture);
	spin_lock_init(&pcdev->lock);
2038
	init_completion(&pcdev->complete);
2039 2040 2041 2042 2043 2044 2045 2046

	pcdev->pdata = pdev->dev.platform_data;
	if (!pcdev->pdata) {
		err = -EINVAL;
		dev_err(&pdev->dev, "CEU platform data not set.\n");
		goto exit_kfree;
	}

2047
	base = ioremap_nocache(res->start, resource_size(res));
2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061
	if (!base) {
		err = -ENXIO;
		dev_err(&pdev->dev, "Unable to ioremap CEU registers.\n");
		goto exit_kfree;
	}

	pcdev->irq = irq;
	pcdev->base = base;
	pcdev->video_limit = 0; /* only enabled if second resource exists */

	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
	if (res) {
		err = dma_declare_coherent_memory(&pdev->dev, res->start,
						  res->start,
2062
						  resource_size(res),
2063 2064 2065 2066 2067 2068 2069 2070
						  DMA_MEMORY_MAP |
						  DMA_MEMORY_EXCLUSIVE);
		if (!err) {
			dev_err(&pdev->dev, "Unable to declare CEU memory.\n");
			err = -ENXIO;
			goto exit_iounmap;
		}

2071
		pcdev->video_limit = resource_size(res);
2072 2073 2074 2075
	}

	/* request irq */
	err = request_irq(pcdev->irq, sh_mobile_ceu_irq, IRQF_DISABLED,
2076
			  dev_name(&pdev->dev), pcdev);
2077 2078 2079 2080 2081
	if (err) {
		dev_err(&pdev->dev, "Unable to register CEU interrupt.\n");
		goto exit_release_mem;
	}

2082 2083 2084
	pm_suspend_ignore_children(&pdev->dev, true);
	pm_runtime_enable(&pdev->dev);
	pm_runtime_resume(&pdev->dev);
2085

2086
	pcdev->ici.priv = pcdev;
2087
	pcdev->ici.v4l2_dev.dev = &pdev->dev;
2088
	pcdev->ici.nr = pdev->id;
2089 2090
	pcdev->ici.drv_name = dev_name(&pdev->dev);
	pcdev->ici.ops = &sh_mobile_ceu_host_ops;
2091

2092 2093 2094 2095 2096 2097 2098 2099 2100 2101
	pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev);
	if (IS_ERR(pcdev->alloc_ctx)) {
		err = PTR_ERR(pcdev->alloc_ctx);
		goto exit_free_clk;
	}

	err = soc_camera_host_register(&pcdev->ici);
	if (err)
		goto exit_free_ctx;

2102
	/* CSI2 interfacing */
2103
	csi2 = pcdev->pdata->csi2;
2104
	if (csi2) {
2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130
		struct platform_device *csi2_pdev =
			platform_device_alloc("sh-mobile-csi2", csi2->id);
		struct sh_csi2_pdata *csi2_pdata = csi2->platform_data;

		if (!csi2_pdev) {
			err = -ENOMEM;
			goto exit_host_unregister;
		}

		pcdev->csi2_pdev		= csi2_pdev;

		err = platform_device_add_data(csi2_pdev, csi2_pdata, sizeof(*csi2_pdata));
		if (err < 0)
			goto exit_pdev_put;

		csi2_pdata			= csi2_pdev->dev.platform_data;
		csi2_pdata->v4l2_dev		= &pcdev->ici.v4l2_dev;

		csi2_pdev->resource		= csi2->resource;
		csi2_pdev->num_resources	= csi2->num_resources;

		err = platform_device_add(csi2_pdev);
		if (err < 0)
			goto exit_pdev_put;

		wait.dev = &csi2_pdev->dev;
2131 2132 2133

		err = bus_register_notifier(&platform_bus_type, &wait.notifier);
		if (err < 0)
2134
			goto exit_pdev_unregister;
2135 2136 2137 2138 2139 2140

		/*
		 * From this point the driver module will not unload, until
		 * we complete the completion.
		 */

2141
		if (!csi2_pdev->dev.driver) {
2142 2143 2144 2145
			complete(&wait.completion);
			/* Either too late, or probing failed */
			bus_unregister_notifier(&platform_bus_type, &wait.notifier);
			err = -ENXIO;
2146
			goto exit_pdev_unregister;
2147 2148 2149 2150 2151 2152 2153 2154
		}

		/*
		 * The module is still loaded, in the worst case it is hanging
		 * in device release on our completion. So, _now_ dereferencing
		 * the "owner" is safe!
		 */

2155
		err = try_module_get(csi2_pdev->dev.driver->owner);
2156 2157 2158 2159 2160 2161

		/* Let notifier complete, if it has been locked */
		complete(&wait.completion);
		bus_unregister_notifier(&platform_bus_type, &wait.notifier);
		if (!err) {
			err = -ENODEV;
2162
			goto exit_pdev_unregister;
2163 2164 2165
		}
	}

2166 2167
	return 0;

2168 2169 2170 2171 2172 2173 2174
exit_pdev_unregister:
	platform_device_del(pcdev->csi2_pdev);
exit_pdev_put:
	pcdev->csi2_pdev->resource = NULL;
	platform_device_put(pcdev->csi2_pdev);
exit_host_unregister:
	soc_camera_host_unregister(&pcdev->ici);
2175 2176
exit_free_ctx:
	vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
2177 2178
exit_free_clk:
	pm_runtime_disable(&pdev->dev);
2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190
	free_irq(pcdev->irq, pcdev);
exit_release_mem:
	if (platform_get_resource(pdev, IORESOURCE_MEM, 1))
		dma_release_declared_memory(&pdev->dev);
exit_iounmap:
	iounmap(base);
exit_kfree:
	kfree(pcdev);
exit:
	return err;
}

2191
static int __devexit sh_mobile_ceu_remove(struct platform_device *pdev)
2192
{
2193 2194 2195
	struct soc_camera_host *soc_host = to_soc_camera_host(&pdev->dev);
	struct sh_mobile_ceu_dev *pcdev = container_of(soc_host,
					struct sh_mobile_ceu_dev, ici);
2196
	struct platform_device *csi2_pdev = pcdev->csi2_pdev;
2197

2198
	soc_camera_host_unregister(soc_host);
2199
	pm_runtime_disable(&pdev->dev);
2200 2201 2202 2203
	free_irq(pcdev->irq, pcdev);
	if (platform_get_resource(pdev, IORESOURCE_MEM, 1))
		dma_release_declared_memory(&pdev->dev);
	iounmap(pcdev->base);
2204
	vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
2205 2206 2207 2208 2209 2210 2211
	if (csi2_pdev && csi2_pdev->dev.driver) {
		struct module *csi2_drv = csi2_pdev->dev.driver->owner;
		platform_device_del(csi2_pdev);
		csi2_pdev->resource = NULL;
		platform_device_put(csi2_pdev);
		module_put(csi2_drv);
	}
2212
	kfree(pcdev);
2213

2214 2215 2216
	return 0;
}

2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228
static int sh_mobile_ceu_runtime_nop(struct device *dev)
{
	/* Runtime PM callback shared between ->runtime_suspend()
	 * and ->runtime_resume(). Simply returns success.
	 *
	 * This driver re-initializes all registers after
	 * pm_runtime_get_sync() anyway so there is no need
	 * to save and restore registers here.
	 */
	return 0;
}

2229
static const struct dev_pm_ops sh_mobile_ceu_dev_pm_ops = {
2230 2231 2232 2233
	.runtime_suspend = sh_mobile_ceu_runtime_nop,
	.runtime_resume = sh_mobile_ceu_runtime_nop,
};

2234 2235 2236
static struct platform_driver sh_mobile_ceu_driver = {
	.driver 	= {
		.name	= "sh_mobile_ceu",
2237
		.pm	= &sh_mobile_ceu_dev_pm_ops,
2238 2239
	},
	.probe		= sh_mobile_ceu_probe,
2240
	.remove		= __devexit_p(sh_mobile_ceu_remove),
2241 2242 2243 2244
};

static int __init sh_mobile_ceu_init(void)
{
2245 2246
	/* Whatever return code */
	request_module("sh_mobile_csi2");
2247 2248 2249 2250 2251
	return platform_driver_register(&sh_mobile_ceu_driver);
}

static void __exit sh_mobile_ceu_exit(void)
{
2252
	platform_driver_unregister(&sh_mobile_ceu_driver);
2253 2254 2255 2256 2257 2258 2259 2260
}

module_init(sh_mobile_ceu_init);
module_exit(sh_mobile_ceu_exit);

MODULE_DESCRIPTION("SuperH Mobile CEU driver");
MODULE_AUTHOR("Magnus Damm");
MODULE_LICENSE("GPL");
2261
MODULE_VERSION("0.0.6");
2262
MODULE_ALIAS("platform:sh_mobile_ceu");