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
3672f2a7686cd37324ba5b5111ab294d307f1df50dSylwester Nawrocki#define FIMC_IS_FW_FILENAME		"exynos4_fimc_is_fw.bin"
3772f2a7686cd37324ba5b5111ab294d307f1df50dSylwester Nawrocki#define FIMC_IS_SETFILE_6A3		"exynos4_s5k6a3_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
42d265d9ac6c7c3201f0fea737cdf9c74e50415178Sylwester Nawrocki#define FIMC_IS_SENSORS_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_ISP,
779a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_DRC,
789a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_FD,
799a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_MCUISP,
809a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_UART,
819a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_GATE_CLKS_MAX,
829a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_ISP_DIV0 = ISS_GATE_CLKS_MAX,
839a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_ISP_DIV1,
849a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_MCUISP_DIV0,
859a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_MCUISP_DIV1,
869a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_ACLK200,
879a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_ACLK200_DIV,
889a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_ACLK400MCUISP,
899a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLK_ACLK400MCUISP_DIV,
909a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	ISS_CLKS_MAX
919a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
929a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
939a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki/* The driver's internal state flags */
949a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockienum {
959a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_IDLE,
969a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_PWR_ON,
979a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_A5_PWR_ON,
989a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_FW_LOADED,
999a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_OPEN_SENSOR,
1009a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_SETFILE_LOADED,
1019a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_INIT_DONE,
1029a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_STREAM_ON,
1039a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_STREAM_OFF,
1049a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_CHANGE_MODE,
1059a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_BLOCK_CMD_CLEARED,
1069a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_SET_ZOOM,
1079a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_PWR_SUBIP_ON,
1089a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_ST_END,
1099a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1109a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1119a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockienum af_state {
1129a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_IDLE		= 0,
1139a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_SETCONFIG	= 1,
1149a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_RUNNING	= 2,
1159a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_LOCK		= 3,
1169a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_ABORT	= 4,
1179a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_FAILED	= 5,
1189a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1199a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1209a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockienum af_lock_state {
1219a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_UNLOCKED	= 0,
1229a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AF_LOCKED	= 2
1239a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1249a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1259a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockienum ae_lock_state {
1269a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AE_UNLOCKED	= 0,
1279a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AE_LOCKED	= 1
1289a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1299a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1309a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockienum awb_lock_state {
1319a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AWB_UNLOCKED	= 0,
1329a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	FIMC_IS_AWB_LOCKED	= 1
1339a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1349a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1359a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockienum {
1369a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_METERING_CONFIG_CMD,
1379a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_METERING_CONFIG_WIN_POS_X,
1389a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_METERING_CONFIG_WIN_POS_Y,
1399a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_METERING_CONFIG_WIN_WIDTH,
1409a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_METERING_CONFIG_WIN_HEIGHT,
1419a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	IS_METERING_CONFIG_MAX
1429a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1439a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1449a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct is_setfile {
1459a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	const struct firmware *info;
1469a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	int state;
1479a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 sub_index;
1489a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 base;
1499a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	size_t size;
1509a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1519a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1529a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct is_fd_result_header {
1539a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 offset;
1549a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 count;
1559a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 index;
1569a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 curr_index;
1579a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 width;
1589a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 height;
1599a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1609a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1619a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct is_af_info {
1629a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 mode;
1639a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 af_state;
1649a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 af_lock_state;
1659a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 ae_lock_state;
1669a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 awb_lock_state;
1679a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 pos_x;
1689a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 pos_y;
1699a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 prev_pos_x;
1709a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 prev_pos_y;
1719a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 use_af;
1729a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1739a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1749a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct fimc_is_firmware {
1759a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	const struct firmware *f_w;
1769a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1779a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	dma_addr_t paddr;
1789a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	void *vaddr;
1799a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	unsigned int size;
1809a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1819a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	char info[FIMC_IS_FW_INFO_LEN + 1];
1829a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	char version[FIMC_IS_FW_VER_LEN + 1];
1839a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	char setfile_info[FIMC_IS_SETFILE_INFO_LEN + 1];
1849a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u8 state;
1859a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1869a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1879a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct fimc_is_memory {
1889a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	/* physical base address */
1899a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	dma_addr_t paddr;
1909a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	/* virtual base address */
1919a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	void *vaddr;
1929a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	/* total length */
1939a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	unsigned int size;
1949a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
1959a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1969a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_I2H_MAX_ARGS	12
1979a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
1989a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct i2h_cmd {
1999a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 cmd;
2009a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 sensor_id;
2019a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 num_args;
2029a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 args[FIMC_IS_I2H_MAX_ARGS];
2039a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
2049a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2059a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct h2i_cmd {
2069a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u16 cmd_type;
2079a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 entry_id;
2089a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
2099a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2109a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_DEBUG_MSG	0x3f
2119a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#define FIMC_IS_DEBUG_LEVEL	3
2129a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2139a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct fimc_is_setfile {
2149a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	const struct firmware *info;
2159a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	unsigned int state;
2169a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	unsigned int size;
2179a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 sub_index;
2189a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u32 base;
2199a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
2209a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2213530ef0a6ea56636b23b5a15ff645632f7596c04Sylwester Nawrockistruct chain_config {
2229a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct global_param	global;
2239a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct sensor_param	sensor;
2249a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct isp_param	isp;
2259a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct drc_param	drc;
2269a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct fd_param		fd;
2279a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2280e761b21b9d6c7a95a8e2b858af85d07f6c62d99Phil Carmody	unsigned long		p_region_index[2];
2299a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
2309a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2319a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki/**
2329a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * struct fimc_is - fimc-is data structure
2339a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @pdev: pointer to FIMC-IS platform device
2349a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @pctrl: pointer to pinctrl structure for this device
2359a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @v4l2_dev: pointer to top the level v4l2_device
2369a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @alloc_ctx: videobuf2 memory allocator context
2379a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @lock: mutex serializing video device and the subdev operations
2389a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @slock: spinlock protecting this data structure and the hw registers
2399a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @clocks: FIMC-LITE gate clock
2409a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @regs: MCUCTL mmapped registers region
2419a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @pmu_regs: PMU ISP mmapped registers region
2429a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @irq_queue: interrupt handling waitqueue
2439a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @lpm: low power mode flag
2449a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki * @state: internal driver's state flags
2459a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki */
2469a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistruct fimc_is {
2479a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct platform_device		*pdev;
2489a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct pinctrl			*pctrl;
2499a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct v4l2_device		*v4l2_dev;
2509a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2519a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct fimc_is_firmware		fw;
2529a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct fimc_is_memory		memory;
2539a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct firmware			*f_w;
2549a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2559a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct fimc_isp			isp;
256d265d9ac6c7c3201f0fea737cdf9c74e50415178Sylwester Nawrocki	struct fimc_is_sensor		sensor[FIMC_IS_SENSORS_NUM];
2579a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct fimc_is_setfile		setfile;
2589a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2599a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct vb2_alloc_ctx		*alloc_ctx;
2609a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct v4l2_ctrl_handler	ctrl_handler;
2619a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2629a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct mutex			lock;
2639a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	spinlock_t			slock;
2649a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2659a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct clk			*clocks[ISS_CLKS_MAX];
2669a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	void __iomem			*regs;
2679a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	void __iomem			*pmu_regs;
2689a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	int				irq;
2699a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	wait_queue_head_t		irq_queue;
2709a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	u8				lpm;
2719a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2729a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	unsigned long			state;
2739a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	unsigned int			sensor_index;
2749a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2759a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct i2h_cmd			i2h_cmd;
2769a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct h2i_cmd			h2i_cmd;
2779a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct is_fd_result_header	fd_header;
2789a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2793530ef0a6ea56636b23b5a15ff645632f7596c04Sylwester Nawrocki	struct chain_config		config[IS_SC_MAX];
2803530ef0a6ea56636b23b5a15ff645632f7596c04Sylwester Nawrocki	unsigned			config_index;
2813530ef0a6ea56636b23b5a15ff645632f7596c04Sylwester Nawrocki
2829a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct is_region		*is_p_region;
2839a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	dma_addr_t			is_dma_p_region;
2849a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct is_share_region		*is_shared_region;
2859a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct is_af_info		af;
2869a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2879a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	struct dentry			*debugfs_entry;
2889a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki};
2899a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
2909a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline struct fimc_is *fimc_isp_to_is(struct fimc_isp *isp)
2919a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
2929a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	return container_of(isp, struct fimc_is, isp);
2939a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
2949a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
29534947b8aebe3f2d4eceb65fceafa92bf8dc97d96Sylwester Nawrockistatic inline struct chain_config *__get_curr_is_config(struct fimc_is *is)
29634947b8aebe3f2d4eceb65fceafa92bf8dc97d96Sylwester Nawrocki{
29734947b8aebe3f2d4eceb65fceafa92bf8dc97d96Sylwester Nawrocki	return &is->config[is->config_index];
29834947b8aebe3f2d4eceb65fceafa92bf8dc97d96Sylwester Nawrocki}
29934947b8aebe3f2d4eceb65fceafa92bf8dc97d96Sylwester Nawrocki
3009a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline void fimc_is_mem_barrier(void)
3019a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
3029a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	mb();
3039a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3049a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3059a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline void fimc_is_set_param_bit(struct fimc_is *is, int num)
3069a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
3073530ef0a6ea56636b23b5a15ff645632f7596c04Sylwester Nawrocki	struct chain_config *cfg = &is->config[is->config_index];
3089a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3090e761b21b9d6c7a95a8e2b858af85d07f6c62d99Phil Carmody	set_bit(num, &cfg->p_region_index[0]);
3109a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3119a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3129a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline void fimc_is_set_param_ctrl_cmd(struct fimc_is *is, int cmd)
3139a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
3149a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	is->is_p_region->parameter.isp.control.cmd = cmd;
3159a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3169a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3179a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline void mcuctl_write(u32 v, struct fimc_is *is, unsigned int offset)
3189a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
3199a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	writel(v, is->regs + offset);
3209a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3219a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3229a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline u32 mcuctl_read(struct fimc_is *is, unsigned int offset)
3239a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
3249a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	return readl(is->regs + offset);
3259a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3269a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3279a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline void pmuisp_write(u32 v, struct fimc_is *is, unsigned int offset)
3289a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
3299a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	writel(v, is->pmu_regs + offset);
3309a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3319a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3329a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockistatic inline u32 pmuisp_read(struct fimc_is *is, unsigned int offset)
3339a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki{
3349a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki	return readl(is->pmu_regs + offset);
3359a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki}
3369a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3379a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockiint fimc_is_wait_event(struct fimc_is *is, unsigned long bit,
3389a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki		       unsigned int state, unsigned int timeout);
3399a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockiint fimc_is_cpu_set_power(struct fimc_is *is, int on);
3409a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockiint fimc_is_start_firmware(struct fimc_is *is);
3419a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockiint fimc_is_hw_initialize(struct fimc_is *is);
3429a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrockivoid fimc_is_log_dump(const char *level, const void *buf, size_t len);
3439a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki
3449a761e436843f228eaa2decda6d2c6dbd5ef1480Sylwester Nawrocki#endif /* FIMC_IS_H_ */
345