sh_mobile_ceu_camera.c 55.4 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 438 439 440 441 442 443 444 445 446 447 448 449
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;
	unsigned long flags;

	spin_lock_irqsave(&pcdev->lock, flags);

	pcdev->active = NULL;

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

	spin_unlock_irqrestore(&pcdev->lock, flags);

	return sh_mobile_ceu_soft_reset(pcdev);
}

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

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

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

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

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

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

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

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

	return IRQ_HANDLED;
}

496
/* Called with .video_lock held */
497 498 499 500
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;
501
	int ret;
502 503

	if (pcdev->icd)
504
		return -EBUSY;
505

506
	dev_info(icd->dev.parent,
507 508 509
		 "SuperH Mobile CEU driver attached to camera %d\n",
		 icd->devnum);

510
	pm_runtime_get_sync(ici->v4l2_dev.dev);
511

512 513 514
	ret = sh_mobile_ceu_soft_reset(pcdev);
	if (!ret)
		pcdev->icd = icd;
515

516
	return ret;
517 518
}

519
/* Called with .video_lock held */
520 521 522 523
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;
524
	unsigned long flags;
525 526 527 528 529

	BUG_ON(icd != pcdev->icd);

	/* disable capture, disable interrupts */
	ceu_write(pcdev, CEIER, 0);
530
	sh_mobile_ceu_soft_reset(pcdev);
531 532 533 534

	/* make sure active buffer is canceled */
	spin_lock_irqsave(&pcdev->lock, flags);
	if (pcdev->active) {
535 536
		list_del_init(&to_ceu_vb(pcdev->active)->queue);
		vb2_buffer_done(pcdev->active, VB2_BUF_STATE_ERROR);
537 538 539 540
		pcdev->active = NULL;
	}
	spin_unlock_irqrestore(&pcdev->lock, flags);

541
	pm_runtime_put_sync(ici->v4l2_dev.dev);
542

543
	dev_info(icd->dev.parent,
544 545 546 547 548 549
		 "SuperH Mobile CEU driver detached from camera %d\n",
		 icd->devnum);

	pcdev->icd = NULL;
}

550 551 552 553 554 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
/*
 * 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 */
581
static void sh_mobile_ceu_set_rect(struct soc_camera_device *icd)
582 583 584 585
{
	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;
586 587
	unsigned int height, width, cdwdr_width, in_width, in_height;
	unsigned int left_offset, top_offset;
588 589
	u32 camor;

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

593 594
	left_offset	= cam->ceu_left;
	top_offset	= cam->ceu_top;
595

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

610
		width = icd->user_width;
611

612 613 614 615 616 617 618
		switch (icd->current_fmt->host_fmt->packing) {
		case SOC_MBUS_PACKING_2X8_PADHI:
			w_factor = 2;
			break;
		default:
			w_factor = 1;
		}
619

620
		in_width = cam->width * w_factor;
621
		left_offset = left_offset * w_factor;
622

623
		if (bytes_per_line < 0)
624
			cdwdr_width = icd->user_width;
625 626
		else
			cdwdr_width = bytes_per_line;
627 628
	}

629 630
	height = icd->user_height;
	in_height = cam->height;
631
	if (V4L2_FIELD_NONE != pcdev->field) {
632
		height /= 2;
633 634
		in_height /= 2;
		top_offset /= 2;
635 636 637
		cdwdr_width *= 2;
	}

638 639 640 641 642 643
	/* CSI2 special configuration */
	if (pcdev->pdata->csi2_dev) {
		in_width = ((in_width - 2) * 2);
		left_offset *= 2;
	}

644
	/* Set CAMOR, CAPWR, CFSZR, take care of CDWDR */
645
	camor = left_offset | (top_offset << 16);
646 647 648 649 650 651

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

652
	ceu_write(pcdev, CAMOR, camor);
653
	ceu_write(pcdev, CAPWR, (in_height << 16) | in_width);
654
	ceu_write(pcdev, CFSZR, (height << 16) | width);
655 656 657 658 659 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
	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);
}

691
/* Capture is not running, no interrupts, no locking needed */
692 693 694 695 696
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;
697
	int ret;
