sh_mobile_ceu_camera.c 54.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*
 * 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>
#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>
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/videobuf2-dma-contig.h>
42 43
#include <media/v4l2-mediabus.h>
#include <media/soc_mediabus.h>
44 45 46

/* register offsets for sh7722 / sh7723 */

47 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
#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 */
80

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

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

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;

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

	struct sh_mobile_ceu_info *pdata;
109

110 111
	u32 cflcr;

112
	enum v4l2_field field;
113
	int sequence;
114

115 116 117 118 119
	unsigned int image_mode:1;
	unsigned int is_16bit:1;
};

struct sh_mobile_ceu_cam {
120 121 122 123 124 125 126 127 128 129 130 131 132 133
	/* 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;
134 135
	const struct soc_mbus_pixelfmt *extra_fmt;
	enum v4l2_mbus_pixelcode code;
136 137
};

138 139 140 141 142
static struct sh_mobile_ceu_buffer *to_ceu_vb(struct vb2_buffer *vb)
{
	return container_of(vb, struct sh_mobile_ceu_buffer, vb);
}

143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
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;
}

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

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

178 179 180 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
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;
}

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

225 226 227
	if (bytes_per_line < 0)
		return bytes_per_line;

228 229 230 231 232
	*num_planes = 1;

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

234
	if (!*count)
235 236 237
		*count = 2;

	if (pcdev->video_limit) {
238 239
		if (PAGE_ALIGN(sizes[0]) * *count > pcdev->video_limit)
			*count = pcdev->video_limit / PAGE_ALIGN(sizes[0]);
240 241
	}

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

	return 0;
}

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


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

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

280 281 282 283 284 285 286 287 288 289
	/*
	 * 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;
	}

290
	if (!pcdev->active)
291
		return ret;
292

293 294 295 296 297 298 299 300 301 302 303 304
	if (V4L2_FIELD_INTERLACED_BT == pcdev->field) {
		top1	= CDBYR;
		top2	= CDBCR;
		bottom1	= CDAYR;
		bottom2	= CDACR;
	} else {
		top1	= CDAYR;
		top2	= CDACR;
		bottom1	= CDBYR;
		bottom2	= CDBCR;
	}

305
	phys_addr_top = vb2_dma_contig_plane_paddr(pcdev->active, 0);
306

307 308
	ceu_write(pcdev, top1, phys_addr_top);
	if (V4L2_FIELD_NONE != pcdev->field) {
309
		phys_addr_bottom = phys_addr_top + icd->user_width;
310
		ceu_write(pcdev, bottom1, phys_addr_bottom);
311
	}
312

313
	switch (icd->current_fmt->host_fmt->fourcc) {
314 315
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
316 317
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
318 319
		phys_addr_top += icd->user_width *
			icd->user_height;
320 321 322 323
		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);
324
		}
325
	}
326 327

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

	return ret;
330 331
}

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

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

343
	buf = to_ceu_vb(vb);
344

345 346
	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));
347 348

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

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

	BUG_ON(NULL == icd->current_fmt);

362
	size = icd->user_height * bytes_per_line;
363

364 365 366 367
	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;
368 369
	}

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

	return 0;
}

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

383 384
	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));
385

386 387
	spin_lock_irqsave(&pcdev->lock, flags);
	list_add_tail(&buf->queue, &pcdev->capture);
388 389

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

401
static void sh_mobile_ceu_videobuf_release(struct vb2_buffer *vb)
402
{
403
	struct soc_camera_device *icd = container_of(vb->vb2_queue, struct soc_camera_device, vb2_vidq);
404
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
405
	struct sh_mobile_ceu_buffer *buf = to_ceu_vb(vb);
406 407 408 409 410 411 412 413 414 415 416
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
	unsigned long flags;

	spin_lock_irqsave(&pcdev->lock, flags);

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

417 418
	/* Doesn't hurt also if the list is empty */
	list_del_init(&buf->queue);
419 420

	spin_unlock_irqrestore(&pcdev->lock, flags);
421
}
422

423 424 425 426 427
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;
428 429
}

430 431 432 433 434 435 436 437
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,
438 439 440 441 442
};

static irqreturn_t sh_mobile_ceu_irq(int irq, void *data)
{
	struct sh_mobile_ceu_dev *pcdev = data;
443 444
	struct vb2_buffer *vb;
	int ret;
445

446
	spin_lock(&pcdev->lock);
447 448

	vb = pcdev->active;
449 450 451 452
	if (!vb)
		/* Stale interrupt from a released buffer */
		goto out;

453
	list_del_init(&to_ceu_vb(vb)->queue);
454 455

	if (!list_empty(&pcdev->capture))
456 457
		pcdev->active = &list_entry(pcdev->capture.next,
					    struct sh_mobile_ceu_buffer, queue)->vb;
458 459 460
	else
		pcdev->active = NULL;

461 462 463 464 465 466 467
	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);
468 469

out:
470
	spin_unlock(&pcdev->lock);
471 472 473 474

	return IRQ_HANDLED;
}

475
/* Called with .video_lock held */
476 477 478 479
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;
480
	int ret;
481 482

	if (pcdev->icd)
483
		return -EBUSY;
484

