From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 11 Dec 2023 08:20:59 +0000 Subject: [PATCH] kernel_5.10 no rt --- kernel/drivers/media/i2c/gc1084.c | 81 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 81 insertions(+), 0 deletions(-) diff --git a/kernel/drivers/media/i2c/gc1084.c b/kernel/drivers/media/i2c/gc1084.c index db95d15..170d1d3 100644 --- a/kernel/drivers/media/i2c/gc1084.c +++ b/kernel/drivers/media/i2c/gc1084.c @@ -136,6 +136,7 @@ const char *module_facing; const char *module_name; const char *len_name; + enum rkmodule_sync_mode sync_mode; u32 cur_vts; bool has_init_exp; @@ -150,6 +151,27 @@ static const s64 link_freq_menu_items[] = { MIPI_FREQ_400M, +}; + +static const struct reg_sequence gc1084_master_mode_regs[] = { + {0x0068, 0x85}, + {0x0d6a, 0x80}, + {0x0069, 0x00}, + {0x006a, 0x02}, + {0x0d69, 0x04}, +}; + +static const struct reg_sequence gc1084_slave_mode_regs[] = { + {0x0d67, 0x00}, + {0x0d69, 0x03}, + {0x0d6a, 0x08}, + {0x0d6b, 0x50}, + {0x0d6c, 0x00}, + {0x0d6d, 0x53}, + {0x0d6e, 0x00}, + {0x0d6f, 0x10}, + {0x0d70, 0x00}, + {0x0d71, 0x12}, }; /* @@ -629,6 +651,7 @@ u32 stream = 0; u64 delay_us = 0; u32 fps = 0; + u32 *sync_mode = NULL; switch (cmd) { case RKMODULE_GET_HDR_CFG: @@ -654,6 +677,14 @@ delay_us = 1000000 / (gc1084->cur_mode->vts_def * fps / gc1084->cur_vts); usleep_range(delay_us, delay_us + 2000); } + break; + case RKMODULE_GET_SYNC_MODE: + sync_mode = (u32 *)arg; + *sync_mode = gc1084->sync_mode; + break; + case RKMODULE_SET_SYNC_MODE: + sync_mode = (u32 *)arg; + gc1084->sync_mode = *sync_mode; break; default: ret = -ENOIOCTLCMD; @@ -686,6 +717,25 @@ } } + if (gc1084->sync_mode == INTERNAL_MASTER_MODE) { + ret = regmap_multi_reg_write(gc1084->regmap, gc1084_master_mode_regs, + ARRAY_SIZE(gc1084_master_mode_regs)); + if (ret) + dev_err(gc1084->dev, + "write internal master mode reg failed %d\n", ret); + } else if (gc1084->sync_mode == EXTERNAL_MASTER_MODE) { + ret = regmap_multi_reg_write(gc1084->regmap, gc1084_slave_mode_regs, + ARRAY_SIZE(gc1084_slave_mode_regs)); + if (ret) + dev_err(gc1084->dev, + "write external master mode reg failed %d\n", ret); + } else if (gc1084->sync_mode == SLAVE_MODE) { + ret = regmap_multi_reg_write(gc1084->regmap, gc1084_slave_mode_regs, + ARRAY_SIZE(gc1084_slave_mode_regs)); + if (ret) + dev_err(gc1084->dev, "write slave mode reg failed %d\n", ret); + } + return gc1084_write_reg(gc1084, GC1084_REG_CTRL_MODE, GC1084_MODE_STREAMING); } @@ -707,6 +757,7 @@ struct preisp_hdrae_exp_s *hdrae; long ret = 0; u32 stream = 0; + u32 sync_mode; switch (cmd) { case RKMODULE_GET_MODULE_INFO: @@ -771,6 +822,21 @@ ret = copy_from_user(&stream, up, sizeof(u32)); if (!ret) ret = gc1084_ioctl(sd, cmd, &stream); + else + ret = -EFAULT; + break; + case RKMODULE_GET_SYNC_MODE: + ret = gc1084_ioctl(sd, cmd, &sync_mode); + if (!ret) { + ret = copy_to_user(up, &sync_mode, sizeof(u32)); + if (ret) + ret = -EFAULT; + } + break; + case RKMODULE_SET_SYNC_MODE: + ret = copy_from_user(&sync_mode, up, sizeof(u32)); + if (!ret) + ret = gc1084_ioctl(sd, cmd, &sync_mode); else ret = -EFAULT; break; @@ -1096,6 +1162,7 @@ struct v4l2_subdev *sd; char facing[2]; int ret; + const char *sync_mode_name = NULL; dev_info(dev, "driver version: %02x.%02x.%02x", DRIVER_VERSION >> 16, @@ -1126,6 +1193,20 @@ return -EINVAL; } + ret = of_property_read_string(node, RKMODULE_CAMERA_SYNC_MODE, + &sync_mode_name); + if (ret) { + gc1084->sync_mode = NO_SYNC_MODE; + dev_err(dev, "could not get sync mode!\n"); + } else { + if (strcmp(sync_mode_name, RKMODULE_EXTERNAL_MASTER_MODE) == 0) + gc1084->sync_mode = EXTERNAL_MASTER_MODE; + else if (strcmp(sync_mode_name, RKMODULE_INTERNAL_MASTER_MODE) == 0) + gc1084->sync_mode = INTERNAL_MASTER_MODE; + else if (strcmp(sync_mode_name, RKMODULE_SLAVE_MODE) == 0) + gc1084->sync_mode = SLAVE_MODE; + } + gc1084->xvclk = devm_clk_get(gc1084->dev, "xvclk"); if (IS_ERR(gc1084->xvclk)) { dev_err(gc1084->dev, "Failed to get xvclk\n"); -- Gitblit v1.6.2