Symbol: hi847
drivers/media/i2c/hi847.c
124
#define to_hi847(_sd) container_of(_sd, struct hi847, sd)
drivers/media/i2c/hi847.c
2203
static int hi847_read_reg(struct hi847 *hi847, u16 reg, u16 len, u32 *val)
drivers/media/i2c/hi847.c
2205
struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
drivers/media/i2c/hi847.c
2233
static int hi847_write_reg(struct hi847 *hi847, u16 reg, u16 len, u32 val)
drivers/media/i2c/hi847.c
2235
struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd);
drivers/media/i2c/hi847.c
2249
static int hi847_write_reg_list(struct hi847 *hi847,
drivers/media/i2c/hi847.c
2256
ret = hi847_write_reg(hi847, r_list->regs[i].address,
drivers/media/i2c/hi847.c
2260
dev_err_ratelimited(hi847->dev,
drivers/media/i2c/hi847.c
2270
static int hi847_update_digital_gain(struct hi847 *hi847, u32 d_gain)
drivers/media/i2c/hi847.c
2274
ret = hi847_write_reg(hi847, HI847_REG_MWB_GR_GAIN,
drivers/media/i2c/hi847.c
2279
ret = hi847_write_reg(hi847, HI847_REG_MWB_GB_GAIN,
drivers/media/i2c/hi847.c
2284
ret = hi847_write_reg(hi847, HI847_REG_MWB_R_GAIN,
drivers/media/i2c/hi847.c
2289
return hi847_write_reg(hi847, HI847_REG_MWB_B_GAIN,
drivers/media/i2c/hi847.c
2293
static int hi847_test_pattern(struct hi847 *hi847, u32 pattern)
drivers/media/i2c/hi847.c
2299
ret = hi847_read_reg(hi847, HI847_REG_ISP,
drivers/media/i2c/hi847.c
2304
ret = hi847_write_reg(hi847, HI847_REG_ISP,
drivers/media/i2c/hi847.c
2311
ret = hi847_read_reg(hi847, HI847_REG_TEST_PATTERN,
drivers/media/i2c/hi847.c
2316
return hi847_write_reg(hi847, HI847_REG_TEST_PATTERN,
drivers/media/i2c/hi847.c
2320
static int hi847_grbg_shift(struct hi847 *hi847)
drivers/media/i2c/hi847.c
2347
hflip = hi847->hflip->val;
drivers/media/i2c/hi847.c
2348
vflip = hi847->vflip->val;
drivers/media/i2c/hi847.c
2350
if (hi847->cur_mode->width == 3264) {
drivers/media/i2c/hi847.c
2351
ret = hi847_write_reg(hi847, HI847_REG_FORMAT_X,
drivers/media/i2c/hi847.c
2357
return hi847_write_reg(hi847, HI847_REG_FORMAT_Y,
drivers/media/i2c/hi847.c
2361
ret = hi847_write_reg(hi847, HI847_REG_FORMAT_X,
drivers/media/i2c/hi847.c
2367
return hi847_write_reg(hi847, HI847_REG_FORMAT_Y,
drivers/media/i2c/hi847.c
2373
static int hi847_set_ctrl_hflip(struct hi847 *hi847, u32 ctrl_val)
drivers/media/i2c/hi847.c
2378
ret = hi847_read_reg(hi847, HI847_REG_MIRROR_FLIP,
drivers/media/i2c/hi847.c
2383
ret = hi847_grbg_shift(hi847);
drivers/media/i2c/hi847.c
2387
return hi847_write_reg(hi847, HI847_REG_MIRROR_FLIP,
drivers/media/i2c/hi847.c
2392
static int hi847_set_ctrl_vflip(struct hi847 *hi847, u8 ctrl_val)
drivers/media/i2c/hi847.c
2397
ret = hi847_read_reg(hi847, HI847_REG_MIRROR_FLIP,
drivers/media/i2c/hi847.c
2402
ret = hi847_grbg_shift(hi847);
drivers/media/i2c/hi847.c
2406
return hi847_write_reg(hi847, HI847_REG_MIRROR_FLIP,
drivers/media/i2c/hi847.c
2413
struct hi847 *hi847 = container_of(ctrl->handler,
drivers/media/i2c/hi847.c
2414
struct hi847, ctrl_handler);
drivers/media/i2c/hi847.c
2421
exposure_max = hi847->cur_mode->height + ctrl->val -
drivers/media/i2c/hi847.c
2423
__v4l2_ctrl_modify_range(hi847->exposure,
drivers/media/i2c/hi847.c
2424
hi847->exposure->minimum,
drivers/media/i2c/hi847.c
2425
exposure_max, hi847->exposure->step,
drivers/media/i2c/hi847.c
2430
if (!pm_runtime_get_if_in_use(hi847->dev))
drivers/media/i2c/hi847.c
2435
ret = hi847_write_reg(hi847, HI847_REG_ANALOG_GAIN,
drivers/media/i2c/hi847.c
2440
ret = hi847_update_digital_gain(hi847, ctrl->val);
drivers/media/i2c/hi847.c
2444
ret = hi847_write_reg(hi847, HI847_REG_EXPOSURE,
drivers/media/i2c/hi847.c
2450
ret = hi847_write_reg(hi847, HI847_REG_FLL,
drivers/media/i2c/hi847.c
2452
hi847->cur_mode->height + ctrl->val);
drivers/media/i2c/hi847.c
2456
ret = hi847_test_pattern(hi847, ctrl->val);
drivers/media/i2c/hi847.c
2460
hi847_set_ctrl_hflip(hi847, ctrl->val);
drivers/media/i2c/hi847.c
2464
hi847_set_ctrl_vflip(hi847, ctrl->val);
drivers/media/i2c/hi847.c
2472
pm_runtime_put(hi847->dev);
drivers/media/i2c/hi847.c
2481
static int hi847_init_controls(struct hi847 *hi847)
drivers/media/i2c/hi847.c
2487
ctrl_hdlr = &hi847->ctrl_handler;
drivers/media/i2c/hi847.c
2492
ctrl_hdlr->lock = &hi847->mutex;
drivers/media/i2c/hi847.c
2493
hi847->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &hi847_ctrl_ops,
drivers/media/i2c/hi847.c
2497
if (hi847->link_freq)
drivers/media/i2c/hi847.c
2498
hi847->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/hi847.c
2500
hi847->pixel_rate = v4l2_ctrl_new_std
drivers/media/i2c/hi847.c
2506
hi847->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
drivers/media/i2c/hi847.c
2508
hi847->cur_mode->fll_min -
drivers/media/i2c/hi847.c
2509
hi847->cur_mode->height,
drivers/media/i2c/hi847.c
2511
hi847->cur_mode->height, 1,
drivers/media/i2c/hi847.c
2512
hi847->cur_mode->fll_def -
drivers/media/i2c/hi847.c
2513
hi847->cur_mode->height);
drivers/media/i2c/hi847.c
2515
h_blank = hi847->cur_mode->llp - hi847->cur_mode->width;
drivers/media/i2c/hi847.c
2517
hi847->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
drivers/media/i2c/hi847.c
2520
if (hi847->hblank)
drivers/media/i2c/hi847.c
2521
hi847->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/hi847.c
2529
exposure_max = hi847->cur_mode->fll_def - HI847_EXPOSURE_MAX_MARGIN;
drivers/media/i2c/hi847.c
2530
hi847->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
drivers/media/i2c/hi847.c
2539
hi847->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
drivers/media/i2c/hi847.c
2541
hi847->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops,
drivers/media/i2c/hi847.c
2547
hi847->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/hi847.c
2561
static int hi847_start_streaming(struct hi847 *hi847)
drivers/media/i2c/hi847.c
2566
link_freq_index = hi847->cur_mode->link_freq_index;
drivers/media/i2c/hi847.c
2568
ret = hi847_write_reg_list(hi847, reg_list);
drivers/media/i2c/hi847.c
2570
dev_err(hi847->dev, "failed to set plls");
drivers/media/i2c/hi847.c
2574
reg_list = &hi847->cur_mode->reg_list;
drivers/media/i2c/hi847.c
2575
ret = hi847_write_reg_list(hi847, reg_list);
drivers/media/i2c/hi847.c
2577
dev_err(hi847->dev, "failed to set mode");
drivers/media/i2c/hi847.c
2581
ret = __v4l2_ctrl_handler_setup(hi847->sd.ctrl_handler);
drivers/media/i2c/hi847.c
2585
ret = hi847_write_reg(hi847, HI847_REG_MODE_TG,
drivers/media/i2c/hi847.c
2588
ret = hi847_write_reg(hi847, HI847_REG_MODE_SELECT,
drivers/media/i2c/hi847.c
2592
dev_err(hi847->dev, "failed to set stream");
drivers/media/i2c/hi847.c
2599
static void hi847_stop_streaming(struct hi847 *hi847)
drivers/media/i2c/hi847.c
2601
if (hi847_write_reg(hi847, HI847_REG_MODE_TG,
drivers/media/i2c/hi847.c
2603
dev_err(hi847->dev, "failed to set stream 0x%x",
drivers/media/i2c/hi847.c
2606
if (hi847_write_reg(hi847, HI847_REG_MODE_SELECT,
drivers/media/i2c/hi847.c
2608
dev_err(hi847->dev, "failed to set stream 0x%x",
drivers/media/i2c/hi847.c
2614
struct hi847 *hi847 = to_hi847(sd);
drivers/media/i2c/hi847.c
2617
mutex_lock(&hi847->mutex);
drivers/media/i2c/hi847.c
2619
ret = pm_runtime_resume_and_get(hi847->dev);
drivers/media/i2c/hi847.c
2621
mutex_unlock(&hi847->mutex);
drivers/media/i2c/hi847.c
2625
ret = hi847_start_streaming(hi847);
drivers/media/i2c/hi847.c
2628
hi847_stop_streaming(hi847);
drivers/media/i2c/hi847.c
2629
pm_runtime_put(hi847->dev);
drivers/media/i2c/hi847.c
2632
hi847_stop_streaming(hi847);
drivers/media/i2c/hi847.c
2633
pm_runtime_put(hi847->dev);
drivers/media/i2c/hi847.c
2636
mutex_unlock(&hi847->mutex);
drivers/media/i2c/hi847.c
2645
struct hi847 *hi847 = to_hi847(sd);
drivers/media/i2c/hi847.c
2654
mutex_lock(&hi847->mutex);
drivers/media/i2c/hi847.c
2660
hi847->cur_mode = mode;
drivers/media/i2c/hi847.c
2661
__v4l2_ctrl_s_ctrl(hi847->link_freq, mode->link_freq_index);
drivers/media/i2c/hi847.c
2662
__v4l2_ctrl_s_ctrl_int64(hi847->pixel_rate,
drivers/media/i2c/hi847.c
2667
__v4l2_ctrl_modify_range(hi847->vblank,
drivers/media/i2c/hi847.c
2671
__v4l2_ctrl_s_ctrl(hi847->vblank, vblank_def);
drivers/media/i2c/hi847.c
2673
h_blank = hi847->cur_mode->llp - hi847->cur_mode->width;
drivers/media/i2c/hi847.c
2675
__v4l2_ctrl_modify_range(hi847->hblank, h_blank, h_blank, 1,
drivers/media/i2c/hi847.c
2679
mutex_unlock(&hi847->mutex);
drivers/media/i2c/hi847.c
2688
struct hi847 *hi847 = to_hi847(sd);
drivers/media/i2c/hi847.c
2690
mutex_lock(&hi847->mutex);
drivers/media/i2c/hi847.c
2695
hi847_assign_pad_format(hi847->cur_mode, &fmt->format);
drivers/media/i2c/hi847.c
2697
mutex_unlock(&hi847->mutex);
drivers/media/i2c/hi847.c
2734
struct hi847 *hi847 = to_hi847(sd);
drivers/media/i2c/hi847.c
2736
mutex_lock(&hi847->mutex);
drivers/media/i2c/hi847.c
2739
mutex_unlock(&hi847->mutex);
drivers/media/i2c/hi847.c
2768
static int hi847_identify_module(struct hi847 *hi847)
drivers/media/i2c/hi847.c
2773
ret = hi847_read_reg(hi847, HI847_REG_CHIP_ID,
drivers/media/i2c/hi847.c
2779
dev_err(hi847->dev, "chip id mismatch: %x!=%x",
drivers/media/i2c/hi847.c
2846
struct hi847 *hi847 = to_hi847(sd);
drivers/media/i2c/hi847.c
2851
pm_runtime_disable(hi847->dev);
drivers/media/i2c/hi847.c
2852
mutex_destroy(&hi847->mutex);
drivers/media/i2c/hi847.c
2857
struct hi847 *hi847;
drivers/media/i2c/hi847.c
2861
hi847 = devm_kzalloc(&client->dev, sizeof(*hi847), GFP_KERNEL);
drivers/media/i2c/hi847.c
2862
if (!hi847)
drivers/media/i2c/hi847.c
2865
hi847->dev = &client->dev;
drivers/media/i2c/hi847.c
2867
hi847->clk = devm_v4l2_sensor_clk_get(hi847->dev, NULL);
drivers/media/i2c/hi847.c
2868
if (IS_ERR(hi847->clk))
drivers/media/i2c/hi847.c
2869
return dev_err_probe(hi847->dev, PTR_ERR(hi847->clk),
drivers/media/i2c/hi847.c
2872
freq = clk_get_rate(hi847->clk);
drivers/media/i2c/hi847.c
2874
return dev_err_probe(hi847->dev, -EINVAL,
drivers/media/i2c/hi847.c
2878
ret = hi847_check_hwcfg(hi847->dev);
drivers/media/i2c/hi847.c
2880
dev_err(hi847->dev, "failed to get HW configuration: %d",
drivers/media/i2c/hi847.c
2885
v4l2_i2c_subdev_init(&hi847->sd, client, &hi847_subdev_ops);
drivers/media/i2c/hi847.c
2886
ret = hi847_identify_module(hi847);
drivers/media/i2c/hi847.c
2888
dev_err(hi847->dev, "failed to find sensor: %d", ret);
drivers/media/i2c/hi847.c
2892
mutex_init(&hi847->mutex);
drivers/media/i2c/hi847.c
2893
hi847->cur_mode = &supported_modes[0];
drivers/media/i2c/hi847.c
2894
ret = hi847_init_controls(hi847);
drivers/media/i2c/hi847.c
2896
dev_err(hi847->dev, "failed to init controls: %d", ret);
drivers/media/i2c/hi847.c
2900
hi847->sd.internal_ops = &hi847_internal_ops;
drivers/media/i2c/hi847.c
2901
hi847->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/hi847.c
2902
hi847->sd.entity.ops = &hi847_subdev_entity_ops;
drivers/media/i2c/hi847.c
2903
hi847->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/hi847.c
2904
hi847->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/hi847.c
2905
ret = media_entity_pads_init(&hi847->sd.entity, 1, &hi847->pad);
drivers/media/i2c/hi847.c
2907
dev_err(hi847->dev, "failed to init entity pads: %d", ret);
drivers/media/i2c/hi847.c
2911
ret = v4l2_async_register_subdev_sensor(&hi847->sd);
drivers/media/i2c/hi847.c
2913
dev_err(hi847->dev, "failed to register V4L2 subdev: %d",
drivers/media/i2c/hi847.c
2918
pm_runtime_set_active(hi847->dev);
drivers/media/i2c/hi847.c
2919
pm_runtime_enable(hi847->dev);
drivers/media/i2c/hi847.c
2920
pm_runtime_idle(hi847->dev);
drivers/media/i2c/hi847.c
2925
media_entity_cleanup(&hi847->sd.entity);
drivers/media/i2c/hi847.c
2928
v4l2_ctrl_handler_free(hi847->sd.ctrl_handler);
drivers/media/i2c/hi847.c
2929
mutex_destroy(&hi847->mutex);