485
	dev_info(icd->dev.parent,
486 487 488
		 "SuperH Mobile CEU driver attached to camera %d\n",
		 icd->devnum);

489
	pm_runtime_get_sync(ici->v4l2_dev.dev);
490

491 492 493
	ret = sh_mobile_ceu_soft_reset(pcdev);
	if (!ret)
		pcdev->icd = icd;
494

495
	return ret;
496 497
}

498
/* Called with .video_lock held */
499 500 501 502
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;
503
	unsigned long flags;
504 505 506 507 508

	BUG_ON(icd != pcdev->icd);

	/* disable capture, disable interrupts */
	ceu_write(pcdev, CEIER, 0);
509
	sh_mobile_ceu_soft_reset(pcdev);
510 511 512 513

	/* make sure active buffer is canceled */
	spin_lock_irqsave(&pcdev->lock, flags);
	if (pcdev->active) {
514 515
		list_del_init(&to_ceu_vb(pcdev->active)->queue);
		vb2_buffer_done(pcdev->active, VB2_BUF_STATE_ERROR);
516 517 518 519
		pcdev->active = NULL;
	}
	spin_unlock_irqrestore(&pcdev->lock, flags);

520
	pm_runtime_put_sync(ici->v4l2_dev.dev);
521

522
	dev_info(icd->dev.parent,
523 524 525 526 527 528
		 "SuperH Mobile CEU driver detached from camera %d\n",
		 icd->devnum);

	pcdev->icd = NULL;
}

529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559
/*
 * 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 */
560
static void sh_mobile_ceu_set_rect(struct soc_camera_device *icd)
561 562 563 564
{
	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;
565 566
	unsigned int height, width, cdwdr_width, in_width, in_height;
	unsigned int left_offset, top_offset;
567 568
	u32 camor;

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

572 573
	left_offset	= cam->ceu_left;
	top_offset	= cam->ceu_top;
574

575
	/* CEU cropping (CFSZR) is applied _after_ the scaling filter (CFLCR) */
576
	if (pcdev->image_mode) {
577
		in_width = cam->width;
578 579 580 581
		if (!pcdev->is_16bit) {
			in_width *= 2;
			left_offset *= 2;
		}
582 583
		width = icd->user_width;
		cdwdr_width = icd->user_width;
584
	} else {
585
		int bytes_per_line = soc_mbus_bytes_per_line(icd->user_width,
586 587
						icd->current_fmt->host_fmt);
		unsigned int w_factor;
588

589
		width = icd->user_width;
590

591 592 593 594 595 596 597
		switch (icd->current_fmt->host_fmt->packing) {
		case SOC_MBUS_PACKING_2X8_PADHI:
			w_factor = 2;
			break;
		default:
			w_factor = 1;
		}
598

599
		in_width = cam->width * w_factor;
600
		left_offset = left_offset * w_factor;
601

602
		if (bytes_per_line < 0)
603
			cdwdr_width = icd->user_width;
604 605
		else
			cdwdr_width = bytes_per_line;
606 607
	}

608 609
	height = icd->user_height;
	in_height = cam->height;
610
	if (V4L2_FIELD_NONE != pcdev->field) {
611
		height /= 2;
612 613
		in_height /= 2;
		top_offset /= 2;
614 615 616
		cdwdr_width *= 2;
	}

617 618 619 620 621 622
	/* CSI2 special configuration */
	if (pcdev->pdata->csi2_dev) {
		in_width = ((in_width - 2) * 2);
		left_offset *= 2;
	}

623
	/* Set CAMOR, CAPWR, CFSZR, take care of CDWDR */
624
	camor = left_offset | (top_offset << 16);
625 626 627 628 629 630

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

631
	ceu_write(pcdev, CAMOR, camor);
632
	ceu_write(pcdev, CAPWR, (in_height << 16) | in_width);
633
	ceu_write(pcdev, CFSZR, (height << 16) | width);
634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669
	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);
}

670
/* Capture is not running, no interrupts, no locking needed */
671 672 673 674 675
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;
676
	int ret;
677
	unsigned long camera_flags, common_flags, value;
678 679 680
	int yuv_lineskip;
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	u32 capsr = capture_save_reset(pcdev);
681 682 683

	camera_flags = icd->ops->query_bus_param(icd);
	common_flags = soc_camera_bus_param_compatible(camera_flags,
684
						       make_bus_param(pcdev));
685 686 687
	if (!common_flags)
		return -EINVAL;

688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704
	/* 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;
	}

705 706 707 708 709 710
	ret = icd->ops->set_bus_param(icd, common_flags);
	if (ret < 0)
		return ret;

	switch (common_flags & SOCAM_DATAWIDTH_MASK) {
	case SOCAM_DATAWIDTH_8:
711
		pcdev->is_16bit = 0;
712 713
		break;
	case SOCAM_DATAWIDTH_16:
714
		pcdev->is_16bit = 1;
715 716 717 718 719 720 721 722
		break;
	default:
		return -EINVAL;
	}

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

723
	value = 0x00000010; /* data fetch by default */
724
	yuv_lineskip = 0;
725

