PageRenderTime 249ms CodeModel.GetById 18ms app.highlight 207ms RepoModel.GetById 1ms app.codeStats 0ms

/drivers/media/video/omap3isp/ispcsi2.c

https://bitbucket.org/wisechild/galaxy-nexus
C | 1317 lines | 843 code | 187 blank | 287 comment | 113 complexity | 1a38e2ea2db8450e3cb7d3e1434edaa7 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
   1/*
   2 * ispcsi2.c
   3 *
   4 * TI OMAP3 ISP - CSI2 module
   5 *
   6 * Copyright (C) 2010 Nokia Corporation
   7 * Copyright (C) 2009 Texas Instruments, Inc.
   8 *
   9 * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  10 *	     Sakari Ailus <sakari.ailus@iki.fi>
  11 *
  12 * This program is free software; you can redistribute it and/or modify
  13 * it under the terms of the GNU General Public License version 2 as
  14 * published by the Free Software Foundation.
  15 *
  16 * This program is distributed in the hope that it will be useful, but
  17 * WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19 * General Public License for more details.
  20 *
  21 * You should have received a copy of the GNU General Public License
  22 * along with this program; if not, write to the Free Software
  23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  24 * 02110-1301 USA
  25 */
  26#include <linux/delay.h>
  27#include <media/v4l2-common.h>
  28#include <linux/v4l2-mediabus.h>
  29#include <linux/mm.h>
  30
  31#include "isp.h"
  32#include "ispreg.h"
  33#include "ispcsi2.h"
  34
  35/*
  36 * csi2_if_enable - Enable CSI2 Receiver interface.
  37 * @enable: enable flag
  38 *
  39 */
  40static void csi2_if_enable(struct isp_device *isp,
  41			   struct isp_csi2_device *csi2, u8 enable)
  42{
  43	struct isp_csi2_ctrl_cfg *currctrl = &csi2->ctrl;
  44
  45	isp_reg_clr_set(isp, csi2->regs1, ISPCSI2_CTRL, ISPCSI2_CTRL_IF_EN,
  46			enable ? ISPCSI2_CTRL_IF_EN : 0);
  47
  48	currctrl->if_enable = enable;
  49}
  50
  51/*
  52 * csi2_recv_config - CSI2 receiver module configuration.
  53 * @currctrl: isp_csi2_ctrl_cfg structure
  54 *
  55 */
  56static void csi2_recv_config(struct isp_device *isp,
  57			     struct isp_csi2_device *csi2,
  58			     struct isp_csi2_ctrl_cfg *currctrl)
  59{
  60	u32 reg;
  61
  62	reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTRL);
  63
  64	if (currctrl->frame_mode)
  65		reg |= ISPCSI2_CTRL_FRAME;
  66	else
  67		reg &= ~ISPCSI2_CTRL_FRAME;
  68
  69	if (currctrl->vp_clk_enable)
  70		reg |= ISPCSI2_CTRL_VP_CLK_EN;
  71	else
  72		reg &= ~ISPCSI2_CTRL_VP_CLK_EN;
  73
  74	if (currctrl->vp_only_enable)
  75		reg |= ISPCSI2_CTRL_VP_ONLY_EN;
  76	else
  77		reg &= ~ISPCSI2_CTRL_VP_ONLY_EN;
  78
  79	reg &= ~ISPCSI2_CTRL_VP_OUT_CTRL_MASK;
  80	reg |= currctrl->vp_out_ctrl << ISPCSI2_CTRL_VP_OUT_CTRL_SHIFT;
  81
  82	if (currctrl->ecc_enable)
  83		reg |= ISPCSI2_CTRL_ECC_EN;
  84	else
  85		reg &= ~ISPCSI2_CTRL_ECC_EN;
  86
  87	isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTRL);
  88}
  89
  90static const unsigned int csi2_input_fmts[] = {
  91	V4L2_MBUS_FMT_SGRBG10_1X10,
  92	V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8,
  93	V4L2_MBUS_FMT_SRGGB10_1X10,
  94	V4L2_MBUS_FMT_SRGGB10_DPCM8_1X8,
  95	V4L2_MBUS_FMT_SBGGR10_1X10,
  96	V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8,
  97	V4L2_MBUS_FMT_SGBRG10_1X10,
  98	V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8,
  99};
 100
 101/* To set the format on the CSI2 requires a mapping function that takes
 102 * the following inputs:
 103 * - 2 different formats (at this time)
 104 * - 2 destinations (mem, vp+mem) (vp only handled separately)
 105 * - 2 decompression options (on, off)
 106 * - 2 isp revisions (certain format must be handled differently on OMAP3630)
 107 * Output should be CSI2 frame format code
 108 * Array indices as follows: [format][dest][decompr][is_3630]
 109 * Not all combinations are valid. 0 means invalid.
 110 */
 111static const u16 __csi2_fmt_map[2][2][2][2] = {
 112	/* RAW10 formats */
 113	{
 114		/* Output to memory */
 115		{
 116			/* No DPCM decompression */
 117			{ CSI2_PIX_FMT_RAW10_EXP16, CSI2_PIX_FMT_RAW10_EXP16 },
 118			/* DPCM decompression */
 119			{ 0, 0 },
 120		},
 121		/* Output to both */
 122		{
 123			/* No DPCM decompression */
 124			{ CSI2_PIX_FMT_RAW10_EXP16_VP,
 125			  CSI2_PIX_FMT_RAW10_EXP16_VP },
 126			/* DPCM decompression */
 127			{ 0, 0 },
 128		},
 129	},
 130	/* RAW10 DPCM8 formats */
 131	{
 132		/* Output to memory */
 133		{
 134			/* No DPCM decompression */
 135			{ CSI2_PIX_FMT_RAW8, CSI2_USERDEF_8BIT_DATA1 },
 136			/* DPCM decompression */
 137			{ CSI2_PIX_FMT_RAW8_DPCM10_EXP16,
 138			  CSI2_USERDEF_8BIT_DATA1_DPCM10 },
 139		},
 140		/* Output to both */
 141		{
 142			/* No DPCM decompression */
 143			{ CSI2_PIX_FMT_RAW8_VP,
 144			  CSI2_PIX_FMT_RAW8_VP },
 145			/* DPCM decompression */
 146			{ CSI2_PIX_FMT_RAW8_DPCM10_VP,
 147			  CSI2_USERDEF_8BIT_DATA1_DPCM10_VP },
 148		},
 149	},
 150};
 151
 152/*
 153 * csi2_ctx_map_format - Map CSI2 sink media bus format to CSI2 format ID
 154 * @csi2: ISP CSI2 device
 155 *
 156 * Returns CSI2 physical format id
 157 */
 158static u16 csi2_ctx_map_format(struct isp_csi2_device *csi2)
 159{
 160	const struct v4l2_mbus_framefmt *fmt = &csi2->formats[CSI2_PAD_SINK];
 161	int fmtidx, destidx, is_3630;
 162
 163	switch (fmt->code) {
 164	case V4L2_MBUS_FMT_SGRBG10_1X10:
 165	case V4L2_MBUS_FMT_SRGGB10_1X10:
 166	case V4L2_MBUS_FMT_SBGGR10_1X10:
 167	case V4L2_MBUS_FMT_SGBRG10_1X10:
 168		fmtidx = 0;
 169		break;
 170	case V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8:
 171	case V4L2_MBUS_FMT_SRGGB10_DPCM8_1X8:
 172	case V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8:
 173	case V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8:
 174		fmtidx = 1;
 175		break;
 176	default:
 177		WARN(1, KERN_ERR "CSI2: pixel format %08x unsupported!\n",
 178		     fmt->code);
 179		return 0;
 180	}
 181
 182	if (!(csi2->output & CSI2_OUTPUT_CCDC) &&
 183	    !(csi2->output & CSI2_OUTPUT_MEMORY)) {
 184		/* Neither output enabled is a valid combination */
 185		return CSI2_PIX_FMT_OTHERS;
 186	}
 187
 188	/* If we need to skip frames at the beginning of the stream disable the
 189	 * video port to avoid sending the skipped frames to the CCDC.
 190	 */
 191	destidx = csi2->frame_skip ? 0 : !!(csi2->output & CSI2_OUTPUT_CCDC);
 192	is_3630 = csi2->isp->revision == ISP_REVISION_15_0;
 193
 194	return __csi2_fmt_map[fmtidx][destidx][csi2->dpcm_decompress][is_3630];
 195}
 196
 197/*
 198 * csi2_set_outaddr - Set memory address to save output image
 199 * @csi2: Pointer to ISP CSI2a device.
 200 * @addr: ISP MMU Mapped 32-bit memory address aligned on 32 byte boundary.
 201 *
 202 * Sets the memory address where the output will be saved.
 203 *
 204 * Returns 0 if successful, or -EINVAL if the address is not in the 32 byte
 205 * boundary.
 206 */
 207static void csi2_set_outaddr(struct isp_csi2_device *csi2, u32 addr)
 208{
 209	struct isp_device *isp = csi2->isp;
 210	struct isp_csi2_ctx_cfg *ctx = &csi2->contexts[0];
 211
 212	ctx->ping_addr = addr;
 213	ctx->pong_addr = addr;
 214	isp_reg_writel(isp, ctx->ping_addr,
 215		       csi2->regs1, ISPCSI2_CTX_DAT_PING_ADDR(ctx->ctxnum));
 216	isp_reg_writel(isp, ctx->pong_addr,
 217		       csi2->regs1, ISPCSI2_CTX_DAT_PONG_ADDR(ctx->ctxnum));
 218}
 219
 220/*
 221 * is_usr_def_mapping - Checks whether USER_DEF_MAPPING should
 222 *			be enabled by CSI2.
 223 * @format_id: mapped format id
 224 *
 225 */
 226static inline int is_usr_def_mapping(u32 format_id)
 227{
 228	return (format_id & 0x40) ? 1 : 0;
 229}
 230
 231/*
 232 * csi2_ctx_enable - Enable specified CSI2 context
 233 * @ctxnum: Context number, valid between 0 and 7 values.
 234 * @enable: enable
 235 *
 236 */
 237static void csi2_ctx_enable(struct isp_device *isp,
 238			    struct isp_csi2_device *csi2, u8 ctxnum, u8 enable)
 239{
 240	struct isp_csi2_ctx_cfg *ctx = &csi2->contexts[ctxnum];
 241	unsigned int skip = 0;
 242	u32 reg;
 243
 244	reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_CTRL1(ctxnum));
 245
 246	if (enable) {
 247		if (csi2->frame_skip)
 248			skip = csi2->frame_skip;
 249		else if (csi2->output & CSI2_OUTPUT_MEMORY)
 250			skip = 1;
 251
 252		reg &= ~ISPCSI2_CTX_CTRL1_COUNT_MASK;
 253		reg |= ISPCSI2_CTX_CTRL1_COUNT_UNLOCK
 254		    |  (skip << ISPCSI2_CTX_CTRL1_COUNT_SHIFT)
 255		    |  ISPCSI2_CTX_CTRL1_CTX_EN;
 256	} else {
 257		reg &= ~ISPCSI2_CTX_CTRL1_CTX_EN;
 258	}
 259
 260	isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTX_CTRL1(ctxnum));
 261	ctx->enabled = enable;
 262}
 263
 264/*
 265 * csi2_ctx_config - CSI2 context configuration.
 266 * @ctx: context configuration
 267 *
 268 */
 269static void csi2_ctx_config(struct isp_device *isp,
 270			    struct isp_csi2_device *csi2,
 271			    struct isp_csi2_ctx_cfg *ctx)
 272{
 273	u32 reg;
 274
 275	/* Set up CSI2_CTx_CTRL1 */
 276	reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_CTRL1(ctx->ctxnum));
 277
 278	if (ctx->eof_enabled)
 279		reg |= ISPCSI2_CTX_CTRL1_EOF_EN;
 280	else
 281		reg &= ~ISPCSI2_CTX_CTRL1_EOF_EN;
 282
 283	if (ctx->eol_enabled)
 284		reg |= ISPCSI2_CTX_CTRL1_EOL_EN;
 285	else
 286		reg &= ~ISPCSI2_CTX_CTRL1_EOL_EN;
 287
 288	if (ctx->checksum_enabled)
 289		reg |= ISPCSI2_CTX_CTRL1_CS_EN;
 290	else
 291		reg &= ~ISPCSI2_CTX_CTRL1_CS_EN;
 292
 293	isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTX_CTRL1(ctx->ctxnum));
 294
 295	/* Set up CSI2_CTx_CTRL2 */
 296	reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_CTRL2(ctx->ctxnum));
 297
 298	reg &= ~(ISPCSI2_CTX_CTRL2_VIRTUAL_ID_MASK);
 299	reg |= ctx->virtual_id << ISPCSI2_CTX_CTRL2_VIRTUAL_ID_SHIFT;
 300
 301	reg &= ~(ISPCSI2_CTX_CTRL2_FORMAT_MASK);
 302	reg |= ctx->format_id << ISPCSI2_CTX_CTRL2_FORMAT_SHIFT;
 303
 304	if (ctx->dpcm_decompress) {
 305		if (ctx->dpcm_predictor)
 306			reg |= ISPCSI2_CTX_CTRL2_DPCM_PRED;
 307		else
 308			reg &= ~ISPCSI2_CTX_CTRL2_DPCM_PRED;
 309	}
 310
 311	if (is_usr_def_mapping(ctx->format_id)) {
 312		reg &= ~ISPCSI2_CTX_CTRL2_USER_DEF_MAP_MASK;
 313		reg |= 2 << ISPCSI2_CTX_CTRL2_USER_DEF_MAP_SHIFT;
 314	}
 315
 316	isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTX_CTRL2(ctx->ctxnum));
 317
 318	/* Set up CSI2_CTx_CTRL3 */
 319	reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_CTRL3(ctx->ctxnum));
 320	reg &= ~(ISPCSI2_CTX_CTRL3_ALPHA_MASK);
 321	reg |= (ctx->alpha << ISPCSI2_CTX_CTRL3_ALPHA_SHIFT);
 322
 323	isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTX_CTRL3(ctx->ctxnum));
 324
 325	/* Set up CSI2_CTx_DAT_OFST */
 326	reg = isp_reg_readl(isp, csi2->regs1,
 327			    ISPCSI2_CTX_DAT_OFST(ctx->ctxnum));
 328	reg &= ~ISPCSI2_CTX_DAT_OFST_OFST_MASK;
 329	reg |= ctx->data_offset << ISPCSI2_CTX_DAT_OFST_OFST_SHIFT;
 330	isp_reg_writel(isp, reg, csi2->regs1,
 331		       ISPCSI2_CTX_DAT_OFST(ctx->ctxnum));
 332
 333	isp_reg_writel(isp, ctx->ping_addr,
 334		       csi2->regs1, ISPCSI2_CTX_DAT_PING_ADDR(ctx->ctxnum));
 335
 336	isp_reg_writel(isp, ctx->pong_addr,
 337		       csi2->regs1, ISPCSI2_CTX_DAT_PONG_ADDR(ctx->ctxnum));
 338}
 339
 340/*
 341 * csi2_timing_config - CSI2 timing configuration.
 342 * @timing: csi2_timing_cfg structure
 343 */
 344static void csi2_timing_config(struct isp_device *isp,
 345			       struct isp_csi2_device *csi2,
 346			       struct isp_csi2_timing_cfg *timing)
 347{
 348	u32 reg;
 349
 350	reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_TIMING);
 351
 352	if (timing->force_rx_mode)
 353		reg |= ISPCSI2_TIMING_FORCE_RX_MODE_IO(timing->ionum);
 354	else
 355		reg &= ~ISPCSI2_TIMING_FORCE_RX_MODE_IO(timing->ionum);
 356
 357	if (timing->stop_state_16x)
 358		reg |= ISPCSI2_TIMING_STOP_STATE_X16_IO(timing->ionum);
 359	else
 360		reg &= ~ISPCSI2_TIMING_STOP_STATE_X16_IO(timing->ionum);
 361
 362	if (timing->stop_state_4x)
 363		reg |= ISPCSI2_TIMING_STOP_STATE_X4_IO(timing->ionum);
 364	else
 365		reg &= ~ISPCSI2_TIMING_STOP_STATE_X4_IO(timing->ionum);
 366
 367	reg &= ~ISPCSI2_TIMING_STOP_STATE_COUNTER_IO_MASK(timing->ionum);
 368	reg |= timing->stop_state_counter <<
 369	       ISPCSI2_TIMING_STOP_STATE_COUNTER_IO_SHIFT(timing->ionum);
 370
 371	isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_TIMING);
 372}
 373
 374/*
 375 * csi2_irq_ctx_set - Enables CSI2 Context IRQs.
 376 * @enable: Enable/disable CSI2 Context interrupts
 377 */
 378static void csi2_irq_ctx_set(struct isp_device *isp,
 379			     struct isp_csi2_device *csi2, int enable)
 380{
 381	u32 reg = ISPCSI2_CTX_IRQSTATUS_FE_IRQ;
 382	int i;
 383
 384	if (csi2->use_fs_irq)
 385		reg |= ISPCSI2_CTX_IRQSTATUS_FS_IRQ;
 386
 387	for (i = 0; i < 8; i++) {
 388		isp_reg_writel(isp, reg, csi2->regs1,
 389			       ISPCSI2_CTX_IRQSTATUS(i));
 390		if (enable)
 391			isp_reg_set(isp, csi2->regs1, ISPCSI2_CTX_IRQENABLE(i),
 392				    reg);
 393		else
 394			isp_reg_clr(isp, csi2->regs1, ISPCSI2_CTX_IRQENABLE(i),
 395				    reg);
 396	}
 397}
 398
 399/*
 400 * csi2_irq_complexio1_set - Enables CSI2 ComplexIO IRQs.
 401 * @enable: Enable/disable CSI2 ComplexIO #1 interrupts
 402 */
 403static void csi2_irq_complexio1_set(struct isp_device *isp,
 404				    struct isp_csi2_device *csi2, int enable)
 405{
 406	u32 reg;
 407	reg = ISPCSI2_PHY_IRQENABLE_STATEALLULPMEXIT |
 408		ISPCSI2_PHY_IRQENABLE_STATEALLULPMENTER |
 409		ISPCSI2_PHY_IRQENABLE_STATEULPM5 |
 410		ISPCSI2_PHY_IRQENABLE_ERRCONTROL5 |
 411		ISPCSI2_PHY_IRQENABLE_ERRESC5 |
 412		ISPCSI2_PHY_IRQENABLE_ERRSOTSYNCHS5 |
 413		ISPCSI2_PHY_IRQENABLE_ERRSOTHS5 |
 414		ISPCSI2_PHY_IRQENABLE_STATEULPM4 |
 415		ISPCSI2_PHY_IRQENABLE_ERRCONTROL4 |
 416		ISPCSI2_PHY_IRQENABLE_ERRESC4 |
 417		ISPCSI2_PHY_IRQENABLE_ERRSOTSYNCHS4 |
 418		ISPCSI2_PHY_IRQENABLE_ERRSOTHS4 |
 419		ISPCSI2_PHY_IRQENABLE_STATEULPM3 |
 420		ISPCSI2_PHY_IRQENABLE_ERRCONTROL3 |
 421		ISPCSI2_PHY_IRQENABLE_ERRESC3 |
 422		ISPCSI2_PHY_IRQENABLE_ERRSOTSYNCHS3 |
 423		ISPCSI2_PHY_IRQENABLE_ERRSOTHS3 |
 424		ISPCSI2_PHY_IRQENABLE_STATEULPM2 |
 425		ISPCSI2_PHY_IRQENABLE_ERRCONTROL2 |
 426		ISPCSI2_PHY_IRQENABLE_ERRESC2 |
 427		ISPCSI2_PHY_IRQENABLE_ERRSOTSYNCHS2 |
 428		ISPCSI2_PHY_IRQENABLE_ERRSOTHS2 |
 429		ISPCSI2_PHY_IRQENABLE_STATEULPM1 |
 430		ISPCSI2_PHY_IRQENABLE_ERRCONTROL1 |
 431		ISPCSI2_PHY_IRQENABLE_ERRESC1 |
 432		ISPCSI2_PHY_IRQENABLE_ERRSOTSYNCHS1 |
 433		ISPCSI2_PHY_IRQENABLE_ERRSOTHS1;
 434	isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_PHY_IRQSTATUS);
 435	if (enable)
 436		reg |= isp_reg_readl(isp, csi2->regs1, ISPCSI2_PHY_IRQENABLE);
 437	else
 438		reg = 0;
 439	isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_PHY_IRQENABLE);
 440}
 441
 442/*
 443 * csi2_irq_status_set - Enables CSI2 Status IRQs.
 444 * @enable: Enable/disable CSI2 Status interrupts
 445 */
 446static void csi2_irq_status_set(struct isp_device *isp,
 447				struct isp_csi2_device *csi2, int enable)
 448{
 449	u32 reg;
 450	reg = ISPCSI2_IRQSTATUS_OCP_ERR_IRQ |
 451		ISPCSI2_IRQSTATUS_SHORT_PACKET_IRQ |
 452		ISPCSI2_IRQSTATUS_ECC_CORRECTION_IRQ |
 453		ISPCSI2_IRQSTATUS_ECC_NO_CORRECTION_IRQ |
 454		ISPCSI2_IRQSTATUS_COMPLEXIO2_ERR_IRQ |
 455		ISPCSI2_IRQSTATUS_COMPLEXIO1_ERR_IRQ |
 456		ISPCSI2_IRQSTATUS_FIFO_OVF_IRQ |
 457		ISPCSI2_IRQSTATUS_CONTEXT(0);
 458	isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_IRQSTATUS);
 459	if (enable)
 460		reg |= isp_reg_readl(isp, csi2->regs1, ISPCSI2_IRQENABLE);
 461	else
 462		reg = 0;
 463
 464	isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_IRQENABLE);
 465}
 466
 467/*
 468 * omap3isp_csi2_reset - Resets the CSI2 module.
 469 *
 470 * Must be called with the phy lock held.
 471 *
 472 * Returns 0 if successful, or -EBUSY if power command didn't respond.
 473 */
 474int omap3isp_csi2_reset(struct isp_csi2_device *csi2)
 475{
 476	struct isp_device *isp = csi2->isp;
 477	u8 soft_reset_retries = 0;
 478	u32 reg;
 479	int i;
 480
 481	if (!csi2->available)
 482		return -ENODEV;
 483
 484	if (csi2->phy->phy_in_use)
 485		return -EBUSY;
 486
 487	isp_reg_set(isp, csi2->regs1, ISPCSI2_SYSCONFIG,
 488		    ISPCSI2_SYSCONFIG_SOFT_RESET);
 489
 490	do {
 491		reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_SYSSTATUS) &
 492				    ISPCSI2_SYSSTATUS_RESET_DONE;
 493		if (reg == ISPCSI2_SYSSTATUS_RESET_DONE)
 494			break;
 495		soft_reset_retries++;
 496		if (soft_reset_retries < 5)
 497			udelay(100);
 498	} while (soft_reset_retries < 5);
 499
 500	if (soft_reset_retries == 5) {
 501		printk(KERN_ERR "CSI2: Soft reset try count exceeded!\n");
 502		return -EBUSY;
 503	}
 504
 505	if (isp->revision == ISP_REVISION_15_0)
 506		isp_reg_set(isp, csi2->regs1, ISPCSI2_PHY_CFG,
 507			    ISPCSI2_PHY_CFG_RESET_CTRL);
 508
 509	i = 100;
 510	do {
 511		reg = isp_reg_readl(isp, csi2->phy->phy_regs, ISPCSIPHY_REG1)
 512		    & ISPCSIPHY_REG1_RESET_DONE_CTRLCLK;
 513		if (reg == ISPCSIPHY_REG1_RESET_DONE_CTRLCLK)
 514			break;
 515		udelay(100);
 516	} while (--i > 0);
 517
 518	if (i == 0) {
 519		printk(KERN_ERR
 520		       "CSI2: Reset for CSI2_96M_FCLK domain Failed!\n");
 521		return -EBUSY;
 522	}
 523
 524	if (isp->autoidle)
 525		isp_reg_clr_set(isp, csi2->regs1, ISPCSI2_SYSCONFIG,
 526				ISPCSI2_SYSCONFIG_MSTANDBY_MODE_MASK |
 527				ISPCSI2_SYSCONFIG_AUTO_IDLE,
 528				ISPCSI2_SYSCONFIG_MSTANDBY_MODE_SMART |
 529				((isp->revision == ISP_REVISION_15_0) ?
 530				 ISPCSI2_SYSCONFIG_AUTO_IDLE : 0));
 531	else
 532		isp_reg_clr_set(isp, csi2->regs1, ISPCSI2_SYSCONFIG,
 533				ISPCSI2_SYSCONFIG_MSTANDBY_MODE_MASK |
 534				ISPCSI2_SYSCONFIG_AUTO_IDLE,
 535				ISPCSI2_SYSCONFIG_MSTANDBY_MODE_NO);
 536
 537	return 0;
 538}
 539
 540static int csi2_configure(struct isp_csi2_device *csi2)
 541{
 542	const struct isp_v4l2_subdevs_group *pdata;
 543	struct isp_device *isp = csi2->isp;
 544	struct isp_csi2_timing_cfg *timing = &csi2->timing[0];
 545	struct v4l2_subdev *sensor;
 546	struct media_pad *pad;
 547
 548	/*
 549	 * CSI2 fields that can be updated while the context has
 550	 * been enabled or the interface has been enabled are not
 551	 * updated dynamically currently. So we do not allow to
 552	 * reconfigure if either has been enabled
 553	 */
 554	if (csi2->contexts[0].enabled || csi2->ctrl.if_enable)
 555		return -EBUSY;
 556
 557	pad = media_entity_remote_source(&csi2->pads[CSI2_PAD_SINK]);
 558	sensor = media_entity_to_v4l2_subdev(pad->entity);
 559	pdata = sensor->host_priv;
 560
 561	csi2->frame_skip = 0;
 562	v4l2_subdev_call(sensor, sensor, g_skip_frames, &csi2->frame_skip);
 563
 564	csi2->ctrl.vp_out_ctrl = pdata->bus.csi2.vpclk_div;
 565	csi2->ctrl.frame_mode = ISP_CSI2_FRAME_IMMEDIATE;
 566	csi2->ctrl.ecc_enable = pdata->bus.csi2.crc;
 567
 568	timing->ionum = 1;
 569	timing->force_rx_mode = 1;
 570	timing->stop_state_16x = 1;
 571	timing->stop_state_4x = 1;
 572	timing->stop_state_counter = 0x1FF;
 573
 574	/*
 575	 * The CSI2 receiver can't do any format conversion except DPCM
 576	 * decompression, so every set_format call configures both pads
 577	 * and enables DPCM decompression as a special case:
 578	 */
 579	if (csi2->formats[CSI2_PAD_SINK].code !=
 580	    csi2->formats[CSI2_PAD_SOURCE].code)
 581		csi2->dpcm_decompress = true;
 582	else
 583		csi2->dpcm_decompress = false;
 584
 585	csi2->contexts[0].format_id = csi2_ctx_map_format(csi2);
 586
 587	if (csi2->video_out.bpl_padding == 0)
 588		csi2->contexts[0].data_offset = 0;
 589	else
 590		csi2->contexts[0].data_offset = csi2->video_out.bpl_value;
 591
 592	/*
 593	 * Enable end of frame and end of line signals generation for
 594	 * context 0. These signals are generated from CSI2 receiver to
 595	 * qualify the last pixel of a frame and the last pixel of a line.
 596	 * Without enabling the signals CSI2 receiver writes data to memory
 597	 * beyond buffer size and/or data line offset is not handled correctly.
 598	 */
 599	csi2->contexts[0].eof_enabled = 1;
 600	csi2->contexts[0].eol_enabled = 1;
 601
 602	csi2_irq_complexio1_set(isp, csi2, 1);
 603	csi2_irq_ctx_set(isp, csi2, 1);
 604	csi2_irq_status_set(isp, csi2, 1);
 605
 606	/* Set configuration (timings, format and links) */
 607	csi2_timing_config(isp, csi2, timing);
 608	csi2_recv_config(isp, csi2, &csi2->ctrl);
 609	csi2_ctx_config(isp, csi2, &csi2->contexts[0]);
 610
 611	return 0;
 612}
 613
 614/*
 615 * csi2_print_status - Prints CSI2 debug information.
 616 */
 617#define CSI2_PRINT_REGISTER(isp, regs, name)\
 618	dev_dbg(isp->dev, "###CSI2 " #name "=0x%08x\n", \
 619		isp_reg_readl(isp, regs, ISPCSI2_##name))
 620
 621static void csi2_print_status(struct isp_csi2_device *csi2)
 622{
 623	struct isp_device *isp = csi2->isp;
 624
 625	if (!csi2->available)
 626		return;
 627
 628	dev_dbg(isp->dev, "-------------CSI2 Register dump-------------\n");
 629
 630	CSI2_PRINT_REGISTER(isp, csi2->regs1, SYSCONFIG);
 631	CSI2_PRINT_REGISTER(isp, csi2->regs1, SYSSTATUS);
 632	CSI2_PRINT_REGISTER(isp, csi2->regs1, IRQENABLE);
 633	CSI2_PRINT_REGISTER(isp, csi2->regs1, IRQSTATUS);
 634	CSI2_PRINT_REGISTER(isp, csi2->regs1, CTRL);
 635	CSI2_PRINT_REGISTER(isp, csi2->regs1, DBG_H);
 636	CSI2_PRINT_REGISTER(isp, csi2->regs1, GNQ);
 637	CSI2_PRINT_REGISTER(isp, csi2->regs1, PHY_CFG);
 638	CSI2_PRINT_REGISTER(isp, csi2->regs1, PHY_IRQSTATUS);
 639	CSI2_PRINT_REGISTER(isp, csi2->regs1, SHORT_PACKET);
 640	CSI2_PRINT_REGISTER(isp, csi2->regs1, PHY_IRQENABLE);
 641	CSI2_PRINT_REGISTER(isp, csi2->regs1, DBG_P);
 642	CSI2_PRINT_REGISTER(isp, csi2->regs1, TIMING);
 643	CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_CTRL1(0));
 644	CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_CTRL2(0));
 645	CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_DAT_OFST(0));
 646	CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_DAT_PING_ADDR(0));
 647	CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_DAT_PONG_ADDR(0));
 648	CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_IRQENABLE(0));
 649	CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_IRQSTATUS(0));
 650	CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_CTRL3(0));
 651
 652	dev_dbg(isp->dev, "--------------------------------------------\n");
 653}
 654
 655/* -----------------------------------------------------------------------------
 656 * Interrupt handling
 657 */
 658
 659/*
 660 * csi2_isr_buffer - Does buffer handling at end-of-frame
 661 * when writing to memory.
 662 */
 663static void csi2_isr_buffer(struct isp_csi2_device *csi2)
 664{
 665	struct isp_device *isp = csi2->isp;
 666	struct isp_buffer *buffer;
 667
 668	csi2_ctx_enable(isp, csi2, 0, 0);
 669
 670	buffer = omap3isp_video_buffer_next(&csi2->video_out, 0);
 671
 672	/*
 673	 * Let video queue operation restart engine if there is an underrun
 674	 * condition.
 675	 */
 676	if (buffer == NULL)
 677		return;
 678
 679	csi2_set_outaddr(csi2, buffer->isp_addr);
 680	csi2_ctx_enable(isp, csi2, 0, 1);
 681}
 682
 683static void csi2_isr_ctx(struct isp_csi2_device *csi2,
 684			 struct isp_csi2_ctx_cfg *ctx)
 685{
 686	struct isp_device *isp = csi2->isp;
 687	unsigned int n = ctx->ctxnum;
 688	u32 status;
 689
 690	status = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_IRQSTATUS(n));
 691	isp_reg_writel(isp, status, csi2->regs1, ISPCSI2_CTX_IRQSTATUS(n));
 692
 693	/* Propagate frame number */
 694	if (status & ISPCSI2_CTX_IRQSTATUS_FS_IRQ) {
 695		struct isp_pipeline *pipe =
 696				     to_isp_pipeline(&csi2->subdev.entity);
 697		if (pipe->do_propagation)
 698			atomic_inc(&pipe->frame_number);
 699	}
 700
 701	if (!(status & ISPCSI2_CTX_IRQSTATUS_FE_IRQ))
 702		return;
 703
 704	/* Skip interrupts until we reach the frame skip count. The CSI2 will be
 705	 * automatically disabled, as the frame skip count has been programmed
 706	 * in the CSI2_CTx_CTRL1::COUNT field, so reenable it.
 707	 *
 708	 * It would have been nice to rely on the FRAME_NUMBER interrupt instead
 709	 * but it turned out that the interrupt is only generated when the CSI2
 710	 * writes to memory (the CSI2_CTx_CTRL1::COUNT field is decreased
 711	 * correctly and reaches 0 when data is forwarded to the video port only
 712	 * but no interrupt arrives). Maybe a CSI2 hardware bug.
 713	 */
 714	if (csi2->frame_skip) {
 715		csi2->frame_skip--;
 716		if (csi2->frame_skip == 0) {
 717			ctx->format_id = csi2_ctx_map_format(csi2);
 718			csi2_ctx_config(isp, csi2, ctx);
 719			csi2_ctx_enable(isp, csi2, n, 1);
 720		}
 721		return;
 722	}
 723
 724	if (csi2->output & CSI2_OUTPUT_MEMORY)
 725		csi2_isr_buffer(csi2);
 726}
 727
 728/*
 729 * omap3isp_csi2_isr - CSI2 interrupt handling.
 730 *
 731 * Return -EIO on Transmission error
 732 */
 733int omap3isp_csi2_isr(struct isp_csi2_device *csi2)
 734{
 735	u32 csi2_irqstatus, cpxio1_irqstatus;
 736	struct isp_device *isp = csi2->isp;
 737	int retval = 0;
 738
 739	if (!csi2->available)
 740		return -ENODEV;
 741
 742	csi2_irqstatus = isp_reg_readl(isp, csi2->regs1, ISPCSI2_IRQSTATUS);
 743	isp_reg_writel(isp, csi2_irqstatus, csi2->regs1, ISPCSI2_IRQSTATUS);
 744
 745	/* Failure Cases */
 746	if (csi2_irqstatus & ISPCSI2_IRQSTATUS_COMPLEXIO1_ERR_IRQ) {
 747		cpxio1_irqstatus = isp_reg_readl(isp, csi2->regs1,
 748						 ISPCSI2_PHY_IRQSTATUS);
 749		isp_reg_writel(isp, cpxio1_irqstatus,
 750			       csi2->regs1, ISPCSI2_PHY_IRQSTATUS);
 751		dev_dbg(isp->dev, "CSI2: ComplexIO Error IRQ "
 752			"%x\n", cpxio1_irqstatus);
 753		retval = -EIO;
 754	}
 755
 756	if (csi2_irqstatus & (ISPCSI2_IRQSTATUS_OCP_ERR_IRQ |
 757			      ISPCSI2_IRQSTATUS_SHORT_PACKET_IRQ |
 758			      ISPCSI2_IRQSTATUS_ECC_NO_CORRECTION_IRQ |
 759			      ISPCSI2_IRQSTATUS_COMPLEXIO2_ERR_IRQ |
 760			      ISPCSI2_IRQSTATUS_FIFO_OVF_IRQ)) {
 761		dev_dbg(isp->dev, "CSI2 Err:"
 762			" OCP:%d,"
 763			" Short_pack:%d,"
 764			" ECC:%d,"
 765			" CPXIO2:%d,"
 766			" FIFO_OVF:%d,"
 767			"\n",
 768			(csi2_irqstatus &
 769			 ISPCSI2_IRQSTATUS_OCP_ERR_IRQ) ? 1 : 0,
 770			(csi2_irqstatus &
 771			 ISPCSI2_IRQSTATUS_SHORT_PACKET_IRQ) ? 1 : 0,
 772			(csi2_irqstatus &
 773			 ISPCSI2_IRQSTATUS_ECC_NO_CORRECTION_IRQ) ? 1 : 0,
 774			(csi2_irqstatus &
 775			 ISPCSI2_IRQSTATUS_COMPLEXIO2_ERR_IRQ) ? 1 : 0,
 776			(csi2_irqstatus &
 777			 ISPCSI2_IRQSTATUS_FIFO_OVF_IRQ) ? 1 : 0);
 778		retval = -EIO;
 779	}
 780
 781	if (omap3isp_module_sync_is_stopping(&csi2->wait, &csi2->stopping))
 782		return 0;
 783
 784	/* Successful cases */
 785	if (csi2_irqstatus & ISPCSI2_IRQSTATUS_CONTEXT(0))
 786		csi2_isr_ctx(csi2, &csi2->contexts[0]);
 787
 788	if (csi2_irqstatus & ISPCSI2_IRQSTATUS_ECC_CORRECTION_IRQ)
 789		dev_dbg(isp->dev, "CSI2: ECC correction done\n");
 790
 791	return retval;
 792}
 793
 794/* -----------------------------------------------------------------------------
 795 * ISP video operations
 796 */
 797
 798/*
 799 * csi2_queue - Queues the first buffer when using memory output
 800 * @video: The video node
 801 * @buffer: buffer to queue
 802 */
 803static int csi2_queue(struct isp_video *video, struct isp_buffer *buffer)
 804{
 805	struct isp_device *isp = video->isp;
 806	struct isp_csi2_device *csi2 = &isp->isp_csi2a;
 807
 808	csi2_set_outaddr(csi2, buffer->isp_addr);
 809
 810	/*
 811	 * If streaming was enabled before there was a buffer queued
 812	 * or underrun happened in the ISR, the hardware was not enabled
 813	 * and DMA queue flag ISP_VIDEO_DMAQUEUE_UNDERRUN is still set.
 814	 * Enable it now.
 815	 */
 816	if (csi2->video_out.dmaqueue_flags & ISP_VIDEO_DMAQUEUE_UNDERRUN) {
 817		/* Enable / disable context 0 and IRQs */
 818		csi2_if_enable(isp, csi2, 1);
 819		csi2_ctx_enable(isp, csi2, 0, 1);
 820		isp_video_dmaqueue_flags_clr(&csi2->video_out);
 821	}
 822
 823	return 0;
 824}
 825
 826static const struct isp_video_operations csi2_ispvideo_ops = {
 827	.queue = csi2_queue,
 828};
 829
 830/* -----------------------------------------------------------------------------
 831 * V4L2 subdev operations
 832 */
 833
 834static struct v4l2_mbus_framefmt *
 835__csi2_get_format(struct isp_csi2_device *csi2, struct v4l2_subdev_fh *fh,
 836		  unsigned int pad, enum v4l2_subdev_format_whence which)
 837{
 838	if (which == V4L2_SUBDEV_FORMAT_TRY)
 839		return v4l2_subdev_get_try_format(fh, pad);
 840	else
 841		return &csi2->formats[pad];
 842}
 843
 844static void
 845csi2_try_format(struct isp_csi2_device *csi2, struct v4l2_subdev_fh *fh,
 846		unsigned int pad, struct v4l2_mbus_framefmt *fmt,
 847		enum v4l2_subdev_format_whence which)
 848{
 849	enum v4l2_mbus_pixelcode pixelcode;
 850	struct v4l2_mbus_framefmt *format;
 851	const struct isp_format_info *info;
 852	unsigned int i;
 853
 854	switch (pad) {
 855	case CSI2_PAD_SINK:
 856		/* Clamp the width and height to valid range (1-8191). */
 857		for (i = 0; i < ARRAY_SIZE(csi2_input_fmts); i++) {
 858			if (fmt->code == csi2_input_fmts[i])
 859				break;
 860		}
 861
 862		/* If not found, use SGRBG10 as default */
 863		if (i >= ARRAY_SIZE(csi2_input_fmts))
 864			fmt->code = V4L2_MBUS_FMT_SGRBG10_1X10;
 865
 866		fmt->width = clamp_t(u32, fmt->width, 1, 8191);
 867		fmt->height = clamp_t(u32, fmt->height, 1, 8191);
 868		break;
 869
 870	case CSI2_PAD_SOURCE:
 871		/* Source format same as sink format, except for DPCM
 872		 * compression.
 873		 */
 874		pixelcode = fmt->code;
 875		format = __csi2_get_format(csi2, fh, CSI2_PAD_SINK, which);
 876		memcpy(fmt, format, sizeof(*fmt));
 877
 878		/*
 879		 * Only Allow DPCM decompression, and check that the
 880		 * pattern is preserved
 881		 */
 882		info = omap3isp_video_format_info(fmt->code);
 883		if (info->uncompressed == pixelcode)
 884			fmt->code = pixelcode;
 885		break;
 886	}
 887
 888	/* RGB, non-interlaced */
 889	fmt->colorspace = V4L2_COLORSPACE_SRGB;
 890	fmt->field = V4L2_FIELD_NONE;
 891}
 892
 893/*
 894 * csi2_enum_mbus_code - Handle pixel format enumeration
 895 * @sd     : pointer to v4l2 subdev structure
 896 * @fh     : V4L2 subdev file handle
 897 * @code   : pointer to v4l2_subdev_mbus_code_enum structure
 898 * return -EINVAL or zero on success
 899 */
 900static int csi2_enum_mbus_code(struct v4l2_subdev *sd,
 901			       struct v4l2_subdev_fh *fh,
 902			       struct v4l2_subdev_mbus_code_enum *code)
 903{
 904	struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
 905	struct v4l2_mbus_framefmt *format;
 906	const struct isp_format_info *info;
 907
 908	if (code->pad == CSI2_PAD_SINK) {
 909		if (code->index >= ARRAY_SIZE(csi2_input_fmts))
 910			return -EINVAL;
 911
 912		code->code = csi2_input_fmts[code->index];
 913	} else {
 914		format = __csi2_get_format(csi2, fh, CSI2_PAD_SINK,
 915					   V4L2_SUBDEV_FORMAT_TRY);
 916		switch (code->index) {
 917		case 0:
 918			/* Passthrough sink pad code */
 919			code->code = format->code;
 920			break;
 921		case 1:
 922			/* Uncompressed code */
 923			info = omap3isp_video_format_info(format->code);
 924			if (info->uncompressed == format->code)
 925				return -EINVAL;
 926
 927			code->code = info->uncompressed;
 928			break;
 929		default:
 930			return -EINVAL;
 931		}
 932	}
 933
 934	return 0;
 935}
 936
 937static int csi2_enum_frame_size(struct v4l2_subdev *sd,
 938				struct v4l2_subdev_fh *fh,
 939				struct v4l2_subdev_frame_size_enum *fse)
 940{
 941	struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
 942	struct v4l2_mbus_framefmt format;
 943
 944	if (fse->index != 0)
 945		return -EINVAL;
 946
 947	format.code = fse->code;
 948	format.width = 1;
 949	format.height = 1;
 950	csi2_try_format(csi2, fh, fse->pad, &format, V4L2_SUBDEV_FORMAT_TRY);
 951	fse->min_width = format.width;
 952	fse->min_height = format.height;
 953
 954	if (format.code != fse->code)
 955		return -EINVAL;
 956
 957	format.code = fse->code;
 958	format.width = -1;
 959	format.height = -1;
 960	csi2_try_format(csi2, fh, fse->pad, &format, V4L2_SUBDEV_FORMAT_TRY);
 961	fse->max_width = format.width;
 962	fse->max_height = format.height;
 963
 964	return 0;
 965}
 966
 967/*
 968 * csi2_get_format - Handle get format by pads subdev method
 969 * @sd : pointer to v4l2 subdev structure
 970 * @fh : V4L2 subdev file handle
 971 * @fmt: pointer to v4l2 subdev format structure
 972 * return -EINVAL or zero on success
 973 */
 974static int csi2_get_format(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
 975			   struct v4l2_subdev_format *fmt)
 976{
 977	struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
 978	struct v4l2_mbus_framefmt *format;
 979
 980	format = __csi2_get_format(csi2, fh, fmt->pad, fmt->which);
 981	if (format == NULL)
 982		return -EINVAL;
 983
 984	fmt->format = *format;
 985	return 0;
 986}
 987
 988/*
 989 * csi2_set_format - Handle set format by pads subdev method
 990 * @sd : pointer to v4l2 subdev structure
 991 * @fh : V4L2 subdev file handle
 992 * @fmt: pointer to v4l2 subdev format structure
 993 * return -EINVAL or zero on success
 994 */
 995static int csi2_set_format(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
 996			   struct v4l2_subdev_format *fmt)
 997{
 998	struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
 999	struct v4l2_mbus_framefmt *format;
1000
1001	format = __csi2_get_format(csi2, fh, fmt->pad, fmt->which);
1002	if (format == NULL)
1003		return -EINVAL;
1004
1005	csi2_try_format(csi2, fh, fmt->pad, &fmt->format, fmt->which);
1006	*format = fmt->format;
1007
1008	/* Propagate the format from sink to source */
1009	if (fmt->pad == CSI2_PAD_SINK) {
1010		format = __csi2_get_format(csi2, fh, CSI2_PAD_SOURCE,
1011					   fmt->which);
1012		*format = fmt->format;
1013		csi2_try_format(csi2, fh, CSI2_PAD_SOURCE, format, fmt->which);
1014	}
1015
1016	return 0;
1017}
1018
1019/*
1020 * csi2_init_formats - Initialize formats on all pads
1021 * @sd: ISP CSI2 V4L2 subdevice
1022 * @fh: V4L2 subdev file handle
1023 *
1024 * Initialize all pad formats with default values. If fh is not NULL, try
1025 * formats are initialized on the file handle. Otherwise active formats are
1026 * initialized on the device.
1027 */
1028static int csi2_init_formats(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
1029{
1030	struct v4l2_subdev_format format;
1031
1032	memset(&format, 0, sizeof(format));
1033	format.pad = CSI2_PAD_SINK;
1034	format.which = fh ? V4L2_SUBDEV_FORMAT_TRY : V4L2_SUBDEV_FORMAT_ACTIVE;
1035	format.format.code = V4L2_MBUS_FMT_SGRBG10_1X10;
1036	format.format.width = 4096;
1037	format.format.height = 4096;
1038	csi2_set_format(sd, fh, &format);
1039
1040	return 0;
1041}
1042
1043/*
1044 * csi2_set_stream - Enable/Disable streaming on the CSI2 module
1045 * @sd: ISP CSI2 V4L2 subdevice
1046 * @enable: ISP pipeline stream state
1047 *
1048 * Return 0 on success or a negative error code otherwise.
1049 */
1050static int csi2_set_stream(struct v4l2_subdev *sd, int enable)
1051{
1052	struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
1053	struct isp_device *isp = csi2->isp;
1054	struct isp_pipeline *pipe = to_isp_pipeline(&csi2->subdev.entity);
1055	struct isp_video *video_out = &csi2->video_out;
1056
1057	switch (enable) {
1058	case ISP_PIPELINE_STREAM_CONTINUOUS:
1059		if (omap3isp_csiphy_acquire(csi2->phy) < 0)
1060			return -ENODEV;
1061		csi2->use_fs_irq = pipe->do_propagation;
1062		if (csi2->output & CSI2_OUTPUT_MEMORY)
1063			omap3isp_sbl_enable(isp, OMAP3_ISP_SBL_CSI2A_WRITE);
1064		csi2_configure(csi2);
1065		csi2_print_status(csi2);
1066
1067		/*
1068		 * When outputting to memory with no buffer available, let the
1069		 * buffer queue handler start the hardware. A DMA queue flag
1070		 * ISP_VIDEO_DMAQUEUE_QUEUED will be set as soon as there is
1071		 * a buffer available.
1072		 */
1073		if (csi2->output & CSI2_OUTPUT_MEMORY &&
1074		    !(video_out->dmaqueue_flags & ISP_VIDEO_DMAQUEUE_QUEUED))
1075			break;
1076		/* Enable context 0 and IRQs */
1077		atomic_set(&csi2->stopping, 0);
1078		csi2_ctx_enable(isp, csi2, 0, 1);
1079		csi2_if_enable(isp, csi2, 1);
1080		isp_video_dmaqueue_flags_clr(video_out);
1081		break;
1082
1083	case ISP_PIPELINE_STREAM_STOPPED:
1084		if (csi2->state == ISP_PIPELINE_STREAM_STOPPED)
1085			return 0;
1086		if (omap3isp_module_sync_idle(&sd->entity, &csi2->wait,
1087					      &csi2->stopping))
1088			dev_dbg(isp->dev, "%s: module stop timeout.\n",
1089				sd->name);
1090		csi2_ctx_enable(isp, csi2, 0, 0);
1091		csi2_if_enable(isp, csi2, 0);
1092		csi2_irq_ctx_set(isp, csi2, 0);
1093		omap3isp_csiphy_release(csi2->phy);
1094		isp_video_dmaqueue_flags_clr(video_out);
1095		omap3isp_sbl_disable(isp, OMAP3_ISP_SBL_CSI2A_WRITE);
1096		break;
1097	}
1098
1099	csi2->state = enable;
1100	return 0;
1101}
1102
1103/* subdev video operations */
1104static const struct v4l2_subdev_video_ops csi2_video_ops = {
1105	.s_stream = csi2_set_stream,
1106};
1107
1108/* subdev pad operations */
1109static const struct v4l2_subdev_pad_ops csi2_pad_ops = {
1110	.enum_mbus_code = csi2_enum_mbus_code,
1111	.enum_frame_size = csi2_enum_frame_size,
1112	.get_fmt = csi2_get_format,
1113	.set_fmt = csi2_set_format,
1114};
1115
1116/* subdev operations */
1117static const struct v4l2_subdev_ops csi2_ops = {
1118	.video = &csi2_video_ops,
1119	.pad = &csi2_pad_ops,
1120};
1121
1122/* subdev internal operations */
1123static const struct v4l2_subdev_internal_ops csi2_internal_ops = {
1124	.open = csi2_init_formats,
1125};
1126
1127/* -----------------------------------------------------------------------------
1128 * Media entity operations
1129 */
1130
1131/*
1132 * csi2_link_setup - Setup CSI2 connections.
1133 * @entity : Pointer to media entity structure
1134 * @local  : Pointer to local pad array
1135 * @remote : Pointer to remote pad array
1136 * @flags  : Link flags
1137 * return -EINVAL or zero on success
1138 */
1139static int csi2_link_setup(struct media_entity *entity,
1140			   const struct media_pad *local,
1141			   const struct media_pad *remote, u32 flags)
1142{
1143	struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(entity);
1144	struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
1145	struct isp_csi2_ctrl_cfg *ctrl = &csi2->ctrl;
1146
1147	/*
1148	 * The ISP core doesn't support pipelines with multiple video outputs.
1149	 * Revisit this when it will be implemented, and return -EBUSY for now.
1150	 */
1151
1152	switch (local->index | media_entity_type(remote->entity)) {
1153	case CSI2_PAD_SOURCE | MEDIA_ENT_T_DEVNODE:
1154		if (flags & MEDIA_LNK_FL_ENABLED) {
1155			if (csi2->output & ~CSI2_OUTPUT_MEMORY)
1156				return -EBUSY;
1157			csi2->output |= CSI2_OUTPUT_MEMORY;
1158		} else {
1159			csi2->output &= ~CSI2_OUTPUT_MEMORY;
1160		}
1161		break;
1162
1163	case CSI2_PAD_SOURCE | MEDIA_ENT_T_V4L2_SUBDEV:
1164		if (flags & MEDIA_LNK_FL_ENABLED) {
1165			if (csi2->output & ~CSI2_OUTPUT_CCDC)
1166				return -EBUSY;
1167			csi2->output |= CSI2_OUTPUT_CCDC;
1168		} else {
1169			csi2->output &= ~CSI2_OUTPUT_CCDC;
1170		}
1171		break;
1172
1173	default:
1174		/* Link from camera to CSI2 is fixed... */
1175		return -EINVAL;
1176	}
1177
1178	ctrl->vp_only_enable =
1179		(csi2->output & CSI2_OUTPUT_MEMORY) ? false : true;
1180	ctrl->vp_clk_enable = !!(csi2->output & CSI2_OUTPUT_CCDC);
1181
1182	return 0;
1183}
1184
1185/* media operations */
1186static const struct media_entity_operations csi2_media_ops = {
1187	.link_setup = csi2_link_setup,
1188};
1189
1190/*
1191 * csi2_init_entities - Initialize subdev and media entity.
1192 * @csi2: Pointer to csi2 structure.
1193 * return -ENOMEM or zero on success
1194 */
1195static int csi2_init_entities(struct isp_csi2_device *csi2)
1196{
1197	struct v4l2_subdev *sd = &csi2->subdev;
1198	struct media_pad *pads = csi2->pads;
1199	struct media_entity *me = &sd->entity;
1200	int ret;
1201
1202	v4l2_subdev_init(sd, &csi2_ops);
1203	sd->internal_ops = &csi2_internal_ops;
1204	strlcpy(sd->name, "OMAP3 ISP CSI2a", sizeof(sd->name));
1205
1206	sd->grp_id = 1 << 16;	/* group ID for isp subdevs */
1207	v4l2_set_subdevdata(sd, csi2);
1208	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1209
1210	pads[CSI2_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
1211	pads[CSI2_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
1212
1213	me->ops = &csi2_media_ops;
1214	ret = media_entity_init(me, CSI2_PADS_NUM, pads, 0);
1215	if (ret < 0)
1216		return ret;
1217
1218	csi2_init_formats(sd, NULL);
1219
1220	/* Video device node */
1221	csi2->video_out.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1222	csi2->video_out.ops = &csi2_ispvideo_ops;
1223	csi2->video_out.bpl_alignment = 32;
1224	csi2->video_out.bpl_zero_padding = 1;
1225	csi2->video_out.bpl_max = 0x1ffe0;
1226	csi2->video_out.isp = csi2->isp;
1227	csi2->video_out.capture_mem = PAGE_ALIGN(4096 * 4096) * 3;
1228
1229	ret = omap3isp_video_init(&csi2->video_out, "CSI2a");
1230	if (ret < 0)
1231		return ret;
1232
1233	/* Connect the CSI2 subdev to the video node. */
1234	ret = media_entity_create_link(&csi2->subdev.entity, CSI2_PAD_SOURCE,
1235				       &csi2->video_out.video.entity, 0, 0);
1236	if (ret < 0)
1237		return ret;
1238
1239	return 0;
1240}
1241
1242void omap3isp_csi2_unregister_entities(struct isp_csi2_device *csi2)
1243{
1244	media_entity_cleanup(&csi2->subdev.entity);
1245
1246	v4l2_device_unregister_subdev(&csi2->subdev);
1247	omap3isp_video_unregister(&csi2->video_out);
1248}
1249
1250int omap3isp_csi2_register_entities(struct isp_csi2_device *csi2,
1251				    struct v4l2_device *vdev)
1252{
1253	int ret;
1254
1255	/* Register the subdev and video nodes. */
1256	ret = v4l2_device_register_subdev(vdev, &csi2->subdev);
1257	if (ret < 0)
1258		goto error;
1259
1260	ret = omap3isp_video_register(&csi2->video_out, vdev);
1261	if (ret < 0)
1262		goto error;
1263
1264	return 0;
1265
1266error:
1267	omap3isp_csi2_unregister_entities(csi2);
1268	return ret;
1269}
1270
1271/* -----------------------------------------------------------------------------
1272 * ISP CSI2 initialisation and cleanup
1273 */
1274
1275/*
1276 * omap3isp_csi2_cleanup - Routine for module driver cleanup
1277 */
1278void omap3isp_csi2_cleanup(struct isp_device *isp)
1279{
1280}
1281
1282/*
1283 * omap3isp_csi2_init - Routine for module driver init
1284 */
1285int omap3isp_csi2_init(struct isp_device *isp)
1286{
1287	struct isp_csi2_device *csi2a = &isp->isp_csi2a;
1288	struct isp_csi2_device *csi2c = &isp->isp_csi2c;
1289	int ret;
1290
1291	csi2a->isp = isp;
1292	csi2a->available = 1;
1293	csi2a->regs1 = OMAP3_ISP_IOMEM_CSI2A_REGS1;
1294	csi2a->regs2 = OMAP3_ISP_IOMEM_CSI2A_REGS2;
1295	csi2a->phy = &isp->isp_csiphy2;
1296	csi2a->state = ISP_PIPELINE_STREAM_STOPPED;
1297	init_waitqueue_head(&csi2a->wait);
1298
1299	ret = csi2_init_entities(csi2a);
1300	if (ret < 0)
1301		goto fail;
1302
1303	if (isp->revision == ISP_REVISION_15_0) {
1304		csi2c->isp = isp;
1305		csi2c->available = 1;
1306		csi2c->regs1 = OMAP3_ISP_IOMEM_CSI2C_REGS1;
1307		csi2c->regs2 = OMAP3_ISP_IOMEM_CSI2C_REGS2;
1308		csi2c->phy = &isp->isp_csiphy1;
1309		csi2c->state = ISP_PIPELINE_STREAM_STOPPED;
1310		init_waitqueue_head(&csi2c->wait);
1311	}
1312
1313	return 0;
1314fail:
1315	omap3isp_csi2_cleanup(isp);
1316	return ret;
1317}