698
	unsigned long camera_flags, common_flags, value;
699 700 701
	int yuv_lineskip;
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	u32 capsr = capture_save_reset(pcdev);
702 703 704

	camera_flags = icd->ops->query_bus_param(icd);
	common_flags = soc_camera_bus_param_compatible(camera_flags,
705
						       make_bus_param(pcdev));
706 707 708
	if (!common_flags)
		return -EINVAL;

709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
	/* 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;
	}

726 727 728 729 730 731
	ret = icd->ops->set_bus_param(icd, common_flags);
	if (ret < 0)
		return ret;

	switch (common_flags & SOCAM_DATAWIDTH_MASK) {
	case SOCAM_DATAWIDTH_8:
732
		pcdev->is_16bit = 0;
733 734
		break;
	case SOCAM_DATAWIDTH_16:
735
		pcdev->is_16bit = 1;
736 737 738 739 740 741 742 743
		break;
	default:
		return -EINVAL;
	}

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

744
	value = 0x00000010; /* data fetch by default */
745
	yuv_lineskip = 0;
746

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

772 773
	if (icd->current_fmt->host_fmt->fourcc == V4L2_PIX_FMT_NV21 ||
	    icd->current_fmt->host_fmt->fourcc == V4L2_PIX_FMT_NV61)
774
		value ^= 0x00000100; /* swap U, V to change from NV1x->NVx1 */
775

776 777
	value |= common_flags & SOCAM_VSYNC_ACTIVE_LOW ? 1 << 1 : 0;
	value |= common_flags & SOCAM_HSYNC_ACTIVE_LOW ? 1 << 0 : 0;
778
	value |= pcdev->is_16bit ? 1 << 12 : 0;
779 780 781 782 783

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

784 785 786
	ceu_write(pcdev, CAMCR, value);

	ceu_write(pcdev, CAPCR, 0x00300000);
787 788 789 790 791 792 793 794 795 796 797 798 799

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

801
	sh_mobile_ceu_set_rect(icd);
802 803
	mdelay(1);

804
	dev_geo(icd->dev.parent, "CFLCR 0x%x\n", pcdev->cflcr);
805
	ceu_write(pcdev, CFLCR, pcdev->cflcr);
806

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

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

827
	dev_dbg(icd->dev.parent, "S_FMT successful for %c%c%c%c %ux%u\n",
828 829
		pixfmt & 0xff, (pixfmt >> 8) & 0xff,
		(pixfmt >> 16) & 0xff, (pixfmt >> 24) & 0xff,
830
		icd->user_width, icd->user_height);
831 832 833

	capture_restore(pcdev, capsr);

834 835 836 837
	/* not in bundle mode: skip CBDSR, CDAYR2, CDACR2, CDBYR2, CDBCR2 */
	return 0;
}

838 839
static int sh_mobile_ceu_try_bus_param(struct soc_camera_device *icd,
				       unsigned char buswidth)
840 841 842 843 844 845 846
{
	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,
847
						       make_bus_param(pcdev));
848 849
	if (!common_flags || buswidth > 16 ||
	    (buswidth > 8 && !(common_flags & SOCAM_DATAWIDTH_16)))
850 851 852 853 854
		return -EINVAL;

	return 0;
}

855
static const struct soc_mbus_pixelfmt sh_mobile_ceu_formats[] = {
856
	{
857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879
		.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,
880
	},
881 882
};

883 884 885 886 887 888 889 890 891 892
/* 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);
}

893 894
static int client_g_rect(struct v4l2_subdev *sd, struct v4l2_rect *rect);

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

908 909 910 911 912 913 914
	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) {
915
		dev_err(dev, "Invalid format code #%u: %d\n", idx, code);
916 917 918
		return -EINVAL;
	}

919 920 921 922 923
	if (!pcdev->pdata->csi2_dev) {
		ret = sh_mobile_ceu_try_bus_param(icd, fmt->bits_per_sample);
		if (ret < 0)
			return 0;
	}
924

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

961 962 963 964
		cam = kzalloc(sizeof(*cam), GFP_KERNEL);
		if (!cam)
			return -ENOMEM;

965 966 967 968 969 970 971 972 973 974
		/* 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;

975 976 977 978 979
		icd->host_priv = cam;
	} else {
		cam = icd->host_priv;
	}

980 981
	/* Beginning of a pass */
	if (!idx)