726
	switch (icd->current_fmt->host_fmt->fourcc) {
727 728 729
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
		yuv_lineskip = 1; /* skip for NV12/21, no skip for NV16/61 */
730 731 732
		/* fall-through */
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
733
		switch (cam->code) {
734
		case V4L2_MBUS_FMT_UYVY8_2X8:
735 736
			value = 0x00000000; /* Cb0, Y0, Cr0, Y1 */
			break;
737
		case V4L2_MBUS_FMT_VYUY8_2X8:
738 739
			value = 0x00000100; /* Cr0, Y0, Cb0, Y1 */
			break;
740
		case V4L2_MBUS_FMT_YUYV8_2X8:
741 742
			value = 0x00000200; /* Y0, Cb0, Y1, Cr0 */
			break;
743
		case V4L2_MBUS_FMT_YVYU8_2X8:
744 745 746 747 748 749 750
			value = 0x00000300; /* Y0, Cr0, Y1, Cb0 */
			break;
		default:
			BUG();
		}
	}

751 752
	if (icd->current_fmt->host_fmt->fourcc == V4L2_PIX_FMT_NV21 ||
	    icd->current_fmt->host_fmt->fourcc == V4L2_PIX_FMT_NV61)
753
		value ^= 0x00000100; /* swap U, V to change from NV1x->NVx1 */
754

755 756
	value |= common_flags & SOCAM_VSYNC_ACTIVE_LOW ? 1 << 1 : 0;
	value |= common_flags & SOCAM_HSYNC_ACTIVE_LOW ? 1 << 0 : 0;
757
	value |= pcdev->is_16bit ? 1 << 12 : 0;
758 759 760 761 762

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

763 764 765
	ceu_write(pcdev, CAMCR, value);

	ceu_write(pcdev, CAPCR, 0x00300000);
766 767 768 769 770 771 772 773 774 775 776 777 778

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

780
	sh_mobile_ceu_set_rect(icd);
781 782
	mdelay(1);

783
	dev_geo(icd->dev.parent, "CFLCR 0x%x\n", pcdev->cflcr);
784
	ceu_write(pcdev, CFLCR, pcdev->cflcr);
785

786 787
	/*
	 * A few words about byte order (observed in Big Endian mode)
788 789 790 791 792 793 794 795
	 *
	 * 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,
796 797
	 * using 7 we swap the data bytes to match the incoming order:
	 * D0, D1, D2, D3, D4, D5, D6, D7
798
	 */
799 800 801 802 803
	value = 0x00000017;
	if (yuv_lineskip)
		value &= ~0x00000010; /* convert 4:2:2 -> 4:2:0 */

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

806
	dev_dbg(icd->dev.parent, "S_FMT successful for %c%c%c%c %ux%u\n",
807 808
		pixfmt & 0xff, (pixfmt >> 8) & 0xff,
		(pixfmt >> 16) & 0xff, (pixfmt >> 24) & 0xff,
809
		icd->user_width, icd->user_height);
810 811 812

	capture_restore(pcdev, capsr);

813 814 815 816
	/* not in bundle mode: skip CBDSR, CDAYR2, CDACR2, CDBYR2, CDBCR2 */
	return 0;
}

817 818
static int sh_mobile_ceu_try_bus_param(struct soc_camera_device *icd,
				       unsigned char buswidth)
819 820 821 822 823 824 825
{
	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,
826
						       make_bus_param(pcdev));
827 828
	if (!common_flags || buswidth > 16 ||
	    (buswidth > 8 && !(common_flags & SOCAM_DATAWIDTH_16)))
829 830 831 832 833
		return -EINVAL;

	return 0;
}

834
static const struct soc_mbus_pixelfmt sh_mobile_ceu_formats[] = {
835
	{
836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858
		.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,
859
	},
860 861
};

862 863 864 865 866 867 868 869 870 871
/* 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);
}

872 873
static int client_g_rect(struct v4l2_subdev *sd, struct v4l2_rect *rect);

874
static int sh_mobile_ceu_get_formats(struct soc_camera_device *icd, unsigned int idx,
875 876
				     struct soc_camera_format_xlate *xlate)
{
877
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
878
	struct device *dev = icd->dev.parent;
879 880
	struct soc_camera_host *ici = to_soc_camera_host(dev);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
881
	int ret, k, n;
882
	int formats = 0;
883
	struct sh_mobile_ceu_cam *cam;
884 885
	enum v4l2_mbus_pixelcode code;
	const struct soc_mbus_pixelfmt *fmt;
886

887 888 889 890 891 892 893
	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) {
894
		dev_err(dev, "Invalid format code #%u: %d\n", idx, code);
895 896 897
		return -EINVAL;
	}

898 899 900 901 902
	if (!pcdev->pdata->csi2_dev) {
		ret = sh_mobile_ceu_try_bus_param(icd, fmt->bits_per_sample);
		if (ret < 0)
			return 0;
	}
903

904
	if (!icd->host_priv) {
905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924
		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;
925 926
			ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video,
							 s_mbus_fmt, &mf);
927 928 929 930 931 932 933 934 935 936 937 938 939
			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);

940 941 942 943
		cam = kzalloc(sizeof(*cam), GFP_KERNEL);
		if (!cam)
			return -ENOMEM;

944 945 946 947 948 949 950 951 952 953
		/* 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;

954 955 956 957 958
		icd->host_priv = cam;
	} else {
		cam = icd->host_priv;
	}

959 960
	/* Beginning of a pass */
	if (!idx)
