sh_mobile_ceu_camera.c 58.0 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 30
#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>
#include <linux/version.h>
31
#include <linux/slab.h>
32 33 34
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/videodev2.h>
35
#include <linux/pm_runtime.h>
36
#include <linux/sched.h>
37 38 39 40 41

#include <media/v4l2-common.h>
#include <media/v4l2-dev.h>
#include <media/soc_camera.h>
#include <media/sh_mobile_ceu.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 99 100 101 102 103
};

struct sh_mobile_ceu_dev {
	struct soc_camera_host ici;
	struct soc_camera_device *icd;

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

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

	struct sh_mobile_ceu_info *pdata;
110
	struct completion complete;
111

112 113
	u32 cflcr;

114
	enum v4l2_field field;
115
	int sequence;
116

117 118
	unsigned int image_mode:1;
	unsigned int is_16bit:1;
119
	unsigned int frozen:1;
120 121 122
};

struct sh_mobile_ceu_cam {
123 124 125 126 127 128 129 130 131 132 133 134 135 136
	/* CEU offsets within scaled by the CEU camera output */
	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;
137 138
	const struct soc_mbus_pixelfmt *extra_fmt;
	enum v4l2_mbus_pixelcode code;
139 140
};

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

146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
static unsigned long make_bus_param(struct sh_mobile_ceu_dev *pcdev)
{
	unsigned long flags;

	flags = SOCAM_MASTER |
		SOCAM_PCLK_SAMPLE_RISING |
		SOCAM_HSYNC_ACTIVE_HIGH |
		SOCAM_HSYNC_ACTIVE_LOW |
		SOCAM_VSYNC_ACTIVE_HIGH |
		SOCAM_VSYNC_ACTIVE_LOW |
		SOCAM_DATA_ACTIVE_HIGH;

	if (pcdev->pdata->flags & SH_CEU_FLAG_USE_8BIT_BUS)
		flags |= SOCAM_DATAWIDTH_8;

	if (pcdev->pdata->flags & SH_CEU_FLAG_USE_16BIT_BUS)
		flags |= SOCAM_DATAWIDTH_16;

	if (flags & SOCAM_DATAWIDTH_MASK)
		return flags;

	return 0;
}

170
static void ceu_write(struct sh_mobile_ceu_dev *priv,
171
		      unsigned long reg_offs, u32 data)
172 173 174 175
{
	iowrite32(data, priv->base + reg_offs);
}

176
static u32 ceu_read(struct sh_mobile_ceu_dev *priv, unsigned long reg_offs)
177 178 179 180
{
	return ioread32(priv->base + reg_offs);
}

181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
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) {
		dev_warn(&icd->dev, "soft reset time out\n");
		return -EIO;
	}

	return 0;
}

215 216 217
/*
 *  Videobuf operations
 */
218 219 220
static int sh_mobile_ceu_videobuf_setup(struct vb2_queue *vq,
			unsigned int *count, unsigned int *num_planes,
			unsigned long sizes[], void *alloc_ctxs[])
221
{
222
	struct soc_camera_device *icd = container_of(vq, struct soc_camera_device, vb2_vidq);
223 224
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
225 226
	int bytes_per_line = soc_mbus_bytes_per_line(icd->user_width,
						icd->current_fmt->host_fmt);
227

228 229 230
	if (bytes_per_line < 0)
		return bytes_per_line;

231 232 233 234 235
	*num_planes = 1;

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

237
	if (!*count)
238 239 240
		*count = 2;

	if (pcdev->video_limit) {
241 242
		if (PAGE_ALIGN(sizes[0]) * *count > pcdev->video_limit)
			*count = pcdev->video_limit / PAGE_ALIGN(sizes[0]);
243 244
	}

245
	dev_dbg(icd->dev.parent, "count=%d, size=%lu\n", *count, sizes[0]);
246 247 248 249

	return 0;
}

250 251 252
#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 */
253
#define CEU_CEIER_VBP   (1 << 20) /* vbp error */
254
#define CEU_CAPCR_CTNCP (1 << 16) /* continuous capture mode (if set) */
255
#define CEU_CEIER_MASK (CEU_CEIER_CPEIE | CEU_CEIER_VBP)
256 257


258 259 260 261 262
/*
 * 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)
263
{
264
	struct soc_camera_device *icd = pcdev->icd;
265
	dma_addr_t phys_addr_top, phys_addr_bottom;
266 267
	unsigned long top1, top2;
	unsigned long bottom1, bottom2;
268 269
	u32 status;
	int ret = 0;
270

271 272
	/*
	 * The hardware is _very_ picky about this sequence. Especially
273 274 275
	 * the CEU_CETCR_MAGIC value. It seems like we need to acknowledge
	 * several not-so-well documented interrupt sources in CETCR.
	 */
276 277 278
	ceu_write(pcdev, CEIER, ceu_read(pcdev, CEIER) & ~CEU_CEIER_MASK);
	status = ceu_read(pcdev, CETCR);
	ceu_write(pcdev, CETCR, ~status & CEU_CETCR_MAGIC);
279 280
	if (!pcdev->frozen)
		ceu_write(pcdev, CEIER, ceu_read(pcdev, CEIER) | CEU_CEIER_MASK);
281 282
	ceu_write(pcdev, CAPCR, ceu_read(pcdev, CAPCR) & ~CEU_CAPCR_CTNCP);
	ceu_write(pcdev, CETCR, CEU_CETCR_MAGIC ^ CEU_CETCR_IGRW);
283

284 285 286 287 288 289 290 291 292 293
	/*
	 * 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;
	}

294 295 296 297 298
	if (pcdev->frozen) {
		complete(&pcdev->complete);
		return ret;
	}

299
	if (!pcdev->active)
300
		return ret;
301

302 303 304 305 306 307 308 309 310 311 312 313
	if (V4L2_FIELD_INTERLACED_BT == pcdev->field) {
		top1	= CDBYR;
		top2	= CDBCR;
		bottom1	= CDAYR;
		bottom2	= CDACR;
	} else {
		top1	= CDAYR;
		top2	= CDACR;
		bottom1	= CDBYR;
		bottom2	= CDBCR;
	}

314
	phys_addr_top = vb2_dma_contig_plane_paddr(pcdev->active, 0);
315

316 317
	ceu_write(pcdev, top1, phys_addr_top);
	if (V4L2_FIELD_NONE != pcdev->field) {
318
		phys_addr_bottom = phys_addr_top + icd->user_width;
319
		ceu_write(pcdev, bottom1, phys_addr_bottom);
320
	}
321

322
	switch (icd->current_fmt->host_fmt->fourcc) {
323 324
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
325 326
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
327 328
		phys_addr_top += icd->user_width *
			icd->user_height;
329 330 331 332
		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);
333
		}
334
	}
335 336

	ceu_write(pcdev, CAPSR, 0x1); /* start capture */