982
		cam->extra_fmt = NULL;
983

984
	switch (code) {
985 986 987 988
	case V4L2_MBUS_FMT_UYVY8_2X8:
	case V4L2_MBUS_FMT_VYUY8_2X8:
	case V4L2_MBUS_FMT_YUYV8_2X8:
	case V4L2_MBUS_FMT_YVYU8_2X8:
989
		if (cam->extra_fmt)
990
			break;
991 992 993 994 995 996 997 998 999 1000

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

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

	return formats;
}

1031 1032 1033 1034 1035 1036
static void sh_mobile_ceu_put_formats(struct soc_camera_device *icd)
{
	kfree(icd->host_priv);
	icd->host_priv = NULL;
}

1037
/* Check if any dimension of r1 is smaller than respective one of r2 */
1038 1039 1040 1041 1042
static bool is_smaller(struct v4l2_rect *r1, struct v4l2_rect *r2)
{
	return r1->width < r2->width || r1->height < r2->height;
}

1043 1044 1045 1046 1047 1048 1049 1050
/* 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;
}

1051 1052 1053 1054 1055 1056 1057 1058 1059 1060
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;
}

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

	return ret;
}

1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111
/* 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;
}

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

1129 1130 1131 1132
	v4l2_subdev_call(sd, video, s_crop, crop);
	ret = client_g_rect(sd, cam_rect);
	if (ret < 0)
		return ret;
1133

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

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

1157
	/* Put user requested rectangle within sensor bounds */
1158 1159 1160 1161
	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);
1162 1163 1164 1165 1166

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

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

		width *= 2;
		height *= 2;
1180

1181 1182
		cam_rect->width = width;
		cam_rect->height = height;
1183

1184 1185 1186 1187 1188 1189 1190
		/*
		 * 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.
1191
		 * Instead we just drop to the left and top bounds.
1192 1193 1194
		 */
		if (cam_rect->left > rect->left)
			cam_rect->left = cap.bounds.left;
1195

1196 1197
		if (cam_rect->left + cam_rect->width < rect->left + rect->width)
			cam_rect->width = rect->left + rect->width -
1198
				cam_rect->left;
1199

1200 1201
		if (cam_rect->top > rect->top)
			cam_rect->top = cap.bounds.top;
1202

1203 1204
		if (cam_rect->top + cam_rect->height < rect->top + rect->height)
			cam_rect->height = rect->top + rect->height -
1205
				cam_rect->top;
1206

1207 1208
		v4l2_subdev_call(sd, video, s_crop, cam_crop);
		ret = client_g_rect(sd, cam_rect);
1209
		dev_geo(dev, "Camera S_CROP %d for %dx%d@%d:%d\n", ret,
1210
			cam_rect->width, cam_rect->height,
1211
			cam_rect->left, cam_rect->top);
1212 1213
	}

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

1228 1229 1230
	if (!ret) {
		cam->rect = *cam_rect;
		update_subrect(cam);
1231 1232
	}

1233
	return ret;
1234 1235
}

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

1248
	ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
1249
					 s_mbus_fmt, mf);
1250 1251 1252 1253 1254 1255 1256 1257
	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;

1258 1259 1260 1261 1262 1263 1264 1265 1266 1267
	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 */
1268 1269
	tmp_w = mf->width;
	tmp_h = mf->height;
1270 1271 1272 1273 1274 1275

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

1289 1290 1291 1292 1293 1294 1295 1296
update_cache:
	/* Update cache */
	ret = client_g_rect(sd, &cam->rect);
	if (ret < 0)
		return ret;

	update_subrect(cam);

1297 1298 1299 1300
	return 0;
}

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

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

	dev_geo(dev, "5: camera scaled to %ux%u\n",
1325
		mf_tmp.width, mf_tmp.height);
1326 1327 1328

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

1329
	/* unneeded - it is already in "mf_tmp" */
1330

