1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Samsung EXYNOS4x12 FIMC-IS (Imaging Subsystem) driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2013 Samsung Electronics Co., Ltd. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Authors: Sylwester Nawrocki <s.nawrocki@samsung.com> 8*4882a593Smuzhiyun * Younghwan Joo <yhwan.joo@samsung.com> 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun #ifndef FIMC_IS_REG_H_ 11*4882a593Smuzhiyun #define FIMC_IS_REG_H_ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* WDT_ISP register */ 14*4882a593Smuzhiyun #define REG_WDT_ISP 0x00170000 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* MCUCTL registers base offset */ 17*4882a593Smuzhiyun #define MCUCTL_BASE 0x00180000 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* MCU Controller Register */ 20*4882a593Smuzhiyun #define MCUCTL_REG_MCUCTRL (MCUCTL_BASE + 0x00) 21*4882a593Smuzhiyun #define MCUCTRL_MSWRST (1 << 0) 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* Boot Base Offset Address Register */ 24*4882a593Smuzhiyun #define MCUCTL_REG_BBOAR (MCUCTL_BASE + 0x04) 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* Interrupt Generation Register 0 from Host CPU to VIC */ 27*4882a593Smuzhiyun #define MCUCTL_REG_INTGR0 (MCUCTL_BASE + 0x08) 28*4882a593Smuzhiyun /* __n = 0...9 */ 29*4882a593Smuzhiyun #define INTGR0_INTGC(__n) (1 << ((__n) + 16)) 30*4882a593Smuzhiyun /* __n = 0...5 */ 31*4882a593Smuzhiyun #define INTGR0_INTGD(__n) (1 << (__n)) 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* Interrupt Clear Register 0 from Host CPU to VIC */ 34*4882a593Smuzhiyun #define MCUCTL_REG_INTCR0 (MCUCTL_BASE + 0x0c) 35*4882a593Smuzhiyun /* __n = 0...9 */ 36*4882a593Smuzhiyun #define INTCR0_INTGC(__n) (1 << ((__n) + 16)) 37*4882a593Smuzhiyun /* __n = 0...5 */ 38*4882a593Smuzhiyun #define INTCR0_INTCD(__n) (1 << ((__n) + 16)) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* Interrupt Mask Register 0 from Host CPU to VIC */ 41*4882a593Smuzhiyun #define MCUCTL_REG_INTMR0 (MCUCTL_BASE + 0x10) 42*4882a593Smuzhiyun /* __n = 0...9 */ 43*4882a593Smuzhiyun #define INTMR0_INTMC(__n) (1 << ((__n) + 16)) 44*4882a593Smuzhiyun /* __n = 0...5 */ 45*4882a593Smuzhiyun #define INTMR0_INTMD(__n) (1 << (__n)) 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /* Interrupt Status Register 0 from Host CPU to VIC */ 48*4882a593Smuzhiyun #define MCUCTL_REG_INTSR0 (MCUCTL_BASE + 0x14) 49*4882a593Smuzhiyun /* __n (bit number) = 0...4 */ 50*4882a593Smuzhiyun #define INTSR0_GET_INTSD(x, __n) (((x) >> (__n)) & 0x1) 51*4882a593Smuzhiyun /* __n (bit number) = 0...9 */ 52*4882a593Smuzhiyun #define INTSR0_GET_INTSC(x, __n) (((x) >> ((__n) + 16)) & 0x1) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* Interrupt Mask Status Register 0 from Host CPU to VIC */ 55*4882a593Smuzhiyun #define MCUCTL_REG_INTMSR0 (MCUCTL_BASE + 0x18) 56*4882a593Smuzhiyun /* __n (bit number) = 0...4 */ 57*4882a593Smuzhiyun #define INTMSR0_GET_INTMSD(x, __n) (((x) >> (__n)) & 0x1) 58*4882a593Smuzhiyun /* __n (bit number) = 0...9 */ 59*4882a593Smuzhiyun #define INTMSR0_GET_INTMSC(x, __n) (((x) >> ((__n) + 16)) & 0x1) 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* Interrupt Generation Register 1 from ISP CPU to Host IC */ 62*4882a593Smuzhiyun #define MCUCTL_REG_INTGR1 (MCUCTL_BASE + 0x1c) 63*4882a593Smuzhiyun /* __n = 0...9 */ 64*4882a593Smuzhiyun #define INTGR1_INTGC(__n) (1 << (__n)) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* Interrupt Clear Register 1 from ISP CPU to Host IC */ 67*4882a593Smuzhiyun #define MCUCTL_REG_INTCR1 (MCUCTL_BASE + 0x20) 68*4882a593Smuzhiyun /* __n = 0...9 */ 69*4882a593Smuzhiyun #define INTCR1_INTCC(__n) (1 << (__n)) 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* Interrupt Mask Register 1 from ISP CPU to Host IC */ 72*4882a593Smuzhiyun #define MCUCTL_REG_INTMR1 (MCUCTL_BASE + 0x24) 73*4882a593Smuzhiyun /* __n = 0...9 */ 74*4882a593Smuzhiyun #define INTMR1_INTMC(__n) (1 << (__n)) 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* Interrupt Status Register 1 from ISP CPU to Host IC */ 77*4882a593Smuzhiyun #define MCUCTL_REG_INTSR1 (MCUCTL_BASE + 0x28) 78*4882a593Smuzhiyun /* Interrupt Mask Status Register 1 from ISP CPU to Host IC */ 79*4882a593Smuzhiyun #define MCUCTL_REG_INTMSR1 (MCUCTL_BASE + 0x2c) 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /* Interrupt Clear Register 2 from ISP BLK's interrupts to Host IC */ 82*4882a593Smuzhiyun #define MCUCTL_REG_INTCR2 (MCUCTL_BASE + 0x30) 83*4882a593Smuzhiyun /* __n = 0...5 */ 84*4882a593Smuzhiyun #define INTCR2_INTCC(__n) (1 << ((__n) + 16)) 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* Interrupt Mask Register 2 from ISP BLK's interrupts to Host IC */ 87*4882a593Smuzhiyun #define MCUCTL_REG_INTMR2 (MCUCTL_BASE + 0x34) 88*4882a593Smuzhiyun /* __n = 0...25 */ 89*4882a593Smuzhiyun #define INTMR2_INTMCIS(__n) (1 << (__n)) 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* Interrupt Status Register 2 from ISP BLK's interrupts to Host IC */ 92*4882a593Smuzhiyun #define MCUCTL_REG_INTSR2 (MCUCTL_BASE + 0x38) 93*4882a593Smuzhiyun /* Interrupt Mask Status Register 2 from ISP BLK's interrupts to Host IC */ 94*4882a593Smuzhiyun #define MCUCTL_REG_INTMSR2 (MCUCTL_BASE + 0x3c) 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* General Purpose Output Control Register (0~17) */ 97*4882a593Smuzhiyun #define MCUCTL_REG_GPOCTLR (MCUCTL_BASE + 0x40) 98*4882a593Smuzhiyun /* __n = 0...17 */ 99*4882a593Smuzhiyun #define GPOCTLR_GPOG(__n) (1 << (__n)) 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /* General Purpose Pad Output Enable Register (0~17) */ 102*4882a593Smuzhiyun #define MCUCTL_REG_GPOENCTLR (MCUCTL_BASE + 0x44) 103*4882a593Smuzhiyun /* __n = 0...17 */ 104*4882a593Smuzhiyun #define GPOENCTLR_GPOEN(__n) (1 << (__n)) 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun /* General Purpose Input Control Register (0~17) */ 107*4882a593Smuzhiyun #define MCUCTL_REG_GPICTLR (MCUCTL_BASE + 0x48) 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun /* Shared registers between ISP CPU and the host CPU - ISSRxx */ 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun /* ISSR(1): Command Host -> IS */ 112*4882a593Smuzhiyun /* ISSR(1): Sensor ID for Command, ISSR2...5 = Parameter 1...4 */ 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun /* ISSR(10): Reply IS -> Host */ 115*4882a593Smuzhiyun /* ISSR(11): Sensor ID for Reply, ISSR12...15 = Parameter 1...4 */ 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /* ISSR(20): ISP_FRAME_DONE : SENSOR ID */ 118*4882a593Smuzhiyun /* ISSR(21): ISP_FRAME_DONE : PARAMETER 1 */ 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* ISSR(24): SCALERC_FRAME_DONE : SENSOR ID */ 121*4882a593Smuzhiyun /* ISSR(25): SCALERC_FRAME_DONE : PARAMETER 1 */ 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun /* ISSR(28): 3DNR_FRAME_DONE : SENSOR ID */ 124*4882a593Smuzhiyun /* ISSR(29): 3DNR_FRAME_DONE : PARAMETER 1 */ 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* ISSR(32): SCALERP_FRAME_DONE : SENSOR ID */ 127*4882a593Smuzhiyun /* ISSR(33): SCALERP_FRAME_DONE : PARAMETER 1 */ 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* __n = 0...63 */ 130*4882a593Smuzhiyun #define MCUCTL_REG_ISSR(__n) (MCUCTL_BASE + 0x80 + ((__n) * 4)) 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun /* PMU ISP register offsets */ 133*4882a593Smuzhiyun #define REG_CMU_RESET_ISP_SYS_PWR_REG 0x1174 134*4882a593Smuzhiyun #define REG_CMU_SYSCLK_ISP_SYS_PWR_REG 0x13b8 135*4882a593Smuzhiyun #define REG_PMU_ISP_ARM_SYS 0x1050 136*4882a593Smuzhiyun #define REG_PMU_ISP_ARM_CONFIGURATION 0x2280 137*4882a593Smuzhiyun #define REG_PMU_ISP_ARM_STATUS 0x2284 138*4882a593Smuzhiyun #define REG_PMU_ISP_ARM_OPTION 0x2288 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun void fimc_is_fw_clear_irq1(struct fimc_is *is, unsigned int bit); 141*4882a593Smuzhiyun void fimc_is_fw_clear_irq2(struct fimc_is *is); 142*4882a593Smuzhiyun int fimc_is_hw_get_params(struct fimc_is *is, unsigned int num); 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun void fimc_is_hw_set_intgr0_gd0(struct fimc_is *is); 145*4882a593Smuzhiyun int fimc_is_hw_wait_intmsr0_intmsd0(struct fimc_is *is); 146*4882a593Smuzhiyun void fimc_is_hw_set_sensor_num(struct fimc_is *is); 147*4882a593Smuzhiyun void fimc_is_hw_set_isp_buf_mask(struct fimc_is *is, unsigned int mask); 148*4882a593Smuzhiyun void fimc_is_hw_stream_on(struct fimc_is *is); 149*4882a593Smuzhiyun void fimc_is_hw_stream_off(struct fimc_is *is); 150*4882a593Smuzhiyun int fimc_is_hw_set_param(struct fimc_is *is); 151*4882a593Smuzhiyun int fimc_is_hw_change_mode(struct fimc_is *is); 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun void fimc_is_hw_close_sensor(struct fimc_is *is, unsigned int index); 154*4882a593Smuzhiyun void fimc_is_hw_get_setfile_addr(struct fimc_is *is); 155*4882a593Smuzhiyun void fimc_is_hw_load_setfile(struct fimc_is *is); 156*4882a593Smuzhiyun void fimc_is_hw_subip_power_off(struct fimc_is *is); 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun int fimc_is_itf_s_param(struct fimc_is *is, bool update); 159*4882a593Smuzhiyun int fimc_is_itf_mode_change(struct fimc_is *is); 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun #endif /* FIMC_IS_REG_H_ */ 162