337 338

	return ret;
339 340
}

341
static int sh_mobile_ceu_videobuf_prepare(struct vb2_buffer *vb)
342
{
343
	struct soc_camera_device *icd = container_of(vb->vb2_queue, struct soc_camera_device, vb2_vidq);
344
	struct sh_mobile_ceu_buffer *buf;
345 346
	int bytes_per_line = soc_mbus_bytes_per_line(icd->user_width,
						icd->current_fmt->host_fmt);
347
	unsigned long size;
348

349 350 351
	if (bytes_per_line < 0)
		return bytes_per_line;

352
	buf = to_ceu_vb(vb);
353

354 355
	dev_dbg(icd->dev.parent, "%s (vb=0x%p) 0x%p %lu\n", __func__,
		vb, vb2_plane_vaddr(vb, 0), vb2_get_plane_payload(vb, 0));
356 357

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

#ifdef DEBUG
361 362 363 364
	/*
	 * This can be useful if you want to see if we actually fill
	 * the buffer with something
	 */
365 366
	if (vb2_plane_vaddr(vb, 0))
		memset(vb2_plane_vaddr(vb, 0), 0xaa, vb2_get_plane_payload(vb, 0));
367 368 369 370
#endif

	BUG_ON(NULL == icd->current_fmt);

371
	size = icd->user_height * bytes_per_line;
372

373 374 375 376
	if (vb2_plane_size(vb, 0) < size) {
		dev_err(icd->dev.parent, "Buffer too small (%lu < %lu)\n",
			vb2_plane_size(vb, 0), size);
		return -ENOBUFS;
377 378
	}

379
	vb2_set_plane_payload(vb, 0, size);
380 381 382 383

	return 0;
}

384
static void sh_mobile_ceu_videobuf_queue(struct vb2_buffer *vb)
385
{
386
	struct soc_camera_device *icd = container_of(vb->vb2_queue, struct soc_camera_device, vb2_vidq);
387 388
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
389
	struct sh_mobile_ceu_buffer *buf = to_ceu_vb(vb);
390

391 392
	dev_dbg(icd->dev.parent, "%s (vb=0x%p) 0x%p %lu\n", __func__,
		vb, vb2_plane_vaddr(vb, 0), vb2_get_plane_payload(vb, 0));
393

394
	spin_lock_irq(&pcdev->lock);
395
	list_add_tail(&buf->queue, &pcdev->capture);
396 397

	if (!pcdev->active) {
398 399 400 401 402
		/*
		 * Because there were no active buffer at this moment,
		 * we are not interested in the return value of
		 * sh_mobile_ceu_capture here.
		 */
403 404 405
		pcdev->active = vb;
		sh_mobile_ceu_capture(pcdev);
	}
406
	spin_unlock_irq(&pcdev->lock);
407 408
}

409
static void sh_mobile_ceu_videobuf_release(struct vb2_buffer *vb)
410
{
411
	struct soc_camera_device *icd = container_of(vb->vb2_queue, struct soc_camera_device, vb2_vidq);
412
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
413
	struct sh_mobile_ceu_buffer *buf = to_ceu_vb(vb);
414 415
	struct sh_mobile_ceu_dev *pcdev = ici->priv;

416
	spin_lock_irq(&pcdev->lock);
417 418 419 420 421 422 423

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

424 425
	/* Doesn't hurt also if the list is empty */
	list_del_init(&buf->queue);
426

427
	spin_unlock_irq(&pcdev->lock);
428
}
429

430 431 432 433 434
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;
435 436
}

437 438 439 440 441 442 443
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);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
	struct list_head *buf_head, *tmp;

444
	spin_lock_irq(&pcdev->lock);
445 446 447 448 449 450

	pcdev->active = NULL;

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

451
	spin_unlock_irq(&pcdev->lock);
452 453 454 455

	return sh_mobile_ceu_soft_reset(pcdev);
}

456 457 458 459 460 461 462 463
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,
464
	.stop_streaming	= sh_mobile_ceu_stop_streaming,
465 466 467 468 469
};

static irqreturn_t sh_mobile_ceu_irq(int irq, void *data)
{
	struct sh_mobile_ceu_dev *pcdev = data;
470 471
	struct vb2_buffer *vb;
	int ret;
472

473
	spin_lock(&pcdev->lock);
474 475

	vb = pcdev->active;
476 477 478 479
	if (!vb)
		/* Stale interrupt from a released buffer */
		goto out;

480
	list_del_init(&to_ceu_vb(vb)->queue);
481 482

	if (!list_empty(&pcdev->capture))
483 484
		pcdev->active = &list_entry(pcdev->capture.next,
					    struct sh_mobile_ceu_buffer, queue)->vb;
485 486 487
	else
		pcdev->active = NULL;

488 489 490 491 492 493 494
	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);
495 496

out:
497
	spin_unlock(&pcdev->lock);
498 499 500 501

	return IRQ_HANDLED;
}

502
/* Called with .video_lock held */
503 504 505 506
static int sh_mobile_ceu_add_device(struct soc_camera_device *icd)
{
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
507
	int ret;
508 509

	if (pcdev->icd)
510
		return -EBUSY;
511

512
	dev_info(icd->dev.parent,
513 514 515
		 "SuperH Mobile CEU driver attached to camera %d\n",
		 icd->devnum);

516
	pm_runtime_get_sync(ici->v4l2_dev.dev);
517

518 519 520
	ret = sh_mobile_ceu_soft_reset(pcdev);
	if (!ret)
		pcdev->icd = icd;
521

522
	return ret;
523 524
}

525
/* Called with .video_lock held */
526 527 528 529 530 531 532 533 534
static void sh_mobile_ceu_remove_device(struct soc_camera_device *icd)
{
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;

	BUG_ON(icd != pcdev->icd);

	/* disable capture, disable interrupts */
	ceu_write(pcdev, CEIER, 0);
535
	sh_mobile_ceu_soft_reset(pcdev);
536 537

	/* make sure active buffer is canceled */
538
	spin_lock_irq(&pcdev->lock);
539
	if (pcdev->active) {
540 541
		list_del_init(&to_ceu_vb(pcdev->active)->queue);
		vb2_buffer_done(pcdev->active, VB2_BUF_STATE_ERROR);
542 543
		pcdev->active = NULL;
	}
544
	spin_unlock_irq(&pcdev->lock);
545

546
	pm_runtime_put_sync(ici->v4l2_dev.dev);
547

548
	dev_info(icd->dev.parent,
549 550 551 552 553 554
		 "SuperH Mobile CEU driver detached from camera %d\n",
		 icd->devnum);

	pcdev->icd = NULL;
}