1331 1332 1333
	/* 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);
1334

1335 1336 1337
	mf->width	= mf_tmp.width;
	mf->height	= mf_tmp.height;
	mf->colorspace	= mf_tmp.colorspace;
1338 1339

	/*
1340
	 * 8. Calculate new CEU crop - apply camera scales to previously
1341
	 *    updated "effective" crop.
1342
	 */
1343 1344
	*width = scale_down(cam->subrect.width, scale_h);
	*height = scale_down(cam->subrect.height, scale_v);
1345

1346
	dev_geo(dev, "8: new client sub-window %ux%u\n", *width, *height);
1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364

	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;
1365
	struct v4l2_rect *cam_rect = &cam_crop.c;
1366 1367
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	struct device *dev = icd->dev.parent;
1368
	struct v4l2_mbus_framefmt mf;
1369
	unsigned int scale_cam_h, scale_cam_v, scale_ceu_h, scale_ceu_v,
1370
		out_width, out_height;
1371
	int interm_width, interm_height;
1372 1373 1374
	u32 capsr, cflcr;
	int ret;

1375 1376
	dev_geo(dev, "S_CROP(%ux%u@%u:%u)\n", rect->width, rect->height,
		rect->left, rect->top);
1377

1378 1379 1380
	/* 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);
1381

1382 1383
	/* 1. - 2. Apply iterative camera S_CROP for new input window. */
	ret = client_s_crop(icd, a, &cam_crop);
1384 1385 1386
	if (ret < 0)
		return ret;

1387
	dev_geo(dev, "1-2: camera cropped to %ux%u@%u:%u\n",
1388 1389 1390 1391 1392
		cam_rect->width, cam_rect->height,
		cam_rect->left, cam_rect->top);

	/* On success cam_crop contains current camera crop */

1393 1394 1395 1396
	/* 3. Retrieve camera output window */
	ret = v4l2_subdev_call(sd, video, g_mbus_fmt, &mf);
	if (ret < 0)
		return ret;
1397

1398 1399
	if (mf.width > 2560 || mf.height > 1920)
		return -EINVAL;
1400

1401 1402 1403
	/* Cache camera output window */
	cam->width	= mf.width;
	cam->height	= mf.height;
1404

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

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

1413 1414 1415 1416 1417 1418 1419
	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;
	}
1420 1421

	/*
1422 1423
	 * 5. Calculate CEU scales from camera scales from results of (5) and
	 *    the user window
1424
	 */
1425 1426
	scale_ceu_h	= calc_scale(interm_width, &out_width);
	scale_ceu_v	= calc_scale(interm_height, &out_height);
1427

1428 1429 1430
	dev_geo(dev, "5: CEU scales %u:%u\n", scale_ceu_h, scale_ceu_v);

	/* Apply CEU scales. */
1431 1432 1433 1434 1435 1436
	cflcr = scale_ceu_h | (scale_ceu_v << 16);
	if (cflcr != pcdev->cflcr) {
		pcdev->cflcr = cflcr;
		ceu_write(pcdev, CFLCR, cflcr);
	}

1437 1438
	icd->user_width	 = out_width;
	icd->user_height = out_height;
1439 1440
	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;
1441 1442 1443 1444 1445 1446 1447 1448 1449 1450

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

1451
	/* Restore capture. The CE bit can be cleared by the hardware */
1452 1453 1454 1455 1456 1457
	if (pcdev->active)
		capsr |= 1;
	capture_restore(pcdev, capsr);

	/* Even if only camera cropping succeeded */
	return ret;
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 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519
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);
}

1520
/* Similar to set_crop multistage iterative algorithm */
1521
static int sh_mobile_ceu_set_fmt(struct soc_camera_device *icd,
1522
				 struct v4l2_format *f)
