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

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

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

/* register offsets for sh7722 / sh7723 */

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

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

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

struct sh_mobile_ceu_dev {
	struct soc_camera_host ici;
	struct soc_camera_device *icd;
98
	struct platform_device *csi2_pdev;
99 100 101

	unsigned int irq;
	void __iomem *base;
102 103
	size_t video_limit;
	size_t buf_total;
104

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

	struct sh_mobile_ceu_info *pdata;
111
	struct completion complete;
112

113 114
	u32 cflcr;

115 116 117 118
	/* static max sizes either from platform data or default */
	int max_width;
	int max_height;

119
	enum v4l2_field field;
120
	int sequence;
121

122 123
	unsigned int image_mode:1;
	unsigned int is_16bit:1;
124
	unsigned int frozen:1;
125 126 127
};

struct sh_mobile_ceu_cam {
128
	/* CEU offsets within the camera output, before the CEU scaler */
129 130 131 132 133 134 135 136 137 138 139 140 141
	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;
142 143
	const struct soc_mbus_pixelfmt *extra_fmt;
	enum v4l2_mbus_pixelcode code;
144 145
};

146 147 148 149 150
static struct sh_mobile_ceu_buffer *to_ceu_vb(struct vb2_buffer *vb)
{
	return container_of(vb, struct sh_mobile_ceu_buffer, vb);
}

151
static void ceu_write(struct sh_mobile_ceu_dev *priv,
152
		      unsigned long reg_offs, u32 data)
153 154 155 156
{
	iowrite32(data, priv->base + reg_offs);
}

157
static u32 ceu_read(struct sh_mobile_ceu_dev *priv, unsigned long reg_offs)
158 159 160 161
{
	return ioread32(priv->base + reg_offs);
}

162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
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) {
189
		dev_warn(icd->pdev, "soft reset time out\n");
190 191 192 193 194 195
		return -EIO;
	}

	return 0;
}

196 197 198
/*
 *  Videobuf operations
 */
199 200 201 202 203 204

/*
 * .queue_setup() is called to check, whether the driver can accept the
 *		  requested number of buffers and to fill in plane sizes
 *		  for the current frame format if required
 */
205
static int sh_mobile_ceu_videobuf_setup(struct vb2_queue *vq,
206
			const struct v4l2_format *fmt,
207
			unsigned int *count, unsigned int *num_planes,
208
			unsigned int sizes[], void *alloc_ctxs[])
209
{
210
	struct soc_camera_device *icd = container_of(vq, struct soc_camera_device, vb2_vidq);
211
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
212 213
	struct sh_mobile_ceu_dev *pcdev = ici->priv;

214 215 216
	if (fmt) {
		const struct soc_camera_format_xlate *xlate = soc_camera_xlate_by_fourcc(icd,
								fmt->fmt.pix.pixelformat);
217 218
		int bytes_per_line;

219 220
		if (!xlate)
			return -EINVAL;
221

222 223
		bytes_per_line = soc_mbus_bytes_per_line(fmt->fmt.pix.width,
							 xlate->host_fmt);
224 225 226 227
		if (bytes_per_line < 0)
			return bytes_per_line;

		sizes[0] = bytes_per_line * fmt->fmt.pix.height;
228 229
	} else {
		/* Called from VIDIOC_REQBUFS or in compatibility mode */
230
		sizes[0] = icd->sizeimage;
231
	}
232 233

	alloc_ctxs[0] = pcdev->alloc_ctx;
234

235 236 237
	if (!vq->num_buffers)
		pcdev->sequence = 0;

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

241 242 243 244 245 246 247
	/* If *num_planes != 0, we have already verified *count. */
	if (pcdev->video_limit && !*num_planes) {
		size_t size = PAGE_ALIGN(sizes[0]) * *count;

		if (size + pcdev->buf_total > pcdev->video_limit)
			*count = (pcdev->video_limit - pcdev->buf_total) /
				PAGE_ALIGN(sizes[0]);
248 249
	}

250 251
	*num_planes = 1;

252
	dev_dbg(icd->parent, "count=%d, size=%u\n", *count, sizes[0]);
253 254 255 256

	return 0;
}

257 258 259
#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 */
260
#define CEU_CEIER_VBP   (1 << 20) /* vbp error */
261
#define CEU_CAPCR_CTNCP (1 << 16) /* continuous capture mode (if set) */
262
#define CEU_CEIER_MASK (CEU_CEIER_CPEIE | CEU_CEIER_VBP)
263 264


265 266 267 268 269
/*
 * 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)
270
{
271
	struct soc_camera_device *icd = pcdev->icd;
272
	dma_addr_t phys_addr_top, phys_addr_bottom;
273 274
	unsigned long top1, top2;
	unsigned long bottom1, bottom2;
275
	u32 status;
276
	bool planar;
277
	int ret = 0;
278

279 280
	/*
	 * The hardware is _very_ picky about this sequence. Especially
281 282 283
	 * the CEU_CETCR_MAGIC value. It seems like we need to acknowledge
	 * several not-so-well documented interrupt sources in CETCR.
	 */
284 285 286
	ceu_write(pcdev, CEIER, ceu_read(pcdev, CEIER) & ~CEU_CEIER_MASK);
	status = ceu_read(pcdev, CETCR);
	ceu_write(pcdev, CETCR, ~status & CEU_CETCR_MAGIC);
287 288
	if (!pcdev->frozen)
		ceu_write(pcdev, CEIER, ceu_read(pcdev, CEIER) | CEU_CEIER_MASK);
289 290
	ceu_write(pcdev, CAPCR, ceu_read(pcdev, CAPCR) & ~CEU_CAPCR_CTNCP);
	ceu_write(pcdev, CETCR, CEU_CETCR_MAGIC ^ CEU_CETCR_IGRW);
291

292 293 294 295 296 297 298 299 300 301
	/*
	 * 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;
	}

302 303 304 305 306
	if (pcdev->frozen) {
		complete(&pcdev->complete);
		return ret;
	}

307
	if (!pcdev->active)
308
		return ret;
309

310 311 312 313 314 315 316 317 318 319 320 321
	if (V4L2_FIELD_INTERLACED_BT == pcdev->field) {
		top1	= CDBYR;
		top2	= CDBCR;
		bottom1	= CDAYR;
		bottom2	= CDACR;
	} else {
		top1	= CDAYR;
		top2	= CDACR;
		bottom1	= CDBYR;
		bottom2	= CDBCR;
	}

322
	phys_addr_top = vb2_dma_contig_plane_dma_addr(pcdev->active, 0);
323

324
	switch (icd->current_fmt->host_fmt->fourcc) {
325 326
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
327 328
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
		planar = true;
		break;
	default:
		planar = false;
	}

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

	if (planar) {
347 348
		phys_addr_top += icd->user_width *
			icd->user_height;
349 350 351 352
		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);
353
		}
354
	}
355 356

	ceu_write(pcdev, CAPSR, 0x1); /* start capture */
357 358

	return ret;
359 360
}

361
static int sh_mobile_ceu_videobuf_prepare(struct vb2_buffer *vb)
362 363 364 365 366 367 368 369 370 371
{
	struct sh_mobile_ceu_buffer *buf = to_ceu_vb(vb);

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

	return 0;
}

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

379
	size = icd->sizeimage;
380 381 382 383 384 385 386 387

	if (vb2_plane_size(vb, 0) < size) {
		dev_err(icd->parent, "Buffer #%d too small (%lu < %lu)\n",
			vb->v4l2_buf.index, vb2_plane_size(vb, 0), size);
		goto error;
	}

	vb2_set_plane_payload(vb, 0, size);
388

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

