From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Wed, 03 Jan 2024 09:43:39 +0000 Subject: [PATCH] update kernel to 5.10.198 --- kernel/drivers/media/i2c/sc223a.c | 322 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 297 insertions(+), 25 deletions(-) diff --git a/kernel/drivers/media/i2c/sc223a.c b/kernel/drivers/media/i2c/sc223a.c index e578ac9..fd82b3e 100644 --- a/kernel/drivers/media/i2c/sc223a.c +++ b/kernel/drivers/media/i2c/sc223a.c @@ -40,6 +40,8 @@ #define PIXEL_RATE_WITH_405M_10BIT (SC223A_LINK_FREQ_405 * 2 * \ SC223A_LANES / SC223A_BITS_PER_SAMPLE) +/* 79.2Mhz */ +#define SC223A_PIXEL_RATE (79200000) #define SC223A_XVCLK_FREQ 24000000 #define CHIP_ID 0xcb3e @@ -93,10 +95,12 @@ #define SC223A_REG_VALUE_16BIT 2 #define SC223A_REG_VALUE_24BIT 3 +#define RKMODULE_CAMERA_MODULE_MODE "rockchip,camera_mode" #define OF_CAMERA_PINCTRL_STATE_DEFAULT "rockchip,camera_default" #define OF_CAMERA_PINCTRL_STATE_SLEEP "rockchip,camera_sleep" #define SC223A_NAME "sc223a" - +#define CAMERA_MIPI_MODE "mipi_mode" +#define CAMERA_DVP_MODE "dvp_mode" static const char * const sc223a_supply_names[] = { "avdd", /* Analog power */ "dovdd", /* Digital I/O power */ @@ -104,6 +108,17 @@ }; #define SC223A_NUM_SUPPLIES ARRAY_SIZE(sc223a_supply_names) + +enum sc223a_support_mode_id { + SC223A_MIPI_1920X1080 = 0, + SC223A_DVP_1920X1080, + SC223A_MODE_ID_MAX = SC223A_DVP_1920X1080, +}; + +enum sc223a_mode_id { + SC223A_MIPI_MODE = 0, + SC223A_DVP_MODE, +}; struct regval { u16 addr; @@ -121,6 +136,7 @@ const struct regval *reg_list; u32 hdr_mode; u32 vc[PAD_MAX]; + u8 mode_id; }; struct sc223a { @@ -152,6 +168,7 @@ const char *module_facing; const char *module_name; const char *len_name; + const char *mode; u32 cur_vts; bool has_init_exp; bool is_thunderboot; @@ -353,8 +370,223 @@ {REG_NULL, 0x00}, }; +/* + * Xclk 24Mhz + * Pclk 79.2Mhz + * max_framerate 30fps + * 1920x1080 + * dvp 10bit, 2lane + */ +static const struct regval sc223a_linear_10_1920x1080_dvp_30fps_regs[] = { + {0x0100, 0x00}, + {0x36e9, 0x80}, + {0x37f9, 0x80}, + {0x3001, 0xff}, + {0x3002, 0xf0}, + {0x300a, 0x24}, + {0x3018, 0x0f}, + {0x301a, 0xf8}, + {0x301c, 0x94}, + {0x301f, 0x40}, + {0x303f, 0x81}, + {0x30b8, 0x44}, + {0x3200, 0x00}, + {0x3201, 0x00}, + {0x3202, 0x00}, + {0x3203, 0x00}, + {0x3204, 0x07}, + {0x3205, 0x87}, + {0x3206, 0x04}, + {0x3207, 0x3f}, + {0x3208, 0x07}, + {0x3209, 0x80}, + {0x320a, 0x04}, + {0x320b, 0x38}, + {0x320c, 0x09}, + {0x320d, 0x60}, + {0x320e, 0x04}, + {0x320f, 0x65}, + {0x3210, 0x00}, + {0x3211, 0x04}, + {0x3212, 0x00}, + {0x3213, 0x04}, + {0x3227, 0x03}, + {0x3250, 0x00}, + {0x3253, 0x0c}, + {0x3281, 0x80}, + {0x3301, 0x06}, + {0x3302, 0x12}, + {0x3306, 0x84}, + {0x3309, 0x60}, + {0x330a, 0x00}, + {0x330b, 0xe0}, + {0x330d, 0x20}, + {0x3314, 0x15}, + {0x331e, 0x41}, + {0x331f, 0x51}, + {0x3320, 0x0a}, + {0x3326, 0x0e}, + {0x3333, 0x10}, + {0x3334, 0x40}, + {0x335d, 0x60}, + {0x335e, 0x06}, + {0x335f, 0x08}, + {0x3364, 0x56}, + {0x337a, 0x06}, + {0x337b, 0x0e}, + {0x337c, 0x02}, + {0x337d, 0x0a}, + {0x3390, 0x03}, + {0x3391, 0x0f}, + {0x3392, 0x1f}, + {0x3393, 0x06}, + {0x3394, 0x06}, + {0x3395, 0x06}, + {0x3396, 0x48}, + {0x3397, 0x4b}, + {0x3398, 0x5f}, + {0x3399, 0x06}, + {0x339a, 0x06}, + {0x339b, 0x9c}, + {0x339c, 0x9c}, + {0x33a2, 0x04}, + {0x33a3, 0x0a}, + {0x33ad, 0x1c}, + {0x33af, 0x40}, + {0x33b1, 0x80}, + {0x33b3, 0x20}, + {0x349f, 0x02}, + {0x34a6, 0x48}, + {0x34a7, 0x4b}, + {0x34a8, 0x20}, + {0x34a9, 0x20}, + {0x34f8, 0x5f}, + {0x34f9, 0x10}, + {0x3616, 0xac}, + {0x3630, 0xc0}, + {0x3631, 0x86}, + {0x3632, 0x26}, + {0x3633, 0x32}, + {0x3637, 0x29}, + {0x363a, 0x84}, + {0x363b, 0x04}, + {0x363c, 0x08}, + {0x3641, 0x3a}, + {0x364f, 0x39}, + {0x3670, 0xce}, + {0x3674, 0xc0}, + {0x3675, 0xc0}, + {0x3676, 0xc0}, + {0x3677, 0x86}, + {0x3678, 0x8b}, + {0x3679, 0x8c}, + {0x367c, 0x4b}, + {0x367d, 0x5f}, + {0x367e, 0x4b}, + {0x367f, 0x5f}, + {0x3690, 0x62}, + {0x3691, 0x63}, + {0x3692, 0x63}, + {0x3699, 0x86}, + {0x369a, 0x92}, + {0x369b, 0xa4}, + {0x369c, 0x48}, + {0x369d, 0x4b}, + {0x36a2, 0x4b}, + {0x36a3, 0x4f}, + {0x36ea, 0x09}, + {0x36eb, 0x0c}, + {0x36ec, 0x1c}, + {0x36ed, 0x28}, + {0x370f, 0x01}, + {0x3721, 0x6c}, + {0x3722, 0x09}, + {0x3724, 0x41}, + {0x3725, 0xc4}, + {0x37b0, 0x09}, + {0x37b1, 0x09}, + {0x37b2, 0x09}, + {0x37b3, 0x48}, + {0x37b4, 0x5f}, + {0x37fa, 0x09}, + {0x37fb, 0x32}, + {0x37fc, 0x10}, + {0x37fd, 0x37}, + {0x3900, 0x19}, + {0x3901, 0x02}, + {0x3905, 0xb8}, + {0x391b, 0x82}, + {0x391c, 0x00}, + {0x391f, 0x04}, + {0x3928, 0xc1}, + {0x3933, 0x81}, + {0x3934, 0x4c}, + {0x393f, 0xff}, + {0x3940, 0x73}, + {0x3942, 0x01}, + {0x3943, 0x4d}, + {0x3946, 0x20}, + {0x3957, 0x86}, + {0x3e01, 0x8c}, + {0x3e02, 0x00}, + {0x3e28, 0xc4}, + {0x440e, 0x02}, + {0x4501, 0xc0}, + {0x4509, 0x14}, + {0x450d, 0x11}, + {0x4518, 0x00}, + {0x451b, 0x0a}, + {0x4603, 0x09}, + {0x4819, 0x07}, + {0x481b, 0x04}, + {0x481d, 0x0e}, + {0x3000, 0xff}, + {0x481f, 0x03}, + {0x4821, 0x09}, + {0x4823, 0x04}, + {0x4825, 0x03}, + {0x4827, 0x03}, + {0x4829, 0x06}, + {0x501c, 0x00}, + {0x501d, 0x60}, + {0x501e, 0x00}, + {0x501f, 0x40}, + {0x5799, 0x06}, + {0x5ae0, 0xfe}, + {0x5ae1, 0x40}, + {0x5ae2, 0x38}, + {0x5ae3, 0x30}, + {0x5ae4, 0x28}, + {0x5ae5, 0x38}, + {0x5ae6, 0x30}, + {0x5ae7, 0x28}, + {0x5ae8, 0x3f}, + {0x5ae9, 0x34}, + {0x5aea, 0x2c}, + {0x5aeb, 0x3f}, + {0x5aec, 0x34}, + {0x5aed, 0x2c}, + {0x5aee, 0xfe}, + {0x5aef, 0x40}, + {0x5af4, 0x38}, + {0x5af5, 0x30}, + {0x5af6, 0x28}, + {0x5af7, 0x38}, + {0x5af8, 0x30}, + {0x5af9, 0x28}, + {0x5afa, 0x3f}, + {0x5afb, 0x34}, + {0x5afc, 0x2c}, + {0x5afd, 0x3f}, + {0x5afe, 0x34}, + {0x5aff, 0x2c}, + {0x36e9, 0x53}, + {0x37f9, 0x53}, + {REG_NULL, 0x00}, +}; + static const struct sc223a_mode supported_modes[] = { - { + [SC223A_MIPI_1920X1080] = { .width = 1920, .height = 1080, .max_fps = { @@ -367,11 +599,28 @@ .bus_fmt = MEDIA_BUS_FMT_SBGGR10_1X10, .reg_list = sc223a_linear_10_1920x1080_30fps_regs, .hdr_mode = NO_HDR, + .mode_id = SC223A_MIPI_MODE, .vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0, - } + }, + [SC223A_DVP_1920X1080] = { + .width = 1920, + .height = 1080, + .max_fps = { + .numerator = 10000, + .denominator = 300000, + }, + .exp_def = 0x0080, + .hts_def = 0x0960, + .vts_def = 0x0465, + .bus_fmt = MEDIA_BUS_FMT_SBGGR8_1X8, + .reg_list = sc223a_linear_10_1920x1080_dvp_30fps_regs, + .hdr_mode = NO_HDR, + .mode_id = SC223A_DVP_MODE, + .vc[PAD0] = 0, + }, }; -static const s64 link_freq_menu_items[] = { +static const __maybe_unused s64 link_freq_menu_items[] = { SC223A_LINK_FREQ_405 }; @@ -694,17 +943,25 @@ struct sc223a *sc223a = to_sc223a(sd); const struct sc223a_mode *mode = sc223a->cur_mode; - u32 val = 1 << (SC223A_LANES - 1) | - V4L2_MBUS_CSI2_CHANNEL_0 | - V4L2_MBUS_CSI2_CONTINUOUS_CLOCK; + u32 val; - if (mode->hdr_mode != NO_HDR) - val |= V4L2_MBUS_CSI2_CHANNEL_1; - if (mode->hdr_mode == HDR_X3) - val |= V4L2_MBUS_CSI2_CHANNEL_2; + if (!strcmp(sc223a->mode, CAMERA_MIPI_MODE)) { + val = 1 << (SC223A_LANES - 1) | + V4L2_MBUS_CSI2_CHANNEL_0 | + V4L2_MBUS_CSI2_CONTINUOUS_CLOCK; + if (mode->hdr_mode != NO_HDR) + val |= V4L2_MBUS_CSI2_CHANNEL_1; + if (mode->hdr_mode == HDR_X3) + val |= V4L2_MBUS_CSI2_CHANNEL_2; - config->type = V4L2_MBUS_CSI2_DPHY; - config->flags = val; + config->type = V4L2_MBUS_CSI2_DPHY; + config->flags = val; + } else if (!strcmp(sc223a->mode, CAMERA_DVP_MODE)) { + config->type = V4L2_MBUS_PARALLEL; + config->flags = V4L2_MBUS_HSYNC_ACTIVE_HIGH | + V4L2_MBUS_VSYNC_ACTIVE_LOW | + V4L2_MBUS_PCLK_SAMPLE_RISING; + } return 0; } @@ -724,6 +981,7 @@ struct sc223a *sc223a = to_sc223a(sd); struct rkmodule_hdr_cfg *hdr; u32 i, h, w; + u8 mode; long ret = 0; u32 stream = 0; @@ -740,9 +998,11 @@ hdr = (struct rkmodule_hdr_cfg *)arg; w = sc223a->cur_mode->width; h = sc223a->cur_mode->height; + mode = sc223a->cur_mode->mode_id; for (i = 0; i < ARRAY_SIZE(supported_modes); i++) { if (w == supported_modes[i].width && h == supported_modes[i].height && + mode == supported_modes[i].mode_id && supported_modes[i].hdr_mode == hdr->hdr_mode) { sc223a->cur_mode = &supported_modes[i]; break; @@ -889,6 +1149,7 @@ } } } + return sc223a_write_reg(sc223a->client, SC223A_REG_CTRL_MODE, SC223A_REG_VALUE_08BIT, SC223A_MODE_STREAMING); } @@ -1293,13 +1554,18 @@ return ret; handler->lock = &sc223a->mutex; - ctrl = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ, - 0, 0, link_freq_menu_items); - if (ctrl) - ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; + if (!strcmp(sc223a->mode, CAMERA_MIPI_MODE)) { + ctrl = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ, + 0, 0, link_freq_menu_items); + if (ctrl) + ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; + v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE, + 0, PIXEL_RATE_WITH_405M_10BIT, 1, PIXEL_RATE_WITH_405M_10BIT); + } else if (!strcmp(sc223a->mode, CAMERA_DVP_MODE)) { + v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE, + 0, SC223A_PIXEL_RATE, 1, SC223A_PIXEL_RATE); + } - v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE, - 0, PIXEL_RATE_WITH_405M_10BIT, 1, PIXEL_RATE_WITH_405M_10BIT); h_blank = mode->hts_def - mode->width; sc223a->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, @@ -1412,6 +1678,8 @@ &sc223a->module_name); ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME, &sc223a->len_name); + ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_MODE, + &sc223a->mode); if (ret) { dev_err(dev, "could not get module information!\n"); return -EINVAL; @@ -1420,14 +1688,18 @@ sc223a->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP); sc223a->client = client; - for (i = 0; i < ARRAY_SIZE(supported_modes); i++) { - if (hdr_mode == supported_modes[i].hdr_mode) { - sc223a->cur_mode = &supported_modes[i]; - break; + if (!strcmp(sc223a->mode, CAMERA_MIPI_MODE)) { + for (i = 0; i < ARRAY_SIZE(supported_modes); i++) { + if (hdr_mode == supported_modes[i].hdr_mode) { + sc223a->cur_mode = &supported_modes[i]; + break; + } } + if (i == ARRAY_SIZE(supported_modes)) + sc223a->cur_mode = &supported_modes[SC223A_MIPI_1920X1080]; + } else if (!strcmp(sc223a->mode, CAMERA_DVP_MODE)) { + sc223a->cur_mode = &supported_modes[SC223A_DVP_1920X1080]; } - if (i == ARRAY_SIZE(supported_modes)) - sc223a->cur_mode = &supported_modes[0]; sc223a->xvclk = devm_clk_get(dev, "xvclk"); if (IS_ERR(sc223a->xvclk)) { -- Gitblit v1.6.2