555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585
/*
 * 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 */
586
static void sh_mobile_ceu_set_rect(struct soc_camera_device *icd)
587 588 589 590
{
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
591 592
	unsigned int height, width, cdwdr_width, in_width, in_height;
	unsigned int left_offset, top_offset;
593 594
	u32 camor;

595 596
	dev_geo(icd->dev.parent, "Crop %ux%u@%u:%u\n",
		icd->user_width, icd->user_height, cam->ceu_left, cam->ceu_top);
597

598 599
	left_offset	= cam->ceu_left;
	top_offset	= cam->ceu_top;
600

601
	/* CEU cropping (CFSZR) is applied _after_ the scaling filter (CFLCR) */
602
	if (pcdev->image_mode) {
603
		in_width = cam->width;
604 605 606 607
		if (!pcdev->is_16bit) {
			in_width *= 2;
			left_offset *= 2;
		}
608 609
		width = icd->user_width;
		cdwdr_width = icd->user_width;
610
	} else {
611
		int bytes_per_line = soc_mbus_bytes_per_line(icd->user_width,
612 613
						icd->current_fmt->host_fmt);
		unsigned int w_factor;
614

615
		width = icd->user_width;
616

617 618 619 620 621 622 623
		switch (icd->current_fmt->host_fmt->packing) {
		case SOC_MBUS_PACKING_2X8_PADHI:
			w_factor = 2;
			break;
		default:
			w_factor = 1;
		}
624

625
		in_width = cam->width * w_factor;
626
		left_offset = left_offset * w_factor;
627

628
		if (bytes_per_line < 0)
629
			cdwdr_width = icd->user_width;
630 631
		else
			cdwdr_width = bytes_per_line;
632 633
	}

634 635
	height = icd->user_height;
	in_height = cam->height;
636
	if (V4L2_FIELD_NONE != pcdev->field) {
637
		height /= 2;
638 639
		in_height /= 2;
		top_offset /= 2;
640 641 642
		cdwdr_width *= 2;
	}

643 644 645 646 647 648
	/* CSI2 special configuration */
	if (pcdev->pdata->csi2_dev) {
		in_width = ((in_width - 2) * 2);
		left_offset *= 2;
	}

649
	/* Set CAMOR, CAPWR, CFSZR, take care of CDWDR */
650
	camor = left_offset | (top_offset << 16);
651 652 653 654 655 656

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

657
	ceu_write(pcdev, CAMOR, camor);
658
	ceu_write(pcdev, CAPWR, (in_height << 16) | in_width);
659
	ceu_write(pcdev, CFSZR, (height << 16) | width);
660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695
	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);
}

696
/* Capture is not running, no interrupts, no locking needed */
697 698 699 700 701
static int sh_mobile_ceu_set_bus_param(struct soc_camera_device *icd,
				       __u32 pixfmt)
{
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
702
	int ret;
703
	unsigned long camera_flags, common_flags, value;
704 705 706
	int yuv_lineskip;
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	u32 capsr = capture_save_reset(pcdev);
707 708 709

	camera_flags = icd->ops->query_bus_param(icd);
	common_flags = soc_camera_bus_param_compatible(camera_flags,
710
						       make_bus_param(pcdev));
711 712 713
	if (!common_flags)
		return -EINVAL;

714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730
	/* Make choises, based on platform preferences */
	if ((common_flags & SOCAM_HSYNC_ACTIVE_HIGH) &&
	    (common_flags & SOCAM_HSYNC_ACTIVE_LOW)) {
		if (pcdev->pdata->flags & SH_CEU_FLAG_HSYNC_LOW)
			common_flags &= ~SOCAM_HSYNC_ACTIVE_HIGH;
		else
			common_flags &= ~SOCAM_HSYNC_ACTIVE_LOW;
	}

	if ((common_flags & SOCAM_VSYNC_ACTIVE_HIGH) &&
	    (common_flags & SOCAM_VSYNC_ACTIVE_LOW)) {
		if (pcdev->pdata->flags & SH_CEU_FLAG_VSYNC_LOW)
			common_flags &= ~SOCAM_VSYNC_ACTIVE_HIGH;
		else
			common_flags &= ~SOCAM_VSYNC_ACTIVE_LOW;
	}

731 732 733 734 735 736
	ret = icd->ops->set_bus_param(icd, common_flags);
	if (ret < 0)
		return ret;

	switch (common_flags & SOCAM_DATAWIDTH_MASK) {
	case SOCAM_DATAWIDTH_8:
737
		pcdev->is_16bit = 0;
738 739
		break;
	case SOCAM_DATAWIDTH_16:
740
		pcdev->is_16bit = 1;
741 742 743 744 745 746 747 748
		break;
	default:
		return -EINVAL;
	}

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

749
	value = 0x00000010; /* data fetch by default */
750
	yuv_lineskip = 0;
751

752
	switch (icd->current_fmt->host_fmt->fourcc) {
753 754 755
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
		yuv_lineskip = 1; /* skip for NV12/21, no skip for NV16/61 */
756 757 758
		/* fall-through */
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
759
		switch (cam->code) {
760
		case V4L2_MBUS_FMT_UYVY8_2X8:
761 762
			value = 0x00000000; /* Cb0, Y0, Cr0, Y1 */
			break;
763
		case V4L2_MBUS_FMT_VYUY8_2X8:
764 765
			value = 0x00000100; /* Cr0, Y0, Cb0, Y1 */
			break;
766
		case V4L2_MBUS_FMT_YUYV8_2X8:
767 768
			value = 0x00000200; /* Y0, Cb0, Y1, Cr0 */
			break;
769
		case V4L2_MBUS_FMT_YVYU8_2X8:
770 771 772 773 774 775 776
			value = 0x00000300; /* Y0, Cr0, Y1, Cb0 */
			break;
		default:
			BUG();
		}
	}

777 778
	if (icd->current_fmt->host_fmt->fourcc == V4L2_PIX_FMT_NV21 ||
	    icd->current_fmt->host_fmt->fourcc == V4L2_PIX_FMT_NV61)
779
		value ^= 0x00000100; /* swap U, V to change from NV1x->NVx1 */
780

781 782
	value |= common_flags & SOCAM_VSYNC_ACTIVE_LOW ? 1 << 1 : 0;
	value |= common_flags & SOCAM_HSYNC_ACTIVE_LOW ? 1 << 0 : 0;
783
	value |= pcdev->is_16bit ? 1 << 12 : 0;
784 785 786 787 788

	/* CSI2 mode */
	if (pcdev->pdata->csi2_dev)
		value |= 3 << 12;

789 790 791
	ceu_write(pcdev, CAMCR, value);

	ceu_write(pcdev, CAPCR, 0x00300000);
792 793 794 795 796 797 798 799 800 801 802 803 804

	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);