#ifdef DEBUG
393 394 395 396
	/*
	 * This can be useful if you want to see if we actually fill
	 * the buffer with something
	 */
397 398
	if (vb2_plane_vaddr(vb, 0))
		memset(vb2_plane_vaddr(vb, 0), 0xaa, vb2_get_plane_payload(vb, 0));
399 400
#endif

401
	spin_lock_irq(&pcdev->lock);
402
	list_add_tail(&buf->queue, &pcdev->capture);
403 404

	if (!pcdev->active) {
405 406 407 408 409
		/*
		 * Because there were no active buffer at this moment,
		 * we are not interested in the return value of
		 * sh_mobile_ceu_capture here.
		 */
410 411 412
		pcdev->active = vb;
		sh_mobile_ceu_capture(pcdev);
	}
413
	spin_unlock_irq(&pcdev->lock);
414 415 416 417 418

	return;

error:
	vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
419 420
}

421
static void sh_mobile_ceu_videobuf_release(struct vb2_buffer *vb)
422
{
423
	struct soc_camera_device *icd = container_of(vb->vb2_queue, struct soc_camera_device, vb2_vidq);
424
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
425
	struct sh_mobile_ceu_buffer *buf = to_ceu_vb(vb);
426 427
	struct sh_mobile_ceu_dev *pcdev = ici->priv;

428
	spin_lock_irq(&pcdev->lock);
429 430 431 432 433 434 435

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

436 437 438 439 440 441
	/*
	 * Doesn't hurt also if the list is empty, but it hurts, if queuing the
	 * buffer failed, and .buf_init() hasn't been called
	 */
	if (buf->queue.next)
		list_del_init(&buf->queue);
442

443 444 445 446
	pcdev->buf_total -= PAGE_ALIGN(vb2_plane_size(vb, 0));
	dev_dbg(icd->parent, "%s() %zu bytes buffers\n", __func__,
		pcdev->buf_total);

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

450 451
static int sh_mobile_ceu_videobuf_init(struct vb2_buffer *vb)
{
452 453 454 455 456 457 458 459
	struct soc_camera_device *icd = container_of(vb->vb2_queue, struct soc_camera_device, vb2_vidq);
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;

	pcdev->buf_total += PAGE_ALIGN(vb2_plane_size(vb, 0));
	dev_dbg(icd->parent, "%s() %zu bytes buffers\n", __func__,
		pcdev->buf_total);

460 461 462
	/* This is for locking debugging only */
	INIT_LIST_HEAD(&to_ceu_vb(vb)->queue);
	return 0;
463 464
}

465 466 467
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);
468
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
469 470 471
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
	struct list_head *buf_head, *tmp;

472
	spin_lock_irq(&pcdev->lock);
473 474 475 476 477 478

	pcdev->active = NULL;

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

479
	spin_unlock_irq(&pcdev->lock);
480 481 482 483

	return sh_mobile_ceu_soft_reset(pcdev);
}

484 485 486 487 488 489 490 491
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,
492
	.stop_streaming	= sh_mobile_ceu_stop_streaming,
493 494 495 496 497
};

static irqreturn_t sh_mobile_ceu_irq(int irq, void *data)
{
	struct sh_mobile_ceu_dev *pcdev = data;
498 499
	struct vb2_buffer *vb;
	int ret;
500

501
	spin_lock(&pcdev->lock);
502 503

	vb = pcdev->active;
504 505 506 507
	if (!vb)
		/* Stale interrupt from a released buffer */
		goto out;

508
	list_del_init(&to_ceu_vb(vb)->queue);
509 510

	if (!list_empty(&pcdev->capture))
511 512
		pcdev->active = &list_entry(pcdev->capture.next,
					    struct sh_mobile_ceu_buffer, queue)->vb;
513 514 515
	else
		pcdev->active = NULL;

516 517 518 519 520 521 522
	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);
523 524

out:
525
	spin_unlock(&pcdev->lock);
526 527 528 529

	return IRQ_HANDLED;
}

530 531 532 533 534 535 536 537 538 539 540 541 542 543
static struct v4l2_subdev *find_csi2(struct sh_mobile_ceu_dev *pcdev)
{
	struct v4l2_subdev *sd;

	if (!pcdev->csi2_pdev)
		return NULL;

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

	return NULL;
}

544
/* Called with .video_lock held */
545 546
static int sh_mobile_ceu_add_device(struct soc_camera_device *icd)
{
547
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
548
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
549
	struct v4l2_subdev *csi2_sd;
550
	int ret;
551 552

	if (pcdev->icd)
553
		return -EBUSY;
554

555
	dev_info(icd->parent,
556 557 558
		 "SuperH Mobile CEU driver attached to camera %d\n",
		 icd->devnum);

559
	pm_runtime_get_sync(ici->v4l2_dev.dev);
560

561 562
	pcdev->buf_total = 0;

563
	ret = sh_mobile_ceu_soft_reset(pcdev);
564 565

	csi2_sd = find_csi2(pcdev);
566 567 568 569
	if (csi2_sd) {
		csi2_sd->grp_id = soc_camera_grp_id(icd);
		v4l2_set_subdev_hostdata(csi2_sd, icd);
	}
570 571

	ret = v4l2_subdev_call(csi2_sd, core, s_power, 1);
572
	if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV) {
573
		pm_runtime_put_sync(ici->v4l2_dev.dev);
574
		return ret;
575
	}
576

577 578 579 580 581 582 583 584 585
	/*
	 * -ENODEV is special: either csi2_sd == NULL or the CSI-2 driver
	 * has not found this soc-camera device among its clients
	 */
	if (ret == -ENODEV && csi2_sd)
		csi2_sd->grp_id = 0;
	pcdev->icd = icd;

	return 0;
586 587
}

588
/* Called with .video_lock held */
589 590
static void sh_mobile_ceu_remove_device(struct soc_camera_device *icd)
{
591
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
592
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
593
	struct v4l2_subdev *csi2_sd = find_csi2(pcdev);
594 595 596

	BUG_ON(icd != pcdev->icd);

597
	v4l2_subdev_call(csi2_sd, core, s_power, 0);
598 599
	if (csi2_sd)
		csi2_sd->grp_id = 0;
600 601
	/* disable capture, disable interrupts */
	ceu_write(pcdev, CEIER, 0);
602
	sh_mobile_ceu_soft_reset(pcdev);
603 604

	/* make sure active buffer is canceled */
605
	spin_lock_irq(&pcdev->lock);
606
	if (pcdev->active) {
607 608
		list_del_init(&to_ceu_vb(pcdev->active)->queue);
		vb2_buffer_done(pcdev->active, VB2_BUF_STATE_ERROR);
609 610
		pcdev->active = NULL;
	}
611
	spin_unlock_irq(&pcdev->lock);
612

613
	pm_runtime_put_sync(ici->v4l2_dev.dev);
614

615
	dev_info(icd->parent,
616 617 618 619 620 621
		 "SuperH Mobile CEU driver detached from camera %d\n",
		 icd->devnum);

	pcdev->icd = NULL;
}

622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652
/*
 * 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 */
