Symbol: s5k3m5
drivers/media/i2c/s5k3m5.c
1009
struct s5k3m5 *s5k3m5 = to_s5k3m5(sd);
drivers/media/i2c/s5k3m5.c
1015
code->code = s5k3m5_get_format_code(s5k3m5);
drivers/media/i2c/s5k3m5.c
1024
struct s5k3m5 *s5k3m5 = to_s5k3m5(sd);
drivers/media/i2c/s5k3m5.c
1029
if (fse->code != s5k3m5_get_format_code(s5k3m5))
drivers/media/i2c/s5k3m5.c
1044
struct s5k3m5 *s5k3m5 = to_s5k3m5(sd);
drivers/media/i2c/s5k3m5.c
1054
sel->r.width = s5k3m5->mode->width;
drivers/media/i2c/s5k3m5.c
1055
sel->r.height = s5k3m5->mode->width;
drivers/media/i2c/s5k3m5.c
1067
struct s5k3m5 *s5k3m5 = to_s5k3m5(sd);
drivers/media/i2c/s5k3m5.c
1073
.width = s5k3m5->mode->width,
drivers/media/i2c/s5k3m5.c
1074
.height = s5k3m5->mode->height,
drivers/media/i2c/s5k3m5.c
1110
static int s5k3m5_identify_sensor(struct s5k3m5 *s5k3m5)
drivers/media/i2c/s5k3m5.c
1115
ret = cci_read(s5k3m5->regmap, S5K3M5_REG_CHIP_ID, &val, NULL);
drivers/media/i2c/s5k3m5.c
1117
dev_err(s5k3m5->dev, "failed to read chip id: %d\n", ret);
drivers/media/i2c/s5k3m5.c
1122
dev_err(s5k3m5->dev, "chip id mismatch: %x!=%llx\n",
drivers/media/i2c/s5k3m5.c
1130
static int s5k3m5_check_hwcfg(struct s5k3m5 *s5k3m5)
drivers/media/i2c/s5k3m5.c
1132
struct fwnode_handle *fwnode = dev_fwnode(s5k3m5->dev), *ep;
drivers/media/i2c/s5k3m5.c
1157
dev_err(s5k3m5->dev, "Invalid number of data lanes: %u\n",
drivers/media/i2c/s5k3m5.c
1163
ret = v4l2_link_freq_to_bitmap(s5k3m5->dev, bus_cfg.link_frequencies,
drivers/media/i2c/s5k3m5.c
1178
struct s5k3m5 *s5k3m5 = to_s5k3m5(sd);
drivers/media/i2c/s5k3m5.c
1181
ret = regulator_bulk_enable(S5K3M5_NUM_SUPPLIES, s5k3m5->supplies);
drivers/media/i2c/s5k3m5.c
1185
ret = clk_prepare_enable(s5k3m5->mclk);
drivers/media/i2c/s5k3m5.c
1189
gpiod_set_value_cansleep(s5k3m5->reset_gpio, 0);
drivers/media/i2c/s5k3m5.c
1195
regulator_bulk_disable(S5K3M5_NUM_SUPPLIES, s5k3m5->supplies);
drivers/media/i2c/s5k3m5.c
1203
struct s5k3m5 *s5k3m5 = to_s5k3m5(sd);
drivers/media/i2c/s5k3m5.c
1205
gpiod_set_value_cansleep(s5k3m5->reset_gpio, 1);
drivers/media/i2c/s5k3m5.c
1207
clk_disable_unprepare(s5k3m5->mclk);
drivers/media/i2c/s5k3m5.c
1209
regulator_bulk_disable(S5K3M5_NUM_SUPPLIES, s5k3m5->supplies);
drivers/media/i2c/s5k3m5.c
1216
struct s5k3m5 *s5k3m5;
drivers/media/i2c/s5k3m5.c
1221
s5k3m5 = devm_kzalloc(&client->dev, sizeof(*s5k3m5), GFP_KERNEL);
drivers/media/i2c/s5k3m5.c
1222
if (!s5k3m5)
drivers/media/i2c/s5k3m5.c
1225
s5k3m5->dev = &client->dev;
drivers/media/i2c/s5k3m5.c
1226
v4l2_i2c_subdev_init(&s5k3m5->sd, client, &s5k3m5_subdev_ops);
drivers/media/i2c/s5k3m5.c
1228
s5k3m5->regmap = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/s5k3m5.c
1229
if (IS_ERR(s5k3m5->regmap))
drivers/media/i2c/s5k3m5.c
1230
return dev_err_probe(s5k3m5->dev, PTR_ERR(s5k3m5->regmap),
drivers/media/i2c/s5k3m5.c
1233
s5k3m5->mclk = devm_v4l2_sensor_clk_get(s5k3m5->dev, NULL);
drivers/media/i2c/s5k3m5.c
1234
if (IS_ERR(s5k3m5->mclk))
drivers/media/i2c/s5k3m5.c
1235
return dev_err_probe(s5k3m5->dev, PTR_ERR(s5k3m5->mclk),
drivers/media/i2c/s5k3m5.c
1238
freq = clk_get_rate(s5k3m5->mclk);
drivers/media/i2c/s5k3m5.c
1240
return dev_err_probe(s5k3m5->dev, -EINVAL,
drivers/media/i2c/s5k3m5.c
1244
ret = s5k3m5_check_hwcfg(s5k3m5);
drivers/media/i2c/s5k3m5.c
1246
return dev_err_probe(s5k3m5->dev, ret,
drivers/media/i2c/s5k3m5.c
1249
s5k3m5->reset_gpio = devm_gpiod_get_optional(s5k3m5->dev, "reset",
drivers/media/i2c/s5k3m5.c
1251
if (IS_ERR(s5k3m5->reset_gpio))
drivers/media/i2c/s5k3m5.c
1252
return dev_err_probe(s5k3m5->dev, PTR_ERR(s5k3m5->reset_gpio),
drivers/media/i2c/s5k3m5.c
1256
s5k3m5->supplies[i].supply = s5k3m5_supply_names[i];
drivers/media/i2c/s5k3m5.c
1258
ret = devm_regulator_bulk_get(s5k3m5->dev, S5K3M5_NUM_SUPPLIES,
drivers/media/i2c/s5k3m5.c
1259
s5k3m5->supplies);
drivers/media/i2c/s5k3m5.c
1261
return dev_err_probe(s5k3m5->dev, ret,
drivers/media/i2c/s5k3m5.c
1265
ret = s5k3m5_power_on(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
1269
ret = s5k3m5_identify_sensor(s5k3m5);
drivers/media/i2c/s5k3m5.c
1271
dev_err_probe(s5k3m5->dev, ret, "failed to find sensor\n");
drivers/media/i2c/s5k3m5.c
1275
s5k3m5->mode = &s5k3m5_supported_modes[0];
drivers/media/i2c/s5k3m5.c
1276
ret = s5k3m5_init_controls(s5k3m5);
drivers/media/i2c/s5k3m5.c
1278
dev_err_probe(s5k3m5->dev, ret, "failed to init controls\n");
drivers/media/i2c/s5k3m5.c
1282
s5k3m5->sd.state_lock = s5k3m5->ctrl_handler.lock;
drivers/media/i2c/s5k3m5.c
1283
s5k3m5->sd.internal_ops = &s5k3m5_internal_ops;
drivers/media/i2c/s5k3m5.c
1284
s5k3m5->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/s5k3m5.c
1285
s5k3m5->sd.entity.ops = &s5k3m5_subdev_entity_ops;
drivers/media/i2c/s5k3m5.c
1286
s5k3m5->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/s5k3m5.c
1287
s5k3m5->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/s5k3m5.c
1289
ret = media_entity_pads_init(&s5k3m5->sd.entity, 1, &s5k3m5->pad);
drivers/media/i2c/s5k3m5.c
1291
dev_err_probe(s5k3m5->dev, ret,
drivers/media/i2c/s5k3m5.c
1296
ret = v4l2_subdev_init_finalize(&s5k3m5->sd);
drivers/media/i2c/s5k3m5.c
1298
dev_err_probe(s5k3m5->dev, ret,
drivers/media/i2c/s5k3m5.c
1303
pm_runtime_set_active(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
1304
pm_runtime_enable(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
1306
ret = v4l2_async_register_subdev_sensor(&s5k3m5->sd);
drivers/media/i2c/s5k3m5.c
1308
dev_err_probe(s5k3m5->dev, ret,
drivers/media/i2c/s5k3m5.c
1313
pm_runtime_set_autosuspend_delay(s5k3m5->dev, 1000);
drivers/media/i2c/s5k3m5.c
1314
pm_runtime_use_autosuspend(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
1315
pm_runtime_idle(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
1320
v4l2_subdev_cleanup(&s5k3m5->sd);
drivers/media/i2c/s5k3m5.c
1321
pm_runtime_disable(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
1322
pm_runtime_set_suspended(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
1325
media_entity_cleanup(&s5k3m5->sd.entity);
drivers/media/i2c/s5k3m5.c
1328
v4l2_ctrl_handler_free(s5k3m5->sd.ctrl_handler);
drivers/media/i2c/s5k3m5.c
1331
s5k3m5_power_off(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
1339
struct s5k3m5 *s5k3m5 = to_s5k3m5(sd);
drivers/media/i2c/s5k3m5.c
1345
pm_runtime_disable(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
1347
if (!pm_runtime_status_suspended(s5k3m5->dev)) {
drivers/media/i2c/s5k3m5.c
1348
s5k3m5_power_off(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
1349
pm_runtime_set_suspended(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
56
#define to_s5k3m5(_sd) container_of(_sd, struct s5k3m5, sd)
drivers/media/i2c/s5k3m5.c
720
struct s5k3m5 *s5k3m5 = container_of(ctrl->handler, struct s5k3m5,
drivers/media/i2c/s5k3m5.c
722
const struct s5k3m5_mode *mode = s5k3m5->mode;
drivers/media/i2c/s5k3m5.c
735
__v4l2_ctrl_modify_range(s5k3m5->exposure,
drivers/media/i2c/s5k3m5.c
736
s5k3m5->exposure->minimum,
drivers/media/i2c/s5k3m5.c
738
s5k3m5->exposure->step,
drivers/media/i2c/s5k3m5.c
739
s5k3m5->exposure->default_value);
drivers/media/i2c/s5k3m5.c
744
if (!pm_runtime_get_if_active(s5k3m5->dev))
drivers/media/i2c/s5k3m5.c
749
ret = cci_write(s5k3m5->regmap, S5K3M5_REG_AGAIN,
drivers/media/i2c/s5k3m5.c
753
ret = cci_write(s5k3m5->regmap, S5K3M5_REG_EXPOSURE,
drivers/media/i2c/s5k3m5.c
757
ret = cci_write(s5k3m5->regmap, S5K3M5_REG_VTS,
drivers/media/i2c/s5k3m5.c
761
ret = cci_write(s5k3m5->regmap, S5K3M5_REG_TEST_PATTERN,
drivers/media/i2c/s5k3m5.c
769
pm_runtime_put(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
783
static int s5k3m5_init_controls(struct s5k3m5 *s5k3m5)
drivers/media/i2c/s5k3m5.c
785
struct v4l2_ctrl_handler *ctrl_hdlr = &s5k3m5->ctrl_handler;
drivers/media/i2c/s5k3m5.c
786
const struct s5k3m5_mode *mode = s5k3m5->mode;
drivers/media/i2c/s5k3m5.c
793
s5k3m5->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &s5k3m5_ctrl_ops,
drivers/media/i2c/s5k3m5.c
797
if (s5k3m5->link_freq)
drivers/media/i2c/s5k3m5.c
798
s5k3m5->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/s5k3m5.c
801
s5k3m5->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &s5k3m5_ctrl_ops,
drivers/media/i2c/s5k3m5.c
806
s5k3m5->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &s5k3m5_ctrl_ops,
drivers/media/i2c/s5k3m5.c
809
if (s5k3m5->hblank)
drivers/media/i2c/s5k3m5.c
810
s5k3m5->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/s5k3m5.c
813
s5k3m5->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &s5k3m5_ctrl_ops,
drivers/media/i2c/s5k3m5.c
823
s5k3m5->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &s5k3m5_ctrl_ops,
drivers/media/i2c/s5k3m5.c
835
s5k3m5->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &s5k3m5_ctrl_ops,
drivers/media/i2c/s5k3m5.c
837
if (s5k3m5->hflip)
drivers/media/i2c/s5k3m5.c
838
s5k3m5->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/s5k3m5.c
840
s5k3m5->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &s5k3m5_ctrl_ops,
drivers/media/i2c/s5k3m5.c
842
if (s5k3m5->vflip)
drivers/media/i2c/s5k3m5.c
843
s5k3m5->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/s5k3m5.c
845
ret = v4l2_fwnode_device_parse(s5k3m5->dev, &props);
drivers/media/i2c/s5k3m5.c
854
s5k3m5->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/s5k3m5.c
868
struct s5k3m5 *s5k3m5 = to_s5k3m5(sd);
drivers/media/i2c/s5k3m5.c
869
const struct s5k3m5_reg_list *reg_list = &s5k3m5->mode->reg_list;
drivers/media/i2c/s5k3m5.c
872
ret = pm_runtime_resume_and_get(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
877
cci_write(s5k3m5->regmap, CCI_REG16(0x6028), 0x4000, &ret);
drivers/media/i2c/s5k3m5.c
880
cci_write(s5k3m5->regmap, CCI_REG16(0x0000), 0x0006, &ret);
drivers/media/i2c/s5k3m5.c
881
cci_write(s5k3m5->regmap, CCI_REG16(0x0000), S5K3M5_CHIP_ID, &ret);
drivers/media/i2c/s5k3m5.c
882
cci_write(s5k3m5->regmap, CCI_REG16(0x6214), 0x7971, &ret);
drivers/media/i2c/s5k3m5.c
883
cci_write(s5k3m5->regmap, CCI_REG16(0x6218), 0x7150, &ret);
drivers/media/i2c/s5k3m5.c
889
cci_write(s5k3m5->regmap, CCI_REG16(0x0a02), 0x7800, &ret);
drivers/media/i2c/s5k3m5.c
890
cci_write(s5k3m5->regmap, CCI_REG16(0x6028), 0x2000, &ret);
drivers/media/i2c/s5k3m5.c
891
cci_write(s5k3m5->regmap, CCI_REG16(0x602a), 0x3eac, &ret);
drivers/media/i2c/s5k3m5.c
894
cci_multi_reg_write(s5k3m5->regmap, burst_array_setting,
drivers/media/i2c/s5k3m5.c
896
cci_multi_reg_write(s5k3m5->regmap, init_array_setting,
drivers/media/i2c/s5k3m5.c
898
cci_multi_reg_write(s5k3m5->regmap, reg_list->regs,
drivers/media/i2c/s5k3m5.c
903
ret = __v4l2_ctrl_handler_setup(s5k3m5->sd.ctrl_handler);
drivers/media/i2c/s5k3m5.c
905
cci_write(s5k3m5->regmap, S5K3M5_REG_CTRL_MODE,
drivers/media/i2c/s5k3m5.c
907
(s5k3m5->vflip->val ? S5K3M5_VFLIP : 0) |
drivers/media/i2c/s5k3m5.c
908
(s5k3m5->hflip->val ? S5K3M5_HFLIP : 0), &ret);
drivers/media/i2c/s5k3m5.c
915
dev_err(s5k3m5->dev, "failed to start streaming: %d\n", ret);
drivers/media/i2c/s5k3m5.c
916
pm_runtime_put_autosuspend(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
925
struct s5k3m5 *s5k3m5 = to_s5k3m5(sd);
drivers/media/i2c/s5k3m5.c
928
ret = cci_write(s5k3m5->regmap, S5K3M5_REG_CTRL_MODE, 0, NULL);
drivers/media/i2c/s5k3m5.c
930
dev_err(s5k3m5->dev, "failed to stop streaming: %d\n", ret);
drivers/media/i2c/s5k3m5.c
932
pm_runtime_put_autosuspend(s5k3m5->dev);
drivers/media/i2c/s5k3m5.c
937
static u32 s5k3m5_get_format_code(struct s5k3m5 *s5k3m5)
drivers/media/i2c/s5k3m5.c
941
i = (s5k3m5->vflip->val ? 2 : 0) | (s5k3m5->hflip->val ? 1 : 0);
drivers/media/i2c/s5k3m5.c
946
static void s5k3m5_update_pad_format(struct s5k3m5 *s5k3m5,
drivers/media/i2c/s5k3m5.c
950
fmt->code = s5k3m5_get_format_code(s5k3m5);
drivers/media/i2c/s5k3m5.c
964
struct s5k3m5 *s5k3m5 = to_s5k3m5(sd);
drivers/media/i2c/s5k3m5.c
973
s5k3m5_update_pad_format(s5k3m5, mode, &fmt->format);
drivers/media/i2c/s5k3m5.c
976
if (fmt->which == V4L2_SUBDEV_FORMAT_TRY || s5k3m5->mode == mode)
drivers/media/i2c/s5k3m5.c
981
__v4l2_ctrl_modify_range(s5k3m5->hblank, hblank, hblank, 1, hblank);
drivers/media/i2c/s5k3m5.c
984
__v4l2_ctrl_modify_range(s5k3m5->vblank, vblank,
drivers/media/i2c/s5k3m5.c
986
__v4l2_ctrl_s_ctrl(s5k3m5->vblank, vblank);
drivers/media/i2c/s5k3m5.c
989
__v4l2_ctrl_modify_range(s5k3m5->exposure, S5K3M5_EXPOSURE_MIN,
drivers/media/i2c/s5k3m5.c
992
__v4l2_ctrl_s_ctrl(s5k3m5->exposure, mode->exposure);
drivers/media/i2c/s5k3m5.c
994
if (s5k3m5->sd.ctrl_handler->error)
drivers/media/i2c/s5k3m5.c
995
return s5k3m5->sd.ctrl_handler->error;
drivers/media/i2c/s5k3m5.c
997
s5k3m5->mode = mode;