805

806
	sh_mobile_ceu_set_rect(icd);
807 808
	mdelay(1);

809
	dev_geo(icd->dev.parent, "CFLCR 0x%x\n", pcdev->cflcr);
810
	ceu_write(pcdev, CFLCR, pcdev->cflcr);
811

812 813
	/*
	 * A few words about byte order (observed in Big Endian mode)
814 815 816 817 818 819 820 821
	 *
	 * 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,
822 823
	 * using 7 we swap the data bytes to match the incoming order:
	 * D0, D1, D2, D3, D4, D5, D6, D7
824
	 */
825 826 827 828 829
	value = 0x00000017;
	if (yuv_lineskip)
		value &= ~0x00000010; /* convert 4:2:2 -> 4:2:0 */

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

832
	dev_dbg(icd->dev.parent, "S_FMT successful for %c%c%c%c %ux%u\n",
833 834
		pixfmt & 0xff, (pixfmt >> 8) & 0xff,
		(pixfmt >> 16) & 0xff, (pixfmt >> 24) & 0xff,
835
		icd->user_width, icd->user_height);
836 837 838

	capture_restore(pcdev, capsr);

839 840 841 842
	/* not in bundle mode: skip CBDSR, CDAYR2, CDACR2, CDBYR2, CDBCR2 */
	return 0;
}

843 844
static int sh_mobile_ceu_try_bus_param(struct soc_camera_device *icd,
				       unsigned char buswidth)
845 846 847 848 849 850 851
{
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
	unsigned long camera_flags, common_flags;

	camera_flags = icd->ops->query_bus_param(icd);
	common_flags = soc_camera_bus_param_compatible(camera_flags,
852
						       make_bus_param(pcdev));
853 854
	if (!common_flags || buswidth > 16 ||
	    (buswidth > 8 && !(common_flags & SOCAM_DATAWIDTH_16)))
855 856 857 858 859
		return -EINVAL;

	return 0;
}

860
static const struct soc_mbus_pixelfmt sh_mobile_ceu_formats[] = {
861
	{
862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884
		.fourcc			= V4L2_PIX_FMT_NV12,
		.name			= "NV12",
		.bits_per_sample	= 12,
		.packing		= SOC_MBUS_PACKING_NONE,
		.order			= SOC_MBUS_ORDER_LE,
	}, {
		.fourcc			= V4L2_PIX_FMT_NV21,
		.name			= "NV21",
		.bits_per_sample	= 12,
		.packing		= SOC_MBUS_PACKING_NONE,
		.order			= SOC_MBUS_ORDER_LE,
	}, {
		.fourcc			= V4L2_PIX_FMT_NV16,
		.name			= "NV16",
		.bits_per_sample	= 16,
		.packing		= SOC_MBUS_PACKING_NONE,
		.order			= SOC_MBUS_ORDER_LE,
	}, {
		.fourcc			= V4L2_PIX_FMT_NV61,
		.name			= "NV61",
		.bits_per_sample	= 16,
		.packing		= SOC_MBUS_PACKING_NONE,
		.order			= SOC_MBUS_ORDER_LE,
885
	},
886 887
};

888 889 890 891 892 893 894 895 896 897
/* 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 ||
		(fmt->bits_per_sample == 8 &&
		 fmt->packing == SOC_MBUS_PACKING_2X8_PADHI) ||
		(fmt->bits_per_sample > 8 &&
		 fmt->packing == SOC_MBUS_PACKING_EXTEND16);
}

898 899
static int client_g_rect(struct v4l2_subdev *sd, struct v4l2_rect *rect);

900
static int sh_mobile_ceu_get_formats(struct soc_camera_device *icd, unsigned int idx,
901 902
				     struct soc_camera_format_xlate *xlate)
{
903
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
904
	struct device *dev = icd->dev.parent;
905 906
	struct soc_camera_host *ici = to_soc_camera_host(dev);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
907
	int ret, k, n;
908
	int formats = 0;
909
	struct sh_mobile_ceu_cam *cam;
910 911
	enum v4l2_mbus_pixelcode code;
	const struct soc_mbus_pixelfmt *fmt;
912

913 914 915 916 917 918 919
	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) {
920 921
		dev_warn(dev, "unsupported format code #%u: %d\n", idx, code);
		return 0;
922 923
	}

924 925 926 927 928
	if (!pcdev->pdata->csi2_dev) {
		ret = sh_mobile_ceu_try_bus_param(icd, fmt->bits_per_sample);
		if (ret < 0)
			return 0;
	}
929

930
	if (!icd->host_priv) {
931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950
		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;
951
			ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
952
							 s_mbus_fmt, &mf);
953 954 955 956 957 958 959 960 961 962 963 964 965
			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);

966 967 968 969
		cam = kzalloc(sizeof(*cam), GFP_KERNEL);
		if (!cam)
			return -ENOMEM;

970 971 972 973 974 975 976 977 978 979
		/* 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;

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

980 981 982 983 984
		icd->host_priv = cam;
	} else {
		cam = icd->host_priv;
	}

985 986
	/* Beginning of a pass */
	if (!idx)
987
		cam->extra_fmt = NULL;
988

989
	switch (code) {
990 991 992 993
	case V4L2_MBUS_FMT_UYVY8_2X8:
	case V4L2_MBUS_FMT_VYUY8_2X8:
	case V4L2_MBUS_FMT_YUYV8_2X8:
	case V4L2_MBUS_FMT_YVYU8_2X8:
994
		if (cam->extra_fmt)
995
			break;
996 997 998 999 1000 1001 1002 1003 1004 1005

		/*
		 * 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.
		 */
1006
		cam->extra_fmt = sh_mobile_ceu_formats;
1007

1008 1009 1010
		n = ARRAY_SIZE(sh_mobile_ceu_formats);
		formats += n;
		for (k = 0; xlate && k < n; k++) {
1011 1012
			xlate->host_fmt	= &sh_mobile_ceu_formats[k];
			xlate->code	= code;
1013
			xlate++;
1014 1015
			dev_dbg(dev, "Providing format %s using code %d\n",
				sh_mobile_ceu_formats[k].name, code);
1016
		}
1017
		break;
1018
	default:
1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
		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",
1030
			fmt->name);
1031 1032 1033 1034 1035
	}

	return formats;
}

1036 1037 1038 1039 1040 1041
static void sh_mobile_ceu_put_formats(struct soc_camera_device *icd)
{
	kfree(icd->host_priv);
	icd->host_priv = NULL;
}

1042
/* Check if any dimension of r1 is smaller than respective one of r2 */
1043 1044 1045 1046 1047
static bool is_smaller(struct v4l2_rect *r1, struct v4l2_rect *r2)
{
	return r1->width < r2->width || r1->height < r2->height;
}