653
static void sh_mobile_ceu_set_rect(struct soc_camera_device *icd)
654
{
655
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
656 657
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
658 659
	unsigned int height, width, cdwdr_width, in_width, in_height;
	unsigned int left_offset, top_offset;
660 661
	u32 camor;

662
	dev_geo(icd->parent, "Crop %ux%u@%u:%u\n",
663
		icd->user_width, icd->user_height, cam->ceu_left, cam->ceu_top);
664

665 666
	left_offset	= cam->ceu_left;
	top_offset	= cam->ceu_top;
667

668 669 670 671
	WARN_ON(icd->user_width & 3 || icd->user_height & 3);

	width = icd->user_width;

672
	if (pcdev->image_mode) {
673
		in_width = cam->width;
674 675 676 677
		if (!pcdev->is_16bit) {
			in_width *= 2;
			left_offset *= 2;
		}
678
		cdwdr_width = width;
679
	} else {
680
		int bytes_per_line = soc_mbus_bytes_per_line(width,
681 682
						icd->current_fmt->host_fmt);
		unsigned int w_factor;
683

684 685 686 687 688 689 690
		switch (icd->current_fmt->host_fmt->packing) {
		case SOC_MBUS_PACKING_2X8_PADHI:
			w_factor = 2;
			break;
		default:
			w_factor = 1;
		}
691

692
		in_width = cam->width * w_factor;
693
		left_offset *= w_factor;
694

695
		if (bytes_per_line < 0)
696
			cdwdr_width = width;
697 698
		else
			cdwdr_width = bytes_per_line;
699 700
	}

701 702
	height = icd->user_height;
	in_height = cam->height;
703
	if (V4L2_FIELD_NONE != pcdev->field) {
704
		height = (height / 2) & ~3;
705 706
		in_height /= 2;
		top_offset /= 2;
707 708 709
		cdwdr_width *= 2;
	}

710
	/* CSI2 special configuration */
711
	if (pcdev->pdata->csi2) {
712 713 714 715
		in_width = ((in_width - 2) * 2);
		left_offset *= 2;
	}

716
	/* Set CAMOR, CAPWR, CFSZR, take care of CDWDR */
717
	camor = left_offset | (top_offset << 16);
718

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

724
	ceu_write(pcdev, CAMOR, camor);
725
	ceu_write(pcdev, CAPWR, (in_height << 16) | in_width);
726
	/* CFSZR clipping is applied _after_ the scaling filter (CFLCR) */
727
	ceu_write(pcdev, CFSZR, (height << 16) | width);
728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
	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);
}

764 765 766 767
/* Find the bus subdevice driver, e.g., CSI2 */
static struct v4l2_subdev *find_bus_subdev(struct sh_mobile_ceu_dev *pcdev,
					   struct soc_camera_device *icd)
{
768 769
	if (pcdev->csi2_pdev) {
		struct v4l2_subdev *csi2_sd = find_csi2(pcdev);
770
		if (csi2_sd && csi2_sd->grp_id == soc_camera_grp_id(icd))
771 772
			return csi2_sd;
	}
773

774
	return soc_camera_to_subdev(icd);
775 776 777 778 779 780 781 782 783 784
}

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

785
/* Capture is not running, no interrupts, no locking needed */
786
static int sh_mobile_ceu_set_bus_param(struct soc_camera_device *icd)
787
{
788
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
789
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
790
	struct v4l2_subdev *sd = find_bus_subdev(pcdev, icd);
791
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
792 793
	struct v4l2_mbus_config cfg = {.type = V4L2_MBUS_PARALLEL,};
	unsigned long value, common_flags = CEU_BUS_FLAGS;
794
	u32 capsr = capture_save_reset(pcdev);
795 796
	unsigned int yuv_lineskip;
	int ret;
797

798 799 800 801 802 803 804 805 806 807 808 809 810
	/*
	 * If the client doesn't implement g_mbus_config, we just use our
	 * platform data
	 */
	ret = v4l2_subdev_call(sd, video, g_mbus_config, &cfg);
	if (!ret) {
		common_flags = soc_mbus_config_compatible(&cfg,
							  common_flags);
		if (!common_flags)
			return -EINVAL;
	} else if (ret != -ENOIOCTLCMD) {
		return ret;
	}
811

812
	/* Make choises, based on platform preferences */
813 814
	if ((common_flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH) &&
	    (common_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)) {
815
		if (pcdev->pdata->flags & SH_CEU_FLAG_HSYNC_LOW)
816
			common_flags &= ~V4L2_MBUS_HSYNC_ACTIVE_HIGH;
817
		else
818
			common_flags &= ~V4L2_MBUS_HSYNC_ACTIVE_LOW;
819 820
	}

821 822
	if ((common_flags & V4L2_MBUS_VSYNC_ACTIVE_HIGH) &&
	    (common_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)) {
823
		if (pcdev->pdata->flags & SH_CEU_FLAG_VSYNC_LOW)
824
			common_flags &= ~V4L2_MBUS_VSYNC_ACTIVE_HIGH;
825
		else
826
			common_flags &= ~V4L2_MBUS_VSYNC_ACTIVE_LOW;
827 828
	}

829 830 831
	cfg.flags = common_flags;
	ret = v4l2_subdev_call(sd, video, s_mbus_config, &cfg);
	if (ret < 0 && ret != -ENOIOCTLCMD)
832 833
		return ret;

834
	if (icd->current_fmt->host_fmt->bits_per_sample > 8)
835
		pcdev->is_16bit = 1;
836 837
	else
		pcdev->is_16bit = 0;
838 839 840 841

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

842
	value = 0x00000010; /* data fetch by default */
843
	yuv_lineskip = 0x10;
844

845
	switch (icd->current_fmt->host_fmt->fourcc) {
846 847
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
848 849
		/* convert 4:2:2 -> 4:2:0 */
		yuv_lineskip = 0; /* skip for NV12/21, no skip for NV16/61 */
850 851 852
		/* fall-through */
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
853
		switch (cam->code) {
854
		case V4L2_MBUS_FMT_UYVY8_2X8:
855 856
			value = 0x00000000; /* Cb0, Y0, Cr0, Y1 */
			break;
857
		case V4L2_MBUS_FMT_VYUY8_2X8:
858 859
			value = 0x00000100; /* Cr0, Y0, Cb0, Y1 */
			break;
860
		case V4L2_MBUS_FMT_YUYV8_2X8:
861 862
			value = 0x00000200; /* Y0, Cb0, Y1, Cr0 */
			break;
863
		case V4L2_MBUS_FMT_YVYU8_2X8:
864 865 866 867 868 869 870
			value = 0x00000300; /* Y0, Cr0, Y1, Cb0 */
			break;
		default:
			BUG();
		}
	}

871 872
	if (icd->current_fmt->host_fmt->fourcc == V4L2_PIX_FMT_NV21 ||
	    icd->current_fmt->host_fmt->fourcc == V4L2_PIX_FMT_NV61)
873
		value ^= 0x00000100; /* swap U, V to change from NV1x->NVx1 */
874

875 876
	value |= common_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW ? 1 << 1 : 0;
	value |= common_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW ? 1 << 0 : 0;
877
	value |= pcdev->is_16bit ? 1 << 12 : 0;
878 879

	/* CSI2 mode */
880
	if (pcdev->pdata->csi2)
881 882
		value |= 3 << 12;

883 884 885
	ceu_write(pcdev, CAMCR, value);

	ceu_write(pcdev, CAPCR, 0x00300000);
886 887 888 889 890 891 892 893 894 895 896 897 898

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

900
	sh_mobile_ceu_set_rect(icd);
901 902
	mdelay(1);

903
	dev_geo(icd->parent, "CFLCR 0x%x\n", pcdev->cflcr);
904
	ceu_write(pcdev, CFLCR, pcdev->cflcr);
905

906 907
	/*
	 * A few words about byte order (observed in Big Endian mode)
908 909 910 911 912 913 914 915
	 *
	 * 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,
916 917
	 * using 7 we swap the data bytes to match the incoming order:
	 * D0, D1, D2, D3, D4, D5, D6, D7
918
	 */
919
	value = 0x00000007 | yuv_lineskip;
920 921

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

924 925
	capture_restore(pcdev, capsr);

926 927 928 929
	/* not in bundle mode: skip CBDSR, CDAYR2, CDACR2, CDBYR2, CDBCR2 */
	return 0;
}

