fimc-is.h revision 0e761b21b9d6c7a95a8e2b858af85d07f6c62d99
19a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki/*
29a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * Samsung EXYNOS4x12 FIMC-IS (Imaging Subsystem) driver
39a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki *
49a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * Copyright (C) 2013 Samsung Electronics Co., Ltd.
59a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki *
69a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * Authors: Younghwan Joo <yhwan.joo@samsung.com>
79a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki *          Sylwester Nawrocki <s.nawrocki@samsung.com>
89a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki *
99a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * This program is free software; you can redistribute it and/or modify
109a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * it under the terms of the GNU General Public License version 2 as
119a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * published by the Free Software Foundation.
129a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki */
139a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#ifndef FIMC_IS_H_
149a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_H_
159a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
169a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include <asm/barrier.h>
179a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include <linux/clk.h>
189a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include <linux/device.h>
199a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include <linux/kernel.h>
209a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include <linux/pinctrl/consumer.h>
219a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include <linux/platform_device.h>
229a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include <linux/sizes.h>
239a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include <linux/spinlock.h>
249a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include <linux/types.h>
259a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include <media/videobuf2-core.h>
269a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include <media/v4l2-ctrls.h>
279a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
289a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include "fimc-isp.h"
299a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include "fimc-is-command.h"
309a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include "fimc-is-sensor.h"
319a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include "fimc-is-param.h"
329a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#include "fimc-is-regs.h"
339a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
349a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_DRV_NAME		"exynos4-fimc-is"
359a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
369a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_FW_FILENAME		"fimc_is_fw.bin"
379a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_SETFILE_6A3		"setfile.bin"
389a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
399a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_FW_LOAD_TIMEOUT		1000 /* ms */
409a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_POWER_ON_TIMEOUT	1000 /* us */
419a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
429a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_SENSOR_NUM		2
439a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
449a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki/* Memory definitions */
459a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_CPU_MEM_SIZE		(0xa00000)
469a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_CPU_BASE_MASK		((1 << 26) - 1)
479a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_REGION_SIZE		0x5000
489a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
499a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_DEBUG_REGION_OFFSET	0x0084b000
509a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_SHARED_REGION_OFFSET	0x008c0000
519a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_FW_INFO_LEN		31
529a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_FW_VER_LEN		7
539a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_FW_DESC_LEN		(FIMC_IS_FW_INFO_LEN + \
549a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki					 FIMC_IS_FW_VER_LEN)
559a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_SETFILE_INFO_LEN	39
569a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
579a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_EXTRA_MEM_SIZE		(FIMC_IS_EXTRA_FW_SIZE + \
589a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki					 FIMC_IS_EXTRA_SETFILE_SIZE + 0x1000)
599a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_EXTRA_FW_SIZE		0x180000
609a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_EXTRA_SETFILE_SIZE	0x4b000
619a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
629a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki/* TODO: revisit */
639a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_FW_ADDR_MASK		((1 << 26) - 1)
649a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_FW_SIZE_MAX		(SZ_4M)
659a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_FW_SIZE_MIN		(SZ_32K)
669a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
679a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define ATCLK_MCUISP_FREQUENCY		100000000UL
689a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define ACLK_AXI_FREQUENCY		100000000UL
699a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
709a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockienum {
719a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_PPMUISPX,
729a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_PPMUISPMX,
739a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_LITE0,
749a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_LITE1,
759a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_MPLL,
769a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_SYSREG,
779a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_ISP,
789a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_DRC,
799a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_FD,
809a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_MCUISP,
819a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_UART,
829a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_GATE_CLKS_MAX,
839a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_ISP_DIV0 = ISS_GATE_CLKS_MAX,
849a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_ISP_DIV1,
859a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_MCUISP_DIV0,
869a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_MCUISP_DIV1,
879a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_ACLK200,
889a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_ACLK200_DIV,
899a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_ACLK400MCUISP,
909a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_ACLK400MCUISP_DIV,
919a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLKS_MAX
929a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
939a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
949a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki/* The driver's internal state flags */
959a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockienum {
969a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_IDLE,
979a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_PWR_ON,
989a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_A5_PWR_ON,
999a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_FW_LOADED,
1009a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_OPEN_SENSOR,
1019a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_SETFILE_LOADED,
1029a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_INIT_DONE,
1039a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_STREAM_ON,
1049a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_STREAM_OFF,
1059a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_CHANGE_MODE,
1069a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_BLOCK_CMD_CLEARED,
1079a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_SET_ZOOM,
1089a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_PWR_SUBIP_ON,
1099a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_END,
1109a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1119a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1129a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockienum af_state {
1139a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_IDLE		= 0,
1149a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_SETCONFIG	= 1,
1159a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_RUNNING	= 2,
1169a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_LOCK		= 3,
1179a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_ABORT	= 4,
1189a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_FAILED	= 5,
1199a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1209a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1219a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockienum af_lock_state {
1229a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_UNLOCKED	= 0,
1239a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_LOCKED	= 2
1249a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1259a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1269a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockienum ae_lock_state {
1279a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AE_UNLOCKED	= 0,
1289a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AE_LOCKED	= 1
1299a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1309a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1319a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockienum awb_lock_state {
1329a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AWB_UNLOCKED	= 0,
1339a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AWB_LOCKED	= 1
1349a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1359a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1369a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockienum {
1379a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_METERING_CONFIG_CMD,
1389a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_METERING_CONFIG_WIN_POS_X,
1399a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_METERING_CONFIG_WIN_POS_Y,
1409a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_METERING_CONFIG_WIN_WIDTH,
1419a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_METERING_CONFIG_WIN_HEIGHT,
1429a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_METERING_CONFIG_MAX
1439a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1449a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1459a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct is_setfile {
1469a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	const struct firmware *info;
1479a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	int state;
1489a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 sub_index;
1499a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 base;
1509a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	size_t size;
1519a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1529a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1539a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct is_fd_result_header {
1549a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 offset;
1559a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 count;
1569a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 index;
1579a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 curr_index;
1589a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 width;
1599a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 height;
1609a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1619a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1629a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct is_af_info {
1639a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 mode;
1649a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 af_state;
1659a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 af_lock_state;
1669a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 ae_lock_state;
1679a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 awb_lock_state;
1689a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 pos_x;
1699a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 pos_y;
1709a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 prev_pos_x;
1719a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 prev_pos_y;
1729a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 use_af;
1739a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1749a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1759a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct fimc_is_firmware {
1769a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	const struct firmware *f_w;
1779a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1789a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	dma_addr_t paddr;
1799a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	void *vaddr;
1809a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	unsigned int size;
1819a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1829a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	char info[FIMC_IS_FW_INFO_LEN + 1];
1839a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	char version[FIMC_IS_FW_VER_LEN + 1];
1849a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	char setfile_info[FIMC_IS_SETFILE_INFO_LEN + 1];
1859a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u8 state;
1869a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1879a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1889a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct fimc_is_memory {
1899a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	/* physical base address */
1909a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	dma_addr_t paddr;
1919a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	/* virtual base address */
1929a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	void *vaddr;
1939a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	/* total length */
1949a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	unsigned int size;
1959a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1969a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1979a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_I2H_MAX_ARGS	12
1989a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1999a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct i2h_cmd {
2009a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 cmd;
2019a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 sensor_id;
2029a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 num_args;
2039a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 args[FIMC_IS_I2H_MAX_ARGS];
2049a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
2059a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2069a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct h2i_cmd {
2079a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 cmd_type;
2089a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 entry_id;
2099a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
2109a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2119a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_DEBUG_MSG	0x3f
2129a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_DEBUG_LEVEL	3
2139a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2149a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct fimc_is_setfile {
2159a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	const struct firmware *info;
2169a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	unsigned int state;
2179a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	unsigned int size;
2189a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 sub_index;
2199a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 base;
2209a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
2219a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2223530ef0a6ea56636b23b5a15ff645632f7596c04Sylwester Nawrockistruct chain_config {
2239a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct global_param	global;
2249a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct sensor_param	sensor;
2259a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct isp_param	isp;
2269a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct drc_param	drc;
2279a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct fd_param		fd;
2289a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2290e761b21b9d6c7a95a8e2b858af85d07f6c62d99Phil Carmody	unsigned long		p_region_index[2];
2309a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
2319a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2329a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki/**
2339a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * struct fimc_is - fimc-is data structure
2349a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @pdev: pointer to FIMC-IS platform device
2359a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @pctrl: pointer to pinctrl structure for this device
2369a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @v4l2_dev: pointer to top the level v4l2_device
2379a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @alloc_ctx: videobuf2 memory allocator context
2389a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @lock: mutex serializing video device and the subdev operations
2399a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @slock: spinlock protecting this data structure and the hw registers
2409a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @clocks: FIMC-LITE gate clock
2419a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @regs: MCUCTL mmapped registers region
2429a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @pmu_regs: PMU ISP mmapped registers region
2439a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @irq_queue: interrupt handling waitqueue
2449a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @lpm: low power mode flag
2459a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @state: internal driver's state flags
2469a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki */
2479a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct fimc_is {
2489a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct platform_device		*pdev;
2499a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct pinctrl			*pctrl;
2509a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct v4l2_device		*v4l2_dev;
2519a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2529a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct fimc_is_firmware		fw;
2539a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct fimc_is_memory		memory;
2549a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct firmware			*f_w;
2559a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2569a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct fimc_isp			isp;
2579a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct fimc_is_sensor		*sensor;
2589a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct fimc_is_setfile		setfile;
2599a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2609a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct vb2_alloc_ctx		*alloc_ctx;
2619a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct v4l2_ctrl_handler	ctrl_handler;
2629a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2639a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct mutex			lock;
2649a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	spinlock_t			slock;
2659a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2669a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct clk			*clocks[ISS_CLKS_MAX];
2679a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	bool				clk_init;
2689a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	void __iomem			*regs;
2699a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	void __iomem			*pmu_regs;
2709a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	int				irq;
2719a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	wait_queue_head_t		irq_queue;
2729a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u8				lpm;
2739a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2749a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	unsigned long			state;
2759a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	unsigned int			sensor_index;
2769a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2779a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct i2h_cmd			i2h_cmd;
2789a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct h2i_cmd			h2i_cmd;
2799a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct is_fd_result_header	fd_header;
2809a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2813530ef0a6ea56636b23b5a15ff645632f7596c04Sylwester Nawrocki	struct chain_config		config[IS_SC_MAX];
2823530ef0a6ea56636b23b5a15ff645632f7596c04Sylwester Nawrocki	unsigned			config_index;
2833530ef0a6ea56636b23b5a15ff645632f7596c04Sylwester Nawrocki
2849a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct is_region		*is_p_region;
2859a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	dma_addr_t			is_dma_p_region;
2869a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct is_share_region		*is_shared_region;
2879a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct is_af_info		af;
2889a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2899a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct dentry			*debugfs_entry;
2909a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
2919a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2929a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline struct fimc_is *fimc_isp_to_is(struct fimc_isp *isp)
2939a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
2949a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	return container_of(isp, struct fimc_is, isp);
2959a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
2969a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2979a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline void fimc_is_mem_barrier(void)
2989a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
2999a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	mb();
3009a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3019a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3029a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline void fimc_is_set_param_bit(struct fimc_is *is, int num)
3039a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
3043530ef0a6ea56636b23b5a15ff645632f7596c04Sylwester Nawrocki	struct chain_config *cfg = &is->config[is->config_index];
3059a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3060e761b21b9d6c7a95a8e2b858af85d07f6c62d99Phil Carmody	set_bit(num, &cfg->p_region_index[0]);
3079a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3089a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3099a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline void fimc_is_set_param_ctrl_cmd(struct fimc_is *is, int cmd)
3109a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
3119a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	is->is_p_region->parameter.isp.control.cmd = cmd;
3129a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3139a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3149a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline void mcuctl_write(u32 v, struct fimc_is *is, unsigned int offset)
3159a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
3169a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	writel(v, is->regs + offset);
3179a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3189a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3199a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline u32 mcuctl_read(struct fimc_is *is, unsigned int offset)
3209a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
3219a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	return readl(is->regs + offset);
3229a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3239a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3249a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline void pmuisp_write(u32 v, struct fimc_is *is, unsigned int offset)
3259a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
3269a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	writel(v, is->pmu_regs + offset);
3279a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3289a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3299a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline u32 pmuisp_read(struct fimc_is *is, unsigned int offset)
3309a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
3319a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	return readl(is->pmu_regs + offset);
3329a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3339a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3349a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockiint fimc_is_wait_event(struct fimc_is *is, unsigned long bit,
3359a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki		       unsigned int state, unsigned int timeout);
3369a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockiint fimc_is_cpu_set_power(struct fimc_is *is, int on);
3379a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockiint fimc_is_start_firmware(struct fimc_is *is);
3389a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockiint fimc_is_hw_initialize(struct fimc_is *is);
3399a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockivoid fimc_is_log_dump(const char *level, const void *buf, size_t len);
3409a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3419a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#endif /* FIMC_IS_H_ */
342