1048 1049 1050 1051 1052 1053 1054 1055
/* 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;
}

1056 1057 1058 1059 1060 1061 1062 1063 1064 1065
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;
}

1066
/* Get and store current client crop */
1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084
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);
1085 1086
	if (!ret)
		*rect = cap.defrect;
1087 1088 1089 1090

	return ret;
}

1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116
/* 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;
}

1117
/*
1118
 * The common for both scaling and cropping iterative approach is:
1119 1120 1121 1122
 * 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
 */
1123
static int client_s_crop(struct soc_camera_device *icd, struct v4l2_crop *crop,
1124
			 struct v4l2_crop *cam_crop)
1125
{
1126
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1127 1128
	struct v4l2_rect *rect = &crop->c, *cam_rect = &cam_crop->c;
	struct device *dev = sd->v4l2_dev->dev;
1129
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1130
	struct v4l2_cropcap cap;
1131
	int ret;
1132
	unsigned int width, height;
1133

1134 1135 1136 1137
	v4l2_subdev_call(sd, video, s_crop, crop);
	ret = client_g_rect(sd, cam_rect);
	if (ret < 0)
		return ret;
1138

1139 1140 1141 1142 1143 1144
	/*
	 * 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 */
1145
		dev_dbg(dev, "Camera S_CROP successful for %dx%d@%d:%d\n",
1146
			rect->width, rect->height, rect->left, rect->top);
1147
		cam->rect = *cam_rect;
1148
		return 0;
1149 1150
	}

1151
	/* Try to fix cropping, that camera hasn't managed to set */
1152
	dev_geo(dev, "Fix camera S_CROP for %dx%d@%d:%d to %dx%d@%d:%d\n",
1153
		cam_rect->width, cam_rect->height,
1154
		cam_rect->left, cam_rect->top,
1155 1156 1157 1158 1159 1160 1161
		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;

1162
	/* Put user requested rectangle within sensor bounds */
1163 1164 1165 1166
	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);
1167 1168 1169 1170 1171

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

1175 1176 1177 1178
	/*
	 * Loop as long as sensor is not covering the requested rectangle and
	 * is still within its bounds
	 */
1179 1180 1181
	while (!ret && (is_smaller(cam_rect, rect) ||
			is_inside(cam_rect, rect)) &&
	       (cap.bounds.width > width || cap.bounds.height > height)) {
1182 1183 1184

		width *= 2;
		height *= 2;
1185

1186 1187
		cam_rect->width = width;
		cam_rect->height = height;
1188

1189 1190 1191 1192 1193 1194 1195
		/*
		 * 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.
1196
		 * Instead we just drop to the left and top bounds.
1197 1198 1199
		 */
		if (cam_rect->left > rect->left)
			cam_rect->left = cap.bounds.left;
1200

1201 1202
		if (cam_rect->left + cam_rect->width < rect->left + rect->width)
			cam_rect->width = rect->left + rect->width -
1203
				cam_rect->left;
1204

1205 1206
		if (cam_rect->top > rect->top)
			cam_rect->top = cap.bounds.top;
1207

1208 1209
		if (cam_rect->top + cam_rect->height < rect->top + rect->height)
			cam_rect->height = rect->top + rect->height -
1210
				cam_rect->top;
1211

1212 1213
		v4l2_subdev_call(sd, video, s_crop, cam_crop);
		ret = client_g_rect(sd, cam_rect);
1214
		dev_geo(dev, "Camera S_CROP %d for %dx%d@%d:%d\n", ret,
1215
			cam_rect->width, cam_rect->height,
1216
			cam_rect->left, cam_rect->top);
1217 1218
	}

1219 1220
	/* S_CROP must not modify the rectangle */
	if (is_smaller(cam_rect, rect) || is_inside(cam_rect, rect)) {
1221 1222 1223 1224
		/*
		 * The camera failed to configure a suitable cropping,
		 * we cannot use the current rectangle, set to max
		 */
1225 1226 1227
		*cam_rect = cap.bounds;
		v4l2_subdev_call(sd, video, s_crop, cam_crop);
		ret = client_g_rect(sd, cam_rect);
1228
		dev_geo(dev, "Camera S_CROP %d for max %dx%d@%d:%d\n", ret,
1229
			cam_rect->width, cam_rect->height,
1230
			cam_rect->left, cam_rect->top);
1231 1232
	}

1233 1234 1235
	if (!ret) {
		cam->rect = *cam_rect;
		update_subrect(cam);
1236 1237
	}

1238
	return ret;
1239 1240
}

1241
/* Iterative s_mbus_fmt, also updates cached client crop on success */
1242 1243
static int client_s_fmt(struct soc_camera_device *icd,
			struct v4l2_mbus_framefmt *mf, bool ceu_can_scale)
1244
{
1245
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1246 1247
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	struct device *dev = icd->dev.parent;
1248
	unsigned int width = mf->width, height = mf->height, tmp_w, tmp_h;
1249 1250 1251 1252
	unsigned int max_width, max_height;
	struct v4l2_cropcap cap;
	int ret;

1253
	ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
1254
					 s_mbus_fmt, mf);
1255 1256 1257 1258 1259 1260 1261 1262
	if (ret < 0)
		return ret;

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

	if ((width == mf->width && height == mf->height) || !ceu_can_scale)
		goto update_cache;

1263 1264 1265 1266 1267 1268 1269 1270 1271 1272
	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 */
1273 1274
	tmp_w = mf->width;
	tmp_h = mf->height;
1275 1276 1277 1278 1279 1280

	/* 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);
1281 1282
		mf->width = tmp_w;
		mf->height = tmp_h;
1283
		ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
1284
						 s_mbus_fmt, mf);
1285
		dev_geo(dev, "Camera scaled to %ux%u\n",
1286
			mf->width, mf->height);
1287 1288 1289 1290 1291 1292 1293
		if (ret < 0) {
			/* This shouldn't happen */
			dev_err(dev, "Client failed to set format: %d\n", ret);
			return ret;
		}
	}

1294 1295 1296 1297 1298 1299 1300 1301
update_cache:
	/* Update cache */
	ret = client_g_rect(sd, &cam->rect);
	if (ret < 0)
		return ret;

	update_subrect(cam);

1302 1303 1304 1305
	return 0;
}

/**
1306 1307 1308
 * @width	- on output: user width, mapped back to input
 * @height	- on output: user height, mapped back to input
 * @mf		- in- / output camera output window
1309
 */
1310 1311 1312 1313
static int client_scale(struct soc_camera_device *icd,
			struct v4l2_mbus_framefmt *mf,
			unsigned int *width, unsigned int *height,
			bool ceu_can_scale)