1523
{
1524
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
1525
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
1526 1527
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	struct v4l2_pix_format *pix = &f->fmt.pix;
1528
	struct v4l2_mbus_framefmt mf;
1529
	struct device *dev = icd->dev.parent;
1530
	__u32 pixfmt = pix->pixelformat;
1531
	const struct soc_camera_format_xlate *xlate;
1532 1533
	/* Keep Compiler Happy */
	unsigned int ceu_sub_width = 0, ceu_sub_height = 0;
1534 1535
	u16 scale_v, scale_h;
	int ret;
1536 1537
	bool image_mode;
	enum v4l2_field field;
1538

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

1541 1542 1543 1544
	switch (pix->field) {
	default:
		pix->field = V4L2_FIELD_NONE;
		/* fall-through */
1545 1546
	case V4L2_FIELD_INTERLACED_TB:
	case V4L2_FIELD_INTERLACED_BT:
1547
	case V4L2_FIELD_NONE:
1548 1549 1550 1551
		field = pix->field;
		break;
	case V4L2_FIELD_INTERLACED:
		field = V4L2_FIELD_INTERLACED_TB;
1552 1553
		break;
	}
1554

1555 1556
	xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
	if (!xlate) {
1557
		dev_warn(dev, "Format %x not found\n", pixfmt);
1558
		return -EINVAL;
1559 1560
	}

1561 1562
	/* 1.-4. Calculate client output geometry */
	calculate_client_output(icd, &f->fmt.pix, &mf);
1563 1564 1565
	mf.field	= pix->field;
	mf.colorspace	= pix->colorspace;
	mf.code		= xlate->code;
1566

1567 1568 1569 1570 1571
	switch (pixfmt) {
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
1572
		image_mode = true;
1573 1574
		break;
	default:
1575
		image_mode = false;
1576
	}
1577

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

1580
	/* 5. - 9. */
1581
	ret = client_scale(icd, &mf, &ceu_sub_width, &ceu_sub_height,
1582
			   image_mode && V4L2_FIELD_NONE == field);
1583

1584
	dev_geo(dev, "5-9: client scale return %d\n", ret);
1585 1586 1587

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

1588 1589
	dev_geo(dev, "fmt %ux%u, requested %ux%u\n",
		mf.width, mf.height, pix->width, pix->height);
1590 1591 1592
	if (ret < 0)
		return ret;

1593 1594 1595
	if (mf.code != xlate->code)
		return -EINVAL;

1596 1597 1598 1599
	/* 9. Prepare CEU crop */
	cam->width = mf.width;
	cam->height = mf.height;

1600
	/* 10. Use CEU scaling to scale to the requested user window. */
1601 1602

	/* We cannot scale up */
1603 1604
	if (pix->width > ceu_sub_width)
		ceu_sub_width = pix->width;
1605

1606 1607
	if (pix->height > ceu_sub_height)
		ceu_sub_height = pix->height;
1608

1609 1610 1611 1612
	pix->colorspace = mf.colorspace;

	if (image_mode) {
		/* Scale pix->{width x height} down to width x height */
1613 1614
		scale_h		= calc_scale(ceu_sub_width, &pix->width);
		scale_v		= calc_scale(ceu_sub_height, &pix->height);
1615
	} else {
1616 1617 1618 1619
		pix->width	= ceu_sub_width;
		pix->height	= ceu_sub_height;
		scale_h		= 0;
		scale_v		= 0;
1620
	}
1621

1622 1623 1624 1625 1626 1627 1628
	pcdev->cflcr = scale_h | (scale_v << 16);

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

1629
	dev_geo(dev, "10: W: %u : 0x%x = %u, H: %u : 0x%x = %u\n",
1630 1631
		ceu_sub_width, scale_h, pix->width,
		ceu_sub_height, scale_v, pix->height);
1632

1633 1634
	cam->code		= xlate->code;
	icd->current_fmt	= xlate;
1635

1636
	pcdev->field = field;
1637
	pcdev->image_mode = image_mode;
1638 1639

	return 0;
1640 1641
}

1642 1643
static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd,
				 struct v4l2_format *f)