930 931
static int sh_mobile_ceu_try_bus_param(struct soc_camera_device *icd,
				       unsigned char buswidth)
932
{
933
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
934
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
935 936 937 938
	struct v4l2_subdev *sd = find_bus_subdev(pcdev, icd);
	unsigned long common_flags = CEU_BUS_FLAGS;
	struct v4l2_mbus_config cfg = {.type = V4L2_MBUS_PARALLEL,};
	int ret;
939

940 941 942 943 944 945 946 947
	ret = v4l2_subdev_call(sd, video, g_mbus_config, &cfg);
	if (!ret)
		common_flags = soc_mbus_config_compatible(&cfg,
							  common_flags);
	else if (ret != -ENOIOCTLCMD)
		return ret;

	if (!common_flags || buswidth > 16)
948 949 950 951 952
		return -EINVAL;

	return 0;
}

953
static const struct soc_mbus_pixelfmt sh_mobile_ceu_formats[] = {
954
	{
955 956
		.fourcc			= V4L2_PIX_FMT_NV12,
		.name			= "NV12",
957 958
		.bits_per_sample	= 8,
		.packing		= SOC_MBUS_PACKING_1_5X8,
959 960 961 962
		.order			= SOC_MBUS_ORDER_LE,
	}, {
		.fourcc			= V4L2_PIX_FMT_NV21,
		.name			= "NV21",
963 964
		.bits_per_sample	= 8,
		.packing		= SOC_MBUS_PACKING_1_5X8,
965 966 967 968
		.order			= SOC_MBUS_ORDER_LE,
	}, {
		.fourcc			= V4L2_PIX_FMT_NV16,
		.name			= "NV16",
969 970
		.bits_per_sample	= 8,
		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
971 972 973 974
		.order			= SOC_MBUS_ORDER_LE,
	}, {
		.fourcc			= V4L2_PIX_FMT_NV61,
		.name			= "NV61",
975 976
		.bits_per_sample	= 8,
		.packing		= SOC_MBUS_PACKING_2X8_PADHI,
977
		.order			= SOC_MBUS_ORDER_LE,
978
	},
979 980
};

981 982 983 984
/* 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 ||
985 986
		(fmt->bits_per_sample == 8 &&
		 fmt->packing == SOC_MBUS_PACKING_1_5X8) ||
987 988 989 990 991 992
		(fmt->bits_per_sample == 8 &&
		 fmt->packing == SOC_MBUS_PACKING_2X8_PADHI) ||
		(fmt->bits_per_sample > 8 &&
		 fmt->packing == SOC_MBUS_PACKING_EXTEND16);
}

993 994
static int client_g_rect(struct v4l2_subdev *sd, struct v4l2_rect *rect);

995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026
static struct soc_camera_device *ctrl_to_icd(struct v4l2_ctrl *ctrl)
{
	return container_of(ctrl->handler, struct soc_camera_device,
							ctrl_handler);
}

static int sh_mobile_ceu_s_ctrl(struct v4l2_ctrl *ctrl)
{
	struct soc_camera_device *icd = ctrl_to_icd(ctrl);
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;

	switch (ctrl->id) {
	case V4L2_CID_SHARPNESS:
		switch (icd->current_fmt->host_fmt->fourcc) {
		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->val);
			return 0;
		}
		break;
	}

	return -EINVAL;
}

static const struct v4l2_ctrl_ops sh_mobile_ceu_ctrl_ops = {
	.s_ctrl = sh_mobile_ceu_s_ctrl,
};

1027
static int sh_mobile_ceu_get_formats(struct soc_camera_device *icd, unsigned int idx,
1028 1029
				     struct soc_camera_format_xlate *xlate)
{
1030
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1031
	struct device *dev = icd->parent;
1032 1033
	struct soc_camera_host *ici = to_soc_camera_host(dev);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
1034
	int ret, k, n;
1035
	int formats = 0;
1036
	struct sh_mobile_ceu_cam *cam;
1037 1038
	enum v4l2_mbus_pixelcode code;
	const struct soc_mbus_pixelfmt *fmt;
1039

1040 1041 1042 1043 1044 1045 1046
	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) {
1047 1048
		dev_warn(dev, "unsupported format code #%u: %d\n", idx, code);
		return 0;
1049 1050
	}

1051
	if (!pcdev->pdata->csi2) {
1052
		/* Are there any restrictions in the CSI-2 case? */
1053 1054 1055 1056
		ret = sh_mobile_ceu_try_bus_param(icd, fmt->bits_per_sample);
		if (ret < 0)
			return 0;
	}
1057

1058
	if (!icd->host_priv) {
1059 1060 1061 1062
		struct v4l2_mbus_framefmt mf;
		struct v4l2_rect rect;
		int shift = 0;

1063 1064 1065 1066 1067 1068
		/* Add our control */
		v4l2_ctrl_new_std(&icd->ctrl_handler, &sh_mobile_ceu_ctrl_ops,
				  V4L2_CID_SHARPNESS, 0, 1, 1, 0);
		if (icd->ctrl_handler.error)
			return icd->ctrl_handler.error;

1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080
		/* 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;

1081 1082 1083 1084 1085 1086 1087 1088 1089
		/*
		 * All currently existing CEU implementations support 2560x1920
		 * or larger frames. If the sensor is proposing too big a frame,
		 * don't bother with possibly supportred by the CEU larger
		 * sizes, just try VGA multiples. If needed, this can be
		 * adjusted in the future.
		 */
		while ((mf.width > pcdev->max_width ||
			mf.height > pcdev->max_height) && shift < 4) {
1090 1091 1092
			/* Try 2560x1920, 1280x960, 640x480, 320x240 */
			mf.width	= 2560 >> shift;
			mf.height	= 1920 >> shift;
1093 1094 1095
			ret = v4l2_device_call_until_err(sd->v4l2_dev,
					soc_camera_grp_id(icd), video,
					s_mbus_fmt, &mf);
1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108
			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);

1109 1110 1111 1112
		cam = kzalloc(sizeof(*cam), GFP_KERNEL);
		if (!cam)
			return -ENOMEM;

1113 1114 1115 1116 1117 1118 1119
		/* 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;

1120 1121 1122 1123 1124
		icd->host_priv = cam;
	} else {
		cam = icd->host_priv;
	}

1125 1126
	/* Beginning of a pass */
	if (!idx)
1127
		cam->extra_fmt = NULL;
1128

1129
	switch (code) {
1130 1131 1132 1133
	case V4L2_MBUS_FMT_UYVY8_2X8:
	case V4L2_MBUS_FMT_VYUY8_2X8:
	case V4L2_MBUS_FMT_YUYV8_2X8:
	case V4L2_MBUS_FMT_YVYU8_2X8:
1134
		if (cam->extra_fmt)
1135
			break;
1136 1137 1138 1139 1140 1141 1142 1143 1144 1145

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

1148 1149 1150
		n = ARRAY_SIZE(sh_mobile_ceu_formats);
		formats += n;
		for (k = 0; xlate && k < n; k++) {
1151 1152
			xlate->host_fmt	= &sh_mobile_ceu_formats[k];
			xlate->code	= code;
1153
			xlate++;
1154 1155
			dev_dbg(dev, "Providing format %s using code %d\n",
				sh_mobile_ceu_formats[k].name, code);
1156
		}
1157
		break;
1158
	default:
1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169
		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",
1170
			fmt->name);
1171 1172 1173 1174 1175
	}

	return formats;
}

