kernel-brax3-ubuntu-touch/drivers/misc/mediatek/imgsensor/src-v4l2/adaptor-common-ctrl.c
erascape f319b992b1 kernel-5.15: Initial import brax3 UT kernel
* halium configs enabled

Signed-off-by: erascape <erascape@proton.me>
2025-09-23 15:17:10 +00:00

192 lines
4.2 KiB
C

// SPDX-License-Identifier: GPL-2.0
// Copyright (c) 2021 MediaTek Inc.
#include "kd_imgsensor_define_v4l2.h"
#include "imgsensor-user.h"
#include "adaptor.h"
#include "adaptor-common-ctrl.h"
#define USER_DESC_TO_IMGSENSOR_ENUM(DESC) \
(DESC - VC_STAGGER_NE + \
IMGSENSOR_STAGGER_EXPOSURE_LE)
#define IS_HDR_STAGGER(DESC) \
((DESC >= VC_STAGGER_NE) && \
(DESC <= VC_STAGGER_SE))
int g_stagger_info(struct adaptor_ctx *ctx,
int scenario,
struct mtk_stagger_info *info)
{
int ret = 0;
struct mtk_mbus_frame_desc fd = {0};
int hdr_cnt = 0;
unsigned int i = 0;
if (!info)
return 0;
if (info->scenario_id != SENSOR_SCENARIO_ID_NONE)
scenario = info->scenario_id;
// dev_info(ctx->dev, " %s scenario %d %d\n", __func__, scenario, info->scenario_id);
ret = subdrv_call(ctx, get_frame_desc, scenario, &fd);
if (!ret) {
for (i = 0; i < fd.num_entries; ++i) {
u16 udd =
fd.entry[i].bus.csi2.user_data_desc;
if (IS_HDR_STAGGER(udd)) {
hdr_cnt++;
info->order[i] = USER_DESC_TO_IMGSENSOR_ENUM(udd);
}
}
}
info->count = hdr_cnt;
// dev_info(ctx->dev, " %s after %d %d\n", __func__, info->count, info->scenario_id);
return ret;
}
int g_stagger_scenario(struct adaptor_ctx *ctx,
int scenario,
struct mtk_stagger_target_scenario *info)
{
int ret = 0;
union feature_para para;
u32 len;
if (!ctx || !info)
return 0;
para.u64[0] = scenario;
para.u64[1] = (u64)info->exposure_num;
para.u64[2] = SENSOR_SCENARIO_ID_NONE;
subdrv_call(ctx, feature_control,
SENSOR_FEATURE_GET_STAGGER_TARGET_SCENARIO,
para.u8, &len);
info->target_scenario_id = (u32)para.u64[2];
return ret;
}
u32 g_scenario_exposure_cnt(struct adaptor_ctx *ctx, int scenario)
{
u32 result = 1, len = 0;
union feature_para para;
struct mtk_stagger_info info = {0};
int ret = 0;
para.u64[0] = scenario;
para.u64[1] = 0;
subdrv_call(ctx, feature_control,
SENSOR_FEATURE_GET_EXPOSURE_COUNT_BY_SCENARIO,
para.u8, &len);
if (para.u64[1]) {
result = (u32) para.u64[1];
adaptor_logd(ctx, "scenario exp count = %u\n", result);
return result;
}
info.scenario_id = SENSOR_SCENARIO_ID_NONE;
ret = g_stagger_info(ctx, scenario, &info);
if (!ret) {
/* non-stagger mode, the info count would be 0, it's same as 1 */
if (info.count == 0)
info.count = 1;
result = info.count;
}
adaptor_logd(ctx, "exp count by stagger info = %u\n", result);
return result;
}
int g_max_exposure(struct adaptor_ctx *ctx,
int scenario,
struct mtk_stagger_max_exp_time *info)
{
u32 len = 0;
union feature_para para;
para.u64[0] = scenario;
para.u64[1] = (u64)info->exposure;
para.u64[2] = 0;
subdrv_call(ctx, feature_control,
SENSOR_FEATURE_GET_STAGGER_MAX_EXP_TIME,
para.u8, &len);
info->max_exp_time = (u32)para.u64[2];
return 0;
}
int g_max_exposure_line(struct adaptor_ctx *ctx,
int scenario,
struct mtk_max_exp_line *info)
{
u32 len = 0;
union feature_para para;
para.u64[0] = scenario;
para.u64[1] = (u64)info->exposure;
para.u64[2] = 0;
subdrv_call(ctx, feature_control,
SENSOR_FEATURE_GET_MAX_EXP_LINE,
para.u8, &len);
info->max_exp_line = (u32)para.u64[2];
return 0;
}
u32 g_sensor_margin(struct adaptor_ctx *ctx, unsigned int scenario)
{
union feature_para para;
struct mtk_stagger_info info = {0};
u32 len = 0;
u32 mode_exp_cnt = 1;
// para.u64[0] = ctx->cur_mode->id;
para.u64[0] = scenario;
para.u64[1] = 0;
para.u64[2] = 0;
subdrv_call(ctx, feature_control,
SENSOR_FEATURE_GET_FRAME_CTRL_INFO_BY_SCENARIO,
para.u8, &len);
info.scenario_id = SENSOR_SCENARIO_ID_NONE;
// if (!g_stagger_info(ctx, ctx->cur_mode->id, &info))
if (!g_stagger_info(ctx, scenario, &info))
mode_exp_cnt = info.count;
/* no vc info case, it is 1 exposure */
if (mode_exp_cnt == 0)
mode_exp_cnt = 1;
return (para.u64[2] * mode_exp_cnt);
}
u32 g_sensor_fine_integ_line(struct adaptor_ctx *ctx,
const unsigned int scenario)
{
union feature_para para;
u32 fine_integ_line = 0;
u32 len = 0;
// para.u64[0] = ctx->cur_mode->id;
para.u64[0] = scenario;
para.u64[1] = (u64)&fine_integ_line;
subdrv_call(ctx, feature_control,
SENSOR_FEATURE_GET_FINE_INTEG_LINE_BY_SCENARIO,
para.u8, &len);
return fine_integ_line;
}