961
		cam->extra_fmt = NULL;
962

963
	switch (code) {
964 965 966 967
	case V4L2_MBUS_FMT_UYVY8_2X8:
	case V4L2_MBUS_FMT_VYUY8_2X8:
	case V4L2_MBUS_FMT_YUYV8_2X8:
	case V4L2_MBUS_FMT_YVYU8_2X8:
968
		if (cam->extra_fmt)
969
			break;
970 971 972 973 974 975 976 977 978 979

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

982 983 984
		n = ARRAY_SIZE(sh_mobile_ceu_formats);
		formats += n;
		for (k = 0; xlate && k < n; k++) {
985 986
			xlate->host_fmt	= &sh_mobile_ceu_formats[k];
			xlate->code	= code;
987
			xlate++;
988 989
			dev_dbg(dev, "Providing format %s using code %d\n",
				sh_mobile_ceu_formats[k].name, code);
990
		}
991
		break;
992
	default:
993 994 995 996 997 998 999 1000 1001 1002 1003
		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",
1004
			fmt->name);
1005 1006 1007 1008 1009
	}

	return formats;
}

1010 1011 1012 1013 1014 1015
static void sh_mobile_ceu_put_formats(struct soc_camera_device *icd)
{
	kfree(icd->host_priv);
	icd->host_priv = NULL;
}

1016
/* Check if any dimension of r1 is smaller than respective one of r2 */
1017 1018 1019 1020 1021
static bool is_smaller(struct v4l2_rect *r1, struct v4l2_rect *r2)
{
	return r1->width < r2->width || r1->height < r2->height;
}

1022 1023 1024 1025 1026 1027 1028 1029
/* 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;
}

1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
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;
}

1040
/* Get and store current client crop */
1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
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);
1059 1060
	if (!ret)
		*rect = cap.defrect;
1061 1062 1063 1064

	return ret;
}

1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090
/* 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;
}

1091
/*
1092
 * The common for both scaling and cropping iterative approach is:
1093 1094 1095 1096
 * 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
 */
1097
static int client_s_crop(struct soc_camera_device *icd, struct v4l2_crop *crop,
1098
			 struct v4l2_crop *cam_crop)
1099
{
1100
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1101 1102
	struct v4l2_rect *rect = &crop->c, *cam_rect = &cam_crop->c;
	struct device *dev = sd->v4l2_dev->dev;
1103
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1104
	struct v4l2_cropcap cap;
1105
	int ret;
1106
	unsigned int width, height;
1107

1108 1109 1110 1111
	v4l2_subdev_call(sd, video, s_crop, crop);
	ret = client_g_rect(sd, cam_rect);
	if (ret < 0)
		return ret;
1112

1113 1114 1115 1116 1117 1118
	/*
	 * 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 */
1119
		dev_dbg(dev, "Camera S_CROP successful for %dx%d@%d:%d\n",
1120
			rect->width, rect->height, rect->left, rect->top);
1121
		cam->rect = *cam_rect;
1122
		return 0;
1123 1124
	}

1125
	/* Try to fix cropping, that camera hasn't managed to set */
1126
	dev_geo(dev, "Fix camera S_CROP for %dx%d@%d:%d to %dx%d@%d:%d\n",
1127
		cam_rect->width, cam_rect->height,
1128
		cam_rect->left, cam_rect->top,
1129 1130 1131 1132 1133 1134 1135
		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;

1136
	/* Put user requested rectangle within sensor bounds */
1137 1138 1139 1140
	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);
1141 1142 1143 1144 1145

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

1149 1150 1151 1152
	/*
	 * Loop as long as sensor is not covering the requested rectangle and
	 * is still within its bounds
	 */
1153 1154 1155
	while (!ret && (is_smaller(cam_rect, rect) ||
			is_inside(cam_rect, rect)) &&
	       (cap.bounds.width > width || cap.bounds.height > height)) {
1156 1157 1158

		width *= 2;
		height *= 2;
1159

1160 1161
		cam_rect->width = width;
		cam_rect->height = height;
1162

1163 1164 1165 1166 1167 1168 1169
		/*
		 * 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.
1170
		 * Instead we just drop to the left and top bounds.
1171 1172 1173
		 */
		if (cam_rect->left > rect->left)
			cam_rect->left = cap.bounds.left;
1174

1175 1176
		if (cam_rect->left + cam_rect->width < rect->left + rect->width)
			cam_rect->width = rect->left + rect->width -
1177
				cam_rect->left;
1178

1179 1180
		if (cam_rect->top > rect->top)
			cam_rect->top = cap.bounds.top;
1181

1182 1183
		if (cam_rect->top + cam_rect->height < rect->top + rect->height)
			cam_rect->height = rect->top + rect->height -
1184
				cam_rect->top;
1185

1186 1187
		v4l2_subdev_call(sd, video, s_crop, cam_crop);
		ret = client_g_rect(sd, cam_rect);
1188
		dev_geo(dev, "Camera S_CROP %d for %dx%d@%d:%d\n", ret,
1189
			cam_rect->width, cam_rect->height,
1190
			cam_rect->left, cam_rect->top);
1191 1192
	}