1644
{
1645
	const struct soc_camera_format_xlate *xlate;
1646
	struct v4l2_pix_format *pix = &f->fmt.pix;
1647
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1648
	struct v4l2_mbus_framefmt mf;
1649
	__u32 pixfmt = pix->pixelformat;
1650
	int width, height;
1651
	int ret;
1652

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

1656 1657
	xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
	if (!xlate) {
1658
		dev_warn(icd->dev.parent, "Format %x not found\n", pixfmt);
1659
		return -EINVAL;
1660
	}
1661

1662 1663
	/* FIXME: calculate using depth and bus width */

1664 1665
	v4l_bound_align_image(&pix->width, 2, 2560, 1,
			      &pix->height, 4, 1920, 2, 0);
1666

1667 1668 1669
	width = pix->width;
	height = pix->height;

1670
	pix->bytesperline = soc_mbus_bytes_per_line(width, xlate->host_fmt);
1671
	if ((int)pix->bytesperline < 0)
1672 1673
		return pix->bytesperline;
	pix->sizeimage = height * pix->bytesperline;
1674

1675
	/* limit to sensor capabilities */
1676 1677 1678 1679 1680 1681
	mf.width	= pix->width;
	mf.height	= pix->height;
	mf.field	= pix->field;
	mf.code		= xlate->code;
	mf.colorspace	= pix->colorspace;

1682
	ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, try_mbus_fmt, &mf);
1683 1684 1685
	if (ret < 0)
		return ret;

1686 1687 1688 1689 1690
	pix->width	= mf.width;
	pix->height	= mf.height;
	pix->field	= mf.field;
	pix->colorspace	= mf.colorspace;

1691 1692 1693 1694 1695 1696 1697 1698
	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) {
1699 1700 1701 1702 1703 1704 1705
			/*
			 * 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;
1706
			ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
1707
							 try_mbus_fmt, &mf);
1708 1709
			if (ret < 0) {
				/* Shouldn't actually happen... */
1710
				dev_err(icd->dev.parent,
1711 1712
					"FIXME: client try_fmt() = %d\n", ret);
				return ret;
1713 1714
			}
		}
1715 1716
		/* We will scale exactly */
		if (mf.width > width)
1717
			pix->width = width;
1718
		if (mf.height > height)
1719
			pix->height = height;
1720 1721
	}

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

1725
	return ret;
1726 1727 1728 1729
}

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

1732
	return vb2_poll(&icd->vb2_vidq, file, pt);
1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743
}

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

1744 1745
static int sh_mobile_ceu_init_videobuf(struct vb2_queue *q,
				       struct soc_camera_device *icd)
1746
{
1747 1748 1749 1750 1751 1752 1753 1754
	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);
1755 1756
}

1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780
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:
1781
		switch (icd->current_fmt->host_fmt->fourcc) {
1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805
		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,
	},
};

1806 1807 1808 1809
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,
1810
	.get_formats	= sh_mobile_ceu_get_formats,
1811
	.put_formats	= sh_mobile_ceu_put_formats,
1812
	.get_crop	= sh_mobile_ceu_get_crop,
1813
	.set_crop	= sh_mobile_ceu_set_crop,
1814 1815
	.set_fmt	= sh_mobile_ceu_set_fmt,
	.try_fmt	= sh_mobile_ceu_try_fmt,
1816 1817
	.set_ctrl	= sh_mobile_ceu_set_ctrl,
	.get_ctrl	= sh_mobile_ceu_get_ctrl,
1818 1819 1820
	.poll		= sh_mobile_ceu_poll,
	.querycap	= sh_mobile_ceu_querycap,
	.set_bus_param	= sh_mobile_ceu_set_bus_param,
1821
	.init_videobuf2	= sh_mobile_ceu_init_videobuf,
1822 1823
	.controls	= sh_mobile_ceu_controls,
	.num_controls	= ARRAY_SIZE(sh_mobile_ceu_controls),
1824 1825
};

1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849
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;
}

1850
static int __devinit sh_mobile_ceu_probe(struct platform_device *pdev)
1851 1852 1853 1854 1855 1856
{
	struct sh_mobile_ceu_dev *pcdev;
	struct resource *res;
	void __iomem *base;
	unsigned int irq;
	int err = 0;
1857 1858 1859 1860 1861
	struct bus_wait wait = {
		.completion = COMPLETION_INITIALIZER_ONSTACK(wait.completion),
		.notifier.notifier_call = bus_notify,
	};
	struct device *csi2;
1862 1863 1864

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	irq = platform_get_irq(pdev, 0);
1865
	if (!res || (int)irq <= 0) {
1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887
		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;
	}

1888
	base = ioremap_nocache(res->start, resource_size(res));
1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902
	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,
1903
						  resource_size(res),
1904 1905 1906 1907 1908 1909 1910 1911
						  DMA_MEMORY_MAP |
						  DMA_MEMORY_EXCLUSIVE);
		if (!err) {
			dev_err(&pdev->dev, "Unable to declare CEU memory.\n");
			err = -ENXIO;
			goto exit_iounmap;
		}