1314 1315 1316
{
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	struct device *dev = icd->dev.parent;
1317
	struct v4l2_mbus_framefmt mf_tmp = *mf;
1318 1319 1320
	unsigned int scale_h, scale_v;
	int ret;

1321 1322 1323 1324
	/*
	 * 5. Apply iterative camera S_FMT for camera user window (also updates
	 *    client crop cache and the imaginary sub-rectangle).
	 */
1325
	ret = client_s_fmt(icd, &mf_tmp, ceu_can_scale);
1326 1327 1328 1329
	if (ret < 0)
		return ret;

	dev_geo(dev, "5: camera scaled to %ux%u\n",
1330
		mf_tmp.width, mf_tmp.height);
1331 1332 1333

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

1334
	/* unneeded - it is already in "mf_tmp" */
1335

1336 1337 1338
	/* 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);
1339

1340 1341 1342
	mf->width	= mf_tmp.width;
	mf->height	= mf_tmp.height;
	mf->colorspace	= mf_tmp.colorspace;
1343 1344

	/*
1345
	 * 8. Calculate new CEU crop - apply camera scales to previously
1346
	 *    updated "effective" crop.
1347
	 */
1348 1349
	*width = scale_down(cam->subrect.width, scale_h);
	*height = scale_down(cam->subrect.height, scale_v);
1350

1351
	dev_geo(dev, "8: new client sub-window %ux%u\n", *width, *height);
1352 1353 1354 1355 1356 1357 1358

	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
1359
 * Documentation/video4linux/sh_mobile_ceu_camera.txt for a description of
1360 1361 1362 1363 1364 1365 1366 1367 1368 1369
 * 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;
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
	struct v4l2_crop cam_crop;
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1370
	struct v4l2_rect *cam_rect = &cam_crop.c;
1371 1372
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	struct device *dev = icd->dev.parent;
1373
	struct v4l2_mbus_framefmt mf;
1374
	unsigned int scale_cam_h, scale_cam_v, scale_ceu_h, scale_ceu_v,
1375
		out_width, out_height;
1376
	int interm_width, interm_height;
1377 1378 1379
	u32 capsr, cflcr;
	int ret;

1380 1381
	dev_geo(dev, "S_CROP(%ux%u@%u:%u)\n", rect->width, rect->height,
		rect->left, rect->top);
1382

1383 1384 1385
	/* 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);
1386

1387 1388
	/* 1. - 2. Apply iterative camera S_CROP for new input window. */
	ret = client_s_crop(icd, a, &cam_crop);
1389 1390 1391
	if (ret < 0)
		return ret;

1392
	dev_geo(dev, "1-2: camera cropped to %ux%u@%u:%u\n",
1393 1394 1395 1396 1397
		cam_rect->width, cam_rect->height,
		cam_rect->left, cam_rect->top);

	/* On success cam_crop contains current camera crop */

1398 1399 1400 1401
	/* 3. Retrieve camera output window */
	ret = v4l2_subdev_call(sd, video, g_mbus_fmt, &mf);
	if (ret < 0)
		return ret;
1402

1403 1404
	if (mf.width > 2560 || mf.height > 1920)
		return -EINVAL;
1405

1406 1407 1408
	/* 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);
1409

1410 1411 1412
	/* Calculate intermediate window */
	interm_width	= scale_down(rect->width, scale_cam_h);
	interm_height	= scale_down(rect->height, scale_cam_v);
1413

1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446
	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;

1447 1448 1449 1450 1451 1452 1453
	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;
	}
1454 1455

	/*
1456 1457
	 * 5. Calculate CEU scales from camera scales from results of (5) and
	 *    the user window
1458
	 */
1459 1460
	scale_ceu_h	= calc_scale(interm_width, &out_width);
	scale_ceu_v	= calc_scale(interm_height, &out_height);
1461

1462 1463 1464
	dev_geo(dev, "5: CEU scales %u:%u\n", scale_ceu_h, scale_ceu_v);

	/* Apply CEU scales. */
1465 1466 1467 1468 1469 1470
	cflcr = scale_ceu_h | (scale_ceu_v << 16);
	if (cflcr != pcdev->cflcr) {
		pcdev->cflcr = cflcr;
		ceu_write(pcdev, CFLCR, cflcr);
	}

1471 1472
	icd->user_width	 = out_width;
	icd->user_height = out_height;
1473 1474
	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;
1475 1476 1477 1478 1479 1480 1481 1482 1483 1484

	/* 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);

1485
	/* Restore capture. The CE bit can be cleared by the hardware */
1486 1487 1488 1489 1490 1491
	if (pcdev->active)
		capsr |= 1;
	capture_restore(pcdev, capsr);

	/* Even if only camera cropping succeeded */
	return ret;
1492 1493
}

1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553
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,
		struct v4l2_pix_format *pix, struct v4l2_mbus_framefmt *mf)
{
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	struct device *dev = icd->dev.parent;
	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);

	/*
	 * 4. Calculate client output window by applying combined scales to real
	 *    input window.
	 */
	mf->width	= scale_down(cam->rect.width, scale_h);
	mf->height	= scale_down(cam->rect.height, scale_v);
}

1554
/* Similar to set_crop multistage iterative algorithm */
1555
static int sh_mobile_ceu_set_fmt(struct soc_camera_device *icd,
1556
				 struct v4l2_format *f)