1193 1194
	/* S_CROP must not modify the rectangle */
	if (is_smaller(cam_rect, rect) || is_inside(cam_rect, rect)) {
1195 1196 1197 1198
		/*
		 * The camera failed to configure a suitable cropping,
		 * we cannot use the current rectangle, set to max
		 */
1199 1200 1201
		*cam_rect = cap.bounds;
		v4l2_subdev_call(sd, video, s_crop, cam_crop);
		ret = client_g_rect(sd, cam_rect);
1202
		dev_geo(dev, "Camera S_CROP %d for max %dx%d@%d:%d\n", ret,
1203
			cam_rect->width, cam_rect->height,
1204
			cam_rect->left, cam_rect->top);
1205 1206
	}

1207 1208 1209
	if (!ret) {
		cam->rect = *cam_rect;
		update_subrect(cam);
1210 1211
	}

1212
	return ret;
1213 1214
}

1215
/* Iterative s_mbus_fmt, also updates cached client crop on success */
1216 1217
static int client_s_fmt(struct soc_camera_device *icd,
			struct v4l2_mbus_framefmt *mf, bool ceu_can_scale)
1218
{
1219
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1220 1221
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	struct device *dev = icd->dev.parent;
1222
	unsigned int width = mf->width, height = mf->height, tmp_w, tmp_h;
1223 1224 1225 1226
	unsigned int max_width, max_height;
	struct v4l2_cropcap cap;
	int ret;

1227 1228
	ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video,
					 s_mbus_fmt, mf);
1229 1230 1231 1232 1233 1234 1235 1236
	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;

1237 1238 1239 1240 1241 1242 1243 1244 1245 1246
	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 */
1247 1248
	tmp_w = mf->width;
	tmp_h = mf->height;
1249 1250 1251 1252 1253 1254

	/* 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);
1255 1256
		mf->width = tmp_w;
		mf->height = tmp_h;
1257 1258
		ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video,
						 s_mbus_fmt, mf);
1259
		dev_geo(dev, "Camera scaled to %ux%u\n",
1260
			mf->width, mf->height);
1261 1262 1263 1264 1265 1266 1267
		if (ret < 0) {
			/* This shouldn't happen */
			dev_err(dev, "Client failed to set format: %d\n", ret);
			return ret;
		}
	}

1268 1269 1270 1271 1272 1273 1274 1275
update_cache:
	/* Update cache */
	ret = client_g_rect(sd, &cam->rect);
	if (ret < 0)
		return ret;

	update_subrect(cam);

1276 1277 1278 1279
	return 0;
}

/**
1280 1281 1282
 * @width	- on output: user width, mapped back to input
 * @height	- on output: user height, mapped back to input
 * @mf		- in- / output camera output window
1283
 */
1284 1285 1286 1287
static int client_scale(struct soc_camera_device *icd,
			struct v4l2_mbus_framefmt *mf,
			unsigned int *width, unsigned int *height,
			bool ceu_can_scale)
1288 1289 1290
{
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	struct device *dev = icd->dev.parent;
1291
	struct v4l2_mbus_framefmt mf_tmp = *mf;
1292 1293 1294
	unsigned int scale_h, scale_v;
	int ret;

1295 1296 1297 1298
	/*
	 * 5. Apply iterative camera S_FMT for camera user window (also updates
	 *    client crop cache and the imaginary sub-rectangle).
	 */
1299
	ret = client_s_fmt(icd, &mf_tmp, ceu_can_scale);
1300 1301 1302 1303
	if (ret < 0)
		return ret;

	dev_geo(dev, "5: camera scaled to %ux%u\n",
1304
		mf_tmp.width, mf_tmp.height);
1305 1306 1307

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

1308
	/* unneeded - it is already in "mf_tmp" */
1309

1310 1311 1312
	/* 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);
1313

1314 1315 1316
	mf->width	= mf_tmp.width;
	mf->height	= mf_tmp.height;
	mf->colorspace	= mf_tmp.colorspace;
1317 1318

	/*
1319
	 * 8. Calculate new CEU crop - apply camera scales to previously
1320
	 *    updated "effective" crop.
1321
	 */
1322 1323
	*width = scale_down(cam->subrect.width, scale_h);
	*height = scale_down(cam->subrect.height, scale_v);
1324

1325
	dev_geo(dev, "8: new client sub-window %ux%u\n", *width, *height);
1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343

	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
 * Documentation/video4linux/sh_mobile_camera_ceu.txt for a description of
 * 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;
1344
	struct v4l2_rect *cam_rect = &cam_crop.c;
1345 1346
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	struct device *dev = icd->dev.parent;
1347
	struct v4l2_mbus_framefmt mf;
1348
	unsigned int scale_cam_h, scale_cam_v, scale_ceu_h, scale_ceu_v,
1349
		out_width, out_height;
1350
	int interm_width, interm_height;
1351 1352 1353
	u32 capsr, cflcr;
	int ret;

1354 1355
	dev_geo(dev, "S_CROP(%ux%u@%u:%u)\n", rect->width, rect->height,
		rect->left, rect->top);
1356

1357 1358 1359
	/* 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);
1360

1361 1362
	/* 1. - 2. Apply iterative camera S_CROP for new input window. */
	ret = client_s_crop(icd, a, &cam_crop);
1363 1364 1365
	if (ret < 0)
		return ret;

1366
	dev_geo(dev, "1-2: camera cropped to %ux%u@%u:%u\n",
1367 1368 1369 1370 1371
		cam_rect->width, cam_rect->height,
		cam_rect->left, cam_rect->top);

	/* On success cam_crop contains current camera crop */

1372 1373 1374 1375
	/* 3. Retrieve camera output window */
	ret = v4l2_subdev_call(sd, video, g_mbus_fmt, &mf);
	if (ret < 0)
		return ret;
1376

1377 1378
	if (mf.width > 2560 || mf.height > 1920)
		return -EINVAL;
1379

1380 1381 1382
	/* Cache camera output window */
	cam->width	= mf.width;
	cam->height	= mf.height;
1383

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

1388 1389 1390
	/* Calculate intermediate window */
	interm_width	= scale_down(rect->width, scale_cam_h);
	interm_height	= scale_down(rect->height, scale_cam_v);
1391

1392 1393 1394 1395 1396 1397 1398
	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;
	}
