1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2026 Renesas Electronics Corp. 4 * Copyright (C) 2026 Ideas on Board Oy 5 * Copyright (C) 2026 Ragnatech AB 6 */ 7 8 #include "rpp_module.h" 9 10 #define GAMMA_OUT_VERSION_REG 0x0000 11 12 #define GAMMA_OUT_ENABLE_REG 0x0004 13 #define GAMMA_OUT_ENABLE_GAMMA_OUT_EN BIT(0) 14 15 #define GAMMA_OUT_MODE_REG 0x0008 16 #define GAMMA_OUT_MODE_GAMMA_OUT_EQU_SEGM BIT(0) 17 18 #define GAMMA_OUT_Y_REG(n) (0x000c + (4 * (n))) 19 20 #define GAMMA_OUT_HV_GAMMA_CURVE_MASK GENMASK(11, 0) 21 #define GAMMA_OUT_MV_GAMMA_CURVE_MASK GENMASK(23, 0) 22 23 static int rppx1_ga_probe(struct rpp_module *mod) 24 { 25 /* Version check. */ 26 switch (rpp_module_read(mod, GAMMA_OUT_VERSION_REG)) { 27 case 1: 28 /* 12-bit. */ 29 break; 30 case 2: 31 /* 24-bit. */ 32 break; 33 default: 34 return -EINVAL; 35 } 36 37 return 0; 38 } 39 40 static int rppx1_ga_start(struct rpp_module *mod, 41 const struct v4l2_mbus_framefmt *fmt) 42 { 43 /* Disable stage. */ 44 rpp_module_write(mod, GAMMA_OUT_ENABLE_REG, 0); 45 46 return 0; 47 } 48 49 static int 50 rppx1_ga_fill_params(struct rpp_module *mod, 51 const union rppx1_params_block *block, 52 rppx1_reg_write write, void *priv) 53 { 54 const struct rppx1_ga_params *cfg = &block->ga; 55 u32 mask; 56 57 /* If the modules is disabled, simply bypass it. */ 58 if (cfg->header.flags & V4L2_ISP_PARAMS_FL_BLOCK_DISABLE) { 59 write(priv, mod->base + GAMMA_OUT_ENABLE_REG, 0); 60 return 0; 61 } 62 63 switch (cfg->header.type) { 64 case RPPX1_PARAMS_BLOCK_TYPE_GA_HV: 65 mask = GAMMA_OUT_HV_GAMMA_CURVE_MASK; 66 break; 67 case RPPX1_PARAMS_BLOCK_TYPE_GA_MV: 68 mask = GAMMA_OUT_MV_GAMMA_CURVE_MASK; 69 break; 70 default: 71 return -EINVAL; 72 } 73 74 write(priv, mod->base + GAMMA_OUT_MODE_REG, cfg->mode); 75 76 for (unsigned int i = 0; i < RPPX1_GA_MAX_SAMPLES; i++) 77 write(priv, mod->base + GAMMA_OUT_Y_REG(i), 78 cfg->gamma_y[i] & mask); 79 80 /* Enable module. */ 81 write(priv, mod->base + GAMMA_OUT_ENABLE_REG, 82 GAMMA_OUT_ENABLE_GAMMA_OUT_EN); 83 84 return 0; 85 } 86 87 const struct rpp_module_ops rppx1_ga_ops = { 88 .probe = rppx1_ga_probe, 89 .start = rppx1_ga_start, 90 .fill_params = rppx1_ga_fill_params, 91 }; 92