1176 1177 1178 1179 1180 1181
static void sh_mobile_ceu_put_formats(struct soc_camera_device *icd)
{
	kfree(icd->host_priv);
	icd->host_priv = NULL;
}

1182
/* Check if any dimension of r1 is smaller than respective one of r2 */
1183 1184 1185 1186 1187
static bool is_smaller(struct v4l2_rect *r1, struct v4l2_rect *r2)
{
	return r1->width < r2->width || r1->height < r2->height;
}

1188 1189 1190 1191 1192 1193 1194 1195
/* 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;
}

1196 1197 1198 1199 1200 1201 1202 1203 1204 1205
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;
}

1206
/* Get and store current client crop */
1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224
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);
1225 1226
	if (!ret)
		*rect = cap.defrect;
1227 1228 1229 1230

	return ret;
}

1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256
/* 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;
}

1257
/*
1258
 * The common for both scaling and cropping iterative approach is:
1259 1260 1261 1262
 * 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
 */
1263
static int client_s_crop(struct soc_camera_device *icd, struct v4l2_crop *crop,
1264
			 struct v4l2_crop *cam_crop)
1265
{
1266
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1267 1268
	struct v4l2_rect *rect = &crop->c, *cam_rect = &cam_crop->c;
	struct device *dev = sd->v4l2_dev->dev;
1269
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1270
	struct v4l2_cropcap cap;
1271
	int ret;
1272
	unsigned int width, height;
1273

1274 1275 1276 1277
	v4l2_subdev_call(sd, video, s_crop, crop);
	ret = client_g_rect(sd, cam_rect);
	if (ret < 0)
		return ret;
1278

1279 1280 1281 1282 1283 1284
	/*
	 * 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 */
1285
		dev_dbg(dev, "Camera S_CROP successful for %dx%d@%d:%d\n",
1286
			rect->width, rect->height, rect->left, rect->top);
1287
		cam->rect = *cam_rect;
1288
		return 0;
1289 1290
	}

1291
	/* Try to fix cropping, that camera hasn't managed to set */
1292
	dev_geo(dev, "Fix camera S_CROP for %dx%d@%d:%d to %dx%d@%d:%d\n",
1293
		cam_rect->width, cam_rect->height,
1294
		cam_rect->left, cam_rect->top,
1295 1296 1297 1298 1299 1300 1301
		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;

1302
	/* Put user requested rectangle within sensor bounds */
1303 1304 1305 1306
	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);
1307 1308 1309 1310 1311

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

1315 1316 1317 1318
	/*
	 * Loop as long as sensor is not covering the requested rectangle and
	 * is still within its bounds
	 */
1319 1320 1321
	while (!ret && (is_smaller(cam_rect, rect) ||
			is_inside(cam_rect, rect)) &&
	       (cap.bounds.width > width || cap.bounds.height > height)) {
1322 1323 1324

		width *= 2;
		height *= 2;
1325

1326 1327
		cam_rect->width = width;
		cam_rect->height = height;
1328

1329 1330 1331 1332 1333 1334 1335
		/*
		 * 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.
1336
		 * Instead we just drop to the left and top bounds.
1337 1338 1339
		 */
		if (cam_rect->left > rect->left)
			cam_rect->left = cap.bounds.left;
1340

1341 1342
		if (cam_rect->left + cam_rect->width < rect->left + rect->width)
			cam_rect->width = rect->left + rect->width -
1343
				cam_rect->left;
1344

1345 1346
		if (cam_rect->top > rect->top)
			cam_rect->top = cap.bounds.top;
1347

1348 1349
		if (cam_rect->top + cam_rect->height < rect->top + rect->height)
			cam_rect->height = rect->top + rect->height -
1350
				cam_rect->top;
1351

1352 1353
		v4l2_subdev_call(sd, video, s_crop, cam_crop);
		ret = client_g_rect(sd, cam_rect);
1354
		dev_geo(dev, "Camera S_CROP %d for %dx%d@%d:%d\n", ret,
1355
			cam_rect->width, cam_rect->height,
1356
			cam_rect->left, cam_rect->top);
1357 1358
	}

1359 1360
	/* S_CROP must not modify the rectangle */
	if (is_smaller(cam_rect, rect) || is_inside(cam_rect, rect)) {
1361 1362 1363 1364
		/*
		 * The camera failed to configure a suitable cropping,
		 * we cannot use the current rectangle, set to max
		 */
1365 1366 1367
		*cam_rect = cap.bounds;
		v4l2_subdev_call(sd, video, s_crop, cam_crop);
		ret = client_g_rect(sd, cam_rect);
1368
		dev_geo(dev, "Camera S_CROP %d for max %dx%d@%d:%d\n", ret,
1369
			cam_rect->width, cam_rect->height,
1370
			cam_rect->left, cam_rect->top);
1371 1372
	}

1373 1374 1375
	if (!ret) {
		cam->rect = *cam_rect;
		update_subrect(cam);
1376 1377
	}

1378
	return ret;
1379 1380
}

1381
/* Iterative s_mbus_fmt, also updates cached client crop on success */
1382 1383
static int client_s_fmt(struct soc_camera_device *icd,
			struct v4l2_mbus_framefmt *mf, bool ceu_can_scale)
1384
{
1385 1386
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
1387
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1388
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1389
	struct device *dev = icd->parent;
1390
	unsigned int width = mf->width, height = mf->height, tmp_w, tmp_h;
1391 1392
	unsigned int max_width, max_height;
	struct v4l2_cropcap cap;
1393
	bool ceu_1to1;
1394 1395
	int ret;

1396 1397
	ret = v4l2_device_call_until_err(sd->v4l2_dev,
					 soc_camera_grp_id(icd), video,
1398
					 s_mbus_fmt, mf);
1399 1400 1401 1402 1403
	if (ret < 0)
		return ret;

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

1404 1405 1406 1407 1408 1409 1410 1411
	if (width == mf->width && height == mf->height) {
		/* Perfect! The client has done it all. */
		ceu_1to1 = true;
		goto update_cache;
	}

	ceu_1to1 = false;
	if (!ceu_can_scale)
1412 1413
		goto update_cache;

1414 1415 1416 1417 1418 1419
	cap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

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

1420 1421
	max_width = min(cap.bounds.width, pcdev->max_width);
	max_height = min(cap.bounds.height, pcdev->max_height);
1422 1423

	/* Camera set a format, but geometry is not precise, try to improve */
1424 1425
	tmp_w = mf->width;
	tmp_h = mf->height;
1426 1427 1428 1429 1430 1431

	/* 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);
1432 1433
		mf->width = tmp_w;
		mf->height = tmp_h;
1434 1435 1436
		ret = v4l2_device_call_until_err(sd->v4l2_dev,
					soc_camera_grp_id(icd), video,
					s_mbus_fmt, mf);
1437
		dev_geo(dev, "Camera scaled to %ux%u\n",
1438
			mf->width, mf->height);
1439 1440 1441 1442 1443 1444 1445
		if (ret < 0) {
			/* This shouldn't happen */
			dev_err(dev, "Client failed to set format: %d\n", ret);
			return ret;
		}
	}

1446 1447 1448 1449 1450 1451
update_cache:
	/* Update cache */
	ret = client_g_rect(sd, &cam->rect);
	if (ret < 0)
		return ret;

1452 1453 1454 1455
	if (ceu_1to1)
		cam->subrect = cam->rect;
	else
		update_subrect(cam);
1456

1457 1458 1459 1460
	return 0;
}

/**
1461 1462 1463
 * @width	- on output: user width, mapped back to input
 * @height	- on output: user height, mapped back to input
 * @mf		- in- / output camera output window
1464
 */
