drivers/media/i2c/s5kjn1.c
1000
s5kjn1_update_pad_format(s5kjn1, mode, &fmt->format);
drivers/media/i2c/s5kjn1.c
1003
if (fmt->which == V4L2_SUBDEV_FORMAT_TRY || s5kjn1->mode == mode)
drivers/media/i2c/s5kjn1.c
1008
__v4l2_ctrl_modify_range(s5kjn1->hblank, hblank, hblank, 1, hblank);
drivers/media/i2c/s5kjn1.c
1011
__v4l2_ctrl_modify_range(s5kjn1->vblank, vblank,
drivers/media/i2c/s5kjn1.c
1013
__v4l2_ctrl_s_ctrl(s5kjn1->vblank, vblank);
drivers/media/i2c/s5kjn1.c
1016
__v4l2_ctrl_modify_range(s5kjn1->exposure, S5KJN1_EXPOSURE_MIN,
drivers/media/i2c/s5kjn1.c
1019
__v4l2_ctrl_s_ctrl(s5kjn1->exposure, mode->exposure);
drivers/media/i2c/s5kjn1.c
1021
if (s5kjn1->sd.ctrl_handler->error)
drivers/media/i2c/s5kjn1.c
1022
return s5kjn1->sd.ctrl_handler->error;
drivers/media/i2c/s5kjn1.c
1024
s5kjn1->mode = mode;
drivers/media/i2c/s5kjn1.c
1036
struct s5kjn1 *s5kjn1 = to_s5kjn1(sd);
drivers/media/i2c/s5kjn1.c
1042
code->code = s5kjn1_get_format_code(s5kjn1);
drivers/media/i2c/s5kjn1.c
1051
struct s5kjn1 *s5kjn1 = to_s5kjn1(sd);
drivers/media/i2c/s5kjn1.c
1056
if (fse->code != s5kjn1_get_format_code(s5kjn1))
drivers/media/i2c/s5kjn1.c
1071
struct s5kjn1 *s5kjn1 = to_s5kjn1(sd);
drivers/media/i2c/s5kjn1.c
1081
sel->r.width = s5kjn1->mode->width;
drivers/media/i2c/s5kjn1.c
1082
sel->r.height = s5kjn1->mode->width;
drivers/media/i2c/s5kjn1.c
1094
struct s5kjn1 *s5kjn1 = to_s5kjn1(sd);
drivers/media/i2c/s5kjn1.c
1100
.width = s5kjn1->mode->width,
drivers/media/i2c/s5kjn1.c
1101
.height = s5kjn1->mode->height,
drivers/media/i2c/s5kjn1.c
1137
static int s5kjn1_identify_sensor(struct s5kjn1 *s5kjn1)
drivers/media/i2c/s5kjn1.c
1142
ret = cci_read(s5kjn1->regmap, S5KJN1_REG_CHIP_ID, &val, NULL);
drivers/media/i2c/s5kjn1.c
1144
dev_err(s5kjn1->dev, "failed to read chip id: %d\n", ret);
drivers/media/i2c/s5kjn1.c
1149
dev_err(s5kjn1->dev, "chip id mismatch: %x!=%llx\n",
drivers/media/i2c/s5kjn1.c
1157
static int s5kjn1_check_hwcfg(struct s5kjn1 *s5kjn1)
drivers/media/i2c/s5kjn1.c
1159
struct fwnode_handle *fwnode = dev_fwnode(s5kjn1->dev), *ep;
drivers/media/i2c/s5kjn1.c
1184
dev_err(s5kjn1->dev, "Invalid number of data lanes: %u\n",
drivers/media/i2c/s5kjn1.c
1190
ret = v4l2_link_freq_to_bitmap(s5kjn1->dev, bus_cfg.link_frequencies,
drivers/media/i2c/s5kjn1.c
1205
struct s5kjn1 *s5kjn1 = to_s5kjn1(sd);
drivers/media/i2c/s5kjn1.c
1208
if (s5kjn1->vddd) {
drivers/media/i2c/s5kjn1.c
1209
ret = regulator_enable(s5kjn1->vddd);
drivers/media/i2c/s5kjn1.c
1216
if (s5kjn1->vdda) {
drivers/media/i2c/s5kjn1.c
1217
ret = regulator_enable(s5kjn1->vdda);
drivers/media/i2c/s5kjn1.c
1222
if (s5kjn1->vddio) {
drivers/media/i2c/s5kjn1.c
1223
ret = regulator_enable(s5kjn1->vddio);
drivers/media/i2c/s5kjn1.c
1228
if (s5kjn1->afvdd) {
drivers/media/i2c/s5kjn1.c
1229
ret = regulator_enable(s5kjn1->afvdd);
drivers/media/i2c/s5kjn1.c
1234
ret = clk_prepare_enable(s5kjn1->mclk);
drivers/media/i2c/s5kjn1.c
1238
gpiod_set_value_cansleep(s5kjn1->reset_gpio, 0);
drivers/media/i2c/s5kjn1.c
1244
if (s5kjn1->afvdd)
drivers/media/i2c/s5kjn1.c
1245
regulator_disable(s5kjn1->afvdd);
drivers/media/i2c/s5kjn1.c
1248
if (s5kjn1->vddio)
drivers/media/i2c/s5kjn1.c
1249
regulator_disable(s5kjn1->vddio);
drivers/media/i2c/s5kjn1.c
1252
if (s5kjn1->vdda)
drivers/media/i2c/s5kjn1.c
1253
regulator_disable(s5kjn1->vdda);
drivers/media/i2c/s5kjn1.c
1256
if (s5kjn1->vddd) {
drivers/media/i2c/s5kjn1.c
1258
regulator_disable(s5kjn1->vddd);
drivers/media/i2c/s5kjn1.c
1267
struct s5kjn1 *s5kjn1 = to_s5kjn1(sd);
drivers/media/i2c/s5kjn1.c
1269
gpiod_set_value_cansleep(s5kjn1->reset_gpio, 1);
drivers/media/i2c/s5kjn1.c
1271
clk_disable_unprepare(s5kjn1->mclk);
drivers/media/i2c/s5kjn1.c
1273
if (s5kjn1->afvdd)
drivers/media/i2c/s5kjn1.c
1274
regulator_disable(s5kjn1->afvdd);
drivers/media/i2c/s5kjn1.c
1276
if (s5kjn1->vddio)
drivers/media/i2c/s5kjn1.c
1277
regulator_disable(s5kjn1->vddio);
drivers/media/i2c/s5kjn1.c
1279
if (s5kjn1->vdda)
drivers/media/i2c/s5kjn1.c
1280
regulator_disable(s5kjn1->vdda);
drivers/media/i2c/s5kjn1.c
1282
if (s5kjn1->vddd) {
drivers/media/i2c/s5kjn1.c
1284
regulator_disable(s5kjn1->vddd);
drivers/media/i2c/s5kjn1.c
1292
struct s5kjn1 *s5kjn1;
drivers/media/i2c/s5kjn1.c
1296
s5kjn1 = devm_kzalloc(&client->dev, sizeof(*s5kjn1), GFP_KERNEL);
drivers/media/i2c/s5kjn1.c
1297
if (!s5kjn1)
drivers/media/i2c/s5kjn1.c
1300
s5kjn1->dev = &client->dev;
drivers/media/i2c/s5kjn1.c
1301
v4l2_i2c_subdev_init(&s5kjn1->sd, client, &s5kjn1_subdev_ops);
drivers/media/i2c/s5kjn1.c
1303
s5kjn1->regmap = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/s5kjn1.c
1304
if (IS_ERR(s5kjn1->regmap))
drivers/media/i2c/s5kjn1.c
1305
return dev_err_probe(s5kjn1->dev, PTR_ERR(s5kjn1->regmap),
drivers/media/i2c/s5kjn1.c
1308
s5kjn1->mclk = devm_v4l2_sensor_clk_get(s5kjn1->dev, NULL);
drivers/media/i2c/s5kjn1.c
1309
if (IS_ERR(s5kjn1->mclk))
drivers/media/i2c/s5kjn1.c
1310
return dev_err_probe(s5kjn1->dev, PTR_ERR(s5kjn1->mclk),
drivers/media/i2c/s5kjn1.c
1313
freq = clk_get_rate(s5kjn1->mclk);
drivers/media/i2c/s5kjn1.c
1315
return dev_err_probe(s5kjn1->dev, -EINVAL,
drivers/media/i2c/s5kjn1.c
1319
ret = s5kjn1_check_hwcfg(s5kjn1);
drivers/media/i2c/s5kjn1.c
1321
return dev_err_probe(s5kjn1->dev, ret,
drivers/media/i2c/s5kjn1.c
1324
s5kjn1->reset_gpio = devm_gpiod_get_optional(s5kjn1->dev, "reset",
drivers/media/i2c/s5kjn1.c
1326
if (IS_ERR(s5kjn1->reset_gpio))
drivers/media/i2c/s5kjn1.c
1327
return dev_err_probe(s5kjn1->dev, PTR_ERR(s5kjn1->reset_gpio),
drivers/media/i2c/s5kjn1.c
1330
s5kjn1->afvdd = devm_regulator_get_optional(s5kjn1->dev, "afvdd");
drivers/media/i2c/s5kjn1.c
1331
if (IS_ERR(s5kjn1->afvdd)) {
drivers/media/i2c/s5kjn1.c
1332
ret = PTR_ERR(s5kjn1->afvdd);
drivers/media/i2c/s5kjn1.c
1334
return dev_err_probe(s5kjn1->dev, ret,
drivers/media/i2c/s5kjn1.c
1338
s5kjn1->afvdd = NULL;
drivers/media/i2c/s5kjn1.c
1341
s5kjn1->vdda = devm_regulator_get_optional(s5kjn1->dev, "vdda");
drivers/media/i2c/s5kjn1.c
1342
if (IS_ERR(s5kjn1->vdda)) {
drivers/media/i2c/s5kjn1.c
1343
ret = PTR_ERR(s5kjn1->vdda);
drivers/media/i2c/s5kjn1.c
1345
return dev_err_probe(s5kjn1->dev, ret,
drivers/media/i2c/s5kjn1.c
1349
s5kjn1->vdda = NULL;
drivers/media/i2c/s5kjn1.c
1352
s5kjn1->vddd = devm_regulator_get_optional(s5kjn1->dev, "vddd");
drivers/media/i2c/s5kjn1.c
1353
if (IS_ERR(s5kjn1->vddd)) {
drivers/media/i2c/s5kjn1.c
1354
ret = PTR_ERR(s5kjn1->vddd);
drivers/media/i2c/s5kjn1.c
1356
return dev_err_probe(s5kjn1->dev, ret,
drivers/media/i2c/s5kjn1.c
1360
s5kjn1->vddd = NULL;
drivers/media/i2c/s5kjn1.c
1363
s5kjn1->vddio = devm_regulator_get_optional(s5kjn1->dev, "vddio");
drivers/media/i2c/s5kjn1.c
1364
if (IS_ERR(s5kjn1->vddio)) {
drivers/media/i2c/s5kjn1.c
1365
ret = PTR_ERR(s5kjn1->vddio);
drivers/media/i2c/s5kjn1.c
1367
return dev_err_probe(s5kjn1->dev, ret,
drivers/media/i2c/s5kjn1.c
1371
s5kjn1->vddio = NULL;
drivers/media/i2c/s5kjn1.c
1375
ret = s5kjn1_power_on(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
1379
ret = s5kjn1_identify_sensor(s5kjn1);
drivers/media/i2c/s5kjn1.c
1381
dev_err_probe(s5kjn1->dev, ret, "failed to find sensor\n");
drivers/media/i2c/s5kjn1.c
1385
s5kjn1->mode = &s5kjn1_supported_modes[0];
drivers/media/i2c/s5kjn1.c
1386
ret = s5kjn1_init_controls(s5kjn1);
drivers/media/i2c/s5kjn1.c
1388
dev_err_probe(s5kjn1->dev, ret, "failed to init controls\n");
drivers/media/i2c/s5kjn1.c
1392
s5kjn1->sd.state_lock = s5kjn1->ctrl_handler.lock;
drivers/media/i2c/s5kjn1.c
1393
s5kjn1->sd.internal_ops = &s5kjn1_internal_ops;
drivers/media/i2c/s5kjn1.c
1394
s5kjn1->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/s5kjn1.c
1395
s5kjn1->sd.entity.ops = &s5kjn1_subdev_entity_ops;
drivers/media/i2c/s5kjn1.c
1396
s5kjn1->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/s5kjn1.c
1397
s5kjn1->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/s5kjn1.c
1399
ret = media_entity_pads_init(&s5kjn1->sd.entity, 1, &s5kjn1->pad);
drivers/media/i2c/s5kjn1.c
1401
dev_err_probe(s5kjn1->dev, ret,
drivers/media/i2c/s5kjn1.c
1406
ret = v4l2_subdev_init_finalize(&s5kjn1->sd);
drivers/media/i2c/s5kjn1.c
1408
dev_err_probe(s5kjn1->dev, ret,
drivers/media/i2c/s5kjn1.c
1413
pm_runtime_set_active(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
1414
pm_runtime_enable(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
1416
ret = v4l2_async_register_subdev_sensor(&s5kjn1->sd);
drivers/media/i2c/s5kjn1.c
1418
dev_err_probe(s5kjn1->dev, ret,
drivers/media/i2c/s5kjn1.c
1423
pm_runtime_set_autosuspend_delay(s5kjn1->dev, 1000);
drivers/media/i2c/s5kjn1.c
1424
pm_runtime_use_autosuspend(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
1425
pm_runtime_idle(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
1430
v4l2_subdev_cleanup(&s5kjn1->sd);
drivers/media/i2c/s5kjn1.c
1431
pm_runtime_disable(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
1432
pm_runtime_set_suspended(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
1435
media_entity_cleanup(&s5kjn1->sd.entity);
drivers/media/i2c/s5kjn1.c
1438
v4l2_ctrl_handler_free(s5kjn1->sd.ctrl_handler);
drivers/media/i2c/s5kjn1.c
1441
s5kjn1_power_off(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
1449
struct s5kjn1 *s5kjn1 = to_s5kjn1(sd);
drivers/media/i2c/s5kjn1.c
1455
pm_runtime_disable(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
1457
if (!pm_runtime_status_suspended(s5kjn1->dev)) {
drivers/media/i2c/s5kjn1.c
1458
s5kjn1_power_off(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
1459
pm_runtime_set_suspended(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
56
#define to_s5kjn1(_sd) container_of(_sd, struct s5kjn1, sd)
drivers/media/i2c/s5kjn1.c
746
struct s5kjn1 *s5kjn1 = container_of(ctrl->handler, struct s5kjn1,
drivers/media/i2c/s5kjn1.c
748
const struct s5kjn1_mode *mode = s5kjn1->mode;
drivers/media/i2c/s5kjn1.c
757
__v4l2_ctrl_modify_range(s5kjn1->exposure,
drivers/media/i2c/s5kjn1.c
758
s5kjn1->exposure->minimum,
drivers/media/i2c/s5kjn1.c
760
s5kjn1->exposure->step,
drivers/media/i2c/s5kjn1.c
761
s5kjn1->exposure->default_value);
drivers/media/i2c/s5kjn1.c
766
if (!pm_runtime_get_if_active(s5kjn1->dev))
drivers/media/i2c/s5kjn1.c
771
ret = cci_write(s5kjn1->regmap, S5KJN1_REG_AGAIN,
drivers/media/i2c/s5kjn1.c
775
ret = cci_write(s5kjn1->regmap, S5KJN1_REG_EXPOSURE,
drivers/media/i2c/s5kjn1.c
779
ret = cci_write(s5kjn1->regmap, S5KJN1_REG_VTS,
drivers/media/i2c/s5kjn1.c
784
ret = cci_write(s5kjn1->regmap, S5KJN1_REG_ORIENTATION,
drivers/media/i2c/s5kjn1.c
785
(s5kjn1->vflip->val ? S5KJN1_VFLIP : 0) |
drivers/media/i2c/s5kjn1.c
786
(s5kjn1->hflip->val ? S5KJN1_HFLIP : 0), NULL);
drivers/media/i2c/s5kjn1.c
789
ret = cci_write(s5kjn1->regmap, S5KJN1_REG_TEST_PATTERN,
drivers/media/i2c/s5kjn1.c
797
pm_runtime_put(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
811
static int s5kjn1_init_controls(struct s5kjn1 *s5kjn1)
drivers/media/i2c/s5kjn1.c
813
struct v4l2_ctrl_handler *ctrl_hdlr = &s5kjn1->ctrl_handler;
drivers/media/i2c/s5kjn1.c
814
const struct s5kjn1_mode *mode = s5kjn1->mode;
drivers/media/i2c/s5kjn1.c
821
s5kjn1->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &s5kjn1_ctrl_ops,
drivers/media/i2c/s5kjn1.c
825
if (s5kjn1->link_freq)
drivers/media/i2c/s5kjn1.c
826
s5kjn1->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/s5kjn1.c
829
s5kjn1->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &s5kjn1_ctrl_ops,
drivers/media/i2c/s5kjn1.c
834
s5kjn1->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &s5kjn1_ctrl_ops,
drivers/media/i2c/s5kjn1.c
837
if (s5kjn1->hblank)
drivers/media/i2c/s5kjn1.c
838
s5kjn1->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/s5kjn1.c
841
s5kjn1->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &s5kjn1_ctrl_ops,
drivers/media/i2c/s5kjn1.c
851
s5kjn1->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &s5kjn1_ctrl_ops,
drivers/media/i2c/s5kjn1.c
863
s5kjn1->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &s5kjn1_ctrl_ops,
drivers/media/i2c/s5kjn1.c
865
if (s5kjn1->hflip)
drivers/media/i2c/s5kjn1.c
866
s5kjn1->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/s5kjn1.c
868
s5kjn1->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &s5kjn1_ctrl_ops,
drivers/media/i2c/s5kjn1.c
870
if (s5kjn1->vflip)
drivers/media/i2c/s5kjn1.c
871
s5kjn1->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/s5kjn1.c
873
ret = v4l2_fwnode_device_parse(s5kjn1->dev, &props);
drivers/media/i2c/s5kjn1.c
882
s5kjn1->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/s5kjn1.c
896
struct s5kjn1 *s5kjn1 = to_s5kjn1(sd);
drivers/media/i2c/s5kjn1.c
897
const struct s5kjn1_reg_list *reg_list = &s5kjn1->mode->reg_list;
drivers/media/i2c/s5kjn1.c
900
ret = pm_runtime_resume_and_get(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
905
cci_write(s5kjn1->regmap, CCI_REG16(0x6028), 0x4000, &ret);
drivers/media/i2c/s5kjn1.c
908
cci_write(s5kjn1->regmap, CCI_REG16(0x0000), 0x0003, &ret);
drivers/media/i2c/s5kjn1.c
909
cci_write(s5kjn1->regmap, CCI_REG16(0x0000), S5KJN1_CHIP_ID, &ret);
drivers/media/i2c/s5kjn1.c
910
cci_write(s5kjn1->regmap, CCI_REG16(0x001e), 0x0007, &ret);
drivers/media/i2c/s5kjn1.c
911
cci_write(s5kjn1->regmap, CCI_REG16(0x6028), 0x4000, &ret);
drivers/media/i2c/s5kjn1.c
912
cci_write(s5kjn1->regmap, CCI_REG16(0x6010), 0x0001, &ret);
drivers/media/i2c/s5kjn1.c
918
cci_write(s5kjn1->regmap, CCI_REG16(0x6226), 0x0001, &ret);
drivers/media/i2c/s5kjn1.c
925
cci_multi_reg_write(s5kjn1->regmap, init_array_setting,
drivers/media/i2c/s5kjn1.c
927
cci_multi_reg_write(s5kjn1->regmap, reg_list->regs,
drivers/media/i2c/s5kjn1.c
932
ret = __v4l2_ctrl_handler_setup(s5kjn1->sd.ctrl_handler);
drivers/media/i2c/s5kjn1.c
934
cci_write(s5kjn1->regmap, S5KJN1_REG_CTRL_MODE,
drivers/media/i2c/s5kjn1.c
942
dev_err(s5kjn1->dev, "failed to start streaming: %d\n", ret);
drivers/media/i2c/s5kjn1.c
943
pm_runtime_put_autosuspend(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
952
struct s5kjn1 *s5kjn1 = to_s5kjn1(sd);
drivers/media/i2c/s5kjn1.c
955
ret = cci_write(s5kjn1->regmap, S5KJN1_REG_CTRL_MODE, 0x0, NULL);
drivers/media/i2c/s5kjn1.c
957
dev_err(s5kjn1->dev, "failed to stop streaming: %d\n", ret);
drivers/media/i2c/s5kjn1.c
959
pm_runtime_put_autosuspend(s5kjn1->dev);
drivers/media/i2c/s5kjn1.c
964
static u32 s5kjn1_get_format_code(struct s5kjn1 *s5kjn1)
drivers/media/i2c/s5kjn1.c
968
i = (s5kjn1->vflip->val ? 2 : 0) | (s5kjn1->hflip->val ? 1 : 0);
drivers/media/i2c/s5kjn1.c
973
static void s5kjn1_update_pad_format(struct s5kjn1 *s5kjn1,
drivers/media/i2c/s5kjn1.c
977
fmt->code = s5kjn1_get_format_code(s5kjn1);
drivers/media/i2c/s5kjn1.c
991
struct s5kjn1 *s5kjn1 = to_s5kjn1(sd);