Symbol: hi556
drivers/media/i2c/hi556.c
1004
ret = hi556_identify_module(hi556);
drivers/media/i2c/hi556.c
1008
link_freq_index = hi556->cur_mode->link_freq_index;
drivers/media/i2c/hi556.c
1010
ret = hi556_write_reg_list(hi556, reg_list);
drivers/media/i2c/hi556.c
1012
dev_err(hi556->dev, "failed to set plls\n");
drivers/media/i2c/hi556.c
1016
reg_list = &hi556->cur_mode->reg_list;
drivers/media/i2c/hi556.c
1017
ret = hi556_write_reg_list(hi556, reg_list);
drivers/media/i2c/hi556.c
1019
dev_err(hi556->dev, "failed to set mode\n");
drivers/media/i2c/hi556.c
1023
ret = __v4l2_ctrl_handler_setup(hi556->sd.ctrl_handler);
drivers/media/i2c/hi556.c
1027
ret = hi556_write_reg(hi556, HI556_REG_MODE_SELECT,
drivers/media/i2c/hi556.c
1031
dev_err(hi556->dev, "failed to set stream\n");
drivers/media/i2c/hi556.c
1038
static void hi556_stop_streaming(struct hi556 *hi556)
drivers/media/i2c/hi556.c
1040
if (hi556_write_reg(hi556, HI556_REG_MODE_SELECT,
drivers/media/i2c/hi556.c
1042
dev_err(hi556->dev, "failed to set stream\n");
drivers/media/i2c/hi556.c
1047
struct hi556 *hi556 = to_hi556(sd);
drivers/media/i2c/hi556.c
1050
mutex_lock(&hi556->mutex);
drivers/media/i2c/hi556.c
1052
ret = pm_runtime_resume_and_get(hi556->dev);
drivers/media/i2c/hi556.c
1054
mutex_unlock(&hi556->mutex);
drivers/media/i2c/hi556.c
1058
ret = hi556_start_streaming(hi556);
drivers/media/i2c/hi556.c
1060
hi556_stop_streaming(hi556);
drivers/media/i2c/hi556.c
1061
pm_runtime_put(hi556->dev);
drivers/media/i2c/hi556.c
1064
hi556_stop_streaming(hi556);
drivers/media/i2c/hi556.c
1065
pm_runtime_put(hi556->dev);
drivers/media/i2c/hi556.c
1068
mutex_unlock(&hi556->mutex);
drivers/media/i2c/hi556.c
1077
struct hi556 *hi556 = to_hi556(sd);
drivers/media/i2c/hi556.c
1086
mutex_lock(&hi556->mutex);
drivers/media/i2c/hi556.c
1091
hi556->cur_mode = mode;
drivers/media/i2c/hi556.c
1092
__v4l2_ctrl_s_ctrl(hi556->link_freq, mode->link_freq_index);
drivers/media/i2c/hi556.c
1093
__v4l2_ctrl_s_ctrl_int64(hi556->pixel_rate,
drivers/media/i2c/hi556.c
1098
__v4l2_ctrl_modify_range(hi556->vblank,
drivers/media/i2c/hi556.c
1102
__v4l2_ctrl_s_ctrl(hi556->vblank, vblank_def);
drivers/media/i2c/hi556.c
1104
h_blank = hi556->cur_mode->llp - hi556->cur_mode->width;
drivers/media/i2c/hi556.c
1106
__v4l2_ctrl_modify_range(hi556->hblank, h_blank, h_blank, 1,
drivers/media/i2c/hi556.c
1110
mutex_unlock(&hi556->mutex);
drivers/media/i2c/hi556.c
1119
struct hi556 *hi556 = to_hi556(sd);
drivers/media/i2c/hi556.c
1121
mutex_lock(&hi556->mutex);
drivers/media/i2c/hi556.c
1126
hi556_assign_pad_format(hi556->cur_mode, &fmt->format);
drivers/media/i2c/hi556.c
1128
mutex_unlock(&hi556->mutex);
drivers/media/i2c/hi556.c
1165
struct hi556 *hi556 = to_hi556(sd);
drivers/media/i2c/hi556.c
1168
mutex_lock(&hi556->mutex);
drivers/media/i2c/hi556.c
1179
mutex_unlock(&hi556->mutex);
drivers/media/i2c/hi556.c
122
#define to_hi556(_sd) container_of(_sd, struct hi556, sd)
drivers/media/i2c/hi556.c
1270
struct hi556 *hi556 = to_hi556(sd);
drivers/media/i2c/hi556.c
1275
pm_runtime_disable(hi556->dev);
drivers/media/i2c/hi556.c
1276
mutex_destroy(&hi556->mutex);
drivers/media/i2c/hi556.c
1282
struct hi556 *hi556 = to_hi556(sd);
drivers/media/i2c/hi556.c
1284
gpiod_set_value_cansleep(hi556->reset_gpio, 1);
drivers/media/i2c/hi556.c
1286
hi556->supplies);
drivers/media/i2c/hi556.c
1287
clk_disable_unprepare(hi556->clk);
drivers/media/i2c/hi556.c
1294
struct hi556 *hi556 = to_hi556(sd);
drivers/media/i2c/hi556.c
1297
ret = clk_prepare_enable(hi556->clk);
drivers/media/i2c/hi556.c
1302
hi556->supplies);
drivers/media/i2c/hi556.c
1305
clk_disable_unprepare(hi556->clk);
drivers/media/i2c/hi556.c
1309
if (hi556->reset_gpio) {
drivers/media/i2c/hi556.c
1312
gpiod_set_value_cansleep(hi556->reset_gpio, 0);
drivers/media/i2c/hi556.c
1321
struct hi556 *hi556;
drivers/media/i2c/hi556.c
1330
hi556 = devm_kzalloc(&client->dev, sizeof(*hi556), GFP_KERNEL);
drivers/media/i2c/hi556.c
1331
if (!hi556)
drivers/media/i2c/hi556.c
1334
hi556->dev = &client->dev;
drivers/media/i2c/hi556.c
1336
v4l2_i2c_subdev_init(&hi556->sd, client, &hi556_subdev_ops);
drivers/media/i2c/hi556.c
1338
hi556->reset_gpio = devm_gpiod_get_optional(hi556->dev, "reset",
drivers/media/i2c/hi556.c
1340
if (IS_ERR(hi556->reset_gpio))
drivers/media/i2c/hi556.c
1341
return dev_err_probe(hi556->dev, PTR_ERR(hi556->reset_gpio),
drivers/media/i2c/hi556.c
1344
hi556->clk = devm_v4l2_sensor_clk_get(hi556->dev, "clk");
drivers/media/i2c/hi556.c
1345
if (IS_ERR(hi556->clk))
drivers/media/i2c/hi556.c
1346
return dev_err_probe(hi556->dev, PTR_ERR(hi556->clk),
drivers/media/i2c/hi556.c
1349
freq = clk_get_rate(hi556->clk);
drivers/media/i2c/hi556.c
1351
return dev_err_probe(hi556->dev, -EINVAL,
drivers/media/i2c/hi556.c
1356
hi556->supplies[i].supply = hi556_supply_names[i];
drivers/media/i2c/hi556.c
1358
ret = devm_regulator_bulk_get(hi556->dev,
drivers/media/i2c/hi556.c
1360
hi556->supplies);
drivers/media/i2c/hi556.c
1362
return dev_err_probe(hi556->dev, ret,
drivers/media/i2c/hi556.c
1365
full_power = acpi_dev_state_d0(hi556->dev);
drivers/media/i2c/hi556.c
1368
ret = hi556_resume(hi556->dev);
drivers/media/i2c/hi556.c
1370
return dev_err_probe(hi556->dev, ret,
drivers/media/i2c/hi556.c
1373
ret = hi556_identify_module(hi556);
drivers/media/i2c/hi556.c
1375
dev_err(hi556->dev, "failed to find sensor: %d\n", ret);
drivers/media/i2c/hi556.c
1380
mutex_init(&hi556->mutex);
drivers/media/i2c/hi556.c
1381
hi556->cur_mode = &supported_modes[0];
drivers/media/i2c/hi556.c
1382
ret = hi556_init_controls(hi556);
drivers/media/i2c/hi556.c
1384
dev_err(hi556->dev, "failed to init controls: %d\n", ret);
drivers/media/i2c/hi556.c
1388
hi556->sd.internal_ops = &hi556_internal_ops;
drivers/media/i2c/hi556.c
1389
hi556->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/hi556.c
1390
hi556->sd.entity.ops = &hi556_subdev_entity_ops;
drivers/media/i2c/hi556.c
1391
hi556->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/hi556.c
1392
hi556->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/hi556.c
1393
ret = media_entity_pads_init(&hi556->sd.entity, 1, &hi556->pad);
drivers/media/i2c/hi556.c
1395
dev_err(hi556->dev, "failed to init entity pads: %d\n", ret);
drivers/media/i2c/hi556.c
1399
ret = v4l2_async_register_subdev_sensor(&hi556->sd);
drivers/media/i2c/hi556.c
1401
dev_err(hi556->dev, "failed to register V4L2 subdev: %d\n",
drivers/media/i2c/hi556.c
1408
pm_runtime_set_active(hi556->dev);
drivers/media/i2c/hi556.c
1409
pm_runtime_enable(hi556->dev);
drivers/media/i2c/hi556.c
1410
pm_runtime_idle(hi556->dev);
drivers/media/i2c/hi556.c
1415
media_entity_cleanup(&hi556->sd.entity);
drivers/media/i2c/hi556.c
1418
v4l2_ctrl_handler_free(hi556->sd.ctrl_handler);
drivers/media/i2c/hi556.c
1419
mutex_destroy(&hi556->mutex);
drivers/media/i2c/hi556.c
1423
hi556_suspend(hi556->dev);
drivers/media/i2c/hi556.c
672
static int hi556_read_reg(struct hi556 *hi556, u16 reg, u16 len, u32 *val)
drivers/media/i2c/hi556.c
674
struct i2c_client *client = v4l2_get_subdevdata(&hi556->sd);
drivers/media/i2c/hi556.c
702
static int hi556_write_reg(struct hi556 *hi556, u16 reg, u16 len, u32 val)
drivers/media/i2c/hi556.c
704
struct i2c_client *client = v4l2_get_subdevdata(&hi556->sd);
drivers/media/i2c/hi556.c
718
static int hi556_write_reg_list(struct hi556 *hi556,
drivers/media/i2c/hi556.c
725
ret = hi556_write_reg(hi556, r_list->regs[i].address,
drivers/media/i2c/hi556.c
729
dev_err_ratelimited(hi556->dev,
drivers/media/i2c/hi556.c
739
static int hi556_update_digital_gain(struct hi556 *hi556, u32 d_gain)
drivers/media/i2c/hi556.c
743
ret = hi556_write_reg(hi556, HI556_REG_MWB_GR_GAIN,
drivers/media/i2c/hi556.c
748
ret = hi556_write_reg(hi556, HI556_REG_MWB_GB_GAIN,
drivers/media/i2c/hi556.c
753
ret = hi556_write_reg(hi556, HI556_REG_MWB_R_GAIN,
drivers/media/i2c/hi556.c
758
return hi556_write_reg(hi556, HI556_REG_MWB_B_GAIN,
drivers/media/i2c/hi556.c
762
static int hi556_test_pattern(struct hi556 *hi556, u32 pattern)
drivers/media/i2c/hi556.c
767
ret = hi556_read_reg(hi556, HI556_REG_ISP,
drivers/media/i2c/hi556.c
775
ret = hi556_write_reg(hi556, HI556_REG_ISP,
drivers/media/i2c/hi556.c
782
return hi556_write_reg(hi556, HI556_REG_TEST_PATTERN,
drivers/media/i2c/hi556.c
788
struct hi556 *hi556 = container_of(ctrl->handler,
drivers/media/i2c/hi556.c
789
struct hi556, ctrl_handler);
drivers/media/i2c/hi556.c
796
exposure_max = hi556->cur_mode->height + ctrl->val -
drivers/media/i2c/hi556.c
798
__v4l2_ctrl_modify_range(hi556->exposure,
drivers/media/i2c/hi556.c
799
hi556->exposure->minimum,
drivers/media/i2c/hi556.c
800
exposure_max, hi556->exposure->step,
drivers/media/i2c/hi556.c
805
if (!pm_runtime_get_if_in_use(hi556->dev))
drivers/media/i2c/hi556.c
810
ret = hi556_write_reg(hi556, HI556_REG_ANALOG_GAIN,
drivers/media/i2c/hi556.c
815
ret = hi556_update_digital_gain(hi556, ctrl->val);
drivers/media/i2c/hi556.c
819
ret = hi556_write_reg(hi556, HI556_REG_EXPOSURE,
drivers/media/i2c/hi556.c
825
ret = hi556_write_reg(hi556, HI556_REG_FLL,
drivers/media/i2c/hi556.c
827
hi556->cur_mode->height + ctrl->val);
drivers/media/i2c/hi556.c
831
ret = hi556_test_pattern(hi556, ctrl->val);
drivers/media/i2c/hi556.c
839
pm_runtime_put(hi556->dev);
drivers/media/i2c/hi556.c
848
static int hi556_init_controls(struct hi556 *hi556)
drivers/media/i2c/hi556.c
854
ctrl_hdlr = &hi556->ctrl_handler;
drivers/media/i2c/hi556.c
859
ctrl_hdlr->lock = &hi556->mutex;
drivers/media/i2c/hi556.c
860
hi556->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &hi556_ctrl_ops,
drivers/media/i2c/hi556.c
864
if (hi556->link_freq)
drivers/media/i2c/hi556.c
865
hi556->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/hi556.c
867
hi556->pixel_rate = v4l2_ctrl_new_std
drivers/media/i2c/hi556.c
873
hi556->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi556_ctrl_ops,
drivers/media/i2c/hi556.c
875
hi556->cur_mode->fll_min -
drivers/media/i2c/hi556.c
876
hi556->cur_mode->height,
drivers/media/i2c/hi556.c
878
hi556->cur_mode->height, 1,
drivers/media/i2c/hi556.c
879
hi556->cur_mode->fll_def -
drivers/media/i2c/hi556.c
880
hi556->cur_mode->height);
drivers/media/i2c/hi556.c
882
h_blank = hi556->cur_mode->llp - hi556->cur_mode->width;
drivers/media/i2c/hi556.c
884
hi556->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi556_ctrl_ops,
drivers/media/i2c/hi556.c
887
if (hi556->hblank)
drivers/media/i2c/hi556.c
888
hi556->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/hi556.c
896
exposure_max = hi556->cur_mode->fll_def - HI556_EXPOSURE_MAX_MARGIN;
drivers/media/i2c/hi556.c
897
hi556->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &hi556_ctrl_ops,
drivers/media/i2c/hi556.c
909
hi556->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/hi556.c
923
static int hi556_identify_module(struct hi556 *hi556)
drivers/media/i2c/hi556.c
928
if (hi556->identified)
drivers/media/i2c/hi556.c
931
ret = hi556_read_reg(hi556, HI556_REG_CHIP_ID,
drivers/media/i2c/hi556.c
937
dev_err(hi556->dev, "chip id mismatch: %x!=%x\n",
drivers/media/i2c/hi556.c
942
hi556->identified = true;
drivers/media/i2c/hi556.c
948
__hi556_get_pad_crop(struct hi556 *hi556,
drivers/media/i2c/hi556.c
956
return &hi556->cur_mode->crop;
drivers/media/i2c/hi556.c
968
struct hi556 *hi556 = to_hi556(sd);
drivers/media/i2c/hi556.c
970
mutex_lock(&hi556->mutex);
drivers/media/i2c/hi556.c
971
sel->r = *__hi556_get_pad_crop(hi556, sd_state, sel->pad,
drivers/media/i2c/hi556.c
973
mutex_unlock(&hi556->mutex);
drivers/media/i2c/hi556.c
999
static int hi556_start_streaming(struct hi556 *hi556)