1399 1400

	/*
1401 1402
	 * 5. Calculate CEU scales from camera scales from results of (5) and
	 *    the user window
1403
	 */
1404 1405
	scale_ceu_h	= calc_scale(interm_width, &out_width);
	scale_ceu_v	= calc_scale(interm_height, &out_height);
1406

1407 1408 1409
	dev_geo(dev, "5: CEU scales %u:%u\n", scale_ceu_h, scale_ceu_v);

	/* Apply CEU scales. */
1410 1411 1412 1413 1414 1415
	cflcr = scale_ceu_h | (scale_ceu_v << 16);
	if (cflcr != pcdev->cflcr) {
		pcdev->cflcr = cflcr;
		ceu_write(pcdev, CFLCR, cflcr);
	}

1416 1417
	icd->user_width	 = out_width;
	icd->user_height = out_height;
1418 1419
	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;
1420 1421 1422 1423 1424 1425 1426 1427 1428 1429

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

1430
	/* Restore capture. The CE bit can be cleared by the hardware */
1431 1432 1433 1434 1435 1436
	if (pcdev->active)
		capsr |= 1;
	capture_restore(pcdev, capsr);

	/* Even if only camera cropping succeeded */
	return ret;
1437 1438
}

1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498
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);
}

1499
/* Similar to set_crop multistage iterative algorithm */
1500
static int sh_mobile_ceu_set_fmt(struct soc_camera_device *icd,
1501
				 struct v4l2_format *f)
1502
{
1503
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
1504
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
1505 1506
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	struct v4l2_pix_format *pix = &f->fmt.pix;
1507
	struct v4l2_mbus_framefmt mf;
1508
	struct device *dev = icd->dev.parent;
1509
	__u32 pixfmt = pix->pixelformat;
1510
	const struct soc_camera_format_xlate *xlate;
1511 1512
	/* Keep Compiler Happy */
	unsigned int ceu_sub_width = 0, ceu_sub_height = 0;
1513 1514
	u16 scale_v, scale_h;
	int ret;
1515 1516
	bool image_mode;
	enum v4l2_field field;
1517

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

1520 1521 1522 1523
	switch (pix->field) {
	default:
		pix->field = V4L2_FIELD_NONE;
		/* fall-through */
1524 1525
	case V4L2_FIELD_INTERLACED_TB:
	case V4L2_FIELD_INTERLACED_BT:
1526
	case V4L2_FIELD_NONE:
1527 1528 1529 1530
		field = pix->field;
		break;
	case V4L2_FIELD_INTERLACED:
		field = V4L2_FIELD_INTERLACED_TB;
1531 1532
		break;
	}
1533

1534 1535
	xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
	if (!xlate) {
1536
		dev_warn(dev, "Format %x not found\n", pixfmt);
1537
		return -EINVAL;
1538 1539
	}

1540 1541
	/* 1.-4. Calculate client output geometry */
	calculate_client_output(icd, &f->fmt.pix, &mf);
1542 1543 1544
	mf.field	= pix->field;
	mf.colorspace	= pix->colorspace;
	mf.code		= xlate->code;
1545

1546 1547 1548 1549 1550
	switch (pixfmt) {
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
1551
		image_mode = true;
1552 1553
		break;
	default:
1554
		image_mode = false;
1555
	}
1556

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

1559
	/* 5. - 9. */
1560
	ret = client_scale(icd, &mf, &ceu_sub_width, &ceu_sub_height,
1561
			   image_mode && V4L2_FIELD_NONE == field);
1562

1563
	dev_geo(dev, "5-9: client scale return %d\n", ret);
1564 1565 1566

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

1567 1568
	dev_geo(dev, "fmt %ux%u, requested %ux%u\n",
		mf.width, mf.height, pix->width, pix->height);
1569 1570 1571
	if (ret < 0)
		return ret;

1572 1573 1574
	if (mf.code != xlate->code)
		return -EINVAL;

1575 1576 1577 1578
	/* 9. Prepare CEU crop */
	cam->width = mf.width;
	cam->height = mf.height;

1579
	/* 10. Use CEU scaling to scale to the requested user window. */
1580 1581

	/* We cannot scale up */
1582 1583
	if (pix->width > ceu_sub_width)
		ceu_sub_width = pix->width;
1584

1585 1586
	if (pix->height > ceu_sub_height)
		ceu_sub_height = pix->height;
1587

1588 1589 1590 1591
	pix->colorspace = mf.colorspace;

	if (image_mode) {
		/* Scale pix->{width x height} down to width x height */
1592 1593
		scale_h		= calc_scale(ceu_sub_width, &pix->width);
		scale_v		= calc_scale(ceu_sub_height, &pix->height);
1594
	} else {
1595 1596 1597 1598
		pix->width	= ceu_sub_width;
		pix->height	= ceu_sub_height;
		scale_h		= 0;
		scale_v		= 0;
1599
	}
1600

1601 1602 1603 1604 1605 1606 1607
	pcdev->cflcr = scale_h | (scale_v << 16);

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

1608
	dev_geo(dev, "10: W: %u : 0x%x = %u, H: %u : 0x%x = %u\n",
1609 1610
		ceu_sub_width, scale_h, pix->width,
		ceu_sub_height, scale_v, pix->height);
1611

1612 1613
	cam->code		= xlate->code;
	icd->current_fmt	= xlate;
1614

1615
	pcdev->field = field;
1616
	pcdev->image_mode = image_mode;
1617 1618

	return 0;
1619 1620
}