1557
{
1558
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
1559
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
1560 1561
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	struct v4l2_pix_format *pix = &f->fmt.pix;
1562
	struct v4l2_mbus_framefmt mf;
1563
	struct device *dev = icd->dev.parent;
1564
	__u32 pixfmt = pix->pixelformat;
1565
	const struct soc_camera_format_xlate *xlate;
1566 1567
	/* Keep Compiler Happy */
	unsigned int ceu_sub_width = 0, ceu_sub_height = 0;
1568 1569
	u16 scale_v, scale_h;
	int ret;
1570 1571
	bool image_mode;
	enum v4l2_field field;
1572

1573 1574
	dev_geo(dev, "S_FMT(pix=0x%x, %ux%u)\n", pixfmt, pix->width, pix->height);

1575 1576 1577 1578
	switch (pix->field) {
	default:
		pix->field = V4L2_FIELD_NONE;
		/* fall-through */
1579 1580
	case V4L2_FIELD_INTERLACED_TB:
	case V4L2_FIELD_INTERLACED_BT:
1581
	case V4L2_FIELD_NONE:
1582 1583 1584 1585
		field = pix->field;
		break;
	case V4L2_FIELD_INTERLACED:
		field = V4L2_FIELD_INTERLACED_TB;
1586 1587
		break;
	}
1588

1589 1590
	xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
	if (!xlate) {
1591
		dev_warn(dev, "Format %x not found\n", pixfmt);
1592
		return -EINVAL;
1593 1594
	}

1595 1596
	/* 1.-4. Calculate client output geometry */
	calculate_client_output(icd, &f->fmt.pix, &mf);
1597 1598 1599
	mf.field	= pix->field;
	mf.colorspace	= pix->colorspace;
	mf.code		= xlate->code;
1600

1601 1602 1603 1604 1605
	switch (pixfmt) {
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
1606
		image_mode = true;
1607 1608
		break;
	default:
1609
		image_mode = false;
1610
	}
1611

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

1614
	/* 5. - 9. */
1615
	ret = client_scale(icd, &mf, &ceu_sub_width, &ceu_sub_height,
1616
			   image_mode && V4L2_FIELD_NONE == field);
1617

1618
	dev_geo(dev, "5-9: client scale return %d\n", ret);
1619 1620 1621

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

1622 1623
	dev_geo(dev, "fmt %ux%u, requested %ux%u\n",
		mf.width, mf.height, pix->width, pix->height);
1624 1625 1626
	if (ret < 0)
		return ret;

1627 1628 1629
	if (mf.code != xlate->code)
		return -EINVAL;

1630 1631 1632 1633
	/* 9. Prepare CEU crop */
	cam->width = mf.width;
	cam->height = mf.height;

1634
	/* 10. Use CEU scaling to scale to the requested user window. */
1635 1636

	/* We cannot scale up */
1637 1638
	if (pix->width > ceu_sub_width)
		ceu_sub_width = pix->width;
1639

1640 1641
	if (pix->height > ceu_sub_height)
		ceu_sub_height = pix->height;
1642

1643 1644 1645 1646
	pix->colorspace = mf.colorspace;

	if (image_mode) {
		/* Scale pix->{width x height} down to width x height */
1647 1648
		scale_h		= calc_scale(ceu_sub_width, &pix->width);
		scale_v		= calc_scale(ceu_sub_height, &pix->height);
1649
	} else {
1650 1651 1652 1653
		pix->width	= ceu_sub_width;
		pix->height	= ceu_sub_height;
		scale_h		= 0;
		scale_v		= 0;
1654
	}
1655

1656 1657 1658 1659 1660 1661 1662
	pcdev->cflcr = scale_h | (scale_v << 16);

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

1663
	dev_geo(dev, "10: W: %u : 0x%x = %u, H: %u : 0x%x = %u\n",
1664 1665
		ceu_sub_width, scale_h, pix->width,
		ceu_sub_height, scale_v, pix->height);
1666

1667 1668
	cam->code		= xlate->code;
	icd->current_fmt	= xlate;
1669

1670
	pcdev->field = field;
1671
	pcdev->image_mode = image_mode;
1672 1673

	return 0;
1674 1675
}

1676 1677
static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd,
				 struct v4l2_format *f)
1678
{
1679
	const struct soc_camera_format_xlate *xlate;
1680
	struct v4l2_pix_format *pix = &f->fmt.pix;
1681
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1682
	struct v4l2_mbus_framefmt mf;
1683
	__u32 pixfmt = pix->pixelformat;
1684
	int width, height;
1685
	int ret;
1686

1687 1688 1689
	dev_geo(icd->dev.parent, "TRY_FMT(pix=0x%x, %ux%u)\n",
		 pixfmt, pix->width, pix->height);

1690 1691
	xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
	if (!xlate) {
1692
		dev_warn(icd->dev.parent, "Format %x not found\n", pixfmt);
1693
		return -EINVAL;
1694
	}
1695

1696 1697
	/* FIXME: calculate using depth and bus width */

1698 1699
	v4l_bound_align_image(&pix->width, 2, 2560, 1,
			      &pix->height, 4, 1920, 2, 0);
1700

1701 1702 1703
	width = pix->width;
	height = pix->height;

1704
	pix->bytesperline = soc_mbus_bytes_per_line(width, xlate->host_fmt);
1705
	if ((int)pix->bytesperline < 0)
1706 1707
		return pix->bytesperline;
	pix->sizeimage = height * pix->bytesperline;
1708

1709
	/* limit to sensor capabilities */
1710 1711 1712 1713 1714 1715
	mf.width	= pix->width;
	mf.height	= pix->height;
	mf.field	= pix->field;
	mf.code		= xlate->code;
	mf.colorspace	= pix->colorspace;

1716
	ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, try_mbus_fmt, &mf);
1717 1718 1719
	if (ret < 0)
		return ret;

1720 1721 1722 1723 1724
	pix->width	= mf.width;
	pix->height	= mf.height;
	pix->field	= mf.field;
	pix->colorspace	= mf.colorspace;

1725 1726 1727 1728 1729 1730 1731 1732
	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) {
1733 1734 1735 1736 1737 1738 1739
			/*
			 * 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;
1740
			ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
1741
							 try_mbus_fmt, &mf);
1742 1743
			if (ret < 0) {
				/* Shouldn't actually happen... */
1744
				dev_err(icd->dev.parent,
1745 1746
					"FIXME: client try_fmt() = %d\n", ret);
				return ret;
1747 1748
			}
		}
1749 1750
		/* We will scale exactly */
		if (mf.width > width)
1751
			pix->width = width;
1752
		if (mf.height > height)
1753
			pix->height = height;
1754 1755
	}

1756 1757 1758
	dev_geo(icd->dev.parent, "%s(): return %d, fmt 0x%x, %ux%u\n",
		__func__, ret, pix->pixelformat, pix->width, pix->height);

1759
	return ret;
1760 1761
}

1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818
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);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	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)
		dev_warn(icd->dev.parent,
			 "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);

	dev_geo(icd->dev.parent, "Output after crop: %ux%u\n", icd->user_width, icd->user_height);

	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) {
			icd->user_width		= out_width;
			icd->user_height	= out_height;
			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;
}

1819 1820
static unsigned int sh_mobile_ceu_poll(struct file *file, poll_table *pt)
{
1821
	struct soc_camera_device *icd = file->private_data;
1822

1823
	return vb2_poll(&icd->vb2_vidq, file, pt);
1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834
}

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->version = KERNEL_VERSION(0, 0, 5);
	cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
	return 0;
}

1835 1836
static int sh_mobile_ceu_init_videobuf(struct vb2_queue *q,
				       struct soc_camera_device *icd)
1837
{
1838 1839 1840 1841 1842 1843 1844 1845
	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);
1846 1847
}

