0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #include <linux/clk.h>
0017 #include <linux/delay.h>
0018 #include <linux/device.h>
0019 #include <linux/firmware.h>
0020 #include <linux/gpio/consumer.h>
0021 #include <linux/module.h>
0022 #include <linux/pm_runtime.h>
0023 #include <linux/property.h>
0024 #include <linux/regulator/consumer.h>
0025 #include <linux/slab.h>
0026 #include <linux/smiapp.h>
0027 #include <linux/v4l2-mediabus.h>
0028 #include <media/v4l2-fwnode.h>
0029 #include <media/v4l2-device.h>
0030 #include <uapi/linux/ccs.h>
0031
0032 #include "ccs.h"
0033
0034 #define CCS_ALIGN_DIM(dim, flags) \
0035 ((flags) & V4L2_SEL_FLAG_GE \
0036 ? ALIGN((dim), 2) \
0037 : (dim) & ~1)
0038
0039 static struct ccs_limit_offset {
0040 u16 lim;
0041 u16 info;
0042 } ccs_limit_offsets[CCS_L_LAST + 1];
0043
0044
0045
0046
0047 static const struct ccs_module_ident ccs_module_idents[] = {
0048 CCS_IDENT_L(0x01, 0x022b, -1, "vs6555"),
0049 CCS_IDENT_L(0x01, 0x022e, -1, "vw6558"),
0050 CCS_IDENT_L(0x07, 0x7698, -1, "ovm7698"),
0051 CCS_IDENT_L(0x0b, 0x4242, -1, "smiapp-003"),
0052 CCS_IDENT_L(0x0c, 0x208a, -1, "tcm8330md"),
0053 CCS_IDENT_LQ(0x0c, 0x2134, -1, "tcm8500md", &smiapp_tcm8500md_quirk),
0054 CCS_IDENT_L(0x0c, 0x213e, -1, "et8en2"),
0055 CCS_IDENT_L(0x0c, 0x2184, -1, "tcm8580md"),
0056 CCS_IDENT_LQ(0x0c, 0x560f, -1, "jt8ew9", &smiapp_jt8ew9_quirk),
0057 CCS_IDENT_LQ(0x10, 0x4141, -1, "jt8ev1", &smiapp_jt8ev1_quirk),
0058 CCS_IDENT_LQ(0x10, 0x4241, -1, "imx125es", &smiapp_imx125es_quirk),
0059 };
0060
0061 #define CCS_DEVICE_FLAG_IS_SMIA BIT(0)
0062
0063 struct ccs_device {
0064 unsigned char flags;
0065 };
0066
0067 static const char * const ccs_regulators[] = { "vcore", "vio", "vana" };
0068
0069
0070
0071
0072
0073
0074
0075 static void ccs_assign_limit(void *ptr, unsigned int width, u32 val)
0076 {
0077 switch (width) {
0078 case sizeof(u8):
0079 *(u8 *)ptr = val;
0080 break;
0081 case sizeof(u16):
0082 *(u16 *)ptr = val;
0083 break;
0084 case sizeof(u32):
0085 *(u32 *)ptr = val;
0086 break;
0087 }
0088 }
0089
0090 static int ccs_limit_ptr(struct ccs_sensor *sensor, unsigned int limit,
0091 unsigned int offset, void **__ptr)
0092 {
0093 const struct ccs_limit *linfo;
0094
0095 if (WARN_ON(limit >= CCS_L_LAST))
0096 return -EINVAL;
0097
0098 linfo = &ccs_limits[ccs_limit_offsets[limit].info];
0099
0100 if (WARN_ON(!sensor->ccs_limits) ||
0101 WARN_ON(offset + ccs_reg_width(linfo->reg) >
0102 ccs_limit_offsets[limit + 1].lim))
0103 return -EINVAL;
0104
0105 *__ptr = sensor->ccs_limits + ccs_limit_offsets[limit].lim + offset;
0106
0107 return 0;
0108 }
0109
0110 void ccs_replace_limit(struct ccs_sensor *sensor,
0111 unsigned int limit, unsigned int offset, u32 val)
0112 {
0113 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
0114 const struct ccs_limit *linfo;
0115 void *ptr;
0116 int ret;
0117
0118 ret = ccs_limit_ptr(sensor, limit, offset, &ptr);
0119 if (ret)
0120 return;
0121
0122 linfo = &ccs_limits[ccs_limit_offsets[limit].info];
0123
0124 dev_dbg(&client->dev, "quirk: 0x%8.8x \"%s\" %u = %u, 0x%x\n",
0125 linfo->reg, linfo->name, offset, val, val);
0126
0127 ccs_assign_limit(ptr, ccs_reg_width(linfo->reg), val);
0128 }
0129
0130 u32 ccs_get_limit(struct ccs_sensor *sensor, unsigned int limit,
0131 unsigned int offset)
0132 {
0133 void *ptr;
0134 u32 val;
0135 int ret;
0136
0137 ret = ccs_limit_ptr(sensor, limit, offset, &ptr);
0138 if (ret)
0139 return 0;
0140
0141 switch (ccs_reg_width(ccs_limits[ccs_limit_offsets[limit].info].reg)) {
0142 case sizeof(u8):
0143 val = *(u8 *)ptr;
0144 break;
0145 case sizeof(u16):
0146 val = *(u16 *)ptr;
0147 break;
0148 case sizeof(u32):
0149 val = *(u32 *)ptr;
0150 break;
0151 default:
0152 WARN_ON(1);
0153 return 0;
0154 }
0155
0156 return ccs_reg_conv(sensor, ccs_limits[limit].reg, val);
0157 }
0158
0159 static int ccs_read_all_limits(struct ccs_sensor *sensor)
0160 {
0161 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
0162 void *ptr, *alloc, *end;
0163 unsigned int i, l;
0164 int ret;
0165
0166 kfree(sensor->ccs_limits);
0167 sensor->ccs_limits = NULL;
0168
0169 alloc = kzalloc(ccs_limit_offsets[CCS_L_LAST].lim, GFP_KERNEL);
0170 if (!alloc)
0171 return -ENOMEM;
0172
0173 end = alloc + ccs_limit_offsets[CCS_L_LAST].lim;
0174
0175 for (i = 0, l = 0, ptr = alloc; ccs_limits[i].size; i++) {
0176 u32 reg = ccs_limits[i].reg;
0177 unsigned int width = ccs_reg_width(reg);
0178 unsigned int j;
0179
0180 if (l == CCS_L_LAST) {
0181 dev_err(&client->dev,
0182 "internal error --- end of limit array\n");
0183 ret = -EINVAL;
0184 goto out_err;
0185 }
0186
0187 for (j = 0; j < ccs_limits[i].size / width;
0188 j++, reg += width, ptr += width) {
0189 u32 val;
0190
0191 ret = ccs_read_addr_noconv(sensor, reg, &val);
0192 if (ret)
0193 goto out_err;
0194
0195 if (ptr + width > end) {
0196 dev_err(&client->dev,
0197 "internal error --- no room for regs\n");
0198 ret = -EINVAL;
0199 goto out_err;
0200 }
0201
0202 if (!val && j)
0203 break;
0204
0205 ccs_assign_limit(ptr, width, val);
0206
0207 dev_dbg(&client->dev, "0x%8.8x \"%s\" = %u, 0x%x\n",
0208 reg, ccs_limits[i].name, val, val);
0209 }
0210
0211 if (ccs_limits[i].flags & CCS_L_FL_SAME_REG)
0212 continue;
0213
0214 l++;
0215 ptr = alloc + ccs_limit_offsets[l].lim;
0216 }
0217
0218 if (l != CCS_L_LAST) {
0219 dev_err(&client->dev,
0220 "internal error --- insufficient limits\n");
0221 ret = -EINVAL;
0222 goto out_err;
0223 }
0224
0225 sensor->ccs_limits = alloc;
0226
0227 if (CCS_LIM(sensor, SCALER_N_MIN) < 16)
0228 ccs_replace_limit(sensor, CCS_L_SCALER_N_MIN, 0, 16);
0229
0230 return 0;
0231
0232 out_err:
0233 kfree(alloc);
0234
0235 return ret;
0236 }
0237
0238 static int ccs_read_frame_fmt(struct ccs_sensor *sensor)
0239 {
0240 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
0241 u8 fmt_model_type, fmt_model_subtype, ncol_desc, nrow_desc;
0242 unsigned int i;
0243 int pixel_count = 0;
0244 int line_count = 0;
0245
0246 fmt_model_type = CCS_LIM(sensor, FRAME_FORMAT_MODEL_TYPE);
0247 fmt_model_subtype = CCS_LIM(sensor, FRAME_FORMAT_MODEL_SUBTYPE);
0248
0249 ncol_desc = (fmt_model_subtype
0250 & CCS_FRAME_FORMAT_MODEL_SUBTYPE_COLUMNS_MASK)
0251 >> CCS_FRAME_FORMAT_MODEL_SUBTYPE_COLUMNS_SHIFT;
0252 nrow_desc = fmt_model_subtype
0253 & CCS_FRAME_FORMAT_MODEL_SUBTYPE_ROWS_MASK;
0254
0255 dev_dbg(&client->dev, "format_model_type %s\n",
0256 fmt_model_type == CCS_FRAME_FORMAT_MODEL_TYPE_2_BYTE
0257 ? "2 byte" :
0258 fmt_model_type == CCS_FRAME_FORMAT_MODEL_TYPE_4_BYTE
0259 ? "4 byte" : "is simply bad");
0260
0261 dev_dbg(&client->dev, "%u column and %u row descriptors\n",
0262 ncol_desc, nrow_desc);
0263
0264 for (i = 0; i < ncol_desc + nrow_desc; i++) {
0265 u32 desc;
0266 u32 pixelcode;
0267 u32 pixels;
0268 char *which;
0269 char *what;
0270
0271 if (fmt_model_type == CCS_FRAME_FORMAT_MODEL_TYPE_2_BYTE) {
0272 desc = CCS_LIM_AT(sensor, FRAME_FORMAT_DESCRIPTOR, i);
0273
0274 pixelcode =
0275 (desc
0276 & CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_MASK)
0277 >> CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_SHIFT;
0278 pixels = desc & CCS_FRAME_FORMAT_DESCRIPTOR_PIXELS_MASK;
0279 } else if (fmt_model_type
0280 == CCS_FRAME_FORMAT_MODEL_TYPE_4_BYTE) {
0281 desc = CCS_LIM_AT(sensor, FRAME_FORMAT_DESCRIPTOR_4, i);
0282
0283 pixelcode =
0284 (desc
0285 & CCS_FRAME_FORMAT_DESCRIPTOR_4_PCODE_MASK)
0286 >> CCS_FRAME_FORMAT_DESCRIPTOR_4_PCODE_SHIFT;
0287 pixels = desc &
0288 CCS_FRAME_FORMAT_DESCRIPTOR_4_PIXELS_MASK;
0289 } else {
0290 dev_dbg(&client->dev,
0291 "invalid frame format model type %u\n",
0292 fmt_model_type);
0293 return -EINVAL;
0294 }
0295
0296 if (i < ncol_desc)
0297 which = "columns";
0298 else
0299 which = "rows";
0300
0301 switch (pixelcode) {
0302 case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_EMBEDDED:
0303 what = "embedded";
0304 break;
0305 case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_DUMMY_PIXEL:
0306 what = "dummy";
0307 break;
0308 case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_BLACK_PIXEL:
0309 what = "black";
0310 break;
0311 case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_DARK_PIXEL:
0312 what = "dark";
0313 break;
0314 case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_VISIBLE_PIXEL:
0315 what = "visible";
0316 break;
0317 default:
0318 what = "invalid";
0319 break;
0320 }
0321
0322 dev_dbg(&client->dev,
0323 "%s pixels: %u %s (pixelcode %u)\n",
0324 what, pixels, which, pixelcode);
0325
0326 if (i < ncol_desc) {
0327 if (pixelcode ==
0328 CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_VISIBLE_PIXEL)
0329 sensor->visible_pixel_start = pixel_count;
0330 pixel_count += pixels;
0331 continue;
0332 }
0333
0334
0335 switch (pixelcode) {
0336 case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_EMBEDDED:
0337 if (sensor->embedded_end)
0338 break;
0339 sensor->embedded_start = line_count;
0340 sensor->embedded_end = line_count + pixels;
0341 break;
0342 case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_VISIBLE_PIXEL:
0343 sensor->image_start = line_count;
0344 break;
0345 }
0346 line_count += pixels;
0347 }
0348
0349 if (sensor->embedded_end > sensor->image_start) {
0350 dev_dbg(&client->dev,
0351 "adjusting image start line to %u (was %u)\n",
0352 sensor->embedded_end, sensor->image_start);
0353 sensor->image_start = sensor->embedded_end;
0354 }
0355
0356 dev_dbg(&client->dev, "embedded data from lines %u to %u\n",
0357 sensor->embedded_start, sensor->embedded_end);
0358 dev_dbg(&client->dev, "image data starts at line %u\n",
0359 sensor->image_start);
0360
0361 return 0;
0362 }
0363
0364 static int ccs_pll_configure(struct ccs_sensor *sensor)
0365 {
0366 struct ccs_pll *pll = &sensor->pll;
0367 int rval;
0368
0369 rval = ccs_write(sensor, VT_PIX_CLK_DIV, pll->vt_bk.pix_clk_div);
0370 if (rval < 0)
0371 return rval;
0372
0373 rval = ccs_write(sensor, VT_SYS_CLK_DIV, pll->vt_bk.sys_clk_div);
0374 if (rval < 0)
0375 return rval;
0376
0377 rval = ccs_write(sensor, PRE_PLL_CLK_DIV, pll->vt_fr.pre_pll_clk_div);
0378 if (rval < 0)
0379 return rval;
0380
0381 rval = ccs_write(sensor, PLL_MULTIPLIER, pll->vt_fr.pll_multiplier);
0382 if (rval < 0)
0383 return rval;
0384
0385 if (!(CCS_LIM(sensor, PHY_CTRL_CAPABILITY) &
0386 CCS_PHY_CTRL_CAPABILITY_AUTO_PHY_CTL)) {
0387
0388 rval = ccs_write(sensor, REQUESTED_LINK_RATE,
0389 DIV_ROUND_UP(pll->op_bk.sys_clk_freq_hz,
0390 1000000 / 256 / 256) *
0391 (pll->flags & CCS_PLL_FLAG_LANE_SPEED_MODEL ?
0392 sensor->pll.csi2.lanes : 1) <<
0393 (pll->flags & CCS_PLL_FLAG_OP_SYS_DDR ?
0394 1 : 0));
0395 if (rval < 0)
0396 return rval;
0397 }
0398
0399 if (sensor->pll.flags & CCS_PLL_FLAG_NO_OP_CLOCKS)
0400 return 0;
0401
0402 rval = ccs_write(sensor, OP_PIX_CLK_DIV, pll->op_bk.pix_clk_div);
0403 if (rval < 0)
0404 return rval;
0405
0406 rval = ccs_write(sensor, OP_SYS_CLK_DIV, pll->op_bk.sys_clk_div);
0407 if (rval < 0)
0408 return rval;
0409
0410 if (!(pll->flags & CCS_PLL_FLAG_DUAL_PLL))
0411 return 0;
0412
0413 rval = ccs_write(sensor, PLL_MODE, CCS_PLL_MODE_DUAL);
0414 if (rval < 0)
0415 return rval;
0416
0417 rval = ccs_write(sensor, OP_PRE_PLL_CLK_DIV,
0418 pll->op_fr.pre_pll_clk_div);
0419 if (rval < 0)
0420 return rval;
0421
0422 return ccs_write(sensor, OP_PLL_MULTIPLIER, pll->op_fr.pll_multiplier);
0423 }
0424
0425 static int ccs_pll_try(struct ccs_sensor *sensor, struct ccs_pll *pll)
0426 {
0427 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
0428 struct ccs_pll_limits lim = {
0429 .vt_fr = {
0430 .min_pre_pll_clk_div = CCS_LIM(sensor, MIN_PRE_PLL_CLK_DIV),
0431 .max_pre_pll_clk_div = CCS_LIM(sensor, MAX_PRE_PLL_CLK_DIV),
0432 .min_pll_ip_clk_freq_hz = CCS_LIM(sensor, MIN_PLL_IP_CLK_FREQ_MHZ),
0433 .max_pll_ip_clk_freq_hz = CCS_LIM(sensor, MAX_PLL_IP_CLK_FREQ_MHZ),
0434 .min_pll_multiplier = CCS_LIM(sensor, MIN_PLL_MULTIPLIER),
0435 .max_pll_multiplier = CCS_LIM(sensor, MAX_PLL_MULTIPLIER),
0436 .min_pll_op_clk_freq_hz = CCS_LIM(sensor, MIN_PLL_OP_CLK_FREQ_MHZ),
0437 .max_pll_op_clk_freq_hz = CCS_LIM(sensor, MAX_PLL_OP_CLK_FREQ_MHZ),
0438 },
0439 .op_fr = {
0440 .min_pre_pll_clk_div = CCS_LIM(sensor, MIN_OP_PRE_PLL_CLK_DIV),
0441 .max_pre_pll_clk_div = CCS_LIM(sensor, MAX_OP_PRE_PLL_CLK_DIV),
0442 .min_pll_ip_clk_freq_hz = CCS_LIM(sensor, MIN_OP_PLL_IP_CLK_FREQ_MHZ),
0443 .max_pll_ip_clk_freq_hz = CCS_LIM(sensor, MAX_OP_PLL_IP_CLK_FREQ_MHZ),
0444 .min_pll_multiplier = CCS_LIM(sensor, MIN_OP_PLL_MULTIPLIER),
0445 .max_pll_multiplier = CCS_LIM(sensor, MAX_OP_PLL_MULTIPLIER),
0446 .min_pll_op_clk_freq_hz = CCS_LIM(sensor, MIN_OP_PLL_OP_CLK_FREQ_MHZ),
0447 .max_pll_op_clk_freq_hz = CCS_LIM(sensor, MAX_OP_PLL_OP_CLK_FREQ_MHZ),
0448 },
0449 .op_bk = {
0450 .min_sys_clk_div = CCS_LIM(sensor, MIN_OP_SYS_CLK_DIV),
0451 .max_sys_clk_div = CCS_LIM(sensor, MAX_OP_SYS_CLK_DIV),
0452 .min_pix_clk_div = CCS_LIM(sensor, MIN_OP_PIX_CLK_DIV),
0453 .max_pix_clk_div = CCS_LIM(sensor, MAX_OP_PIX_CLK_DIV),
0454 .min_sys_clk_freq_hz = CCS_LIM(sensor, MIN_OP_SYS_CLK_FREQ_MHZ),
0455 .max_sys_clk_freq_hz = CCS_LIM(sensor, MAX_OP_SYS_CLK_FREQ_MHZ),
0456 .min_pix_clk_freq_hz = CCS_LIM(sensor, MIN_OP_PIX_CLK_FREQ_MHZ),
0457 .max_pix_clk_freq_hz = CCS_LIM(sensor, MAX_OP_PIX_CLK_FREQ_MHZ),
0458 },
0459 .vt_bk = {
0460 .min_sys_clk_div = CCS_LIM(sensor, MIN_VT_SYS_CLK_DIV),
0461 .max_sys_clk_div = CCS_LIM(sensor, MAX_VT_SYS_CLK_DIV),
0462 .min_pix_clk_div = CCS_LIM(sensor, MIN_VT_PIX_CLK_DIV),
0463 .max_pix_clk_div = CCS_LIM(sensor, MAX_VT_PIX_CLK_DIV),
0464 .min_sys_clk_freq_hz = CCS_LIM(sensor, MIN_VT_SYS_CLK_FREQ_MHZ),
0465 .max_sys_clk_freq_hz = CCS_LIM(sensor, MAX_VT_SYS_CLK_FREQ_MHZ),
0466 .min_pix_clk_freq_hz = CCS_LIM(sensor, MIN_VT_PIX_CLK_FREQ_MHZ),
0467 .max_pix_clk_freq_hz = CCS_LIM(sensor, MAX_VT_PIX_CLK_FREQ_MHZ),
0468 },
0469 .min_line_length_pck_bin = CCS_LIM(sensor, MIN_LINE_LENGTH_PCK_BIN),
0470 .min_line_length_pck = CCS_LIM(sensor, MIN_LINE_LENGTH_PCK),
0471 };
0472
0473 return ccs_pll_calculate(&client->dev, &lim, pll);
0474 }
0475
0476 static int ccs_pll_update(struct ccs_sensor *sensor)
0477 {
0478 struct ccs_pll *pll = &sensor->pll;
0479 int rval;
0480
0481 pll->binning_horizontal = sensor->binning_horizontal;
0482 pll->binning_vertical = sensor->binning_vertical;
0483 pll->link_freq =
0484 sensor->link_freq->qmenu_int[sensor->link_freq->val];
0485 pll->scale_m = sensor->scale_m;
0486 pll->bits_per_pixel = sensor->csi_format->compressed;
0487
0488 rval = ccs_pll_try(sensor, pll);
0489 if (rval < 0)
0490 return rval;
0491
0492 __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_parray,
0493 pll->pixel_rate_pixel_array);
0494 __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_csi, pll->pixel_rate_csi);
0495
0496 return 0;
0497 }
0498
0499
0500
0501
0502
0503
0504
0505
0506 static void __ccs_update_exposure_limits(struct ccs_sensor *sensor)
0507 {
0508 struct v4l2_ctrl *ctrl = sensor->exposure;
0509 int max;
0510
0511 max = sensor->pixel_array->crop[CCS_PA_PAD_SRC].height
0512 + sensor->vblank->val
0513 - CCS_LIM(sensor, COARSE_INTEGRATION_TIME_MAX_MARGIN);
0514
0515 __v4l2_ctrl_modify_range(ctrl, ctrl->minimum, max, ctrl->step, max);
0516 }
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526 static const struct ccs_csi_data_format ccs_csi_data_formats[] = {
0527 { MEDIA_BUS_FMT_SGRBG16_1X16, 16, 16, CCS_PIXEL_ORDER_GRBG, },
0528 { MEDIA_BUS_FMT_SRGGB16_1X16, 16, 16, CCS_PIXEL_ORDER_RGGB, },
0529 { MEDIA_BUS_FMT_SBGGR16_1X16, 16, 16, CCS_PIXEL_ORDER_BGGR, },
0530 { MEDIA_BUS_FMT_SGBRG16_1X16, 16, 16, CCS_PIXEL_ORDER_GBRG, },
0531 { MEDIA_BUS_FMT_SGRBG14_1X14, 14, 14, CCS_PIXEL_ORDER_GRBG, },
0532 { MEDIA_BUS_FMT_SRGGB14_1X14, 14, 14, CCS_PIXEL_ORDER_RGGB, },
0533 { MEDIA_BUS_FMT_SBGGR14_1X14, 14, 14, CCS_PIXEL_ORDER_BGGR, },
0534 { MEDIA_BUS_FMT_SGBRG14_1X14, 14, 14, CCS_PIXEL_ORDER_GBRG, },
0535 { MEDIA_BUS_FMT_SGRBG12_1X12, 12, 12, CCS_PIXEL_ORDER_GRBG, },
0536 { MEDIA_BUS_FMT_SRGGB12_1X12, 12, 12, CCS_PIXEL_ORDER_RGGB, },
0537 { MEDIA_BUS_FMT_SBGGR12_1X12, 12, 12, CCS_PIXEL_ORDER_BGGR, },
0538 { MEDIA_BUS_FMT_SGBRG12_1X12, 12, 12, CCS_PIXEL_ORDER_GBRG, },
0539 { MEDIA_BUS_FMT_SGRBG10_1X10, 10, 10, CCS_PIXEL_ORDER_GRBG, },
0540 { MEDIA_BUS_FMT_SRGGB10_1X10, 10, 10, CCS_PIXEL_ORDER_RGGB, },
0541 { MEDIA_BUS_FMT_SBGGR10_1X10, 10, 10, CCS_PIXEL_ORDER_BGGR, },
0542 { MEDIA_BUS_FMT_SGBRG10_1X10, 10, 10, CCS_PIXEL_ORDER_GBRG, },
0543 { MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8, 10, 8, CCS_PIXEL_ORDER_GRBG, },
0544 { MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8, 10, 8, CCS_PIXEL_ORDER_RGGB, },
0545 { MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8, 10, 8, CCS_PIXEL_ORDER_BGGR, },
0546 { MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8, 10, 8, CCS_PIXEL_ORDER_GBRG, },
0547 { MEDIA_BUS_FMT_SGRBG8_1X8, 8, 8, CCS_PIXEL_ORDER_GRBG, },
0548 { MEDIA_BUS_FMT_SRGGB8_1X8, 8, 8, CCS_PIXEL_ORDER_RGGB, },
0549 { MEDIA_BUS_FMT_SBGGR8_1X8, 8, 8, CCS_PIXEL_ORDER_BGGR, },
0550 { MEDIA_BUS_FMT_SGBRG8_1X8, 8, 8, CCS_PIXEL_ORDER_GBRG, },
0551 };
0552
0553 static const char *pixel_order_str[] = { "GRBG", "RGGB", "BGGR", "GBRG" };
0554
0555 #define to_csi_format_idx(fmt) (((unsigned long)(fmt) \
0556 - (unsigned long)ccs_csi_data_formats) \
0557 / sizeof(*ccs_csi_data_formats))
0558
0559 static u32 ccs_pixel_order(struct ccs_sensor *sensor)
0560 {
0561 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
0562 int flip = 0;
0563
0564 if (sensor->hflip) {
0565 if (sensor->hflip->val)
0566 flip |= CCS_IMAGE_ORIENTATION_HORIZONTAL_MIRROR;
0567
0568 if (sensor->vflip->val)
0569 flip |= CCS_IMAGE_ORIENTATION_VERTICAL_FLIP;
0570 }
0571
0572 flip ^= sensor->hvflip_inv_mask;
0573
0574 dev_dbg(&client->dev, "flip %u\n", flip);
0575 return sensor->default_pixel_order ^ flip;
0576 }
0577
0578 static void ccs_update_mbus_formats(struct ccs_sensor *sensor)
0579 {
0580 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
0581 unsigned int csi_format_idx =
0582 to_csi_format_idx(sensor->csi_format) & ~3;
0583 unsigned int internal_csi_format_idx =
0584 to_csi_format_idx(sensor->internal_csi_format) & ~3;
0585 unsigned int pixel_order = ccs_pixel_order(sensor);
0586
0587 if (WARN_ON_ONCE(max(internal_csi_format_idx, csi_format_idx) +
0588 pixel_order >= ARRAY_SIZE(ccs_csi_data_formats)))
0589 return;
0590
0591 sensor->mbus_frame_fmts =
0592 sensor->default_mbus_frame_fmts << pixel_order;
0593 sensor->csi_format =
0594 &ccs_csi_data_formats[csi_format_idx + pixel_order];
0595 sensor->internal_csi_format =
0596 &ccs_csi_data_formats[internal_csi_format_idx
0597 + pixel_order];
0598
0599 dev_dbg(&client->dev, "new pixel order %s\n",
0600 pixel_order_str[pixel_order]);
0601 }
0602
0603 static const char * const ccs_test_patterns[] = {
0604 "Disabled",
0605 "Solid Colour",
0606 "Eight Vertical Colour Bars",
0607 "Colour Bars With Fade to Grey",
0608 "Pseudorandom Sequence (PN9)",
0609 };
0610
0611 static int ccs_set_ctrl(struct v4l2_ctrl *ctrl)
0612 {
0613 struct ccs_sensor *sensor =
0614 container_of(ctrl->handler, struct ccs_subdev, ctrl_handler)
0615 ->sensor;
0616 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
0617 int pm_status;
0618 u32 orient = 0;
0619 unsigned int i;
0620 int exposure;
0621 int rval;
0622
0623 switch (ctrl->id) {
0624 case V4L2_CID_HFLIP:
0625 case V4L2_CID_VFLIP:
0626 if (sensor->streaming)
0627 return -EBUSY;
0628
0629 if (sensor->hflip->val)
0630 orient |= CCS_IMAGE_ORIENTATION_HORIZONTAL_MIRROR;
0631
0632 if (sensor->vflip->val)
0633 orient |= CCS_IMAGE_ORIENTATION_VERTICAL_FLIP;
0634
0635 orient ^= sensor->hvflip_inv_mask;
0636
0637 ccs_update_mbus_formats(sensor);
0638
0639 break;
0640 case V4L2_CID_VBLANK:
0641 exposure = sensor->exposure->val;
0642
0643 __ccs_update_exposure_limits(sensor);
0644
0645 if (exposure > sensor->exposure->maximum) {
0646 sensor->exposure->val = sensor->exposure->maximum;
0647 rval = ccs_set_ctrl(sensor->exposure);
0648 if (rval < 0)
0649 return rval;
0650 }
0651
0652 break;
0653 case V4L2_CID_LINK_FREQ:
0654 if (sensor->streaming)
0655 return -EBUSY;
0656
0657 rval = ccs_pll_update(sensor);
0658 if (rval)
0659 return rval;
0660
0661 return 0;
0662 case V4L2_CID_TEST_PATTERN:
0663 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++)
0664 v4l2_ctrl_activate(
0665 sensor->test_data[i],
0666 ctrl->val ==
0667 V4L2_SMIAPP_TEST_PATTERN_MODE_SOLID_COLOUR);
0668
0669 break;
0670 }
0671
0672 pm_status = pm_runtime_get_if_active(&client->dev, true);
0673 if (!pm_status)
0674 return 0;
0675
0676 switch (ctrl->id) {
0677 case V4L2_CID_ANALOGUE_GAIN:
0678 rval = ccs_write(sensor, ANALOG_GAIN_CODE_GLOBAL, ctrl->val);
0679
0680 break;
0681
0682 case V4L2_CID_CCS_ANALOGUE_LINEAR_GAIN:
0683 rval = ccs_write(sensor, ANALOG_LINEAR_GAIN_GLOBAL, ctrl->val);
0684
0685 break;
0686
0687 case V4L2_CID_CCS_ANALOGUE_EXPONENTIAL_GAIN:
0688 rval = ccs_write(sensor, ANALOG_EXPONENTIAL_GAIN_GLOBAL,
0689 ctrl->val);
0690
0691 break;
0692
0693 case V4L2_CID_DIGITAL_GAIN:
0694 if (CCS_LIM(sensor, DIGITAL_GAIN_CAPABILITY) ==
0695 CCS_DIGITAL_GAIN_CAPABILITY_GLOBAL) {
0696 rval = ccs_write(sensor, DIGITAL_GAIN_GLOBAL,
0697 ctrl->val);
0698 break;
0699 }
0700
0701 rval = ccs_write_addr(sensor,
0702 SMIAPP_REG_U16_DIGITAL_GAIN_GREENR,
0703 ctrl->val);
0704 if (rval)
0705 break;
0706
0707 rval = ccs_write_addr(sensor,
0708 SMIAPP_REG_U16_DIGITAL_GAIN_RED,
0709 ctrl->val);
0710 if (rval)
0711 break;
0712
0713 rval = ccs_write_addr(sensor,
0714 SMIAPP_REG_U16_DIGITAL_GAIN_BLUE,
0715 ctrl->val);
0716 if (rval)
0717 break;
0718
0719 rval = ccs_write_addr(sensor,
0720 SMIAPP_REG_U16_DIGITAL_GAIN_GREENB,
0721 ctrl->val);
0722
0723 break;
0724 case V4L2_CID_EXPOSURE:
0725 rval = ccs_write(sensor, COARSE_INTEGRATION_TIME, ctrl->val);
0726
0727 break;
0728 case V4L2_CID_HFLIP:
0729 case V4L2_CID_VFLIP:
0730 rval = ccs_write(sensor, IMAGE_ORIENTATION, orient);
0731
0732 break;
0733 case V4L2_CID_VBLANK:
0734 rval = ccs_write(sensor, FRAME_LENGTH_LINES,
0735 sensor->pixel_array->crop[
0736 CCS_PA_PAD_SRC].height
0737 + ctrl->val);
0738
0739 break;
0740 case V4L2_CID_HBLANK:
0741 rval = ccs_write(sensor, LINE_LENGTH_PCK,
0742 sensor->pixel_array->crop[CCS_PA_PAD_SRC].width
0743 + ctrl->val);
0744
0745 break;
0746 case V4L2_CID_TEST_PATTERN:
0747 rval = ccs_write(sensor, TEST_PATTERN_MODE, ctrl->val);
0748
0749 break;
0750 case V4L2_CID_TEST_PATTERN_RED:
0751 rval = ccs_write(sensor, TEST_DATA_RED, ctrl->val);
0752
0753 break;
0754 case V4L2_CID_TEST_PATTERN_GREENR:
0755 rval = ccs_write(sensor, TEST_DATA_GREENR, ctrl->val);
0756
0757 break;
0758 case V4L2_CID_TEST_PATTERN_BLUE:
0759 rval = ccs_write(sensor, TEST_DATA_BLUE, ctrl->val);
0760
0761 break;
0762 case V4L2_CID_TEST_PATTERN_GREENB:
0763 rval = ccs_write(sensor, TEST_DATA_GREENB, ctrl->val);
0764
0765 break;
0766 case V4L2_CID_CCS_SHADING_CORRECTION:
0767 rval = ccs_write(sensor, SHADING_CORRECTION_EN,
0768 ctrl->val ? CCS_SHADING_CORRECTION_EN_ENABLE :
0769 0);
0770
0771 if (!rval && sensor->luminance_level)
0772 v4l2_ctrl_activate(sensor->luminance_level, ctrl->val);
0773
0774 break;
0775 case V4L2_CID_CCS_LUMINANCE_CORRECTION_LEVEL:
0776 rval = ccs_write(sensor, LUMINANCE_CORRECTION_LEVEL, ctrl->val);
0777
0778 break;
0779 case V4L2_CID_PIXEL_RATE:
0780
0781 rval = 0;
0782
0783 break;
0784 default:
0785 rval = -EINVAL;
0786 }
0787
0788 if (pm_status > 0) {
0789 pm_runtime_mark_last_busy(&client->dev);
0790 pm_runtime_put_autosuspend(&client->dev);
0791 }
0792
0793 return rval;
0794 }
0795
0796 static const struct v4l2_ctrl_ops ccs_ctrl_ops = {
0797 .s_ctrl = ccs_set_ctrl,
0798 };
0799
0800 static int ccs_init_controls(struct ccs_sensor *sensor)
0801 {
0802 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
0803 int rval;
0804
0805 rval = v4l2_ctrl_handler_init(&sensor->pixel_array->ctrl_handler, 17);
0806 if (rval)
0807 return rval;
0808
0809 sensor->pixel_array->ctrl_handler.lock = &sensor->mutex;
0810
0811 switch (CCS_LIM(sensor, ANALOG_GAIN_CAPABILITY)) {
0812 case CCS_ANALOG_GAIN_CAPABILITY_GLOBAL: {
0813 struct {
0814 const char *name;
0815 u32 id;
0816 s32 value;
0817 } const gain_ctrls[] = {
0818 { "Analogue Gain m0", V4L2_CID_CCS_ANALOGUE_GAIN_M0,
0819 CCS_LIM(sensor, ANALOG_GAIN_M0), },
0820 { "Analogue Gain c0", V4L2_CID_CCS_ANALOGUE_GAIN_C0,
0821 CCS_LIM(sensor, ANALOG_GAIN_C0), },
0822 { "Analogue Gain m1", V4L2_CID_CCS_ANALOGUE_GAIN_M1,
0823 CCS_LIM(sensor, ANALOG_GAIN_M1), },
0824 { "Analogue Gain c1", V4L2_CID_CCS_ANALOGUE_GAIN_C1,
0825 CCS_LIM(sensor, ANALOG_GAIN_C1), },
0826 };
0827 struct v4l2_ctrl_config ctrl_cfg = {
0828 .type = V4L2_CTRL_TYPE_INTEGER,
0829 .ops = &ccs_ctrl_ops,
0830 .flags = V4L2_CTRL_FLAG_READ_ONLY,
0831 .step = 1,
0832 };
0833 unsigned int i;
0834
0835 for (i = 0; i < ARRAY_SIZE(gain_ctrls); i++) {
0836 ctrl_cfg.name = gain_ctrls[i].name;
0837 ctrl_cfg.id = gain_ctrls[i].id;
0838 ctrl_cfg.min = ctrl_cfg.max = ctrl_cfg.def =
0839 gain_ctrls[i].value;
0840
0841 v4l2_ctrl_new_custom(&sensor->pixel_array->ctrl_handler,
0842 &ctrl_cfg, NULL);
0843 }
0844
0845 v4l2_ctrl_new_std(&sensor->pixel_array->ctrl_handler,
0846 &ccs_ctrl_ops, V4L2_CID_ANALOGUE_GAIN,
0847 CCS_LIM(sensor, ANALOG_GAIN_CODE_MIN),
0848 CCS_LIM(sensor, ANALOG_GAIN_CODE_MAX),
0849 max(CCS_LIM(sensor, ANALOG_GAIN_CODE_STEP),
0850 1U),
0851 CCS_LIM(sensor, ANALOG_GAIN_CODE_MIN));
0852 }
0853 break;
0854
0855 case CCS_ANALOG_GAIN_CAPABILITY_ALTERNATE_GLOBAL: {
0856 struct {
0857 const char *name;
0858 u32 id;
0859 u16 min, max, step;
0860 } const gain_ctrls[] = {
0861 {
0862 "Analogue Linear Gain",
0863 V4L2_CID_CCS_ANALOGUE_LINEAR_GAIN,
0864 CCS_LIM(sensor, ANALOG_LINEAR_GAIN_MIN),
0865 CCS_LIM(sensor, ANALOG_LINEAR_GAIN_MAX),
0866 max(CCS_LIM(sensor,
0867 ANALOG_LINEAR_GAIN_STEP_SIZE),
0868 1U),
0869 },
0870 {
0871 "Analogue Exponential Gain",
0872 V4L2_CID_CCS_ANALOGUE_EXPONENTIAL_GAIN,
0873 CCS_LIM(sensor, ANALOG_EXPONENTIAL_GAIN_MIN),
0874 CCS_LIM(sensor, ANALOG_EXPONENTIAL_GAIN_MAX),
0875 max(CCS_LIM(sensor,
0876 ANALOG_EXPONENTIAL_GAIN_STEP_SIZE),
0877 1U),
0878 },
0879 };
0880 struct v4l2_ctrl_config ctrl_cfg = {
0881 .type = V4L2_CTRL_TYPE_INTEGER,
0882 .ops = &ccs_ctrl_ops,
0883 };
0884 unsigned int i;
0885
0886 for (i = 0; i < ARRAY_SIZE(gain_ctrls); i++) {
0887 ctrl_cfg.name = gain_ctrls[i].name;
0888 ctrl_cfg.min = ctrl_cfg.def = gain_ctrls[i].min;
0889 ctrl_cfg.max = gain_ctrls[i].max;
0890 ctrl_cfg.step = gain_ctrls[i].step;
0891 ctrl_cfg.id = gain_ctrls[i].id;
0892
0893 v4l2_ctrl_new_custom(&sensor->pixel_array->ctrl_handler,
0894 &ctrl_cfg, NULL);
0895 }
0896 }
0897 }
0898
0899 if (CCS_LIM(sensor, SHADING_CORRECTION_CAPABILITY) &
0900 (CCS_SHADING_CORRECTION_CAPABILITY_COLOR_SHADING |
0901 CCS_SHADING_CORRECTION_CAPABILITY_LUMINANCE_CORRECTION)) {
0902 const struct v4l2_ctrl_config ctrl_cfg = {
0903 .name = "Shading Correction",
0904 .type = V4L2_CTRL_TYPE_BOOLEAN,
0905 .id = V4L2_CID_CCS_SHADING_CORRECTION,
0906 .ops = &ccs_ctrl_ops,
0907 .max = 1,
0908 .step = 1,
0909 };
0910
0911 v4l2_ctrl_new_custom(&sensor->pixel_array->ctrl_handler,
0912 &ctrl_cfg, NULL);
0913 }
0914
0915 if (CCS_LIM(sensor, SHADING_CORRECTION_CAPABILITY) &
0916 CCS_SHADING_CORRECTION_CAPABILITY_LUMINANCE_CORRECTION) {
0917 const struct v4l2_ctrl_config ctrl_cfg = {
0918 .name = "Luminance Correction Level",
0919 .type = V4L2_CTRL_TYPE_BOOLEAN,
0920 .id = V4L2_CID_CCS_LUMINANCE_CORRECTION_LEVEL,
0921 .ops = &ccs_ctrl_ops,
0922 .max = 255,
0923 .step = 1,
0924 .def = 128,
0925 };
0926
0927 sensor->luminance_level =
0928 v4l2_ctrl_new_custom(&sensor->pixel_array->ctrl_handler,
0929 &ctrl_cfg, NULL);
0930 }
0931
0932 if (CCS_LIM(sensor, DIGITAL_GAIN_CAPABILITY) ==
0933 CCS_DIGITAL_GAIN_CAPABILITY_GLOBAL ||
0934 CCS_LIM(sensor, DIGITAL_GAIN_CAPABILITY) ==
0935 SMIAPP_DIGITAL_GAIN_CAPABILITY_PER_CHANNEL)
0936 v4l2_ctrl_new_std(&sensor->pixel_array->ctrl_handler,
0937 &ccs_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
0938 CCS_LIM(sensor, DIGITAL_GAIN_MIN),
0939 CCS_LIM(sensor, DIGITAL_GAIN_MAX),
0940 max(CCS_LIM(sensor, DIGITAL_GAIN_STEP_SIZE),
0941 1U),
0942 0x100);
0943
0944
0945 sensor->exposure = v4l2_ctrl_new_std(
0946 &sensor->pixel_array->ctrl_handler, &ccs_ctrl_ops,
0947 V4L2_CID_EXPOSURE, 0, 0, 1, 0);
0948
0949 sensor->hflip = v4l2_ctrl_new_std(
0950 &sensor->pixel_array->ctrl_handler, &ccs_ctrl_ops,
0951 V4L2_CID_HFLIP, 0, 1, 1, 0);
0952 sensor->vflip = v4l2_ctrl_new_std(
0953 &sensor->pixel_array->ctrl_handler, &ccs_ctrl_ops,
0954 V4L2_CID_VFLIP, 0, 1, 1, 0);
0955
0956 sensor->vblank = v4l2_ctrl_new_std(
0957 &sensor->pixel_array->ctrl_handler, &ccs_ctrl_ops,
0958 V4L2_CID_VBLANK, 0, 1, 1, 0);
0959
0960 if (sensor->vblank)
0961 sensor->vblank->flags |= V4L2_CTRL_FLAG_UPDATE;
0962
0963 sensor->hblank = v4l2_ctrl_new_std(
0964 &sensor->pixel_array->ctrl_handler, &ccs_ctrl_ops,
0965 V4L2_CID_HBLANK, 0, 1, 1, 0);
0966
0967 if (sensor->hblank)
0968 sensor->hblank->flags |= V4L2_CTRL_FLAG_UPDATE;
0969
0970 sensor->pixel_rate_parray = v4l2_ctrl_new_std(
0971 &sensor->pixel_array->ctrl_handler, &ccs_ctrl_ops,
0972 V4L2_CID_PIXEL_RATE, 1, INT_MAX, 1, 1);
0973
0974 v4l2_ctrl_new_std_menu_items(&sensor->pixel_array->ctrl_handler,
0975 &ccs_ctrl_ops, V4L2_CID_TEST_PATTERN,
0976 ARRAY_SIZE(ccs_test_patterns) - 1,
0977 0, 0, ccs_test_patterns);
0978
0979 if (sensor->pixel_array->ctrl_handler.error) {
0980 dev_err(&client->dev,
0981 "pixel array controls initialization failed (%d)\n",
0982 sensor->pixel_array->ctrl_handler.error);
0983 return sensor->pixel_array->ctrl_handler.error;
0984 }
0985
0986 sensor->pixel_array->sd.ctrl_handler =
0987 &sensor->pixel_array->ctrl_handler;
0988
0989 v4l2_ctrl_cluster(2, &sensor->hflip);
0990
0991 rval = v4l2_ctrl_handler_init(&sensor->src->ctrl_handler, 0);
0992 if (rval)
0993 return rval;
0994
0995 sensor->src->ctrl_handler.lock = &sensor->mutex;
0996
0997 sensor->pixel_rate_csi = v4l2_ctrl_new_std(
0998 &sensor->src->ctrl_handler, &ccs_ctrl_ops,
0999 V4L2_CID_PIXEL_RATE, 1, INT_MAX, 1, 1);
1000
1001 if (sensor->src->ctrl_handler.error) {
1002 dev_err(&client->dev,
1003 "src controls initialization failed (%d)\n",
1004 sensor->src->ctrl_handler.error);
1005 return sensor->src->ctrl_handler.error;
1006 }
1007
1008 sensor->src->sd.ctrl_handler = &sensor->src->ctrl_handler;
1009
1010 return 0;
1011 }
1012
1013
1014
1015
1016
1017 static int ccs_init_late_controls(struct ccs_sensor *sensor)
1018 {
1019 unsigned long *valid_link_freqs = &sensor->valid_link_freqs[
1020 sensor->csi_format->compressed - sensor->compressed_min_bpp];
1021 unsigned int i;
1022
1023 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++) {
1024 int max_value = (1 << sensor->csi_format->width) - 1;
1025
1026 sensor->test_data[i] = v4l2_ctrl_new_std(
1027 &sensor->pixel_array->ctrl_handler,
1028 &ccs_ctrl_ops, V4L2_CID_TEST_PATTERN_RED + i,
1029 0, max_value, 1, max_value);
1030 }
1031
1032 sensor->link_freq = v4l2_ctrl_new_int_menu(
1033 &sensor->src->ctrl_handler, &ccs_ctrl_ops,
1034 V4L2_CID_LINK_FREQ, __fls(*valid_link_freqs),
1035 __ffs(*valid_link_freqs), sensor->hwcfg.op_sys_clock);
1036
1037 return sensor->src->ctrl_handler.error;
1038 }
1039
1040 static void ccs_free_controls(struct ccs_sensor *sensor)
1041 {
1042 unsigned int i;
1043
1044 for (i = 0; i < sensor->ssds_used; i++)
1045 v4l2_ctrl_handler_free(&sensor->ssds[i].ctrl_handler);
1046 }
1047
1048 static int ccs_get_mbus_formats(struct ccs_sensor *sensor)
1049 {
1050 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1051 struct ccs_pll *pll = &sensor->pll;
1052 u8 compressed_max_bpp = 0;
1053 unsigned int type, n;
1054 unsigned int i, pixel_order;
1055 int rval;
1056
1057 type = CCS_LIM(sensor, DATA_FORMAT_MODEL_TYPE);
1058
1059 dev_dbg(&client->dev, "data_format_model_type %u\n", type);
1060
1061 rval = ccs_read(sensor, PIXEL_ORDER, &pixel_order);
1062 if (rval)
1063 return rval;
1064
1065 if (pixel_order >= ARRAY_SIZE(pixel_order_str)) {
1066 dev_dbg(&client->dev, "bad pixel order %u\n", pixel_order);
1067 return -EINVAL;
1068 }
1069
1070 dev_dbg(&client->dev, "pixel order %u (%s)\n", pixel_order,
1071 pixel_order_str[pixel_order]);
1072
1073 switch (type) {
1074 case CCS_DATA_FORMAT_MODEL_TYPE_NORMAL:
1075 n = SMIAPP_DATA_FORMAT_MODEL_TYPE_NORMAL_N;
1076 break;
1077 case CCS_DATA_FORMAT_MODEL_TYPE_EXTENDED:
1078 n = CCS_LIM_DATA_FORMAT_DESCRIPTOR_MAX_N + 1;
1079 break;
1080 default:
1081 return -EINVAL;
1082 }
1083
1084 sensor->default_pixel_order = pixel_order;
1085 sensor->mbus_frame_fmts = 0;
1086
1087 for (i = 0; i < n; i++) {
1088 unsigned int fmt, j;
1089
1090 fmt = CCS_LIM_AT(sensor, DATA_FORMAT_DESCRIPTOR, i);
1091
1092 dev_dbg(&client->dev, "%u: bpp %u, compressed %u\n",
1093 i, fmt >> 8, (u8)fmt);
1094
1095 for (j = 0; j < ARRAY_SIZE(ccs_csi_data_formats); j++) {
1096 const struct ccs_csi_data_format *f =
1097 &ccs_csi_data_formats[j];
1098
1099 if (f->pixel_order != CCS_PIXEL_ORDER_GRBG)
1100 continue;
1101
1102 if (f->width != fmt >>
1103 CCS_DATA_FORMAT_DESCRIPTOR_UNCOMPRESSED_SHIFT ||
1104 f->compressed !=
1105 (fmt & CCS_DATA_FORMAT_DESCRIPTOR_COMPRESSED_MASK))
1106 continue;
1107
1108 dev_dbg(&client->dev, "jolly good! %u\n", j);
1109
1110 sensor->default_mbus_frame_fmts |= 1 << j;
1111 }
1112 }
1113
1114
1115 pll->binning_horizontal = 1;
1116 pll->binning_vertical = 1;
1117 pll->scale_m = sensor->scale_m;
1118
1119 for (i = 0; i < ARRAY_SIZE(ccs_csi_data_formats); i++) {
1120 sensor->compressed_min_bpp =
1121 min(ccs_csi_data_formats[i].compressed,
1122 sensor->compressed_min_bpp);
1123 compressed_max_bpp =
1124 max(ccs_csi_data_formats[i].compressed,
1125 compressed_max_bpp);
1126 }
1127
1128 sensor->valid_link_freqs = devm_kcalloc(
1129 &client->dev,
1130 compressed_max_bpp - sensor->compressed_min_bpp + 1,
1131 sizeof(*sensor->valid_link_freqs), GFP_KERNEL);
1132 if (!sensor->valid_link_freqs)
1133 return -ENOMEM;
1134
1135 for (i = 0; i < ARRAY_SIZE(ccs_csi_data_formats); i++) {
1136 const struct ccs_csi_data_format *f =
1137 &ccs_csi_data_formats[i];
1138 unsigned long *valid_link_freqs =
1139 &sensor->valid_link_freqs[
1140 f->compressed - sensor->compressed_min_bpp];
1141 unsigned int j;
1142
1143 if (!(sensor->default_mbus_frame_fmts & 1 << i))
1144 continue;
1145
1146 pll->bits_per_pixel = f->compressed;
1147
1148 for (j = 0; sensor->hwcfg.op_sys_clock[j]; j++) {
1149 pll->link_freq = sensor->hwcfg.op_sys_clock[j];
1150
1151 rval = ccs_pll_try(sensor, pll);
1152 dev_dbg(&client->dev, "link freq %u Hz, bpp %u %s\n",
1153 pll->link_freq, pll->bits_per_pixel,
1154 rval ? "not ok" : "ok");
1155 if (rval)
1156 continue;
1157
1158 set_bit(j, valid_link_freqs);
1159 }
1160
1161 if (!*valid_link_freqs) {
1162 dev_info(&client->dev,
1163 "no valid link frequencies for %u bpp\n",
1164 f->compressed);
1165 sensor->default_mbus_frame_fmts &= ~BIT(i);
1166 continue;
1167 }
1168
1169 if (!sensor->csi_format
1170 || f->width > sensor->csi_format->width
1171 || (f->width == sensor->csi_format->width
1172 && f->compressed > sensor->csi_format->compressed)) {
1173 sensor->csi_format = f;
1174 sensor->internal_csi_format = f;
1175 }
1176 }
1177
1178 if (!sensor->csi_format) {
1179 dev_err(&client->dev, "no supported mbus code found\n");
1180 return -EINVAL;
1181 }
1182
1183 ccs_update_mbus_formats(sensor);
1184
1185 return 0;
1186 }
1187
1188 static void ccs_update_blanking(struct ccs_sensor *sensor)
1189 {
1190 struct v4l2_ctrl *vblank = sensor->vblank;
1191 struct v4l2_ctrl *hblank = sensor->hblank;
1192 u16 min_fll, max_fll, min_llp, max_llp, min_lbp;
1193 int min, max;
1194
1195 if (sensor->binning_vertical > 1 || sensor->binning_horizontal > 1) {
1196 min_fll = CCS_LIM(sensor, MIN_FRAME_LENGTH_LINES_BIN);
1197 max_fll = CCS_LIM(sensor, MAX_FRAME_LENGTH_LINES_BIN);
1198 min_llp = CCS_LIM(sensor, MIN_LINE_LENGTH_PCK_BIN);
1199 max_llp = CCS_LIM(sensor, MAX_LINE_LENGTH_PCK_BIN);
1200 min_lbp = CCS_LIM(sensor, MIN_LINE_BLANKING_PCK_BIN);
1201 } else {
1202 min_fll = CCS_LIM(sensor, MIN_FRAME_LENGTH_LINES);
1203 max_fll = CCS_LIM(sensor, MAX_FRAME_LENGTH_LINES);
1204 min_llp = CCS_LIM(sensor, MIN_LINE_LENGTH_PCK);
1205 max_llp = CCS_LIM(sensor, MAX_LINE_LENGTH_PCK);
1206 min_lbp = CCS_LIM(sensor, MIN_LINE_BLANKING_PCK);
1207 }
1208
1209 min = max_t(int,
1210 CCS_LIM(sensor, MIN_FRAME_BLANKING_LINES),
1211 min_fll - sensor->pixel_array->crop[CCS_PA_PAD_SRC].height);
1212 max = max_fll - sensor->pixel_array->crop[CCS_PA_PAD_SRC].height;
1213
1214 __v4l2_ctrl_modify_range(vblank, min, max, vblank->step, min);
1215
1216 min = max_t(int,
1217 min_llp - sensor->pixel_array->crop[CCS_PA_PAD_SRC].width,
1218 min_lbp);
1219 max = max_llp - sensor->pixel_array->crop[CCS_PA_PAD_SRC].width;
1220
1221 __v4l2_ctrl_modify_range(hblank, min, max, hblank->step, min);
1222
1223 __ccs_update_exposure_limits(sensor);
1224 }
1225
1226 static int ccs_pll_blanking_update(struct ccs_sensor *sensor)
1227 {
1228 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1229 int rval;
1230
1231 rval = ccs_pll_update(sensor);
1232 if (rval < 0)
1233 return rval;
1234
1235
1236 ccs_update_blanking(sensor);
1237
1238 dev_dbg(&client->dev, "vblank\t\t%d\n", sensor->vblank->val);
1239 dev_dbg(&client->dev, "hblank\t\t%d\n", sensor->hblank->val);
1240
1241 dev_dbg(&client->dev, "real timeperframe\t100/%d\n",
1242 sensor->pll.pixel_rate_pixel_array /
1243 ((sensor->pixel_array->crop[CCS_PA_PAD_SRC].width
1244 + sensor->hblank->val) *
1245 (sensor->pixel_array->crop[CCS_PA_PAD_SRC].height
1246 + sensor->vblank->val) / 100));
1247
1248 return 0;
1249 }
1250
1251
1252
1253
1254
1255
1256
1257 static int ccs_read_nvm_page(struct ccs_sensor *sensor, u32 p, u8 *nvm,
1258 u8 *status)
1259 {
1260 unsigned int i;
1261 int rval;
1262 u32 s;
1263
1264 *status = 0;
1265
1266 rval = ccs_write(sensor, DATA_TRANSFER_IF_1_PAGE_SELECT, p);
1267 if (rval)
1268 return rval;
1269
1270 rval = ccs_write(sensor, DATA_TRANSFER_IF_1_CTRL,
1271 CCS_DATA_TRANSFER_IF_1_CTRL_ENABLE);
1272 if (rval)
1273 return rval;
1274
1275 rval = ccs_read(sensor, DATA_TRANSFER_IF_1_STATUS, &s);
1276 if (rval)
1277 return rval;
1278
1279 if (s & CCS_DATA_TRANSFER_IF_1_STATUS_IMPROPER_IF_USAGE) {
1280 *status = s;
1281 return -ENODATA;
1282 }
1283
1284 if (CCS_LIM(sensor, DATA_TRANSFER_IF_CAPABILITY) &
1285 CCS_DATA_TRANSFER_IF_CAPABILITY_POLLING) {
1286 for (i = 1000; i > 0; i--) {
1287 if (s & CCS_DATA_TRANSFER_IF_1_STATUS_READ_IF_READY)
1288 break;
1289
1290 rval = ccs_read(sensor, DATA_TRANSFER_IF_1_STATUS, &s);
1291 if (rval)
1292 return rval;
1293 }
1294
1295 if (!i)
1296 return -ETIMEDOUT;
1297 }
1298
1299 for (i = 0; i <= CCS_LIM_DATA_TRANSFER_IF_1_DATA_MAX_P; i++) {
1300 u32 v;
1301
1302 rval = ccs_read(sensor, DATA_TRANSFER_IF_1_DATA(i), &v);
1303 if (rval)
1304 return rval;
1305
1306 *nvm++ = v;
1307 }
1308
1309 return 0;
1310 }
1311
1312 static int ccs_read_nvm(struct ccs_sensor *sensor, unsigned char *nvm,
1313 size_t nvm_size)
1314 {
1315 u8 status = 0;
1316 u32 p;
1317 int rval = 0, rval2;
1318
1319 for (p = 0; p < nvm_size / (CCS_LIM_DATA_TRANSFER_IF_1_DATA_MAX_P + 1)
1320 && !rval; p++) {
1321 rval = ccs_read_nvm_page(sensor, p, nvm, &status);
1322 nvm += CCS_LIM_DATA_TRANSFER_IF_1_DATA_MAX_P + 1;
1323 }
1324
1325 if (rval == -ENODATA &&
1326 status & CCS_DATA_TRANSFER_IF_1_STATUS_IMPROPER_IF_USAGE)
1327 rval = 0;
1328
1329 rval2 = ccs_write(sensor, DATA_TRANSFER_IF_1_CTRL, 0);
1330 if (rval < 0)
1331 return rval;
1332 else
1333 return rval2 ?: p * (CCS_LIM_DATA_TRANSFER_IF_1_DATA_MAX_P + 1);
1334 }
1335
1336
1337
1338
1339
1340
1341 static int ccs_change_cci_addr(struct ccs_sensor *sensor)
1342 {
1343 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1344 int rval;
1345 u32 val;
1346
1347 client->addr = sensor->hwcfg.i2c_addr_dfl;
1348
1349 rval = ccs_write(sensor, CCI_ADDRESS_CTRL,
1350 sensor->hwcfg.i2c_addr_alt << 1);
1351 if (rval)
1352 return rval;
1353
1354 client->addr = sensor->hwcfg.i2c_addr_alt;
1355
1356
1357 rval = ccs_read(sensor, CCI_ADDRESS_CTRL, &val);
1358 if (rval)
1359 return rval;
1360
1361 if (val != sensor->hwcfg.i2c_addr_alt << 1)
1362 return -ENODEV;
1363
1364 return 0;
1365 }
1366
1367
1368
1369
1370
1371
1372 static int ccs_setup_flash_strobe(struct ccs_sensor *sensor)
1373 {
1374 struct ccs_flash_strobe_parms *strobe_setup;
1375 unsigned int ext_freq = sensor->hwcfg.ext_clk;
1376 u32 tmp;
1377 u32 strobe_adjustment;
1378 u32 strobe_width_high_rs;
1379 int rval;
1380
1381 strobe_setup = sensor->hwcfg.strobe_setup;
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452 tmp = div_u64(1000000ULL * ((1 << 16) - 1) * ((1 << 8) - 1) -
1453 1000000 + 1, ext_freq);
1454 strobe_setup->strobe_width_high_us =
1455 clamp_t(u32, strobe_setup->strobe_width_high_us, 1, tmp);
1456
1457 tmp = div_u64(((u64)strobe_setup->strobe_width_high_us * (u64)ext_freq +
1458 1000000 - 1), 1000000ULL);
1459 strobe_adjustment = (tmp + (1 << 16) - 1 - 1) / ((1 << 16) - 1);
1460 strobe_width_high_rs = (tmp + strobe_adjustment - 1) /
1461 strobe_adjustment;
1462
1463 rval = ccs_write(sensor, FLASH_MODE_RS, strobe_setup->mode);
1464 if (rval < 0)
1465 goto out;
1466
1467 rval = ccs_write(sensor, FLASH_STROBE_ADJUSTMENT, strobe_adjustment);
1468 if (rval < 0)
1469 goto out;
1470
1471 rval = ccs_write(sensor, TFLASH_STROBE_WIDTH_HIGH_RS_CTRL,
1472 strobe_width_high_rs);
1473 if (rval < 0)
1474 goto out;
1475
1476 rval = ccs_write(sensor, TFLASH_STROBE_DELAY_RS_CTRL,
1477 strobe_setup->strobe_delay);
1478 if (rval < 0)
1479 goto out;
1480
1481 rval = ccs_write(sensor, FLASH_STROBE_START_POINT,
1482 strobe_setup->stobe_start_point);
1483 if (rval < 0)
1484 goto out;
1485
1486 rval = ccs_write(sensor, FLASH_TRIGGER_RS, strobe_setup->trigger);
1487
1488 out:
1489 sensor->hwcfg.strobe_setup->trigger = 0;
1490
1491 return rval;
1492 }
1493
1494
1495
1496
1497
1498 static int ccs_write_msr_regs(struct ccs_sensor *sensor)
1499 {
1500 int rval;
1501
1502 rval = ccs_write_data_regs(sensor,
1503 sensor->sdata.sensor_manufacturer_regs,
1504 sensor->sdata.num_sensor_manufacturer_regs);
1505 if (rval)
1506 return rval;
1507
1508 return ccs_write_data_regs(sensor,
1509 sensor->mdata.module_manufacturer_regs,
1510 sensor->mdata.num_module_manufacturer_regs);
1511 }
1512
1513 static int ccs_update_phy_ctrl(struct ccs_sensor *sensor)
1514 {
1515 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1516 u8 val;
1517
1518 if (!sensor->ccs_limits)
1519 return 0;
1520
1521 if (CCS_LIM(sensor, PHY_CTRL_CAPABILITY) &
1522 CCS_PHY_CTRL_CAPABILITY_AUTO_PHY_CTL) {
1523 val = CCS_PHY_CTRL_AUTO;
1524 } else if (CCS_LIM(sensor, PHY_CTRL_CAPABILITY) &
1525 CCS_PHY_CTRL_CAPABILITY_UI_PHY_CTL) {
1526 val = CCS_PHY_CTRL_UI;
1527 } else {
1528 dev_err(&client->dev, "manual PHY control not supported\n");
1529 return -EINVAL;
1530 }
1531
1532 return ccs_write(sensor, PHY_CTRL, val);
1533 }
1534
1535 static int ccs_power_on(struct device *dev)
1536 {
1537 struct v4l2_subdev *subdev = dev_get_drvdata(dev);
1538 struct ccs_subdev *ssd = to_ccs_subdev(subdev);
1539
1540
1541
1542
1543 struct ccs_sensor *sensor =
1544 container_of(ssd, struct ccs_sensor, ssds[0]);
1545 const struct ccs_device *ccsdev = device_get_match_data(dev);
1546 int rval;
1547
1548 rval = regulator_bulk_enable(ARRAY_SIZE(ccs_regulators),
1549 sensor->regulators);
1550 if (rval) {
1551 dev_err(dev, "failed to enable vana regulator\n");
1552 return rval;
1553 }
1554
1555 if (sensor->reset || sensor->xshutdown || sensor->ext_clk) {
1556 unsigned int sleep;
1557
1558 rval = clk_prepare_enable(sensor->ext_clk);
1559 if (rval < 0) {
1560 dev_dbg(dev, "failed to enable xclk\n");
1561 goto out_xclk_fail;
1562 }
1563
1564 gpiod_set_value(sensor->reset, 0);
1565 gpiod_set_value(sensor->xshutdown, 1);
1566
1567 if (ccsdev->flags & CCS_DEVICE_FLAG_IS_SMIA)
1568 sleep = SMIAPP_RESET_DELAY(sensor->hwcfg.ext_clk);
1569 else
1570 sleep = 5000;
1571
1572 usleep_range(sleep, sleep);
1573 }
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586 if (!sensor->reset && !sensor->xshutdown) {
1587 u8 retry = 100;
1588 u32 reset;
1589
1590 rval = ccs_write(sensor, SOFTWARE_RESET, CCS_SOFTWARE_RESET_ON);
1591 if (rval < 0) {
1592 dev_err(dev, "software reset failed\n");
1593 goto out_cci_addr_fail;
1594 }
1595
1596 do {
1597 rval = ccs_read(sensor, SOFTWARE_RESET, &reset);
1598 reset = !rval && reset == CCS_SOFTWARE_RESET_OFF;
1599 if (reset)
1600 break;
1601
1602 usleep_range(1000, 2000);
1603 } while (--retry);
1604
1605 if (!reset) {
1606 dev_err(dev, "software reset failed\n");
1607 rval = -EIO;
1608 goto out_cci_addr_fail;
1609 }
1610 }
1611
1612 if (sensor->hwcfg.i2c_addr_alt) {
1613 rval = ccs_change_cci_addr(sensor);
1614 if (rval) {
1615 dev_err(dev, "cci address change error\n");
1616 goto out_cci_addr_fail;
1617 }
1618 }
1619
1620 rval = ccs_write(sensor, COMPRESSION_MODE,
1621 CCS_COMPRESSION_MODE_DPCM_PCM_SIMPLE);
1622 if (rval) {
1623 dev_err(dev, "compression mode set failed\n");
1624 goto out_cci_addr_fail;
1625 }
1626
1627 rval = ccs_write(sensor, EXTCLK_FREQUENCY_MHZ,
1628 sensor->hwcfg.ext_clk / (1000000 / (1 << 8)));
1629 if (rval) {
1630 dev_err(dev, "extclk frequency set failed\n");
1631 goto out_cci_addr_fail;
1632 }
1633
1634 rval = ccs_write(sensor, CSI_LANE_MODE, sensor->hwcfg.lanes - 1);
1635 if (rval) {
1636 dev_err(dev, "csi lane mode set failed\n");
1637 goto out_cci_addr_fail;
1638 }
1639
1640 rval = ccs_write(sensor, FAST_STANDBY_CTRL,
1641 CCS_FAST_STANDBY_CTRL_FRAME_TRUNCATION);
1642 if (rval) {
1643 dev_err(dev, "fast standby set failed\n");
1644 goto out_cci_addr_fail;
1645 }
1646
1647 rval = ccs_write(sensor, CSI_SIGNALING_MODE,
1648 sensor->hwcfg.csi_signalling_mode);
1649 if (rval) {
1650 dev_err(dev, "csi signalling mode set failed\n");
1651 goto out_cci_addr_fail;
1652 }
1653
1654 rval = ccs_update_phy_ctrl(sensor);
1655 if (rval < 0)
1656 goto out_cci_addr_fail;
1657
1658 rval = ccs_write_msr_regs(sensor);
1659 if (rval)
1660 goto out_cci_addr_fail;
1661
1662 rval = ccs_call_quirk(sensor, post_poweron);
1663 if (rval) {
1664 dev_err(dev, "post_poweron quirks failed\n");
1665 goto out_cci_addr_fail;
1666 }
1667
1668 return 0;
1669
1670 out_cci_addr_fail:
1671 gpiod_set_value(sensor->reset, 1);
1672 gpiod_set_value(sensor->xshutdown, 0);
1673 clk_disable_unprepare(sensor->ext_clk);
1674
1675 out_xclk_fail:
1676 regulator_bulk_disable(ARRAY_SIZE(ccs_regulators),
1677 sensor->regulators);
1678
1679 return rval;
1680 }
1681
1682 static int ccs_power_off(struct device *dev)
1683 {
1684 struct v4l2_subdev *subdev = dev_get_drvdata(dev);
1685 struct ccs_subdev *ssd = to_ccs_subdev(subdev);
1686 struct ccs_sensor *sensor =
1687 container_of(ssd, struct ccs_sensor, ssds[0]);
1688
1689
1690
1691
1692
1693
1694
1695
1696 if (sensor->hwcfg.i2c_addr_alt)
1697 ccs_write(sensor, SOFTWARE_RESET, CCS_SOFTWARE_RESET_ON);
1698
1699 gpiod_set_value(sensor->reset, 1);
1700 gpiod_set_value(sensor->xshutdown, 0);
1701 clk_disable_unprepare(sensor->ext_clk);
1702 usleep_range(5000, 5000);
1703 regulator_bulk_disable(ARRAY_SIZE(ccs_regulators),
1704 sensor->regulators);
1705 sensor->streaming = false;
1706
1707 return 0;
1708 }
1709
1710
1711
1712
1713
1714 static int ccs_start_streaming(struct ccs_sensor *sensor)
1715 {
1716 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1717 unsigned int binning_mode;
1718 int rval;
1719
1720 mutex_lock(&sensor->mutex);
1721
1722 rval = ccs_write(sensor, CSI_DATA_FORMAT,
1723 (sensor->csi_format->width << 8) |
1724 sensor->csi_format->compressed);
1725 if (rval)
1726 goto out;
1727
1728
1729 if (sensor->binning_horizontal == 1 &&
1730 sensor->binning_vertical == 1) {
1731 binning_mode = 0;
1732 } else {
1733 u8 binning_type =
1734 (sensor->binning_horizontal << 4)
1735 | sensor->binning_vertical;
1736
1737 rval = ccs_write(sensor, BINNING_TYPE, binning_type);
1738 if (rval < 0)
1739 goto out;
1740
1741 binning_mode = 1;
1742 }
1743 rval = ccs_write(sensor, BINNING_MODE, binning_mode);
1744 if (rval < 0)
1745 goto out;
1746
1747
1748 rval = ccs_pll_configure(sensor);
1749 if (rval)
1750 goto out;
1751
1752
1753 rval = ccs_write(sensor, X_ADDR_START,
1754 sensor->pixel_array->crop[CCS_PA_PAD_SRC].left);
1755 if (rval < 0)
1756 goto out;
1757
1758 rval = ccs_write(sensor, Y_ADDR_START,
1759 sensor->pixel_array->crop[CCS_PA_PAD_SRC].top);
1760 if (rval < 0)
1761 goto out;
1762
1763
1764 rval = ccs_write(
1765 sensor, X_ADDR_END,
1766 sensor->pixel_array->crop[CCS_PA_PAD_SRC].left
1767 + sensor->pixel_array->crop[CCS_PA_PAD_SRC].width - 1);
1768 if (rval < 0)
1769 goto out;
1770
1771 rval = ccs_write(
1772 sensor, Y_ADDR_END,
1773 sensor->pixel_array->crop[CCS_PA_PAD_SRC].top
1774 + sensor->pixel_array->crop[CCS_PA_PAD_SRC].height - 1);
1775 if (rval < 0)
1776 goto out;
1777
1778
1779
1780
1781
1782
1783
1784 if (CCS_LIM(sensor, DIGITAL_CROP_CAPABILITY)
1785 == CCS_DIGITAL_CROP_CAPABILITY_INPUT_CROP) {
1786 rval = ccs_write(
1787 sensor, DIGITAL_CROP_X_OFFSET,
1788 sensor->scaler->crop[CCS_PAD_SINK].left);
1789 if (rval < 0)
1790 goto out;
1791
1792 rval = ccs_write(
1793 sensor, DIGITAL_CROP_Y_OFFSET,
1794 sensor->scaler->crop[CCS_PAD_SINK].top);
1795 if (rval < 0)
1796 goto out;
1797
1798 rval = ccs_write(
1799 sensor, DIGITAL_CROP_IMAGE_WIDTH,
1800 sensor->scaler->crop[CCS_PAD_SINK].width);
1801 if (rval < 0)
1802 goto out;
1803
1804 rval = ccs_write(
1805 sensor, DIGITAL_CROP_IMAGE_HEIGHT,
1806 sensor->scaler->crop[CCS_PAD_SINK].height);
1807 if (rval < 0)
1808 goto out;
1809 }
1810
1811
1812 if (CCS_LIM(sensor, SCALING_CAPABILITY)
1813 != CCS_SCALING_CAPABILITY_NONE) {
1814 rval = ccs_write(sensor, SCALING_MODE, sensor->scaling_mode);
1815 if (rval < 0)
1816 goto out;
1817
1818 rval = ccs_write(sensor, SCALE_M, sensor->scale_m);
1819 if (rval < 0)
1820 goto out;
1821 }
1822
1823
1824 rval = ccs_write(sensor, X_OUTPUT_SIZE,
1825 sensor->src->crop[CCS_PAD_SRC].width);
1826 if (rval < 0)
1827 goto out;
1828 rval = ccs_write(sensor, Y_OUTPUT_SIZE,
1829 sensor->src->crop[CCS_PAD_SRC].height);
1830 if (rval < 0)
1831 goto out;
1832
1833 if (CCS_LIM(sensor, FLASH_MODE_CAPABILITY) &
1834 (CCS_FLASH_MODE_CAPABILITY_SINGLE_STROBE |
1835 SMIAPP_FLASH_MODE_CAPABILITY_MULTIPLE_STROBE) &&
1836 sensor->hwcfg.strobe_setup != NULL &&
1837 sensor->hwcfg.strobe_setup->trigger != 0) {
1838 rval = ccs_setup_flash_strobe(sensor);
1839 if (rval)
1840 goto out;
1841 }
1842
1843 rval = ccs_call_quirk(sensor, pre_streamon);
1844 if (rval) {
1845 dev_err(&client->dev, "pre_streamon quirks failed\n");
1846 goto out;
1847 }
1848
1849 rval = ccs_write(sensor, MODE_SELECT, CCS_MODE_SELECT_STREAMING);
1850
1851 out:
1852 mutex_unlock(&sensor->mutex);
1853
1854 return rval;
1855 }
1856
1857 static int ccs_stop_streaming(struct ccs_sensor *sensor)
1858 {
1859 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1860 int rval;
1861
1862 mutex_lock(&sensor->mutex);
1863 rval = ccs_write(sensor, MODE_SELECT, CCS_MODE_SELECT_SOFTWARE_STANDBY);
1864 if (rval)
1865 goto out;
1866
1867 rval = ccs_call_quirk(sensor, post_streamoff);
1868 if (rval)
1869 dev_err(&client->dev, "post_streamoff quirks failed\n");
1870
1871 out:
1872 mutex_unlock(&sensor->mutex);
1873 return rval;
1874 }
1875
1876
1877
1878
1879
1880 static int ccs_pm_get_init(struct ccs_sensor *sensor)
1881 {
1882 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1883 int rval;
1884
1885
1886
1887
1888
1889
1890 rval = pm_runtime_get_sync(&client->dev);
1891 if (rval < 0)
1892 goto error;
1893
1894
1895 if (rval == 1)
1896 return 0;
1897
1898
1899 rval = v4l2_ctrl_handler_setup(&sensor->pixel_array->ctrl_handler);
1900 if (rval)
1901 goto error;
1902
1903 rval = v4l2_ctrl_handler_setup(&sensor->src->ctrl_handler);
1904 if (rval)
1905 goto error;
1906
1907
1908 return 0;
1909 error:
1910 pm_runtime_put(&client->dev);
1911 return rval;
1912 }
1913
1914 static int ccs_set_stream(struct v4l2_subdev *subdev, int enable)
1915 {
1916 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
1917 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1918 int rval;
1919
1920 if (sensor->streaming == enable)
1921 return 0;
1922
1923 if (!enable) {
1924 ccs_stop_streaming(sensor);
1925 sensor->streaming = false;
1926 pm_runtime_mark_last_busy(&client->dev);
1927 pm_runtime_put_autosuspend(&client->dev);
1928
1929 return 0;
1930 }
1931
1932 rval = ccs_pm_get_init(sensor);
1933 if (rval)
1934 return rval;
1935
1936 sensor->streaming = true;
1937
1938 rval = ccs_start_streaming(sensor);
1939 if (rval < 0) {
1940 sensor->streaming = false;
1941 pm_runtime_mark_last_busy(&client->dev);
1942 pm_runtime_put_autosuspend(&client->dev);
1943 }
1944
1945 return rval;
1946 }
1947
1948 static int ccs_pre_streamon(struct v4l2_subdev *subdev, u32 flags)
1949 {
1950 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
1951 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1952 int rval;
1953
1954 if (flags & V4L2_SUBDEV_PRE_STREAMON_FL_MANUAL_LP) {
1955 switch (sensor->hwcfg.csi_signalling_mode) {
1956 case CCS_CSI_SIGNALING_MODE_CSI_2_DPHY:
1957 if (!(CCS_LIM(sensor, PHY_CTRL_CAPABILITY_2) &
1958 CCS_PHY_CTRL_CAPABILITY_2_MANUAL_LP_DPHY))
1959 return -EACCES;
1960 break;
1961 case CCS_CSI_SIGNALING_MODE_CSI_2_CPHY:
1962 if (!(CCS_LIM(sensor, PHY_CTRL_CAPABILITY_2) &
1963 CCS_PHY_CTRL_CAPABILITY_2_MANUAL_LP_CPHY))
1964 return -EACCES;
1965 break;
1966 default:
1967 return -EACCES;
1968 }
1969 }
1970
1971 rval = ccs_pm_get_init(sensor);
1972 if (rval)
1973 return rval;
1974
1975 if (flags & V4L2_SUBDEV_PRE_STREAMON_FL_MANUAL_LP) {
1976 rval = ccs_write(sensor, MANUAL_LP_CTRL,
1977 CCS_MANUAL_LP_CTRL_ENABLE);
1978 if (rval)
1979 pm_runtime_put(&client->dev);
1980 }
1981
1982 return rval;
1983 }
1984
1985 static int ccs_post_streamoff(struct v4l2_subdev *subdev)
1986 {
1987 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
1988 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1989
1990 return pm_runtime_put(&client->dev);
1991 }
1992
1993 static int ccs_enum_mbus_code(struct v4l2_subdev *subdev,
1994 struct v4l2_subdev_state *sd_state,
1995 struct v4l2_subdev_mbus_code_enum *code)
1996 {
1997 struct i2c_client *client = v4l2_get_subdevdata(subdev);
1998 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
1999 unsigned int i;
2000 int idx = -1;
2001 int rval = -EINVAL;
2002
2003 mutex_lock(&sensor->mutex);
2004
2005 dev_err(&client->dev, "subdev %s, pad %u, index %u\n",
2006 subdev->name, code->pad, code->index);
2007
2008 if (subdev != &sensor->src->sd || code->pad != CCS_PAD_SRC) {
2009 if (code->index)
2010 goto out;
2011
2012 code->code = sensor->internal_csi_format->code;
2013 rval = 0;
2014 goto out;
2015 }
2016
2017 for (i = 0; i < ARRAY_SIZE(ccs_csi_data_formats); i++) {
2018 if (sensor->mbus_frame_fmts & (1 << i))
2019 idx++;
2020
2021 if (idx == code->index) {
2022 code->code = ccs_csi_data_formats[i].code;
2023 dev_err(&client->dev, "found index %u, i %u, code %x\n",
2024 code->index, i, code->code);
2025 rval = 0;
2026 break;
2027 }
2028 }
2029
2030 out:
2031 mutex_unlock(&sensor->mutex);
2032
2033 return rval;
2034 }
2035
2036 static u32 __ccs_get_mbus_code(struct v4l2_subdev *subdev, unsigned int pad)
2037 {
2038 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2039
2040 if (subdev == &sensor->src->sd && pad == CCS_PAD_SRC)
2041 return sensor->csi_format->code;
2042 else
2043 return sensor->internal_csi_format->code;
2044 }
2045
2046 static int __ccs_get_format(struct v4l2_subdev *subdev,
2047 struct v4l2_subdev_state *sd_state,
2048 struct v4l2_subdev_format *fmt)
2049 {
2050 struct ccs_subdev *ssd = to_ccs_subdev(subdev);
2051
2052 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
2053 fmt->format = *v4l2_subdev_get_try_format(subdev, sd_state,
2054 fmt->pad);
2055 } else {
2056 struct v4l2_rect *r;
2057
2058 if (fmt->pad == ssd->source_pad)
2059 r = &ssd->crop[ssd->source_pad];
2060 else
2061 r = &ssd->sink_fmt;
2062
2063 fmt->format.code = __ccs_get_mbus_code(subdev, fmt->pad);
2064 fmt->format.width = r->width;
2065 fmt->format.height = r->height;
2066 fmt->format.field = V4L2_FIELD_NONE;
2067 }
2068
2069 return 0;
2070 }
2071
2072 static int ccs_get_format(struct v4l2_subdev *subdev,
2073 struct v4l2_subdev_state *sd_state,
2074 struct v4l2_subdev_format *fmt)
2075 {
2076 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2077 int rval;
2078
2079 mutex_lock(&sensor->mutex);
2080 rval = __ccs_get_format(subdev, sd_state, fmt);
2081 mutex_unlock(&sensor->mutex);
2082
2083 return rval;
2084 }
2085
2086 static void ccs_get_crop_compose(struct v4l2_subdev *subdev,
2087 struct v4l2_subdev_state *sd_state,
2088 struct v4l2_rect **crops,
2089 struct v4l2_rect **comps, int which)
2090 {
2091 struct ccs_subdev *ssd = to_ccs_subdev(subdev);
2092 unsigned int i;
2093
2094 if (which == V4L2_SUBDEV_FORMAT_ACTIVE) {
2095 if (crops)
2096 for (i = 0; i < subdev->entity.num_pads; i++)
2097 crops[i] = &ssd->crop[i];
2098 if (comps)
2099 *comps = &ssd->compose;
2100 } else {
2101 if (crops) {
2102 for (i = 0; i < subdev->entity.num_pads; i++)
2103 crops[i] = v4l2_subdev_get_try_crop(subdev,
2104 sd_state,
2105 i);
2106 }
2107 if (comps)
2108 *comps = v4l2_subdev_get_try_compose(subdev, sd_state,
2109 CCS_PAD_SINK);
2110 }
2111 }
2112
2113
2114 static void ccs_propagate(struct v4l2_subdev *subdev,
2115 struct v4l2_subdev_state *sd_state, int which,
2116 int target)
2117 {
2118 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2119 struct ccs_subdev *ssd = to_ccs_subdev(subdev);
2120 struct v4l2_rect *comp, *crops[CCS_PADS];
2121
2122 ccs_get_crop_compose(subdev, sd_state, crops, &comp, which);
2123
2124 switch (target) {
2125 case V4L2_SEL_TGT_CROP:
2126 comp->width = crops[CCS_PAD_SINK]->width;
2127 comp->height = crops[CCS_PAD_SINK]->height;
2128 if (which == V4L2_SUBDEV_FORMAT_ACTIVE) {
2129 if (ssd == sensor->scaler) {
2130 sensor->scale_m = CCS_LIM(sensor, SCALER_N_MIN);
2131 sensor->scaling_mode =
2132 CCS_SCALING_MODE_NO_SCALING;
2133 } else if (ssd == sensor->binner) {
2134 sensor->binning_horizontal = 1;
2135 sensor->binning_vertical = 1;
2136 }
2137 }
2138 fallthrough;
2139 case V4L2_SEL_TGT_COMPOSE:
2140 *crops[CCS_PAD_SRC] = *comp;
2141 break;
2142 default:
2143 WARN_ON_ONCE(1);
2144 }
2145 }
2146
2147 static const struct ccs_csi_data_format
2148 *ccs_validate_csi_data_format(struct ccs_sensor *sensor, u32 code)
2149 {
2150 unsigned int i;
2151
2152 for (i = 0; i < ARRAY_SIZE(ccs_csi_data_formats); i++) {
2153 if (sensor->mbus_frame_fmts & (1 << i) &&
2154 ccs_csi_data_formats[i].code == code)
2155 return &ccs_csi_data_formats[i];
2156 }
2157
2158 return sensor->csi_format;
2159 }
2160
2161 static int ccs_set_format_source(struct v4l2_subdev *subdev,
2162 struct v4l2_subdev_state *sd_state,
2163 struct v4l2_subdev_format *fmt)
2164 {
2165 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2166 const struct ccs_csi_data_format *csi_format,
2167 *old_csi_format = sensor->csi_format;
2168 unsigned long *valid_link_freqs;
2169 u32 code = fmt->format.code;
2170 unsigned int i;
2171 int rval;
2172
2173 rval = __ccs_get_format(subdev, sd_state, fmt);
2174 if (rval)
2175 return rval;
2176
2177
2178
2179
2180
2181 if (subdev != &sensor->src->sd)
2182 return 0;
2183
2184 csi_format = ccs_validate_csi_data_format(sensor, code);
2185
2186 fmt->format.code = csi_format->code;
2187
2188 if (fmt->which != V4L2_SUBDEV_FORMAT_ACTIVE)
2189 return 0;
2190
2191 sensor->csi_format = csi_format;
2192
2193 if (csi_format->width != old_csi_format->width)
2194 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++)
2195 __v4l2_ctrl_modify_range(
2196 sensor->test_data[i], 0,
2197 (1 << csi_format->width) - 1, 1, 0);
2198
2199 if (csi_format->compressed == old_csi_format->compressed)
2200 return 0;
2201
2202 valid_link_freqs =
2203 &sensor->valid_link_freqs[sensor->csi_format->compressed
2204 - sensor->compressed_min_bpp];
2205
2206 __v4l2_ctrl_modify_range(
2207 sensor->link_freq, 0,
2208 __fls(*valid_link_freqs), ~*valid_link_freqs,
2209 __ffs(*valid_link_freqs));
2210
2211 return ccs_pll_update(sensor);
2212 }
2213
2214 static int ccs_set_format(struct v4l2_subdev *subdev,
2215 struct v4l2_subdev_state *sd_state,
2216 struct v4l2_subdev_format *fmt)
2217 {
2218 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2219 struct ccs_subdev *ssd = to_ccs_subdev(subdev);
2220 struct v4l2_rect *crops[CCS_PADS];
2221
2222 mutex_lock(&sensor->mutex);
2223
2224 if (fmt->pad == ssd->source_pad) {
2225 int rval;
2226
2227 rval = ccs_set_format_source(subdev, sd_state, fmt);
2228
2229 mutex_unlock(&sensor->mutex);
2230
2231 return rval;
2232 }
2233
2234
2235 fmt->format.code = __ccs_get_mbus_code(subdev, fmt->pad);
2236 fmt->format.width &= ~1;
2237 fmt->format.height &= ~1;
2238 fmt->format.field = V4L2_FIELD_NONE;
2239
2240 fmt->format.width =
2241 clamp(fmt->format.width,
2242 CCS_LIM(sensor, MIN_X_OUTPUT_SIZE),
2243 CCS_LIM(sensor, MAX_X_OUTPUT_SIZE));
2244 fmt->format.height =
2245 clamp(fmt->format.height,
2246 CCS_LIM(sensor, MIN_Y_OUTPUT_SIZE),
2247 CCS_LIM(sensor, MAX_Y_OUTPUT_SIZE));
2248
2249 ccs_get_crop_compose(subdev, sd_state, crops, NULL, fmt->which);
2250
2251 crops[ssd->sink_pad]->left = 0;
2252 crops[ssd->sink_pad]->top = 0;
2253 crops[ssd->sink_pad]->width = fmt->format.width;
2254 crops[ssd->sink_pad]->height = fmt->format.height;
2255 if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE)
2256 ssd->sink_fmt = *crops[ssd->sink_pad];
2257 ccs_propagate(subdev, sd_state, fmt->which, V4L2_SEL_TGT_CROP);
2258
2259 mutex_unlock(&sensor->mutex);
2260
2261 return 0;
2262 }
2263
2264
2265
2266
2267
2268 #define SCALING_GOODNESS 100000
2269 #define SCALING_GOODNESS_EXTREME 100000000
2270 static int scaling_goodness(struct v4l2_subdev *subdev, int w, int ask_w,
2271 int h, int ask_h, u32 flags)
2272 {
2273 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2274 struct i2c_client *client = v4l2_get_subdevdata(subdev);
2275 int val = 0;
2276
2277 w &= ~1;
2278 ask_w &= ~1;
2279 h &= ~1;
2280 ask_h &= ~1;
2281
2282 if (flags & V4L2_SEL_FLAG_GE) {
2283 if (w < ask_w)
2284 val -= SCALING_GOODNESS;
2285 if (h < ask_h)
2286 val -= SCALING_GOODNESS;
2287 }
2288
2289 if (flags & V4L2_SEL_FLAG_LE) {
2290 if (w > ask_w)
2291 val -= SCALING_GOODNESS;
2292 if (h > ask_h)
2293 val -= SCALING_GOODNESS;
2294 }
2295
2296 val -= abs(w - ask_w);
2297 val -= abs(h - ask_h);
2298
2299 if (w < CCS_LIM(sensor, MIN_X_OUTPUT_SIZE))
2300 val -= SCALING_GOODNESS_EXTREME;
2301
2302 dev_dbg(&client->dev, "w %d ask_w %d h %d ask_h %d goodness %d\n",
2303 w, ask_w, h, ask_h, val);
2304
2305 return val;
2306 }
2307
2308 static void ccs_set_compose_binner(struct v4l2_subdev *subdev,
2309 struct v4l2_subdev_state *sd_state,
2310 struct v4l2_subdev_selection *sel,
2311 struct v4l2_rect **crops,
2312 struct v4l2_rect *comp)
2313 {
2314 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2315 unsigned int i;
2316 unsigned int binh = 1, binv = 1;
2317 int best = scaling_goodness(
2318 subdev,
2319 crops[CCS_PAD_SINK]->width, sel->r.width,
2320 crops[CCS_PAD_SINK]->height, sel->r.height, sel->flags);
2321
2322 for (i = 0; i < sensor->nbinning_subtypes; i++) {
2323 int this = scaling_goodness(
2324 subdev,
2325 crops[CCS_PAD_SINK]->width
2326 / sensor->binning_subtypes[i].horizontal,
2327 sel->r.width,
2328 crops[CCS_PAD_SINK]->height
2329 / sensor->binning_subtypes[i].vertical,
2330 sel->r.height, sel->flags);
2331
2332 if (this > best) {
2333 binh = sensor->binning_subtypes[i].horizontal;
2334 binv = sensor->binning_subtypes[i].vertical;
2335 best = this;
2336 }
2337 }
2338 if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
2339 sensor->binning_vertical = binv;
2340 sensor->binning_horizontal = binh;
2341 }
2342
2343 sel->r.width = (crops[CCS_PAD_SINK]->width / binh) & ~1;
2344 sel->r.height = (crops[CCS_PAD_SINK]->height / binv) & ~1;
2345 }
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356 static void ccs_set_compose_scaler(struct v4l2_subdev *subdev,
2357 struct v4l2_subdev_state *sd_state,
2358 struct v4l2_subdev_selection *sel,
2359 struct v4l2_rect **crops,
2360 struct v4l2_rect *comp)
2361 {
2362 struct i2c_client *client = v4l2_get_subdevdata(subdev);
2363 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2364 u32 min, max, a, b, max_m;
2365 u32 scale_m = CCS_LIM(sensor, SCALER_N_MIN);
2366 int mode = CCS_SCALING_MODE_HORIZONTAL;
2367 u32 try[4];
2368 u32 ntry = 0;
2369 unsigned int i;
2370 int best = INT_MIN;
2371
2372 sel->r.width = min_t(unsigned int, sel->r.width,
2373 crops[CCS_PAD_SINK]->width);
2374 sel->r.height = min_t(unsigned int, sel->r.height,
2375 crops[CCS_PAD_SINK]->height);
2376
2377 a = crops[CCS_PAD_SINK]->width
2378 * CCS_LIM(sensor, SCALER_N_MIN) / sel->r.width;
2379 b = crops[CCS_PAD_SINK]->height
2380 * CCS_LIM(sensor, SCALER_N_MIN) / sel->r.height;
2381 max_m = crops[CCS_PAD_SINK]->width
2382 * CCS_LIM(sensor, SCALER_N_MIN)
2383 / CCS_LIM(sensor, MIN_X_OUTPUT_SIZE);
2384
2385 a = clamp(a, CCS_LIM(sensor, SCALER_M_MIN),
2386 CCS_LIM(sensor, SCALER_M_MAX));
2387 b = clamp(b, CCS_LIM(sensor, SCALER_M_MIN),
2388 CCS_LIM(sensor, SCALER_M_MAX));
2389 max_m = clamp(max_m, CCS_LIM(sensor, SCALER_M_MIN),
2390 CCS_LIM(sensor, SCALER_M_MAX));
2391
2392 dev_dbg(&client->dev, "scaling: a %u b %u max_m %u\n", a, b, max_m);
2393
2394 min = min(max_m, min(a, b));
2395 max = min(max_m, max(a, b));
2396
2397 try[ntry] = min;
2398 ntry++;
2399 if (min != max) {
2400 try[ntry] = max;
2401 ntry++;
2402 }
2403 if (max != max_m) {
2404 try[ntry] = min + 1;
2405 ntry++;
2406 if (min != max) {
2407 try[ntry] = max + 1;
2408 ntry++;
2409 }
2410 }
2411
2412 for (i = 0; i < ntry; i++) {
2413 int this = scaling_goodness(
2414 subdev,
2415 crops[CCS_PAD_SINK]->width
2416 / try[i] * CCS_LIM(sensor, SCALER_N_MIN),
2417 sel->r.width,
2418 crops[CCS_PAD_SINK]->height,
2419 sel->r.height,
2420 sel->flags);
2421
2422 dev_dbg(&client->dev, "trying factor %u (%u)\n", try[i], i);
2423
2424 if (this > best) {
2425 scale_m = try[i];
2426 mode = CCS_SCALING_MODE_HORIZONTAL;
2427 best = this;
2428 }
2429
2430 if (CCS_LIM(sensor, SCALING_CAPABILITY)
2431 == CCS_SCALING_CAPABILITY_HORIZONTAL)
2432 continue;
2433
2434 this = scaling_goodness(
2435 subdev, crops[CCS_PAD_SINK]->width
2436 / try[i]
2437 * CCS_LIM(sensor, SCALER_N_MIN),
2438 sel->r.width,
2439 crops[CCS_PAD_SINK]->height
2440 / try[i]
2441 * CCS_LIM(sensor, SCALER_N_MIN),
2442 sel->r.height,
2443 sel->flags);
2444
2445 if (this > best) {
2446 scale_m = try[i];
2447 mode = SMIAPP_SCALING_MODE_BOTH;
2448 best = this;
2449 }
2450 }
2451
2452 sel->r.width =
2453 (crops[CCS_PAD_SINK]->width
2454 / scale_m
2455 * CCS_LIM(sensor, SCALER_N_MIN)) & ~1;
2456 if (mode == SMIAPP_SCALING_MODE_BOTH)
2457 sel->r.height =
2458 (crops[CCS_PAD_SINK]->height
2459 / scale_m
2460 * CCS_LIM(sensor, SCALER_N_MIN))
2461 & ~1;
2462 else
2463 sel->r.height = crops[CCS_PAD_SINK]->height;
2464
2465 if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
2466 sensor->scale_m = scale_m;
2467 sensor->scaling_mode = mode;
2468 }
2469 }
2470
2471 static int ccs_set_compose(struct v4l2_subdev *subdev,
2472 struct v4l2_subdev_state *sd_state,
2473 struct v4l2_subdev_selection *sel)
2474 {
2475 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2476 struct ccs_subdev *ssd = to_ccs_subdev(subdev);
2477 struct v4l2_rect *comp, *crops[CCS_PADS];
2478
2479 ccs_get_crop_compose(subdev, sd_state, crops, &comp, sel->which);
2480
2481 sel->r.top = 0;
2482 sel->r.left = 0;
2483
2484 if (ssd == sensor->binner)
2485 ccs_set_compose_binner(subdev, sd_state, sel, crops, comp);
2486 else
2487 ccs_set_compose_scaler(subdev, sd_state, sel, crops, comp);
2488
2489 *comp = sel->r;
2490 ccs_propagate(subdev, sd_state, sel->which, V4L2_SEL_TGT_COMPOSE);
2491
2492 if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE)
2493 return ccs_pll_blanking_update(sensor);
2494
2495 return 0;
2496 }
2497
2498 static int __ccs_sel_supported(struct v4l2_subdev *subdev,
2499 struct v4l2_subdev_selection *sel)
2500 {
2501 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2502 struct ccs_subdev *ssd = to_ccs_subdev(subdev);
2503
2504
2505 switch (sel->target) {
2506 case V4L2_SEL_TGT_CROP:
2507 case V4L2_SEL_TGT_CROP_BOUNDS:
2508 if (ssd == sensor->pixel_array && sel->pad == CCS_PA_PAD_SRC)
2509 return 0;
2510 if (ssd == sensor->src && sel->pad == CCS_PAD_SRC)
2511 return 0;
2512 if (ssd == sensor->scaler && sel->pad == CCS_PAD_SINK &&
2513 CCS_LIM(sensor, DIGITAL_CROP_CAPABILITY)
2514 == CCS_DIGITAL_CROP_CAPABILITY_INPUT_CROP)
2515 return 0;
2516 return -EINVAL;
2517 case V4L2_SEL_TGT_NATIVE_SIZE:
2518 if (ssd == sensor->pixel_array && sel->pad == CCS_PA_PAD_SRC)
2519 return 0;
2520 return -EINVAL;
2521 case V4L2_SEL_TGT_COMPOSE:
2522 case V4L2_SEL_TGT_COMPOSE_BOUNDS:
2523 if (sel->pad == ssd->source_pad)
2524 return -EINVAL;
2525 if (ssd == sensor->binner)
2526 return 0;
2527 if (ssd == sensor->scaler && CCS_LIM(sensor, SCALING_CAPABILITY)
2528 != CCS_SCALING_CAPABILITY_NONE)
2529 return 0;
2530 fallthrough;
2531 default:
2532 return -EINVAL;
2533 }
2534 }
2535
2536 static int ccs_set_crop(struct v4l2_subdev *subdev,
2537 struct v4l2_subdev_state *sd_state,
2538 struct v4l2_subdev_selection *sel)
2539 {
2540 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2541 struct ccs_subdev *ssd = to_ccs_subdev(subdev);
2542 struct v4l2_rect *src_size, *crops[CCS_PADS];
2543 struct v4l2_rect _r;
2544
2545 ccs_get_crop_compose(subdev, sd_state, crops, NULL, sel->which);
2546
2547 if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
2548 if (sel->pad == ssd->sink_pad)
2549 src_size = &ssd->sink_fmt;
2550 else
2551 src_size = &ssd->compose;
2552 } else {
2553 if (sel->pad == ssd->sink_pad) {
2554 _r.left = 0;
2555 _r.top = 0;
2556 _r.width = v4l2_subdev_get_try_format(subdev,
2557 sd_state,
2558 sel->pad)
2559 ->width;
2560 _r.height = v4l2_subdev_get_try_format(subdev,
2561 sd_state,
2562 sel->pad)
2563 ->height;
2564 src_size = &_r;
2565 } else {
2566 src_size = v4l2_subdev_get_try_compose(
2567 subdev, sd_state, ssd->sink_pad);
2568 }
2569 }
2570
2571 if (ssd == sensor->src && sel->pad == CCS_PAD_SRC) {
2572 sel->r.left = 0;
2573 sel->r.top = 0;
2574 }
2575
2576 sel->r.width = min(sel->r.width, src_size->width);
2577 sel->r.height = min(sel->r.height, src_size->height);
2578
2579 sel->r.left = min_t(int, sel->r.left, src_size->width - sel->r.width);
2580 sel->r.top = min_t(int, sel->r.top, src_size->height - sel->r.height);
2581
2582 *crops[sel->pad] = sel->r;
2583
2584 if (ssd != sensor->pixel_array && sel->pad == CCS_PAD_SINK)
2585 ccs_propagate(subdev, sd_state, sel->which, V4L2_SEL_TGT_CROP);
2586
2587 return 0;
2588 }
2589
2590 static void ccs_get_native_size(struct ccs_subdev *ssd, struct v4l2_rect *r)
2591 {
2592 r->top = 0;
2593 r->left = 0;
2594 r->width = CCS_LIM(ssd->sensor, X_ADDR_MAX) + 1;
2595 r->height = CCS_LIM(ssd->sensor, Y_ADDR_MAX) + 1;
2596 }
2597
2598 static int __ccs_get_selection(struct v4l2_subdev *subdev,
2599 struct v4l2_subdev_state *sd_state,
2600 struct v4l2_subdev_selection *sel)
2601 {
2602 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2603 struct ccs_subdev *ssd = to_ccs_subdev(subdev);
2604 struct v4l2_rect *comp, *crops[CCS_PADS];
2605 struct v4l2_rect sink_fmt;
2606 int ret;
2607
2608 ret = __ccs_sel_supported(subdev, sel);
2609 if (ret)
2610 return ret;
2611
2612 ccs_get_crop_compose(subdev, sd_state, crops, &comp, sel->which);
2613
2614 if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
2615 sink_fmt = ssd->sink_fmt;
2616 } else {
2617 struct v4l2_mbus_framefmt *fmt =
2618 v4l2_subdev_get_try_format(subdev, sd_state,
2619 ssd->sink_pad);
2620
2621 sink_fmt.left = 0;
2622 sink_fmt.top = 0;
2623 sink_fmt.width = fmt->width;
2624 sink_fmt.height = fmt->height;
2625 }
2626
2627 switch (sel->target) {
2628 case V4L2_SEL_TGT_CROP_BOUNDS:
2629 case V4L2_SEL_TGT_NATIVE_SIZE:
2630 if (ssd == sensor->pixel_array)
2631 ccs_get_native_size(ssd, &sel->r);
2632 else if (sel->pad == ssd->sink_pad)
2633 sel->r = sink_fmt;
2634 else
2635 sel->r = *comp;
2636 break;
2637 case V4L2_SEL_TGT_CROP:
2638 case V4L2_SEL_TGT_COMPOSE_BOUNDS:
2639 sel->r = *crops[sel->pad];
2640 break;
2641 case V4L2_SEL_TGT_COMPOSE:
2642 sel->r = *comp;
2643 break;
2644 }
2645
2646 return 0;
2647 }
2648
2649 static int ccs_get_selection(struct v4l2_subdev *subdev,
2650 struct v4l2_subdev_state *sd_state,
2651 struct v4l2_subdev_selection *sel)
2652 {
2653 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2654 int rval;
2655
2656 mutex_lock(&sensor->mutex);
2657 rval = __ccs_get_selection(subdev, sd_state, sel);
2658 mutex_unlock(&sensor->mutex);
2659
2660 return rval;
2661 }
2662
2663 static int ccs_set_selection(struct v4l2_subdev *subdev,
2664 struct v4l2_subdev_state *sd_state,
2665 struct v4l2_subdev_selection *sel)
2666 {
2667 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2668 int ret;
2669
2670 ret = __ccs_sel_supported(subdev, sel);
2671 if (ret)
2672 return ret;
2673
2674 mutex_lock(&sensor->mutex);
2675
2676 sel->r.left = max(0, sel->r.left & ~1);
2677 sel->r.top = max(0, sel->r.top & ~1);
2678 sel->r.width = CCS_ALIGN_DIM(sel->r.width, sel->flags);
2679 sel->r.height = CCS_ALIGN_DIM(sel->r.height, sel->flags);
2680
2681 sel->r.width = max_t(unsigned int, CCS_LIM(sensor, MIN_X_OUTPUT_SIZE),
2682 sel->r.width);
2683 sel->r.height = max_t(unsigned int, CCS_LIM(sensor, MIN_Y_OUTPUT_SIZE),
2684 sel->r.height);
2685
2686 switch (sel->target) {
2687 case V4L2_SEL_TGT_CROP:
2688 ret = ccs_set_crop(subdev, sd_state, sel);
2689 break;
2690 case V4L2_SEL_TGT_COMPOSE:
2691 ret = ccs_set_compose(subdev, sd_state, sel);
2692 break;
2693 default:
2694 ret = -EINVAL;
2695 }
2696
2697 mutex_unlock(&sensor->mutex);
2698 return ret;
2699 }
2700
2701 static int ccs_get_skip_frames(struct v4l2_subdev *subdev, u32 *frames)
2702 {
2703 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2704
2705 *frames = sensor->frame_skip;
2706 return 0;
2707 }
2708
2709 static int ccs_get_skip_top_lines(struct v4l2_subdev *subdev, u32 *lines)
2710 {
2711 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2712
2713 *lines = sensor->image_start;
2714
2715 return 0;
2716 }
2717
2718
2719
2720
2721
2722 static ssize_t
2723 nvm_show(struct device *dev, struct device_attribute *attr, char *buf)
2724 {
2725 struct v4l2_subdev *subdev = i2c_get_clientdata(to_i2c_client(dev));
2726 struct i2c_client *client = v4l2_get_subdevdata(subdev);
2727 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2728 int rval;
2729
2730 if (!sensor->dev_init_done)
2731 return -EBUSY;
2732
2733 rval = ccs_pm_get_init(sensor);
2734 if (rval < 0)
2735 return -ENODEV;
2736
2737 rval = ccs_read_nvm(sensor, buf, PAGE_SIZE);
2738 if (rval < 0) {
2739 pm_runtime_put(&client->dev);
2740 dev_err(&client->dev, "nvm read failed\n");
2741 return -ENODEV;
2742 }
2743
2744 pm_runtime_mark_last_busy(&client->dev);
2745 pm_runtime_put_autosuspend(&client->dev);
2746
2747
2748
2749
2750
2751 return rval;
2752 }
2753 static DEVICE_ATTR_RO(nvm);
2754
2755 static ssize_t
2756 ident_show(struct device *dev, struct device_attribute *attr, char *buf)
2757 {
2758 struct v4l2_subdev *subdev = i2c_get_clientdata(to_i2c_client(dev));
2759 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2760 struct ccs_module_info *minfo = &sensor->minfo;
2761
2762 if (minfo->mipi_manufacturer_id)
2763 return sysfs_emit(buf, "%4.4x%4.4x%2.2x\n",
2764 minfo->mipi_manufacturer_id, minfo->model_id,
2765 minfo->revision_number) + 1;
2766 else
2767 return sysfs_emit(buf, "%2.2x%4.4x%2.2x\n",
2768 minfo->smia_manufacturer_id, minfo->model_id,
2769 minfo->revision_number) + 1;
2770 }
2771 static DEVICE_ATTR_RO(ident);
2772
2773
2774
2775
2776
2777 static int ccs_identify_module(struct ccs_sensor *sensor)
2778 {
2779 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
2780 struct ccs_module_info *minfo = &sensor->minfo;
2781 unsigned int i;
2782 u32 rev;
2783 int rval = 0;
2784
2785
2786 rval = ccs_read(sensor, MODULE_MANUFACTURER_ID,
2787 &minfo->mipi_manufacturer_id);
2788 if (!rval && !minfo->mipi_manufacturer_id)
2789 rval = ccs_read_addr_8only(sensor,
2790 SMIAPP_REG_U8_MANUFACTURER_ID,
2791 &minfo->smia_manufacturer_id);
2792 if (!rval)
2793 rval = ccs_read_addr_8only(sensor, CCS_R_MODULE_MODEL_ID,
2794 &minfo->model_id);
2795 if (!rval)
2796 rval = ccs_read_addr_8only(sensor,
2797 CCS_R_MODULE_REVISION_NUMBER_MAJOR,
2798 &rev);
2799 if (!rval) {
2800 rval = ccs_read_addr_8only(sensor,
2801 CCS_R_MODULE_REVISION_NUMBER_MINOR,
2802 &minfo->revision_number);
2803 minfo->revision_number |= rev << 8;
2804 }
2805 if (!rval)
2806 rval = ccs_read_addr_8only(sensor, CCS_R_MODULE_DATE_YEAR,
2807 &minfo->module_year);
2808 if (!rval)
2809 rval = ccs_read_addr_8only(sensor, CCS_R_MODULE_DATE_MONTH,
2810 &minfo->module_month);
2811 if (!rval)
2812 rval = ccs_read_addr_8only(sensor, CCS_R_MODULE_DATE_DAY,
2813 &minfo->module_day);
2814
2815
2816 if (!rval)
2817 rval = ccs_read(sensor, SENSOR_MANUFACTURER_ID,
2818 &minfo->sensor_mipi_manufacturer_id);
2819 if (!rval && !minfo->sensor_mipi_manufacturer_id)
2820 rval = ccs_read_addr_8only(sensor,
2821 CCS_R_SENSOR_MANUFACTURER_ID,
2822 &minfo->sensor_smia_manufacturer_id);
2823 if (!rval)
2824 rval = ccs_read_addr_8only(sensor,
2825 CCS_R_SENSOR_MODEL_ID,
2826 &minfo->sensor_model_id);
2827 if (!rval)
2828 rval = ccs_read_addr_8only(sensor,
2829 CCS_R_SENSOR_REVISION_NUMBER,
2830 &minfo->sensor_revision_number);
2831 if (!rval)
2832 rval = ccs_read_addr_8only(sensor,
2833 CCS_R_SENSOR_FIRMWARE_VERSION,
2834 &minfo->sensor_firmware_version);
2835
2836
2837 if (!rval)
2838 rval = ccs_read(sensor, MIPI_CCS_VERSION, &minfo->ccs_version);
2839 if (!rval && !minfo->ccs_version)
2840 rval = ccs_read_addr_8only(sensor, SMIAPP_REG_U8_SMIA_VERSION,
2841 &minfo->smia_version);
2842 if (!rval && !minfo->ccs_version)
2843 rval = ccs_read_addr_8only(sensor, SMIAPP_REG_U8_SMIAPP_VERSION,
2844 &minfo->smiapp_version);
2845
2846 if (rval) {
2847 dev_err(&client->dev, "sensor detection failed\n");
2848 return -ENODEV;
2849 }
2850
2851 if (minfo->mipi_manufacturer_id)
2852 dev_dbg(&client->dev, "MIPI CCS module 0x%4.4x-0x%4.4x\n",
2853 minfo->mipi_manufacturer_id, minfo->model_id);
2854 else
2855 dev_dbg(&client->dev, "SMIA module 0x%2.2x-0x%4.4x\n",
2856 minfo->smia_manufacturer_id, minfo->model_id);
2857
2858 dev_dbg(&client->dev,
2859 "module revision 0x%4.4x date %2.2d-%2.2d-%2.2d\n",
2860 minfo->revision_number, minfo->module_year, minfo->module_month,
2861 minfo->module_day);
2862
2863 if (minfo->sensor_mipi_manufacturer_id)
2864 dev_dbg(&client->dev, "MIPI CCS sensor 0x%4.4x-0x%4.4x\n",
2865 minfo->sensor_mipi_manufacturer_id,
2866 minfo->sensor_model_id);
2867 else
2868 dev_dbg(&client->dev, "SMIA sensor 0x%2.2x-0x%4.4x\n",
2869 minfo->sensor_smia_manufacturer_id,
2870 minfo->sensor_model_id);
2871
2872 dev_dbg(&client->dev,
2873 "sensor revision 0x%2.2x firmware version 0x%2.2x\n",
2874 minfo->sensor_revision_number, minfo->sensor_firmware_version);
2875
2876 if (minfo->ccs_version) {
2877 dev_dbg(&client->dev, "MIPI CCS version %u.%u",
2878 (minfo->ccs_version & CCS_MIPI_CCS_VERSION_MAJOR_MASK)
2879 >> CCS_MIPI_CCS_VERSION_MAJOR_SHIFT,
2880 (minfo->ccs_version & CCS_MIPI_CCS_VERSION_MINOR_MASK));
2881 minfo->name = CCS_NAME;
2882 } else {
2883 dev_dbg(&client->dev,
2884 "smia version %2.2d smiapp version %2.2d\n",
2885 minfo->smia_version, minfo->smiapp_version);
2886 minfo->name = SMIAPP_NAME;
2887 }
2888
2889
2890
2891
2892
2893
2894 if (minfo->sensor_smia_manufacturer_id &&
2895 !minfo->smia_manufacturer_id && !minfo->model_id) {
2896 minfo->smia_manufacturer_id =
2897 minfo->sensor_smia_manufacturer_id;
2898 minfo->model_id = minfo->sensor_model_id;
2899 minfo->revision_number = minfo->sensor_revision_number;
2900 }
2901
2902 for (i = 0; i < ARRAY_SIZE(ccs_module_idents); i++) {
2903 if (ccs_module_idents[i].mipi_manufacturer_id &&
2904 ccs_module_idents[i].mipi_manufacturer_id
2905 != minfo->mipi_manufacturer_id)
2906 continue;
2907 if (ccs_module_idents[i].smia_manufacturer_id &&
2908 ccs_module_idents[i].smia_manufacturer_id
2909 != minfo->smia_manufacturer_id)
2910 continue;
2911 if (ccs_module_idents[i].model_id != minfo->model_id)
2912 continue;
2913 if (ccs_module_idents[i].flags
2914 & CCS_MODULE_IDENT_FLAG_REV_LE) {
2915 if (ccs_module_idents[i].revision_number_major
2916 < (minfo->revision_number >> 8))
2917 continue;
2918 } else {
2919 if (ccs_module_idents[i].revision_number_major
2920 != (minfo->revision_number >> 8))
2921 continue;
2922 }
2923
2924 minfo->name = ccs_module_idents[i].name;
2925 minfo->quirk = ccs_module_idents[i].quirk;
2926 break;
2927 }
2928
2929 if (i >= ARRAY_SIZE(ccs_module_idents))
2930 dev_warn(&client->dev,
2931 "no quirks for this module; let's hope it's fully compliant\n");
2932
2933 dev_dbg(&client->dev, "the sensor is called %s\n", minfo->name);
2934
2935 return 0;
2936 }
2937
2938 static const struct v4l2_subdev_ops ccs_ops;
2939 static const struct v4l2_subdev_internal_ops ccs_internal_ops;
2940 static const struct media_entity_operations ccs_entity_ops;
2941
2942 static int ccs_register_subdev(struct ccs_sensor *sensor,
2943 struct ccs_subdev *ssd,
2944 struct ccs_subdev *sink_ssd,
2945 u16 source_pad, u16 sink_pad, u32 link_flags)
2946 {
2947 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
2948 int rval;
2949
2950 if (!sink_ssd)
2951 return 0;
2952
2953 rval = media_entity_pads_init(&ssd->sd.entity, ssd->npads, ssd->pads);
2954 if (rval) {
2955 dev_err(&client->dev, "media_entity_pads_init failed\n");
2956 return rval;
2957 }
2958
2959 rval = v4l2_device_register_subdev(sensor->src->sd.v4l2_dev, &ssd->sd);
2960 if (rval) {
2961 dev_err(&client->dev, "v4l2_device_register_subdev failed\n");
2962 return rval;
2963 }
2964
2965 rval = media_create_pad_link(&ssd->sd.entity, source_pad,
2966 &sink_ssd->sd.entity, sink_pad,
2967 link_flags);
2968 if (rval) {
2969 dev_err(&client->dev, "media_create_pad_link failed\n");
2970 v4l2_device_unregister_subdev(&ssd->sd);
2971 return rval;
2972 }
2973
2974 return 0;
2975 }
2976
2977 static void ccs_unregistered(struct v4l2_subdev *subdev)
2978 {
2979 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2980 unsigned int i;
2981
2982 for (i = 1; i < sensor->ssds_used; i++)
2983 v4l2_device_unregister_subdev(&sensor->ssds[i].sd);
2984 }
2985
2986 static int ccs_registered(struct v4l2_subdev *subdev)
2987 {
2988 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
2989 int rval;
2990
2991 if (sensor->scaler) {
2992 rval = ccs_register_subdev(sensor, sensor->binner,
2993 sensor->scaler,
2994 CCS_PAD_SRC, CCS_PAD_SINK,
2995 MEDIA_LNK_FL_ENABLED |
2996 MEDIA_LNK_FL_IMMUTABLE);
2997 if (rval < 0)
2998 return rval;
2999 }
3000
3001 rval = ccs_register_subdev(sensor, sensor->pixel_array, sensor->binner,
3002 CCS_PA_PAD_SRC, CCS_PAD_SINK,
3003 MEDIA_LNK_FL_ENABLED |
3004 MEDIA_LNK_FL_IMMUTABLE);
3005 if (rval)
3006 goto out_err;
3007
3008 return 0;
3009
3010 out_err:
3011 ccs_unregistered(subdev);
3012
3013 return rval;
3014 }
3015
3016 static void ccs_cleanup(struct ccs_sensor *sensor)
3017 {
3018 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
3019
3020 device_remove_file(&client->dev, &dev_attr_nvm);
3021 device_remove_file(&client->dev, &dev_attr_ident);
3022
3023 ccs_free_controls(sensor);
3024 }
3025
3026 static void ccs_create_subdev(struct ccs_sensor *sensor,
3027 struct ccs_subdev *ssd, const char *name,
3028 unsigned short num_pads, u32 function)
3029 {
3030 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
3031
3032 if (!ssd)
3033 return;
3034
3035 if (ssd != sensor->src)
3036 v4l2_subdev_init(&ssd->sd, &ccs_ops);
3037
3038 ssd->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
3039 ssd->sd.entity.function = function;
3040 ssd->sensor = sensor;
3041
3042 ssd->npads = num_pads;
3043 ssd->source_pad = num_pads - 1;
3044
3045 v4l2_i2c_subdev_set_name(&ssd->sd, client, sensor->minfo.name, name);
3046
3047 ccs_get_native_size(ssd, &ssd->sink_fmt);
3048
3049 ssd->compose.width = ssd->sink_fmt.width;
3050 ssd->compose.height = ssd->sink_fmt.height;
3051 ssd->crop[ssd->source_pad] = ssd->compose;
3052 ssd->pads[ssd->source_pad].flags = MEDIA_PAD_FL_SOURCE;
3053 if (ssd != sensor->pixel_array) {
3054 ssd->crop[ssd->sink_pad] = ssd->compose;
3055 ssd->pads[ssd->sink_pad].flags = MEDIA_PAD_FL_SINK;
3056 }
3057
3058 ssd->sd.entity.ops = &ccs_entity_ops;
3059
3060 if (ssd == sensor->src)
3061 return;
3062
3063 ssd->sd.internal_ops = &ccs_internal_ops;
3064 ssd->sd.owner = THIS_MODULE;
3065 ssd->sd.dev = &client->dev;
3066 v4l2_set_subdevdata(&ssd->sd, client);
3067 }
3068
3069 static int ccs_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
3070 {
3071 struct ccs_subdev *ssd = to_ccs_subdev(sd);
3072 struct ccs_sensor *sensor = ssd->sensor;
3073 unsigned int i;
3074
3075 mutex_lock(&sensor->mutex);
3076
3077 for (i = 0; i < ssd->npads; i++) {
3078 struct v4l2_mbus_framefmt *try_fmt =
3079 v4l2_subdev_get_try_format(sd, fh->state, i);
3080 struct v4l2_rect *try_crop =
3081 v4l2_subdev_get_try_crop(sd, fh->state, i);
3082 struct v4l2_rect *try_comp;
3083
3084 ccs_get_native_size(ssd, try_crop);
3085
3086 try_fmt->width = try_crop->width;
3087 try_fmt->height = try_crop->height;
3088 try_fmt->code = sensor->internal_csi_format->code;
3089 try_fmt->field = V4L2_FIELD_NONE;
3090
3091 if (ssd != sensor->pixel_array)
3092 continue;
3093
3094 try_comp = v4l2_subdev_get_try_compose(sd, fh->state, i);
3095 *try_comp = *try_crop;
3096 }
3097
3098 mutex_unlock(&sensor->mutex);
3099
3100 return 0;
3101 }
3102
3103 static const struct v4l2_subdev_video_ops ccs_video_ops = {
3104 .s_stream = ccs_set_stream,
3105 .pre_streamon = ccs_pre_streamon,
3106 .post_streamoff = ccs_post_streamoff,
3107 };
3108
3109 static const struct v4l2_subdev_pad_ops ccs_pad_ops = {
3110 .enum_mbus_code = ccs_enum_mbus_code,
3111 .get_fmt = ccs_get_format,
3112 .set_fmt = ccs_set_format,
3113 .get_selection = ccs_get_selection,
3114 .set_selection = ccs_set_selection,
3115 };
3116
3117 static const struct v4l2_subdev_sensor_ops ccs_sensor_ops = {
3118 .g_skip_frames = ccs_get_skip_frames,
3119 .g_skip_top_lines = ccs_get_skip_top_lines,
3120 };
3121
3122 static const struct v4l2_subdev_ops ccs_ops = {
3123 .video = &ccs_video_ops,
3124 .pad = &ccs_pad_ops,
3125 .sensor = &ccs_sensor_ops,
3126 };
3127
3128 static const struct media_entity_operations ccs_entity_ops = {
3129 .link_validate = v4l2_subdev_link_validate,
3130 };
3131
3132 static const struct v4l2_subdev_internal_ops ccs_internal_src_ops = {
3133 .registered = ccs_registered,
3134 .unregistered = ccs_unregistered,
3135 .open = ccs_open,
3136 };
3137
3138 static const struct v4l2_subdev_internal_ops ccs_internal_ops = {
3139 .open = ccs_open,
3140 };
3141
3142
3143
3144
3145
3146 static int __maybe_unused ccs_suspend(struct device *dev)
3147 {
3148 struct i2c_client *client = to_i2c_client(dev);
3149 struct v4l2_subdev *subdev = i2c_get_clientdata(client);
3150 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
3151 bool streaming = sensor->streaming;
3152 int rval;
3153
3154 rval = pm_runtime_resume_and_get(dev);
3155 if (rval < 0)
3156 return rval;
3157
3158 if (sensor->streaming)
3159 ccs_stop_streaming(sensor);
3160
3161
3162 sensor->streaming = streaming;
3163
3164 return 0;
3165 }
3166
3167 static int __maybe_unused ccs_resume(struct device *dev)
3168 {
3169 struct i2c_client *client = to_i2c_client(dev);
3170 struct v4l2_subdev *subdev = i2c_get_clientdata(client);
3171 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
3172 int rval = 0;
3173
3174 pm_runtime_put(dev);
3175
3176 if (sensor->streaming)
3177 rval = ccs_start_streaming(sensor);
3178
3179 return rval;
3180 }
3181
3182 static int ccs_get_hwconfig(struct ccs_sensor *sensor, struct device *dev)
3183 {
3184 struct ccs_hwconfig *hwcfg = &sensor->hwcfg;
3185 struct v4l2_fwnode_endpoint bus_cfg = { .bus_type = V4L2_MBUS_UNKNOWN };
3186 struct fwnode_handle *ep;
3187 struct fwnode_handle *fwnode = dev_fwnode(dev);
3188 u32 rotation;
3189 unsigned int i;
3190 int rval;
3191
3192 ep = fwnode_graph_get_endpoint_by_id(fwnode, 0, 0,
3193 FWNODE_GRAPH_ENDPOINT_NEXT);
3194 if (!ep)
3195 return -ENODEV;
3196
3197
3198
3199
3200
3201 rval = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
3202 if (rval)
3203 goto out_err;
3204
3205 switch (bus_cfg.bus_type) {
3206 case V4L2_MBUS_CSI2_DPHY:
3207 hwcfg->csi_signalling_mode = CCS_CSI_SIGNALING_MODE_CSI_2_DPHY;
3208 hwcfg->lanes = bus_cfg.bus.mipi_csi2.num_data_lanes;
3209 break;
3210 case V4L2_MBUS_CSI2_CPHY:
3211 hwcfg->csi_signalling_mode = CCS_CSI_SIGNALING_MODE_CSI_2_CPHY;
3212 hwcfg->lanes = bus_cfg.bus.mipi_csi2.num_data_lanes;
3213 break;
3214 case V4L2_MBUS_CSI1:
3215 case V4L2_MBUS_CCP2:
3216 hwcfg->csi_signalling_mode = (bus_cfg.bus.mipi_csi1.strobe) ?
3217 SMIAPP_CSI_SIGNALLING_MODE_CCP2_DATA_STROBE :
3218 SMIAPP_CSI_SIGNALLING_MODE_CCP2_DATA_CLOCK;
3219 hwcfg->lanes = 1;
3220 break;
3221 default:
3222 dev_err(dev, "unsupported bus %u\n", bus_cfg.bus_type);
3223 rval = -EINVAL;
3224 goto out_err;
3225 }
3226
3227 rval = fwnode_property_read_u32(fwnode, "rotation", &rotation);
3228 if (!rval) {
3229 switch (rotation) {
3230 case 180:
3231 hwcfg->module_board_orient =
3232 CCS_MODULE_BOARD_ORIENT_180;
3233 fallthrough;
3234 case 0:
3235 break;
3236 default:
3237 dev_err(dev, "invalid rotation %u\n", rotation);
3238 rval = -EINVAL;
3239 goto out_err;
3240 }
3241 }
3242
3243 rval = fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency",
3244 &hwcfg->ext_clk);
3245 if (rval)
3246 dev_info(dev, "can't get clock-frequency\n");
3247
3248 dev_dbg(dev, "clk %u, mode %u\n", hwcfg->ext_clk,
3249 hwcfg->csi_signalling_mode);
3250
3251 if (!bus_cfg.nr_of_link_frequencies) {
3252 dev_warn(dev, "no link frequencies defined\n");
3253 rval = -EINVAL;
3254 goto out_err;
3255 }
3256
3257 hwcfg->op_sys_clock = devm_kcalloc(
3258 dev, bus_cfg.nr_of_link_frequencies + 1 ,
3259 sizeof(*hwcfg->op_sys_clock), GFP_KERNEL);
3260 if (!hwcfg->op_sys_clock) {
3261 rval = -ENOMEM;
3262 goto out_err;
3263 }
3264
3265 for (i = 0; i < bus_cfg.nr_of_link_frequencies; i++) {
3266 hwcfg->op_sys_clock[i] = bus_cfg.link_frequencies[i];
3267 dev_dbg(dev, "freq %u: %lld\n", i, hwcfg->op_sys_clock[i]);
3268 }
3269
3270 v4l2_fwnode_endpoint_free(&bus_cfg);
3271 fwnode_handle_put(ep);
3272
3273 return 0;
3274
3275 out_err:
3276 v4l2_fwnode_endpoint_free(&bus_cfg);
3277 fwnode_handle_put(ep);
3278
3279 return rval;
3280 }
3281
3282 static int ccs_probe(struct i2c_client *client)
3283 {
3284 struct ccs_sensor *sensor;
3285 const struct firmware *fw;
3286 char filename[40];
3287 unsigned int i;
3288 int rval;
3289
3290 sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL);
3291 if (sensor == NULL)
3292 return -ENOMEM;
3293
3294 rval = ccs_get_hwconfig(sensor, &client->dev);
3295 if (rval)
3296 return rval;
3297
3298 sensor->src = &sensor->ssds[sensor->ssds_used];
3299
3300 v4l2_i2c_subdev_init(&sensor->src->sd, client, &ccs_ops);
3301 sensor->src->sd.internal_ops = &ccs_internal_src_ops;
3302
3303 sensor->regulators = devm_kcalloc(&client->dev,
3304 ARRAY_SIZE(ccs_regulators),
3305 sizeof(*sensor->regulators),
3306 GFP_KERNEL);
3307 if (!sensor->regulators)
3308 return -ENOMEM;
3309
3310 for (i = 0; i < ARRAY_SIZE(ccs_regulators); i++)
3311 sensor->regulators[i].supply = ccs_regulators[i];
3312
3313 rval = devm_regulator_bulk_get(&client->dev, ARRAY_SIZE(ccs_regulators),
3314 sensor->regulators);
3315 if (rval) {
3316 dev_err(&client->dev, "could not get regulators\n");
3317 return rval;
3318 }
3319
3320 sensor->ext_clk = devm_clk_get(&client->dev, NULL);
3321 if (PTR_ERR(sensor->ext_clk) == -ENOENT) {
3322 dev_info(&client->dev, "no clock defined, continuing...\n");
3323 sensor->ext_clk = NULL;
3324 } else if (IS_ERR(sensor->ext_clk)) {
3325 dev_err(&client->dev, "could not get clock (%ld)\n",
3326 PTR_ERR(sensor->ext_clk));
3327 return -EPROBE_DEFER;
3328 }
3329
3330 if (sensor->ext_clk) {
3331 if (sensor->hwcfg.ext_clk) {
3332 unsigned long rate;
3333
3334 rval = clk_set_rate(sensor->ext_clk,
3335 sensor->hwcfg.ext_clk);
3336 if (rval < 0) {
3337 dev_err(&client->dev,
3338 "unable to set clock freq to %u\n",
3339 sensor->hwcfg.ext_clk);
3340 return rval;
3341 }
3342
3343 rate = clk_get_rate(sensor->ext_clk);
3344 if (rate != sensor->hwcfg.ext_clk) {
3345 dev_err(&client->dev,
3346 "can't set clock freq, asked for %u but got %lu\n",
3347 sensor->hwcfg.ext_clk, rate);
3348 return -EINVAL;
3349 }
3350 } else {
3351 sensor->hwcfg.ext_clk = clk_get_rate(sensor->ext_clk);
3352 dev_dbg(&client->dev, "obtained clock freq %u\n",
3353 sensor->hwcfg.ext_clk);
3354 }
3355 } else if (sensor->hwcfg.ext_clk) {
3356 dev_dbg(&client->dev, "assuming clock freq %u\n",
3357 sensor->hwcfg.ext_clk);
3358 } else {
3359 dev_err(&client->dev, "unable to obtain clock freq\n");
3360 return -EINVAL;
3361 }
3362
3363 if (!sensor->hwcfg.ext_clk) {
3364 dev_err(&client->dev, "cannot work with xclk frequency 0\n");
3365 return -EINVAL;
3366 }
3367
3368 sensor->reset = devm_gpiod_get_optional(&client->dev, "reset",
3369 GPIOD_OUT_HIGH);
3370 if (IS_ERR(sensor->reset))
3371 return PTR_ERR(sensor->reset);
3372
3373 if (!sensor->reset)
3374 sensor->xshutdown = devm_gpiod_get_optional(&client->dev,
3375 "xshutdown",
3376 GPIOD_OUT_LOW);
3377 if (IS_ERR(sensor->xshutdown))
3378 return PTR_ERR(sensor->xshutdown);
3379
3380 rval = ccs_power_on(&client->dev);
3381 if (rval < 0)
3382 return rval;
3383
3384 mutex_init(&sensor->mutex);
3385
3386 rval = ccs_identify_module(sensor);
3387 if (rval) {
3388 rval = -ENODEV;
3389 goto out_power_off;
3390 }
3391
3392 rval = snprintf(filename, sizeof(filename),
3393 "ccs/ccs-sensor-%4.4x-%4.4x-%4.4x.fw",
3394 sensor->minfo.sensor_mipi_manufacturer_id,
3395 sensor->minfo.sensor_model_id,
3396 sensor->minfo.sensor_revision_number);
3397 if (rval >= sizeof(filename)) {
3398 rval = -ENOMEM;
3399 goto out_power_off;
3400 }
3401
3402 rval = request_firmware(&fw, filename, &client->dev);
3403 if (!rval) {
3404 ccs_data_parse(&sensor->sdata, fw->data, fw->size, &client->dev,
3405 true);
3406 release_firmware(fw);
3407 }
3408
3409 rval = snprintf(filename, sizeof(filename),
3410 "ccs/ccs-module-%4.4x-%4.4x-%4.4x.fw",
3411 sensor->minfo.mipi_manufacturer_id,
3412 sensor->minfo.model_id,
3413 sensor->minfo.revision_number);
3414 if (rval >= sizeof(filename)) {
3415 rval = -ENOMEM;
3416 goto out_release_sdata;
3417 }
3418
3419 rval = request_firmware(&fw, filename, &client->dev);
3420 if (!rval) {
3421 ccs_data_parse(&sensor->mdata, fw->data, fw->size, &client->dev,
3422 true);
3423 release_firmware(fw);
3424 }
3425
3426 rval = ccs_read_all_limits(sensor);
3427 if (rval)
3428 goto out_release_mdata;
3429
3430 rval = ccs_read_frame_fmt(sensor);
3431 if (rval) {
3432 rval = -ENODEV;
3433 goto out_free_ccs_limits;
3434 }
3435
3436 rval = ccs_update_phy_ctrl(sensor);
3437 if (rval < 0)
3438 goto out_free_ccs_limits;
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453 if (sensor->hwcfg.module_board_orient ==
3454 CCS_MODULE_BOARD_ORIENT_180)
3455 sensor->hvflip_inv_mask =
3456 CCS_IMAGE_ORIENTATION_HORIZONTAL_MIRROR |
3457 CCS_IMAGE_ORIENTATION_VERTICAL_FLIP;
3458
3459 rval = ccs_call_quirk(sensor, limits);
3460 if (rval) {
3461 dev_err(&client->dev, "limits quirks failed\n");
3462 goto out_free_ccs_limits;
3463 }
3464
3465 if (CCS_LIM(sensor, BINNING_CAPABILITY)) {
3466 sensor->nbinning_subtypes =
3467 min_t(u8, CCS_LIM(sensor, BINNING_SUB_TYPES),
3468 CCS_LIM_BINNING_SUB_TYPE_MAX_N);
3469
3470 for (i = 0; i < sensor->nbinning_subtypes; i++) {
3471 sensor->binning_subtypes[i].horizontal =
3472 CCS_LIM_AT(sensor, BINNING_SUB_TYPE, i) >>
3473 CCS_BINNING_SUB_TYPE_COLUMN_SHIFT;
3474 sensor->binning_subtypes[i].vertical =
3475 CCS_LIM_AT(sensor, BINNING_SUB_TYPE, i) &
3476 CCS_BINNING_SUB_TYPE_ROW_MASK;
3477
3478 dev_dbg(&client->dev, "binning %xx%x\n",
3479 sensor->binning_subtypes[i].horizontal,
3480 sensor->binning_subtypes[i].vertical);
3481 }
3482 }
3483 sensor->binning_horizontal = 1;
3484 sensor->binning_vertical = 1;
3485
3486 if (device_create_file(&client->dev, &dev_attr_ident) != 0) {
3487 dev_err(&client->dev, "sysfs ident entry creation failed\n");
3488 rval = -ENOENT;
3489 goto out_free_ccs_limits;
3490 }
3491
3492 if (sensor->minfo.smiapp_version &&
3493 CCS_LIM(sensor, DATA_TRANSFER_IF_CAPABILITY) &
3494 CCS_DATA_TRANSFER_IF_CAPABILITY_SUPPORTED) {
3495 if (device_create_file(&client->dev, &dev_attr_nvm) != 0) {
3496 dev_err(&client->dev, "sysfs nvm entry failed\n");
3497 rval = -EBUSY;
3498 goto out_cleanup;
3499 }
3500 }
3501
3502 if (!CCS_LIM(sensor, MIN_OP_SYS_CLK_DIV) ||
3503 !CCS_LIM(sensor, MAX_OP_SYS_CLK_DIV) ||
3504 !CCS_LIM(sensor, MIN_OP_PIX_CLK_DIV) ||
3505 !CCS_LIM(sensor, MAX_OP_PIX_CLK_DIV)) {
3506
3507 sensor->pll.flags |= CCS_PLL_FLAG_NO_OP_CLOCKS;
3508 } else if (CCS_LIM(sensor, SCALING_CAPABILITY)
3509 != CCS_SCALING_CAPABILITY_NONE ||
3510 CCS_LIM(sensor, DIGITAL_CROP_CAPABILITY)
3511 == CCS_DIGITAL_CROP_CAPABILITY_INPUT_CROP) {
3512
3513 sensor->scaler = &sensor->ssds[sensor->ssds_used];
3514 sensor->ssds_used++;
3515 }
3516 sensor->binner = &sensor->ssds[sensor->ssds_used];
3517 sensor->ssds_used++;
3518 sensor->pixel_array = &sensor->ssds[sensor->ssds_used];
3519 sensor->ssds_used++;
3520
3521 sensor->scale_m = CCS_LIM(sensor, SCALER_N_MIN);
3522
3523
3524 sensor->pll.bus_type = CCS_PLL_BUS_TYPE_CSI2_DPHY;
3525 sensor->pll.csi2.lanes = sensor->hwcfg.lanes;
3526 if (CCS_LIM(sensor, CLOCK_CALCULATION) &
3527 CCS_CLOCK_CALCULATION_LANE_SPEED) {
3528 sensor->pll.flags |= CCS_PLL_FLAG_LANE_SPEED_MODEL;
3529 if (CCS_LIM(sensor, CLOCK_CALCULATION) &
3530 CCS_CLOCK_CALCULATION_LINK_DECOUPLED) {
3531 sensor->pll.vt_lanes =
3532 CCS_LIM(sensor, NUM_OF_VT_LANES) + 1;
3533 sensor->pll.op_lanes =
3534 CCS_LIM(sensor, NUM_OF_OP_LANES) + 1;
3535 sensor->pll.flags |= CCS_PLL_FLAG_LINK_DECOUPLED;
3536 } else {
3537 sensor->pll.vt_lanes = sensor->pll.csi2.lanes;
3538 sensor->pll.op_lanes = sensor->pll.csi2.lanes;
3539 }
3540 }
3541 if (CCS_LIM(sensor, CLOCK_TREE_PLL_CAPABILITY) &
3542 CCS_CLOCK_TREE_PLL_CAPABILITY_EXT_DIVIDER)
3543 sensor->pll.flags |= CCS_PLL_FLAG_EXT_IP_PLL_DIVIDER;
3544 if (CCS_LIM(sensor, CLOCK_TREE_PLL_CAPABILITY) &
3545 CCS_CLOCK_TREE_PLL_CAPABILITY_FLEXIBLE_OP_PIX_CLK_DIV)
3546 sensor->pll.flags |= CCS_PLL_FLAG_FLEXIBLE_OP_PIX_CLK_DIV;
3547 if (CCS_LIM(sensor, FIFO_SUPPORT_CAPABILITY) &
3548 CCS_FIFO_SUPPORT_CAPABILITY_DERATING)
3549 sensor->pll.flags |= CCS_PLL_FLAG_FIFO_DERATING;
3550 if (CCS_LIM(sensor, FIFO_SUPPORT_CAPABILITY) &
3551 CCS_FIFO_SUPPORT_CAPABILITY_DERATING_OVERRATING)
3552 sensor->pll.flags |= CCS_PLL_FLAG_FIFO_DERATING |
3553 CCS_PLL_FLAG_FIFO_OVERRATING;
3554 if (CCS_LIM(sensor, CLOCK_TREE_PLL_CAPABILITY) &
3555 CCS_CLOCK_TREE_PLL_CAPABILITY_DUAL_PLL) {
3556 if (CCS_LIM(sensor, CLOCK_TREE_PLL_CAPABILITY) &
3557 CCS_CLOCK_TREE_PLL_CAPABILITY_SINGLE_PLL) {
3558 u32 v;
3559
3560
3561 rval = ccs_read(sensor, PLL_MODE, &v);
3562 if (rval)
3563 goto out_cleanup;
3564
3565 if (v == CCS_PLL_MODE_DUAL)
3566 sensor->pll.flags |= CCS_PLL_FLAG_DUAL_PLL;
3567 } else {
3568 sensor->pll.flags |= CCS_PLL_FLAG_DUAL_PLL;
3569 }
3570 if (CCS_LIM(sensor, CLOCK_CALCULATION) &
3571 CCS_CLOCK_CALCULATION_DUAL_PLL_OP_SYS_DDR)
3572 sensor->pll.flags |= CCS_PLL_FLAG_OP_SYS_DDR;
3573 if (CCS_LIM(sensor, CLOCK_CALCULATION) &
3574 CCS_CLOCK_CALCULATION_DUAL_PLL_OP_PIX_DDR)
3575 sensor->pll.flags |= CCS_PLL_FLAG_OP_PIX_DDR;
3576 }
3577 sensor->pll.op_bits_per_lane = CCS_LIM(sensor, OP_BITS_PER_LANE);
3578 sensor->pll.ext_clk_freq_hz = sensor->hwcfg.ext_clk;
3579 sensor->pll.scale_n = CCS_LIM(sensor, SCALER_N_MIN);
3580
3581 ccs_create_subdev(sensor, sensor->scaler, " scaler", 2,
3582 MEDIA_ENT_F_PROC_VIDEO_SCALER);
3583 ccs_create_subdev(sensor, sensor->binner, " binner", 2,
3584 MEDIA_ENT_F_PROC_VIDEO_SCALER);
3585 ccs_create_subdev(sensor, sensor->pixel_array, " pixel_array", 1,
3586 MEDIA_ENT_F_CAM_SENSOR);
3587
3588 rval = ccs_init_controls(sensor);
3589 if (rval < 0)
3590 goto out_cleanup;
3591
3592 rval = ccs_call_quirk(sensor, init);
3593 if (rval)
3594 goto out_cleanup;
3595
3596 rval = ccs_get_mbus_formats(sensor);
3597 if (rval) {
3598 rval = -ENODEV;
3599 goto out_cleanup;
3600 }
3601
3602 rval = ccs_init_late_controls(sensor);
3603 if (rval) {
3604 rval = -ENODEV;
3605 goto out_cleanup;
3606 }
3607
3608 mutex_lock(&sensor->mutex);
3609 rval = ccs_pll_blanking_update(sensor);
3610 mutex_unlock(&sensor->mutex);
3611 if (rval) {
3612 dev_err(&client->dev, "update mode failed\n");
3613 goto out_cleanup;
3614 }
3615
3616 sensor->streaming = false;
3617 sensor->dev_init_done = true;
3618
3619 rval = media_entity_pads_init(&sensor->src->sd.entity, 2,
3620 sensor->src->pads);
3621 if (rval < 0)
3622 goto out_media_entity_cleanup;
3623
3624 rval = ccs_write_msr_regs(sensor);
3625 if (rval)
3626 goto out_media_entity_cleanup;
3627
3628 pm_runtime_set_active(&client->dev);
3629 pm_runtime_get_noresume(&client->dev);
3630 pm_runtime_enable(&client->dev);
3631
3632 rval = v4l2_async_register_subdev_sensor(&sensor->src->sd);
3633 if (rval < 0)
3634 goto out_disable_runtime_pm;
3635
3636 pm_runtime_set_autosuspend_delay(&client->dev, 1000);
3637 pm_runtime_use_autosuspend(&client->dev);
3638 pm_runtime_put_autosuspend(&client->dev);
3639
3640 return 0;
3641
3642 out_disable_runtime_pm:
3643 pm_runtime_put_noidle(&client->dev);
3644 pm_runtime_disable(&client->dev);
3645
3646 out_media_entity_cleanup:
3647 media_entity_cleanup(&sensor->src->sd.entity);
3648
3649 out_cleanup:
3650 ccs_cleanup(sensor);
3651
3652 out_release_mdata:
3653 kvfree(sensor->mdata.backing);
3654
3655 out_release_sdata:
3656 kvfree(sensor->sdata.backing);
3657
3658 out_free_ccs_limits:
3659 kfree(sensor->ccs_limits);
3660
3661 out_power_off:
3662 ccs_power_off(&client->dev);
3663 mutex_destroy(&sensor->mutex);
3664
3665 return rval;
3666 }
3667
3668 static int ccs_remove(struct i2c_client *client)
3669 {
3670 struct v4l2_subdev *subdev = i2c_get_clientdata(client);
3671 struct ccs_sensor *sensor = to_ccs_sensor(subdev);
3672 unsigned int i;
3673
3674 v4l2_async_unregister_subdev(subdev);
3675
3676 pm_runtime_disable(&client->dev);
3677 if (!pm_runtime_status_suspended(&client->dev))
3678 ccs_power_off(&client->dev);
3679 pm_runtime_set_suspended(&client->dev);
3680
3681 for (i = 0; i < sensor->ssds_used; i++) {
3682 v4l2_device_unregister_subdev(&sensor->ssds[i].sd);
3683 media_entity_cleanup(&sensor->ssds[i].sd.entity);
3684 }
3685 ccs_cleanup(sensor);
3686 mutex_destroy(&sensor->mutex);
3687 kfree(sensor->ccs_limits);
3688 kvfree(sensor->sdata.backing);
3689 kvfree(sensor->mdata.backing);
3690
3691 return 0;
3692 }
3693
3694 static const struct ccs_device smia_device = {
3695 .flags = CCS_DEVICE_FLAG_IS_SMIA,
3696 };
3697
3698 static const struct ccs_device ccs_device = {};
3699
3700 static const struct acpi_device_id ccs_acpi_table[] = {
3701 { .id = "MIPI0200", .driver_data = (unsigned long)&ccs_device },
3702 { },
3703 };
3704 MODULE_DEVICE_TABLE(acpi, ccs_acpi_table);
3705
3706 static const struct of_device_id ccs_of_table[] = {
3707 { .compatible = "mipi-ccs-1.1", .data = &ccs_device },
3708 { .compatible = "mipi-ccs-1.0", .data = &ccs_device },
3709 { .compatible = "mipi-ccs", .data = &ccs_device },
3710 { .compatible = "nokia,smia", .data = &smia_device },
3711 { },
3712 };
3713 MODULE_DEVICE_TABLE(of, ccs_of_table);
3714
3715 static const struct dev_pm_ops ccs_pm_ops = {
3716 SET_SYSTEM_SLEEP_PM_OPS(ccs_suspend, ccs_resume)
3717 SET_RUNTIME_PM_OPS(ccs_power_off, ccs_power_on, NULL)
3718 };
3719
3720 static struct i2c_driver ccs_i2c_driver = {
3721 .driver = {
3722 .acpi_match_table = ccs_acpi_table,
3723 .of_match_table = ccs_of_table,
3724 .name = CCS_NAME,
3725 .pm = &ccs_pm_ops,
3726 },
3727 .probe_new = ccs_probe,
3728 .remove = ccs_remove,
3729 };
3730
3731 static int ccs_module_init(void)
3732 {
3733 unsigned int i, l;
3734
3735 for (i = 0, l = 0; ccs_limits[i].size && l < CCS_L_LAST; i++) {
3736 if (!(ccs_limits[i].flags & CCS_L_FL_SAME_REG)) {
3737 ccs_limit_offsets[l + 1].lim =
3738 ALIGN(ccs_limit_offsets[l].lim +
3739 ccs_limits[i].size,
3740 ccs_reg_width(ccs_limits[i + 1].reg));
3741 ccs_limit_offsets[l].info = i;
3742 l++;
3743 } else {
3744 ccs_limit_offsets[l].lim += ccs_limits[i].size;
3745 }
3746 }
3747
3748 if (WARN_ON(ccs_limits[i].size))
3749 return -EINVAL;
3750
3751 if (WARN_ON(l != CCS_L_LAST))
3752 return -EINVAL;
3753
3754 return i2c_register_driver(THIS_MODULE, &ccs_i2c_driver);
3755 }
3756
3757 static void ccs_module_cleanup(void)
3758 {
3759 i2c_del_driver(&ccs_i2c_driver);
3760 }
3761
3762 module_init(ccs_module_init);
3763 module_exit(ccs_module_cleanup);
3764
3765 MODULE_AUTHOR("Sakari Ailus <sakari.ailus@linux.intel.com>");
3766 MODULE_DESCRIPTION("Generic MIPI CCS/SMIA/SMIA++ camera sensor driver");
3767 MODULE_LICENSE("GPL v2");
3768 MODULE_ALIAS("smiapp");