1465 1466 1467 1468
static int client_scale(struct soc_camera_device *icd,
			struct v4l2_mbus_framefmt *mf,
			unsigned int *width, unsigned int *height,
			bool ceu_can_scale)
1469 1470
{
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1471
	struct device *dev = icd->parent;
1472
	struct v4l2_mbus_framefmt mf_tmp = *mf;
1473 1474 1475
	unsigned int scale_h, scale_v;
	int ret;

1476 1477 1478 1479
	/*
	 * 5. Apply iterative camera S_FMT for camera user window (also updates
	 *    client crop cache and the imaginary sub-rectangle).
	 */
1480
	ret = client_s_fmt(icd, &mf_tmp, ceu_can_scale);
1481 1482 1483 1484
	if (ret < 0)
		return ret;

	dev_geo(dev, "5: camera scaled to %ux%u\n",
1485
		mf_tmp.width, mf_tmp.height);
1486 1487 1488

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

1489
	/* unneeded - it is already in "mf_tmp" */
1490

1491 1492 1493
	/* 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);
1494

1495 1496 1497
	mf->width	= mf_tmp.width;
	mf->height	= mf_tmp.height;
	mf->colorspace	= mf_tmp.colorspace;
1498 1499

	/*
1500
	 * 8. Calculate new CEU crop - apply camera scales to previously
1501
	 *    updated "effective" crop.
1502
	 */
1503 1504
	*width = scale_down(cam->subrect.width, scale_h);
	*height = scale_down(cam->subrect.height, scale_v);
1505

1506
	dev_geo(dev, "8: new client sub-window %ux%u\n", *width, *height);
1507 1508 1509 1510 1511 1512 1513

	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
1514
 * Documentation/video4linux/sh_mobile_ceu_camera.txt for a description of
1515 1516 1517 1518 1519 1520
 * 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;
1521 1522
	struct device *dev = icd->parent;
	struct soc_camera_host *ici = to_soc_camera_host(dev);
1523 1524 1525
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
	struct v4l2_crop cam_crop;
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1526
	struct v4l2_rect *cam_rect = &cam_crop.c;
1527
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1528
	struct v4l2_mbus_framefmt mf;
1529
	unsigned int scale_cam_h, scale_cam_v, scale_ceu_h, scale_ceu_v,
1530
		out_width, out_height;
1531
	int interm_width, interm_height;
1532 1533 1534
	u32 capsr, cflcr;
	int ret;

1535 1536
	dev_geo(dev, "S_CROP(%ux%u@%u:%u)\n", rect->width, rect->height,
		rect->left, rect->top);
1537

1538 1539 1540
	/* 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);
1541

1542 1543 1544 1545
	/*
	 * 1. - 2. Apply iterative camera S_CROP for new input window, read back
	 * actual camera rectangle.
	 */
1546
	ret = client_s_crop(icd, a, &cam_crop);
1547 1548 1549
	if (ret < 0)
		return ret;

1550
	dev_geo(dev, "1-2: camera cropped to %ux%u@%u:%u\n",
1551 1552 1553 1554 1555
		cam_rect->width, cam_rect->height,
		cam_rect->left, cam_rect->top);

	/* On success cam_crop contains current camera crop */

1556 1557 1558 1559
	/* 3. Retrieve camera output window */
	ret = v4l2_subdev_call(sd, video, g_mbus_fmt, &mf);
	if (ret < 0)
		return ret;
1560

1561
	if (mf.width > pcdev->max_width || mf.height > pcdev->max_height)
1562
		return -EINVAL;
1563

1564 1565 1566
	/* 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);
1567

1568 1569 1570
	/* Calculate intermediate window */
	interm_width	= scale_down(rect->width, scale_cam_h);
	interm_height	= scale_down(rect->height, scale_cam_v);
1571

1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588
	if (interm_width < icd->user_width) {
		u32 new_scale_h;

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

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

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

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

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

	if (interm_width < icd->user_width || interm_height < icd->user_height) {
1589 1590 1591
		ret = v4l2_device_call_until_err(sd->v4l2_dev,
					soc_camera_grp_id(icd), video,
					s_mbus_fmt, &mf);
1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605
		if (ret < 0)
			return ret;

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

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

1606 1607 1608 1609 1610 1611 1612
	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;
	}
1613 1614

	/*
1615 1616
	 * 5. Calculate CEU scales from camera scales from results of (5) and
	 *    the user window
1617
	 */
1618 1619
	scale_ceu_h	= calc_scale(interm_width, &out_width);
	scale_ceu_v	= calc_scale(interm_height, &out_height);
1620

1621 1622 1623
	dev_geo(dev, "5: CEU scales %u:%u\n", scale_ceu_h, scale_ceu_v);

	/* Apply CEU scales. */
1624 1625 1626 1627 1628 1629
	cflcr = scale_ceu_h | (scale_ceu_v << 16);
	if (cflcr != pcdev->cflcr) {
		pcdev->cflcr = cflcr;
		ceu_write(pcdev, CFLCR, cflcr);
	}

1630 1631 1632
	icd->user_width	 = out_width & ~3;
	icd->user_height = out_height & ~3;
	/* Offsets are applied at the CEU scaling filter input */
1633 1634
	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;
1635 1636 1637 1638 1639 1640 1641 1642 1643 1644

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

1645
	/* Restore capture. The CE bit can be cleared by the hardware */
1646 1647 1648 1649 1650 1651
	if (pcdev->active)
		capsr |= 1;
	capture_restore(pcdev, capsr);

	/* Even if only camera cropping succeeded */
	return ret;
1652 1653
}

1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670
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,
1671
		const struct v4l2_pix_format *pix, struct v4l2_mbus_framefmt *mf)
1672 1673
{
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
1674
	struct device *dev = icd->parent;
1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706
	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);

	/*
1707 1708
	 * 4. Calculate desired client output window by applying combined scales
	 *    to client (real) input window.
1709 1710 1711 1712 1713
	 */
	mf->width	= scale_down(cam->rect.width, scale_h);
	mf->height	= scale_down(cam->rect.height, scale_v);
}

1714
/* Similar to set_crop multistage iterative algorithm */
1715
static int sh_mobile_ceu_set_fmt(struct soc_camera_device *icd,
1716
				 struct v4l2_format *f)