1621 1622
static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd,
				 struct v4l2_format *f)
1623
{
1624
	const struct soc_camera_format_xlate *xlate;
1625
	struct v4l2_pix_format *pix = &f->fmt.pix;
1626
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1627
	struct v4l2_mbus_framefmt mf;
1628
	__u32 pixfmt = pix->pixelformat;
1629
	int width, height;
1630
	int ret;
1631

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

1635 1636
	xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
	if (!xlate) {
1637
		dev_warn(icd->dev.parent, "Format %x not found\n", pixfmt);
1638
		return -EINVAL;
1639
	}
1640

1641 1642
	/* FIXME: calculate using depth and bus width */

1643 1644
	v4l_bound_align_image(&pix->width, 2, 2560, 1,
			      &pix->height, 4, 1920, 2, 0);
1645

1646 1647 1648
	width = pix->width;
	height = pix->height;

1649
	pix->bytesperline = soc_mbus_bytes_per_line(width, xlate->host_fmt);
1650
	if ((int)pix->bytesperline < 0)
1651 1652
		return pix->bytesperline;
	pix->sizeimage = height * pix->bytesperline;
1653

1654
	/* limit to sensor capabilities */
1655 1656 1657 1658 1659 1660
	mf.width	= pix->width;
	mf.height	= pix->height;
	mf.field	= pix->field;
	mf.code		= xlate->code;
	mf.colorspace	= pix->colorspace;

1661
	ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video, try_mbus_fmt, &mf);
1662 1663 1664
	if (ret < 0)
		return ret;

1665 1666 1667 1668 1669
	pix->width	= mf.width;
	pix->height	= mf.height;
	pix->field	= mf.field;
	pix->colorspace	= mf.colorspace;

1670 1671 1672 1673 1674 1675 1676 1677
	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) {
1678 1679 1680 1681 1682 1683 1684
			/*
			 * 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;
1685 1686
			ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video,
							 try_mbus_fmt, &mf);
1687 1688
			if (ret < 0) {
				/* Shouldn't actually happen... */
1689
				dev_err(icd->dev.parent,
1690 1691
					"FIXME: client try_fmt() = %d\n", ret);
				return ret;
1692 1693
			}
		}
1694 1695
		/* We will scale exactly */
		if (mf.width > width)
1696
			pix->width = width;
1697
		if (mf.height > height)
1698
			pix->height = height;
1699 1700
	}

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

1704
	return ret;
1705 1706 1707 1708
}

static unsigned int sh_mobile_ceu_poll(struct file *file, poll_table *pt)
{
1709
	struct soc_camera_device *icd = file->private_data;
1710

1711
	return vb2_poll(&icd->vb2_vidq, file, pt);
1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722
}

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;
}

1723 1724
static int sh_mobile_ceu_init_videobuf(struct vb2_queue *q,
				       struct soc_camera_device *icd)
1725
{
1726 1727 1728 1729 1730 1731 1732 1733
	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);
1734 1735
}

1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759
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:
1760
		switch (icd->current_fmt->host_fmt->fourcc) {
1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784
		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,
	},
};

1785 1786 1787 1788
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,
1789
	.get_formats	= sh_mobile_ceu_get_formats,
1790
	.put_formats	= sh_mobile_ceu_put_formats,
1791
	.get_crop	= sh_mobile_ceu_get_crop,
1792
	.set_crop	= sh_mobile_ceu_set_crop,
1793 1794
	.set_fmt	= sh_mobile_ceu_set_fmt,
	.try_fmt	= sh_mobile_ceu_try_fmt,
1795 1796
	.set_ctrl	= sh_mobile_ceu_set_ctrl,
	.get_ctrl	= sh_mobile_ceu_get_ctrl,
