Lines Matching full:state
199 int (*init)(struct adv7180_state *state);
227 static int adv7180_select_page(struct adv7180_state *state, unsigned int page) in adv7180_select_page() argument
229 if (state->register_page != page) { in adv7180_select_page()
230 i2c_smbus_write_byte_data(state->client, ADV7180_REG_CTRL, in adv7180_select_page()
232 state->register_page = page; in adv7180_select_page()
238 static int adv7180_write(struct adv7180_state *state, unsigned int reg, in adv7180_write() argument
241 lockdep_assert_held(&state->mutex); in adv7180_write()
242 adv7180_select_page(state, reg >> 8); in adv7180_write()
243 return i2c_smbus_write_byte_data(state->client, reg & 0xff, value); in adv7180_write()
246 static int adv7180_read(struct adv7180_state *state, unsigned int reg) in adv7180_read() argument
248 lockdep_assert_held(&state->mutex); in adv7180_read()
249 adv7180_select_page(state, reg >> 8); in adv7180_read()
250 return i2c_smbus_read_byte_data(state->client, reg & 0xff); in adv7180_read()
253 static int adv7180_csi_write(struct adv7180_state *state, unsigned int reg, in adv7180_csi_write() argument
256 return i2c_smbus_write_byte_data(state->csi_client, reg, value); in adv7180_csi_write()
259 static int adv7180_set_video_standard(struct adv7180_state *state, in adv7180_set_video_standard() argument
262 return state->chip_info->set_std(state, std); in adv7180_set_video_standard()
265 static int adv7180_vpp_write(struct adv7180_state *state, unsigned int reg, in adv7180_vpp_write() argument
268 return i2c_smbus_write_byte_data(state->vpp_client, reg, value); in adv7180_vpp_write()
330 static int __adv7180_status(struct adv7180_state *state, u32 *status, in __adv7180_status() argument
333 int status1 = adv7180_read(state, ADV7180_REG_STATUS1); in __adv7180_status()
353 struct adv7180_state *state = to_state(sd); in adv7180_querystd() local
354 int err = mutex_lock_interruptible(&state->mutex); in adv7180_querystd()
358 if (state->streaming) { in adv7180_querystd()
363 err = adv7180_set_video_standard(state, in adv7180_querystd()
369 __adv7180_status(state, NULL, std); in adv7180_querystd()
371 err = v4l2_std_to_adv7180(state->curr_norm); in adv7180_querystd()
375 err = adv7180_set_video_standard(state, err); in adv7180_querystd()
378 mutex_unlock(&state->mutex); in adv7180_querystd()
385 struct adv7180_state *state = to_state(sd); in adv7180_s_routing() local
386 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_routing()
391 if (input > 31 || !(BIT(input) & state->chip_info->valid_input_mask)) { in adv7180_s_routing()
396 ret = state->chip_info->select_input(state, input); in adv7180_s_routing()
399 state->input = input; in adv7180_s_routing()
401 mutex_unlock(&state->mutex); in adv7180_s_routing()
407 struct adv7180_state *state = to_state(sd); in adv7180_g_input_status() local
408 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_g_input_status()
412 ret = __adv7180_status(state, status, NULL); in adv7180_g_input_status()
413 mutex_unlock(&state->mutex); in adv7180_g_input_status()
417 static int adv7180_program_std(struct adv7180_state *state) in adv7180_program_std() argument
421 ret = v4l2_std_to_adv7180(state->curr_norm); in adv7180_program_std()
425 ret = adv7180_set_video_standard(state, ret); in adv7180_program_std()
433 struct adv7180_state *state = to_state(sd); in adv7180_s_std() local
434 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_std()
444 state->curr_norm = std; in adv7180_s_std()
446 ret = adv7180_program_std(state); in adv7180_s_std()
448 mutex_unlock(&state->mutex); in adv7180_s_std()
454 struct adv7180_state *state = to_state(sd); in adv7180_g_std() local
456 *norm = state->curr_norm; in adv7180_g_std()
464 struct adv7180_state *state = to_state(sd); in adv7180_g_frame_interval() local
466 if (state->curr_norm & V4L2_STD_525_60) { in adv7180_g_frame_interval()
477 static void adv7180_set_power_pin(struct adv7180_state *state, bool on) in adv7180_set_power_pin() argument
479 if (!state->pwdn_gpio) in adv7180_set_power_pin()
483 gpiod_set_value_cansleep(state->pwdn_gpio, 0); in adv7180_set_power_pin()
486 gpiod_set_value_cansleep(state->pwdn_gpio, 1); in adv7180_set_power_pin()
490 static void adv7180_set_reset_pin(struct adv7180_state *state, bool on) in adv7180_set_reset_pin() argument
492 if (!state->rst_gpio) in adv7180_set_reset_pin()
496 gpiod_set_value_cansleep(state->rst_gpio, 1); in adv7180_set_reset_pin()
498 gpiod_set_value_cansleep(state->rst_gpio, 0); in adv7180_set_reset_pin()
503 static int adv7180_set_power(struct adv7180_state *state, bool on) in adv7180_set_power() argument
513 ret = adv7180_write(state, ADV7180_REG_PWR_MAN, val); in adv7180_set_power()
517 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_power()
519 adv7180_csi_write(state, 0xDE, 0x02); in adv7180_set_power()
520 adv7180_csi_write(state, 0xD2, 0xF7); in adv7180_set_power()
521 adv7180_csi_write(state, 0xD8, 0x65); in adv7180_set_power()
522 adv7180_csi_write(state, 0xE0, 0x09); in adv7180_set_power()
523 adv7180_csi_write(state, 0x2C, 0x00); in adv7180_set_power()
524 if (state->field == V4L2_FIELD_NONE) in adv7180_set_power()
525 adv7180_csi_write(state, 0x1D, 0x80); in adv7180_set_power()
526 adv7180_csi_write(state, 0x00, 0x00); in adv7180_set_power()
528 adv7180_csi_write(state, 0x00, 0x80); in adv7180_set_power()
537 struct adv7180_state *state = to_state(sd); in adv7180_s_power() local
540 ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_power()
544 ret = adv7180_set_power(state, on); in adv7180_s_power()
546 state->powered = on; in adv7180_s_power()
548 mutex_unlock(&state->mutex); in adv7180_s_power()
555 struct adv7180_state *state = to_state(sd); in adv7180_s_ctrl() local
556 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_ctrl()
564 ret = adv7180_write(state, ADV7180_REG_BRI, val); in adv7180_s_ctrl()
568 ret = adv7180_write(state, ADV7180_REG_HUE, -val); in adv7180_s_ctrl()
571 ret = adv7180_write(state, ADV7180_REG_CON, val); in adv7180_s_ctrl()
578 ret = adv7180_write(state, ADV7180_REG_SD_SAT_CB, val); in adv7180_s_ctrl()
581 ret = adv7180_write(state, ADV7180_REG_SD_SAT_CR, val); in adv7180_s_ctrl()
586 adv7180_write(state, 0x80d9, 0x44); in adv7180_s_ctrl()
587 adv7180_write(state, ADV7180_REG_FLCONTROL, in adv7180_s_ctrl()
591 adv7180_write(state, 0x80d9, 0xc4); in adv7180_s_ctrl()
592 adv7180_write(state, ADV7180_REG_FLCONTROL, 0x00); in adv7180_s_ctrl()
599 mutex_unlock(&state->mutex); in adv7180_s_ctrl()
617 static int adv7180_init_controls(struct adv7180_state *state) in adv7180_init_controls() argument
619 v4l2_ctrl_handler_init(&state->ctrl_hdl, 4); in adv7180_init_controls()
621 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
624 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
627 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
630 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
633 v4l2_ctrl_new_custom(&state->ctrl_hdl, &adv7180_ctrl_fast_switch, NULL); in adv7180_init_controls()
635 state->sd.ctrl_handler = &state->ctrl_hdl; in adv7180_init_controls()
636 if (state->ctrl_hdl.error) { in adv7180_init_controls()
637 int err = state->ctrl_hdl.error; in adv7180_init_controls()
639 v4l2_ctrl_handler_free(&state->ctrl_hdl); in adv7180_init_controls()
642 v4l2_ctrl_handler_setup(&state->ctrl_hdl); in adv7180_init_controls()
646 static void adv7180_exit_controls(struct adv7180_state *state) in adv7180_exit_controls() argument
648 v4l2_ctrl_handler_free(&state->ctrl_hdl); in adv7180_exit_controls()
666 struct adv7180_state *state = to_state(sd); in adv7180_mbus_fmt() local
671 fmt->height = state->curr_norm & V4L2_STD_525_60 ? 480 : 576; in adv7180_mbus_fmt()
673 if (state->field == V4L2_FIELD_ALTERNATE) in adv7180_mbus_fmt()
679 static int adv7180_set_field_mode(struct adv7180_state *state) in adv7180_set_field_mode() argument
681 if (!(state->chip_info->flags & ADV7180_FLAG_I2P)) in adv7180_set_field_mode()
684 if (state->field == V4L2_FIELD_NONE) { in adv7180_set_field_mode()
685 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_field_mode()
686 adv7180_csi_write(state, 0x01, 0x20); in adv7180_set_field_mode()
687 adv7180_csi_write(state, 0x02, 0x28); in adv7180_set_field_mode()
688 adv7180_csi_write(state, 0x03, 0x38); in adv7180_set_field_mode()
689 adv7180_csi_write(state, 0x04, 0x30); in adv7180_set_field_mode()
690 adv7180_csi_write(state, 0x05, 0x30); in adv7180_set_field_mode()
691 adv7180_csi_write(state, 0x06, 0x80); in adv7180_set_field_mode()
692 adv7180_csi_write(state, 0x07, 0x70); in adv7180_set_field_mode()
693 adv7180_csi_write(state, 0x08, 0x50); in adv7180_set_field_mode()
695 adv7180_vpp_write(state, 0xa3, 0x00); in adv7180_set_field_mode()
696 adv7180_vpp_write(state, 0x5b, 0x00); in adv7180_set_field_mode()
697 adv7180_vpp_write(state, 0x55, 0x80); in adv7180_set_field_mode()
699 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_field_mode()
700 adv7180_csi_write(state, 0x01, 0x18); in adv7180_set_field_mode()
701 adv7180_csi_write(state, 0x02, 0x18); in adv7180_set_field_mode()
702 adv7180_csi_write(state, 0x03, 0x30); in adv7180_set_field_mode()
703 adv7180_csi_write(state, 0x04, 0x20); in adv7180_set_field_mode()
704 adv7180_csi_write(state, 0x05, 0x28); in adv7180_set_field_mode()
705 adv7180_csi_write(state, 0x06, 0x40); in adv7180_set_field_mode()
706 adv7180_csi_write(state, 0x07, 0x58); in adv7180_set_field_mode()
707 adv7180_csi_write(state, 0x08, 0x30); in adv7180_set_field_mode()
709 adv7180_vpp_write(state, 0xa3, 0x70); in adv7180_set_field_mode()
710 adv7180_vpp_write(state, 0x5b, 0x80); in adv7180_set_field_mode()
711 adv7180_vpp_write(state, 0x55, 0x00); in adv7180_set_field_mode()
721 struct adv7180_state *state = to_state(sd); in adv7180_get_pad_format() local
727 format->format.field = state->field; in adv7180_get_pad_format()
737 struct adv7180_state *state = to_state(sd); in adv7180_set_pad_format() local
743 if (state->chip_info->flags & ADV7180_FLAG_I2P) in adv7180_set_pad_format()
754 if (state->field != format->format.field) { in adv7180_set_pad_format()
755 state->field = format->format.field; in adv7180_set_pad_format()
756 adv7180_set_power(state, false); in adv7180_set_pad_format()
757 adv7180_set_field_mode(state); in adv7180_set_pad_format()
758 adv7180_set_power(state, true); in adv7180_set_pad_format()
783 struct adv7180_state *state = to_state(sd); in adv7180_get_mbus_config() local
785 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_get_mbus_config()
812 struct adv7180_state *state = to_state(sd); in adv7180_g_pixelaspect() local
814 if (state->curr_norm & V4L2_STD_525_60) { in adv7180_g_pixelaspect()
833 struct adv7180_state *state = to_state(sd); in adv7180_s_stream() local
838 state->streaming = enable; in adv7180_s_stream()
843 ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_stream()
846 state->streaming = enable; in adv7180_s_stream()
847 mutex_unlock(&state->mutex); in adv7180_s_stream()
904 struct adv7180_state *state = devid; in adv7180_irq() local
907 mutex_lock(&state->mutex); in adv7180_irq()
908 isr3 = adv7180_read(state, ADV7180_REG_ISR3); in adv7180_irq()
910 adv7180_write(state, ADV7180_REG_ICR3, isr3); in adv7180_irq()
918 v4l2_subdev_notify_event(&state->sd, &src_ch); in adv7180_irq()
920 mutex_unlock(&state->mutex); in adv7180_irq()
925 static int adv7180_init(struct adv7180_state *state) in adv7180_init() argument
930 ret = adv7180_write(state, ADV7180_REG_EXTENDED_OUTPUT_CONTROL, in adv7180_init()
936 return adv7180_write(state, ADV7180_REG_NTSC_V_BIT_END, in adv7180_init()
940 static int adv7180_set_std(struct adv7180_state *state, unsigned int std) in adv7180_set_std() argument
942 return adv7180_write(state, ADV7180_REG_INPUT_CONTROL, in adv7180_set_std()
943 (std << 4) | state->input); in adv7180_set_std()
946 static int adv7180_select_input(struct adv7180_state *state, unsigned int input) in adv7180_select_input() argument
950 ret = adv7180_read(state, ADV7180_REG_INPUT_CONTROL); in adv7180_select_input()
956 return adv7180_write(state, ADV7180_REG_INPUT_CONTROL, ret); in adv7180_select_input()
959 static int adv7182_init(struct adv7180_state *state) in adv7182_init() argument
961 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) in adv7182_init()
962 adv7180_write(state, ADV7180_REG_CSI_SLAVE_ADDR, in adv7182_init()
965 if (state->chip_info->flags & ADV7180_FLAG_I2P) in adv7182_init()
966 adv7180_write(state, ADV7180_REG_VPP_SLAVE_ADDR, in adv7182_init()
969 if (state->chip_info->flags & ADV7180_FLAG_V2) { in adv7182_init()
971 adv7180_write(state, 0x0080, 0x51); in adv7182_init()
972 adv7180_write(state, 0x0081, 0x51); in adv7182_init()
973 adv7180_write(state, 0x0082, 0x68); in adv7182_init()
977 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7182_init()
978 adv7180_write(state, ADV7180_REG_OUTPUT_CONTROL, 0x4e); in adv7182_init()
979 adv7180_write(state, ADV7180_REG_EXTENDED_OUTPUT_CONTROL, 0x57); in adv7182_init()
980 adv7180_write(state, ADV7180_REG_CTRL_2, 0xc0); in adv7182_init()
982 if (state->chip_info->flags & ADV7180_FLAG_V2) { in adv7182_init()
983 if (state->force_bt656_4) { in adv7182_init()
985 adv7180_write(state, in adv7182_init()
989 adv7180_write(state, in adv7182_init()
993 adv7180_write(state, in adv7182_init()
997 adv7180_write(state, in adv7182_init()
1003 adv7180_write(state, in adv7182_init()
1006 adv7180_write(state, ADV7180_REG_OUTPUT_CONTROL, 0x0c); in adv7182_init()
1007 adv7180_write(state, ADV7180_REG_CTRL_2, 0x40); in adv7182_init()
1010 adv7180_write(state, 0x0013, 0x00); in adv7182_init()
1015 static int adv7182_set_std(struct adv7180_state *state, unsigned int std) in adv7182_set_std() argument
1017 return adv7180_write(state, ADV7182_REG_INPUT_VIDSEL, std << 4); in adv7182_set_std()
1072 static int adv7182_select_input(struct adv7180_state *state, unsigned int input) in adv7182_select_input() argument
1079 ret = adv7180_write(state, ADV7180_REG_INPUT_CONTROL, input); in adv7182_select_input()
1084 adv7180_write(state, ADV7180_REG_RST_CLAMP, 0x00); in adv7182_select_input()
1085 adv7180_write(state, ADV7180_REG_RST_CLAMP, 0xff); in adv7182_select_input()
1093 adv7180_write(state, ADV7180_REG_SHAP_FILTER_CTL_1, 0x41); in adv7182_select_input()
1096 adv7180_write(state, ADV7180_REG_SHAP_FILTER_CTL_1, 0x01); in adv7182_select_input()
1100 if (state->chip_info->flags & ADV7180_FLAG_V2) in adv7182_select_input()
1106 adv7180_write(state, ADV7180_REG_CVBS_TRIM + i, lbias[i]); in adv7182_select_input()
1110 adv7180_write(state, ADV7180_REG_RES_CIR, 0xa8); in adv7182_select_input()
1111 adv7180_write(state, ADV7180_REG_CLAMP_ADJ, 0x90); in adv7182_select_input()
1112 adv7180_write(state, ADV7180_REG_DIFF_MODE, 0xb0); in adv7182_select_input()
1113 adv7180_write(state, ADV7180_REG_AGC_ADJ1, 0x08); in adv7182_select_input()
1114 adv7180_write(state, ADV7180_REG_AGC_ADJ2, 0xa0); in adv7182_select_input()
1116 adv7180_write(state, ADV7180_REG_RES_CIR, 0xf0); in adv7182_select_input()
1117 adv7180_write(state, ADV7180_REG_CLAMP_ADJ, 0xd0); in adv7182_select_input()
1118 adv7180_write(state, ADV7180_REG_DIFF_MODE, 0x10); in adv7182_select_input()
1119 adv7180_write(state, ADV7180_REG_AGC_ADJ1, 0x9c); in adv7182_select_input()
1120 adv7180_write(state, ADV7180_REG_AGC_ADJ2, 0x00); in adv7182_select_input()
1291 static int init_device(struct adv7180_state *state) in init_device() argument
1295 mutex_lock(&state->mutex); in init_device()
1297 adv7180_set_power_pin(state, true); in init_device()
1298 adv7180_set_reset_pin(state, false); in init_device()
1300 adv7180_write(state, ADV7180_REG_PWR_MAN, ADV7180_PWR_MAN_RES); in init_device()
1303 ret = state->chip_info->init(state); in init_device()
1307 ret = adv7180_program_std(state); in init_device()
1311 adv7180_set_field_mode(state); in init_device()
1314 if (state->irq > 0) { in init_device()
1316 ret = adv7180_write(state, ADV7180_REG_ICONF1, in init_device()
1322 ret = adv7180_write(state, ADV7180_REG_IMR1, 0); in init_device()
1326 ret = adv7180_write(state, ADV7180_REG_IMR2, 0); in init_device()
1331 ret = adv7180_write(state, ADV7180_REG_IMR3, in init_device()
1336 ret = adv7180_write(state, ADV7180_REG_IMR4, 0); in init_device()
1342 mutex_unlock(&state->mutex); in init_device()
1351 struct adv7180_state *state; in adv7180_probe() local
1359 state = devm_kzalloc(&client->dev, sizeof(*state), GFP_KERNEL); in adv7180_probe()
1360 if (state == NULL) in adv7180_probe()
1363 state->client = client; in adv7180_probe()
1364 state->field = V4L2_FIELD_ALTERNATE; in adv7180_probe()
1365 state->chip_info = (struct adv7180_chip_info *)id->driver_data; in adv7180_probe()
1367 state->pwdn_gpio = devm_gpiod_get_optional(&client->dev, "powerdown", in adv7180_probe()
1369 if (IS_ERR(state->pwdn_gpio)) { in adv7180_probe()
1370 ret = PTR_ERR(state->pwdn_gpio); in adv7180_probe()
1375 state->rst_gpio = devm_gpiod_get_optional(&client->dev, "reset", in adv7180_probe()
1377 if (IS_ERR(state->rst_gpio)) { in adv7180_probe()
1378 ret = PTR_ERR(state->rst_gpio); in adv7180_probe()
1384 state->force_bt656_4 = true; in adv7180_probe()
1386 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_probe()
1387 state->csi_client = i2c_new_dummy_device(client->adapter, in adv7180_probe()
1389 if (IS_ERR(state->csi_client)) in adv7180_probe()
1390 return PTR_ERR(state->csi_client); in adv7180_probe()
1393 if (state->chip_info->flags & ADV7180_FLAG_I2P) { in adv7180_probe()
1394 state->vpp_client = i2c_new_dummy_device(client->adapter, in adv7180_probe()
1396 if (IS_ERR(state->vpp_client)) { in adv7180_probe()
1397 ret = PTR_ERR(state->vpp_client); in adv7180_probe()
1402 state->irq = client->irq; in adv7180_probe()
1403 mutex_init(&state->mutex); in adv7180_probe()
1404 state->curr_norm = V4L2_STD_NTSC; in adv7180_probe()
1405 if (state->chip_info->flags & ADV7180_FLAG_RESET_POWERED) in adv7180_probe()
1406 state->powered = true; in adv7180_probe()
1408 state->powered = false; in adv7180_probe()
1409 state->input = 0; in adv7180_probe()
1410 sd = &state->sd; in adv7180_probe()
1414 ret = adv7180_init_controls(state); in adv7180_probe()
1418 state->pad.flags = MEDIA_PAD_FL_SOURCE; in adv7180_probe()
1420 ret = media_entity_pads_init(&sd->entity, 1, &state->pad); in adv7180_probe()
1424 ret = init_device(state); in adv7180_probe()
1428 if (state->irq) { in adv7180_probe()
1431 KBUILD_MODNAME, state); in adv7180_probe()
1440 mutex_lock(&state->mutex); in adv7180_probe()
1441 ret = adv7180_read(state, ADV7180_REG_IDENT); in adv7180_probe()
1442 mutex_unlock(&state->mutex); in adv7180_probe()
1454 if (state->irq > 0) in adv7180_probe()
1455 free_irq(client->irq, state); in adv7180_probe()
1459 adv7180_exit_controls(state); in adv7180_probe()
1461 i2c_unregister_device(state->vpp_client); in adv7180_probe()
1463 i2c_unregister_device(state->csi_client); in adv7180_probe()
1464 mutex_destroy(&state->mutex); in adv7180_probe()
1471 struct adv7180_state *state = to_state(sd); in adv7180_remove() local
1475 if (state->irq > 0) in adv7180_remove()
1476 free_irq(client->irq, state); in adv7180_remove()
1479 adv7180_exit_controls(state); in adv7180_remove()
1481 i2c_unregister_device(state->vpp_client); in adv7180_remove()
1482 i2c_unregister_device(state->csi_client); in adv7180_remove()
1484 adv7180_set_reset_pin(state, true); in adv7180_remove()
1485 adv7180_set_power_pin(state, false); in adv7180_remove()
1487 mutex_destroy(&state->mutex); in adv7180_remove()
1512 struct adv7180_state *state = to_state(sd); in adv7180_suspend() local
1514 return adv7180_set_power(state, false); in adv7180_suspend()
1520 struct adv7180_state *state = to_state(sd); in adv7180_resume() local
1523 ret = init_device(state); in adv7180_resume()
1527 ret = adv7180_set_power(state, state->powered); in adv7180_resume()