1717
{
1718 1719
	struct device *dev = icd->parent;
	struct soc_camera_host *ici = to_soc_camera_host(dev);
1720
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
1721 1722
	struct sh_mobile_ceu_cam *cam = icd->host_priv;
	struct v4l2_pix_format *pix = &f->fmt.pix;
1723
	struct v4l2_mbus_framefmt mf;
1724
	__u32 pixfmt = pix->pixelformat;
1725
	const struct soc_camera_format_xlate *xlate;
1726 1727
	/* Keep Compiler Happy */
	unsigned int ceu_sub_width = 0, ceu_sub_height = 0;
1728 1729
	u16 scale_v, scale_h;
	int ret;
1730 1731
	bool image_mode;
	enum v4l2_field field;
1732 1733 1734 1735 1736

	switch (pix->field) {
	default:
		pix->field = V4L2_FIELD_NONE;
		/* fall-through */
1737 1738
	case V4L2_FIELD_INTERLACED_TB:
	case V4L2_FIELD_INTERLACED_BT:
1739
	case V4L2_FIELD_NONE:
1740 1741 1742 1743
		field = pix->field;
		break;
	case V4L2_FIELD_INTERLACED:
		field = V4L2_FIELD_INTERLACED_TB;
1744 1745
		break;
	}
1746

1747 1748
	xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
	if (!xlate) {
1749
		dev_warn(dev, "Format %x not found\n", pixfmt);
1750
		return -EINVAL;
1751 1752
	}

1753
	/* 1.-4. Calculate desired client output geometry */
1754
	calculate_client_output(icd, pix, &mf);
1755 1756 1757
	mf.field	= pix->field;
	mf.colorspace	= pix->colorspace;
	mf.code		= xlate->code;
1758

1759 1760 1761 1762 1763
	switch (pixfmt) {
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV21:
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV61:
1764
		image_mode = true;
1765 1766
		break;
	default:
1767
		image_mode = false;
1768
	}
1769

1770
	dev_geo(dev, "S_FMT(pix=0x%x, fld 0x%x, code 0x%x, %ux%u)\n", pixfmt, mf.field, mf.code,
1771 1772
		pix->width, pix->height);

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

1775
	/* 5. - 9. */
1776
	ret = client_scale(icd, &mf, &ceu_sub_width, &ceu_sub_height,
1777
			   image_mode && V4L2_FIELD_NONE == field);
1778

1779
	dev_geo(dev, "5-9: client scale return %d\n", ret);
1780 1781 1782

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

1783 1784
	dev_geo(dev, "fmt %ux%u, requested %ux%u\n",
		mf.width, mf.height, pix->width, pix->height);
1785 1786 1787
	if (ret < 0)
		return ret;

1788 1789 1790
	if (mf.code != xlate->code)
		return -EINVAL;

1791 1792 1793 1794
	/* 9. Prepare CEU crop */
	cam->width = mf.width;
	cam->height = mf.height;

1795
	/* 10. Use CEU scaling to scale to the requested user window. */
1796 1797

	/* We cannot scale up */
1798 1799
	if (pix->width > ceu_sub_width)
		ceu_sub_width = pix->width;
1800

1801 1802
	if (pix->height > ceu_sub_height)
		ceu_sub_height = pix->height;
1803

1804 1805 1806 1807
	pix->colorspace = mf.colorspace;

	if (image_mode) {
		/* Scale pix->{width x height} down to width x height */
1808 1809
		scale_h		= calc_scale(ceu_sub_width, &pix->width);
		scale_v		= calc_scale(ceu_sub_height, &pix->height);
1810
	} else {
1811 1812 1813 1814
		pix->width	= ceu_sub_width;
		pix->height	= ceu_sub_height;
		scale_h		= 0;
		scale_v		= 0;
1815
	}
1816

1817 1818 1819 1820 1821 1822 1823
	pcdev->cflcr = scale_h | (scale_v << 16);

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

1824
	dev_geo(dev, "10: W: %u : 0x%x = %u, H: %u : 0x%x = %u\n",
1825 1826
		ceu_sub_width, scale_h, pix->width,
		ceu_sub_height, scale_v, pix->height);
1827

1828 1829
	cam->code		= xlate->code;
	icd->current_fmt	= xlate;
1830

1831
	pcdev->field = field;
1832
	pcdev->image_mode = image_mode;
1833

1834 1835 1836 1837
	/* CFSZR requirement */
	pix->width	&= ~3;
	pix->height	&= ~3;

1838
	return 0;
1839 1840
}

1841 1842
static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd,
				 struct v4l2_format *f)
1843
{
1844 1845
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
1846
	const struct soc_camera_format_xlate *xlate;
1847
	struct v4l2_pix_format *pix = &f->fmt.pix;
1848
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1849
	struct v4l2_mbus_framefmt mf;
1850
	__u32 pixfmt = pix->pixelformat;
1851
	int width, height;
1852
	int ret;
1853

1854
	dev_geo(icd->parent, "TRY_FMT(pix=0x%x, %ux%u)\n",
1855 1856
		 pixfmt, pix->width, pix->height);

1857 1858
	xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
	if (!xlate) {
1859
		dev_warn(icd->parent, "Format %x not found\n", pixfmt);
1860
		return -EINVAL;
1861
	}
1862

1863 1864
	/* FIXME: calculate using depth and bus width */

1865
	/* CFSZR requires height and width to be 4-pixel aligned */
1866 1867
	v4l_bound_align_image(&pix->width, 2, pcdev->max_width, 2,
			      &pix->height, 4, pcdev->max_height, 2, 0);
1868

1869 1870 1871
	width = pix->width;
	height = pix->height;

1872
	/* limit to sensor capabilities */
1873 1874 1875 1876 1877 1878
	mf.width	= pix->width;
	mf.height	= pix->height;
	mf.field	= pix->field;
	mf.code		= xlate->code;
	mf.colorspace	= pix->colorspace;

1879 1880
	ret = v4l2_device_call_until_err(sd->v4l2_dev, soc_camera_grp_id(icd),
					 video, try_mbus_fmt, &mf);
1881 1882 1883
	if (ret < 0)
		return ret;

1884 1885 1886 1887 1888
	pix->width	= mf.width;
	pix->height	= mf.height;
	pix->field	= mf.field;
	pix->colorspace	= mf.colorspace;

1889 1890 1891 1892 1893 1894 1895 1896
	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) {
1897 1898 1899 1900 1901
			/*
			 * We presume, the sensor behaves sanely, i.e., if
			 * requested a bigger rectangle, it will not return a
			 * smaller one.
			 */
1902 1903
			mf.width = pcdev->max_width;
			mf.height = pcdev->max_height;
1904 1905 1906
			ret = v4l2_device_call_until_err(sd->v4l2_dev,
					soc_camera_grp_id(icd), video,
					try_mbus_fmt, &mf);
1907 1908
			if (ret < 0) {
				/* Shouldn't actually happen... */
1909
				dev_err(icd->parent,
1910 1911
					"FIXME: client try_fmt() = %d\n", ret);
				return ret;
1912 1913
			}
		}
1914 1915
		/* We will scale exactly */
		if (mf.width > width)
1916
			pix->width = width;
1917
		if (mf.height > height)
1918
			pix->height = height;
1919 1920
	}

1921 1922 1923
	pix->width	&= ~3;
	pix->height	&= ~3;

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

1927
	return ret;
1928 1929
}

1930 1931 1932 1933
static int sh_mobile_ceu_set_livecrop(struct soc_camera_device *icd,
				      struct v4l2_crop *a)
{
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1934
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945
	struct sh_mobile_ceu_dev *pcdev = ici->priv;
	u32 out_width = icd->user_width, out_height = icd->user_height;
	int ret;

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

1952
	dev_geo(icd->parent, "Output after crop: %ux%u\n", icd->user_width, icd->user_height);
1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969

	if (icd->user_width != out_width || icd->user_height != out_height) {
		struct v4l2_format f = {
			.type	= V4L2_BUF_TYPE_VIDEO_CAPTURE,
			.fmt.pix	= {
				.width		= out_width,
				.height		= out_height,
				.pixelformat	= icd->current_fmt->host_fmt->fourcc,
				.field		= pcdev->field,
				.colorspace	= icd->colorspace,
			},
		};
		ret = sh_mobile_ceu_set_fmt(icd, &f);
		if (!ret && (out_width != f.fmt.pix.width ||
			     out_height != f.fmt.pix.height))
			ret = -EINVAL;
		if (!ret) {
1970 1971
			icd->user_width		= out_width & ~3;
			icd->user_height	= out_height & ~3;
1972
			ret = sh_mobile_ceu_set_bus_param(icd);
1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985
		}
	}

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

1986 1987
static unsigned int sh_mobile_ceu_poll(struct file *file, poll_table *pt)
{
1988
	struct soc_camera_device *icd = file->private_data;
1989

1990
	return vb2_poll(&icd->vb2_vidq, file, pt);
1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
}

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

2001 2002
static int sh_mobile_ceu_init_videobuf(struct vb2_queue *q,
				       struct soc_camera_device *icd)
2003
{
2004 2005 2006 2007 2008 2009 2010 2011
	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);
2012 2013 2014 2015 2016 2017
}

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,
2018
	.get_formats	= sh_mobile_ceu_get_formats,