1797 1798 1799
	.poll		= sh_mobile_ceu_poll,
	.querycap	= sh_mobile_ceu_querycap,
	.set_bus_param	= sh_mobile_ceu_set_bus_param,
1800
	.init_videobuf2	= sh_mobile_ceu_init_videobuf,
1801 1802
	.controls	= sh_mobile_ceu_controls,
	.num_controls	= ARRAY_SIZE(sh_mobile_ceu_controls),
1803 1804
};

1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828
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;
}

1829
static int __devinit sh_mobile_ceu_probe(struct platform_device *pdev)
1830 1831 1832 1833 1834 1835
{
	struct sh_mobile_ceu_dev *pcdev;
	struct resource *res;
	void __iomem *base;
	unsigned int irq;
	int err = 0;
1836 1837 1838 1839 1840
	struct bus_wait wait = {
		.completion = COMPLETION_INITIALIZER_ONSTACK(wait.completion),
		.notifier.notifier_call = bus_notify,
	};
	struct device *csi2;
1841 1842 1843

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	irq = platform_get_irq(pdev, 0);
1844
	if (!res || (int)irq <= 0) {
1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866
		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);

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

1867
	base = ioremap_nocache(res->start, resource_size(res));
1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881
	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,
1882
						  resource_size(res),
1883 1884 1885 1886 1887 1888 1889 1890
						  DMA_MEMORY_MAP |
						  DMA_MEMORY_EXCLUSIVE);
		if (!err) {
			dev_err(&pdev->dev, "Unable to declare CEU memory.\n");
			err = -ENXIO;
			goto exit_iounmap;
		}

1891
		pcdev->video_limit = resource_size(res);
1892 1893 1894 1895
	}

	/* request irq */
	err = request_irq(pcdev->irq, sh_mobile_ceu_irq, IRQF_DISABLED,
1896
			  dev_name(&pdev->dev), pcdev);
1897 1898 1899 1900 1901
	if (err) {
		dev_err(&pdev->dev, "Unable to register CEU interrupt.\n");
		goto exit_release_mem;
	}

1902 1903 1904
	pm_suspend_ignore_children(&pdev->dev, true);
	pm_runtime_enable(&pdev->dev);
	pm_runtime_resume(&pdev->dev);
1905

1906
	pcdev->ici.priv = pcdev;
1907
	pcdev->ici.v4l2_dev.dev = &pdev->dev;
1908
	pcdev->ici.nr = pdev->id;
1909 1910
	pcdev->ici.drv_name = dev_name(&pdev->dev);
	pcdev->ici.ops = &sh_mobile_ceu_host_ops;
1911

1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925
	/* 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.
		 */

1926
		if (!csi2->driver) {
1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950
			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;
		}
	}

1951 1952 1953 1954 1955 1956
	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;
	}

1957 1958
	err = soc_camera_host_register(&pcdev->ici);
	if (err)
1959
		goto exit_free_ctx;
1960 1961 1962

	return 0;

1963 1964
exit_free_ctx:
	vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
1965 1966 1967
exit_module_put:
	if (csi2 && csi2->driver)
		module_put(csi2->driver->owner);
1968 1969
exit_free_clk:
	pm_runtime_disable(&pdev->dev);
1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981
	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;
}

1982
static int __devexit sh_mobile_ceu_remove(struct platform_device *pdev)
1983
{
1984 1985 1986
	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);
1987
	struct device *csi2 = pcdev->pdata->csi2_dev;
1988

1989
	soc_camera_host_unregister(soc_host);
1990
	pm_runtime_disable(&pdev->dev);
1991 1992 1993 1994
	free_irq(pcdev->irq, pcdev);
	if (platform_get_resource(pdev, IORESOURCE_MEM, 1))
		dma_release_declared_memory(&pdev->dev);
	iounmap(pcdev->base);
1995
	vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
1996 1997
	if (csi2 && csi2->driver)
		module_put(csi2->driver->owner);
1998
	kfree(pcdev);
1999

2000 2001 2002
	return 0;
}

2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014
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;
}

2015
static const struct dev_pm_ops sh_mobile_ceu_dev_pm_ops = {
2016 2017 2018 2019
	.runtime_suspend = sh_mobile_ceu_runtime_nop,
	.runtime_resume = sh_mobile_ceu_runtime_nop,
};

2020 2021 2022
static struct platform_driver sh_mobile_ceu_driver = {
	.driver 	= {
		.name	= "sh_mobile_ceu",
2023
		.pm	= &sh_mobile_ceu_dev_pm_ops,
2024 2025
	},
	.probe		= sh_mobile_ceu_probe,
2026
	.remove		= __devexit_p(sh_mobile_ceu_remove),
2027 2028 2029 2030
};

static int __init sh_mobile_ceu_init(void)
{
2031 2032
	/* Whatever return code */
	request_module("sh_mobile_csi2");
2033 2034 2035 2036 2037
	return platform_driver_register(&sh_mobile_ceu_driver);
}

static void __exit sh_mobile_ceu_exit(void)
{
2038
	platform_driver_unregister(&sh_mobile_ceu_driver);
2039 2040 2041 2042 2043 2044 2045 2046
}

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