1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871
static int sh_mobile_ceu_get_ctrl(struct soc_camera_device *icd,
				  struct v4l2_control *ctrl)
{
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	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)
{
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;

	switch (ctrl->id) {
	case V4L2_CID_SHARPNESS:
1872
		switch (icd->current_fmt->host_fmt->fourcc) {
1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896
		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,
	},
};

1897 1898 1899 1900
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,
1901
	.get_formats	= sh_mobile_ceu_get_formats,
1902
	.put_formats	= sh_mobile_ceu_put_formats,
1903
	.get_crop	= sh_mobile_ceu_get_crop,
1904
	.set_crop	= sh_mobile_ceu_set_crop,
1905
	.set_livecrop	= sh_mobile_ceu_set_livecrop,
1906 1907
	.set_fmt	= sh_mobile_ceu_set_fmt,
	.try_fmt	= sh_mobile_ceu_try_fmt,
1908 1909
	.set_ctrl	= sh_mobile_ceu_set_ctrl,
	.get_ctrl	= sh_mobile_ceu_get_ctrl,
1910 1911 1912
	.poll		= sh_mobile_ceu_poll,
	.querycap	= sh_mobile_ceu_querycap,
	.set_bus_param	= sh_mobile_ceu_set_bus_param,
1913
	.init_videobuf2	= sh_mobile_ceu_init_videobuf,
1914 1915
	.controls	= sh_mobile_ceu_controls,
	.num_controls	= ARRAY_SIZE(sh_mobile_ceu_controls),
1916 1917
};

1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941
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;
}

1942
static int __devinit sh_mobile_ceu_probe(struct platform_device *pdev)
1943 1944 1945 1946 1947 1948
{
	struct sh_mobile_ceu_dev *pcdev;
	struct resource *res;
	void __iomem *base;
	unsigned int irq;
	int err = 0;
1949 1950 1951 1952 1953
	struct bus_wait wait = {
		.completion = COMPLETION_INITIALIZER_ONSTACK(wait.completion),
		.notifier.notifier_call = bus_notify,
	};
	struct device *csi2;
1954 1955 1956

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	irq = platform_get_irq(pdev, 0);
1957
	if (!res || (int)irq <= 0) {
1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971
		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);
1972
	init_completion(&pcdev->complete);
1973 1974 1975 1976 1977 1978 1979 1980

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

1981
	base = ioremap_nocache(res->start, resource_size(res));
1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995
	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,
1996
						  resource_size(res),
1997 1998 1999 2000 2001 2002 2003 2004
						  DMA_MEMORY_MAP |
						  DMA_MEMORY_EXCLUSIVE);
		if (!err) {
			dev_err(&pdev->dev, "Unable to declare CEU memory.\n");
			err = -ENXIO;
			goto exit_iounmap;
		}

2005
		pcdev->video_limit = resource_size(res);
2006 2007 2008 2009
	}

	/* request irq */
	err = request_irq(pcdev->irq, sh_mobile_ceu_irq, IRQF_DISABLED,
2010
			  dev_name(&pdev->dev), pcdev);
2011 2012 2013 2014 2015
	if (err) {
		dev_err(&pdev->dev, "Unable to register CEU interrupt.\n");
		goto exit_release_mem;
	}

2016 2017 2018
	pm_suspend_ignore_children(&pdev->dev, true);
	pm_runtime_enable(&pdev->dev);
	pm_runtime_resume(&pdev->dev);
2019

2020
	pcdev->ici.priv = pcdev;
2021
	pcdev->ici.v4l2_dev.dev = &pdev->dev;
2022
	pcdev->ici.nr = pdev->id;
2023 2024
	pcdev->ici.drv_name = dev_name(&pdev->dev);
	pcdev->ici.ops = &sh_mobile_ceu_host_ops;
2025

2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039
	/* CSI2 interfacing */
	csi2 = pcdev->pdata->csi2_dev;
	if (csi2) {
		wait.dev = csi2;

		err = bus_register_notifier(&platform_bus_type, &wait.notifier);
		if (err < 0)
			goto exit_free_clk;

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

2040
		if (!csi2->driver) {
2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064
			complete(&wait.completion);
			/* Either too late, or probing failed */
			bus_unregister_notifier(&platform_bus_type, &wait.notifier);
			err = -ENXIO;
			goto exit_free_clk;
		}

		/*
		 * 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!
		 */

		err = try_module_get(csi2->driver->owner);

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

2065 2066 2067 2068 2069 2070
	pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev);
	if (IS_ERR(pcdev->alloc_ctx)) {
		err = PTR_ERR(pcdev->alloc_ctx);
		goto exit_module_put;
	}

2071 2072
	err = soc_camera_host_register(&pcdev->ici);
	if (err)
2073
		goto exit_free_ctx;
2074 2075 2076

	return 0;

2077 2078
exit_free_ctx:
	vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
2079 2080 2081
exit_module_put:
	if (csi2 && csi2->driver)
		module_put(csi2->driver->owner);
2082 2083
exit_free_clk:
	pm_runtime_disable(&pdev->dev);
2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095
	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;
}

2096
static int __devexit sh_mobile_ceu_remove(struct platform_device *pdev)
2097
{
2098 2099 2100
	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);
2101
	struct device *csi2 = pcdev->pdata->csi2_dev;
2102

2103
	soc_camera_host_unregister(soc_host);
2104
	pm_runtime_disable(&pdev->dev);
2105 2106 2107 2108
	free_irq(pcdev->irq, pcdev);
	if (platform_get_resource(pdev, IORESOURCE_MEM, 1))
		dma_release_declared_memory(&pdev->dev);
	iounmap(pcdev->base);
2109
	vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
2110 2111
	if (csi2 && csi2->driver)
		module_put(csi2->driver->owner);
2112
	kfree(pcdev);
2113

2114 2115 2116
	return 0;
}

2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128
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;
}

2129
static const struct dev_pm_ops sh_mobile_ceu_dev_pm_ops = {
2130 2131 2132 2133
	.runtime_suspend = sh_mobile_ceu_runtime_nop,
	.runtime_resume = sh_mobile_ceu_runtime_nop,
};

2134 2135 2136
static struct platform_driver sh_mobile_ceu_driver = {
	.driver 	= {
		.name	= "sh_mobile_ceu",
2137
		.pm	= &sh_mobile_ceu_dev_pm_ops,
2138 2139
	},
	.probe		= sh_mobile_ceu_probe,
2140
	.remove		= __devexit_p(sh_mobile_ceu_remove),
2141 2142 2143 2144
};

static int __init sh_mobile_ceu_init(void)
{
2145 2146
	/* Whatever return code */
	request_module("sh_mobile_csi2");
2147 2148 2149 2150 2151
	return platform_driver_register(&sh_mobile_ceu_driver);
}

static void __exit sh_mobile_ceu_exit(void)
{
2152
	platform_driver_unregister(&sh_mobile_ceu_driver);
2153 2154 2155 2156 2157 2158 2159 2160
}

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");
2161
MODULE_ALIAS("platform:sh_mobile_ceu");