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