1912
		pcdev->video_limit = resource_size(res);
1913 1914 1915 1916
	}

	/* request irq */
	err = request_irq(pcdev->irq, sh_mobile_ceu_irq, IRQF_DISABLED,
1917
			  dev_name(&pdev->dev), pcdev);
1918 1919 1920 1921 1922
	if (err) {
		dev_err(&pdev->dev, "Unable to register CEU interrupt.\n");
		goto exit_release_mem;
	}

1923 1924 1925
	pm_suspend_ignore_children(&pdev->dev, true);
	pm_runtime_enable(&pdev->dev);
	pm_runtime_resume(&pdev->dev);
1926

1927
	pcdev->ici.priv = pcdev;
1928
	pcdev->ici.v4l2_dev.dev = &pdev->dev;
1929
	pcdev->ici.nr = pdev->id;
1930 1931
	pcdev->ici.drv_name = dev_name(&pdev->dev);
	pcdev->ici.ops = &sh_mobile_ceu_host_ops;
1932

1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946
	/* 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.
		 */

1947
		if (!csi2->driver) {
1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971
			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;
		}
	}

1972 1973 1974 1975 1976 1977
	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;
	}

1978 1979
	err = soc_camera_host_register(&pcdev->ici);
	if (err)
1980
		goto exit_free_ctx;
1981 1982 1983

	return 0;

1984 1985
exit_free_ctx:
	vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
1986 1987 1988
exit_module_put:
	if (csi2 && csi2->driver)
		module_put(csi2->driver->owner);
1989 1990
exit_free_clk:
	pm_runtime_disable(&pdev->dev);
1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002
	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;
}

2003
static int __devexit sh_mobile_ceu_remove(struct platform_device *pdev)
2004
{
2005 2006 2007
	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);
2008
	struct device *csi2 = pcdev->pdata->csi2_dev;
2009

2010
	soc_camera_host_unregister(soc_host);
2011
	pm_runtime_disable(&pdev->dev);
2012 2013 2014 2015
	free_irq(pcdev->irq, pcdev);
	if (platform_get_resource(pdev, IORESOURCE_MEM, 1))
		dma_release_declared_memory(&pdev->dev);
	iounmap(pcdev->base);
2016
	vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
2017 2018
	if (csi2 && csi2->driver)
		module_put(csi2->driver->owner);
2019
	kfree(pcdev);
2020

2021 2022 2023
	return 0;
}

2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035
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;
}

2036
static const struct dev_pm_ops sh_mobile_ceu_dev_pm_ops = {
2037 2038 2039 2040
	.runtime_suspend = sh_mobile_ceu_runtime_nop,
	.runtime_resume = sh_mobile_ceu_runtime_nop,
};

2041 2042 2043
static struct platform_driver sh_mobile_ceu_driver = {
	.driver 	= {
		.name	= "sh_mobile_ceu",
2044
		.pm	= &sh_mobile_ceu_dev_pm_ops,
2045 2046
	},
	.probe		= sh_mobile_ceu_probe,
2047
	.remove		= __devexit_p(sh_mobile_ceu_remove),
2048 2049 2050 2051
};

static int __init sh_mobile_ceu_init(void)
{
2052 2053
	/* Whatever return code */
	request_module("sh_mobile_csi2");
2054 2055 2056 2057 2058
	return platform_driver_register(&sh_mobile_ceu_driver);
}

static void __exit sh_mobile_ceu_exit(void)
{
2059
	platform_driver_unregister(&sh_mobile_ceu_driver);
2060 2061 2062 2063 2064 2065 2066 2067
}

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