2019
	.put_formats	= sh_mobile_ceu_put_formats,
2020
	.get_crop	= sh_mobile_ceu_get_crop,
2021
	.set_crop	= sh_mobile_ceu_set_crop,
2022
	.set_livecrop	= sh_mobile_ceu_set_livecrop,
2023 2024
	.set_fmt	= sh_mobile_ceu_set_fmt,
	.try_fmt	= sh_mobile_ceu_try_fmt,
2025 2026 2027
	.poll		= sh_mobile_ceu_poll,
	.querycap	= sh_mobile_ceu_querycap,
	.set_bus_param	= sh_mobile_ceu_set_bus_param,
2028
	.init_videobuf2	= sh_mobile_ceu_init_videobuf,
2029 2030
};

2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054
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;
}

2055
static int __devinit sh_mobile_ceu_probe(struct platform_device *pdev)
2056 2057 2058 2059 2060 2061
{
	struct sh_mobile_ceu_dev *pcdev;
	struct resource *res;
	void __iomem *base;
	unsigned int irq;
	int err = 0;
2062 2063 2064 2065
	struct bus_wait wait = {
		.completion = COMPLETION_INITIALIZER_ONSTACK(wait.completion),
		.notifier.notifier_call = bus_notify,
	};
2066
	struct sh_mobile_ceu_companion *csi2;
2067 2068 2069

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	irq = platform_get_irq(pdev, 0);
2070
	if (!res || (int)irq <= 0) {
2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084
		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);
2085
	init_completion(&pcdev->complete);
2086 2087 2088 2089 2090 2091 2092 2093

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

2094 2095 2096
	pcdev->max_width = pcdev->pdata->max_width ? : 2560;
	pcdev->max_height = pcdev->pdata->max_height ? : 1920;

2097
	base = ioremap_nocache(res->start, resource_size(res));
2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111
	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,
2112
						  resource_size(res),
2113 2114 2115 2116 2117 2118 2119 2120
						  DMA_MEMORY_MAP |
						  DMA_MEMORY_EXCLUSIVE);
		if (!err) {
			dev_err(&pdev->dev, "Unable to declare CEU memory.\n");
			err = -ENXIO;
			goto exit_iounmap;
		}

2121
		pcdev->video_limit = resource_size(res);
2122 2123 2124 2125
	}

	/* request irq */
	err = request_irq(pcdev->irq, sh_mobile_ceu_irq, IRQF_DISABLED,
2126
			  dev_name(&pdev->dev), pcdev);
2127 2128 2129 2130 2131
	if (err) {
		dev_err(&pdev->dev, "Unable to register CEU interrupt.\n");
		goto exit_release_mem;
	}

2132 2133 2134
	pm_suspend_ignore_children(&pdev->dev, true);
	pm_runtime_enable(&pdev->dev);
	pm_runtime_resume(&pdev->dev);
2135

2136
	pcdev->ici.priv = pcdev;
2137
	pcdev->ici.v4l2_dev.dev = &pdev->dev;
2138
	pcdev->ici.nr = pdev->id;
2139 2140
	pcdev->ici.drv_name = dev_name(&pdev->dev);
	pcdev->ici.ops = &sh_mobile_ceu_host_ops;
2141

2142 2143 2144 2145 2146 2147 2148 2149 2150 2151
	pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev);
	if (IS_ERR(pcdev->alloc_ctx)) {
		err = PTR_ERR(pcdev->alloc_ctx);
		goto exit_free_clk;
	}

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

2152
	/* CSI2 interfacing */
2153
	csi2 = pcdev->pdata->csi2;
2154
	if (csi2) {
2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180
		struct platform_device *csi2_pdev =
			platform_device_alloc("sh-mobile-csi2", csi2->id);
		struct sh_csi2_pdata *csi2_pdata = csi2->platform_data;

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

		pcdev->csi2_pdev		= csi2_pdev;

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

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

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

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

		wait.dev = &csi2_pdev->dev;
2181 2182 2183

		err = bus_register_notifier(&platform_bus_type, &wait.notifier);
		if (err < 0)
2184
			goto exit_pdev_unregister;
2185 2186 2187 2188 2189 2190

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

2191
		if (!csi2_pdev->dev.driver) {
2192 2193 2194 2195
			complete(&wait.completion);
			/* Either too late, or probing failed */
			bus_unregister_notifier(&platform_bus_type, &wait.notifier);
			err = -ENXIO;
2196
			goto exit_pdev_unregister;
2197 2198 2199 2200 2201 2202 2203 2204
		}

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

2205
		err = try_module_get(csi2_pdev->dev.driver->owner);
2206 2207 2208 2209 2210 2211

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

2216 2217
	return 0;

2218 2219 2220 2221 2222 2223 2224
exit_pdev_unregister:
	platform_device_del(pcdev->csi2_pdev);
exit_pdev_put:
	pcdev->csi2_pdev->resource = NULL;
	platform_device_put(pcdev->csi2_pdev);
exit_host_unregister:
	soc_camera_host_unregister(&pcdev->ici);
2225 2226
exit_free_ctx:
	vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
2227 2228
exit_free_clk:
	pm_runtime_disable(&pdev->dev);
2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240
	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;
}

2241
static int __devexit sh_mobile_ceu_remove(struct platform_device *pdev)
2242
{
2243 2244 2245
	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);
2246
	struct platform_device *csi2_pdev = pcdev->csi2_pdev;
2247

2248
	soc_camera_host_unregister(soc_host);
2249
	pm_runtime_disable(&pdev->dev);
2250 2251 2252 2253
	free_irq(pcdev->irq, pcdev);
	if (platform_get_resource(pdev, IORESOURCE_MEM, 1))
		dma_release_declared_memory(&pdev->dev);
	iounmap(pcdev->base);
2254
	vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
2255 2256 2257 2258 2259 2260 2261
	if (csi2_pdev && csi2_pdev->dev.driver) {
		struct module *csi2_drv = csi2_pdev->dev.driver->owner;
		platform_device_del(csi2_pdev);
		csi2_pdev->resource = NULL;
		platform_device_put(csi2_pdev);
		module_put(csi2_drv);
	}
2262
	kfree(pcdev);
2263

2264 2265 2266
	return 0;
}

2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278
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;
}

2279
static const struct dev_pm_ops sh_mobile_ceu_dev_pm_ops = {
2280 2281 2282 2283
	.runtime_suspend = sh_mobile_ceu_runtime_nop,
	.runtime_resume = sh_mobile_ceu_runtime_nop,
};

2284 2285 2286
static struct platform_driver sh_mobile_ceu_driver = {
	.driver 	= {
		.name	= "sh_mobile_ceu",
2287
		.pm	= &sh_mobile_ceu_dev_pm_ops,
2288 2289
	},
	.probe		= sh_mobile_ceu_probe,
2290
	.remove		= __devexit_p(sh_mobile_ceu_remove),
2291 2292 2293 2294
};

static int __init sh_mobile_ceu_init(void)
{
2295 2296
	/* Whatever return code */
	request_module("sh_mobile_csi2");
2297 2298 2299 2300 2301
	return platform_driver_register(&sh_mobile_ceu_driver);
}

static void __exit sh_mobile_ceu_exit(void)
{
2302
	platform_driver_unregister(&sh_mobile_ceu_driver);
2303 2304 2305 2306 2307 2308 2309 2310
}

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");
2311
MODULE_VERSION("0.0.6");
2312
MODULE_ALIAS("platform:sh_mobile_ceu");