Lines Matching refs:adv7511
23 struct adv7511 { struct
51 static struct adv7511 *encoder_to_adv7511(struct drm_encoder *encoder) in encoder_to_adv7511() argument
165 static void adv7511_set_colormap(struct adv7511 *adv7511, bool enable, in adv7511_set_colormap() argument
171 regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(1), in adv7511_set_colormap()
176 regmap_update_bits(adv7511->regmap, in adv7511_set_colormap()
179 regmap_write(adv7511->regmap, in adv7511_set_colormap()
186 regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(0), in adv7511_set_colormap()
189 regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(0), in adv7511_set_colormap()
192 regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(1), in adv7511_set_colormap()
196 static int adv7511_packet_enable(struct adv7511 *adv7511, unsigned int packet) in adv7511_packet_enable() argument
199 regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE0, in adv7511_packet_enable()
204 regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE1, in adv7511_packet_enable()
211 static int adv7511_packet_disable(struct adv7511 *adv7511, unsigned int packet) in adv7511_packet_disable() argument
214 regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE0, in adv7511_packet_disable()
219 regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE1, in adv7511_packet_disable()
233 static void adv7511_set_config_csc(struct adv7511 *adv7511, in adv7511_set_config_csc() argument
242 if (adv7511->edid) in adv7511_set_config_csc()
243 config.hdmi_mode = drm_detect_hdmi_monitor(adv7511->edid); in adv7511_set_config_csc()
293 adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); in adv7511_set_config_csc()
295 adv7511_set_colormap(adv7511, config.csc_enable, in adv7511_set_config_csc()
299 regmap_update_bits(adv7511->regmap, ADV7511_REG_VIDEO_INPUT_CFG1, 0x81, in adv7511_set_config_csc()
302 regmap_update_bits(adv7511->regmap, ADV7511_REG_HDCP_HDMI_CFG, in adv7511_set_config_csc()
309 regmap_bulk_write(adv7511->regmap, ADV7511_REG_AVI_INFOFRAME_VERSION, in adv7511_set_config_csc()
312 adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); in adv7511_set_config_csc()
315 static void adv7511_set_link_config(struct adv7511 *adv7511, in adv7511_set_link_config() argument
343 regmap_update_bits(adv7511->regmap, ADV7511_REG_I2C_FREQ_ID_CFG, 0xf, in adv7511_set_link_config()
345 regmap_update_bits(adv7511->regmap, ADV7511_REG_VIDEO_INPUT_CFG1, 0x7e, in adv7511_set_link_config()
348 regmap_write(adv7511->regmap, ADV7511_REG_VIDEO_INPUT_CFG2, in adv7511_set_link_config()
350 regmap_write(adv7511->regmap, ADV7511_REG_TIMING_GEN_SEQ, in adv7511_set_link_config()
353 regmap_write(adv7511->regmap, 0xba, clock_delay << 5); in adv7511_set_link_config()
355 adv7511->embedded_sync = config->embedded_sync; in adv7511_set_link_config()
356 adv7511->hsync_polarity = config->hsync_polarity; in adv7511_set_link_config()
357 adv7511->vsync_polarity = config->vsync_polarity; in adv7511_set_link_config()
358 adv7511->rgb = config->input_colorspace == HDMI_COLORSPACE_RGB; in adv7511_set_link_config()
361 static void adv7511_power_on(struct adv7511 *adv7511) in adv7511_power_on() argument
363 adv7511->current_edid_segment = -1; in adv7511_power_on()
365 regmap_write(adv7511->regmap, ADV7511_REG_INT(0), in adv7511_power_on()
367 regmap_write(adv7511->regmap, ADV7511_REG_INT(1), in adv7511_power_on()
369 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, in adv7511_power_on()
380 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2, in adv7511_power_on()
387 regcache_sync(adv7511->regmap); in adv7511_power_on()
389 adv7511->powered = true; in adv7511_power_on()
392 static void adv7511_power_off(struct adv7511 *adv7511) in adv7511_power_off() argument
395 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, in adv7511_power_off()
398 regcache_mark_dirty(adv7511->regmap); in adv7511_power_off()
400 adv7511->powered = false; in adv7511_power_off()
407 static bool adv7511_hpd(struct adv7511 *adv7511) in adv7511_hpd() argument
412 ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(0), &irq0); in adv7511_hpd()
417 regmap_write(adv7511->regmap, ADV7511_REG_INT(0), in adv7511_hpd()
425 static int adv7511_irq_process(struct adv7511 *adv7511) in adv7511_irq_process() argument
430 ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(0), &irq0); in adv7511_irq_process()
434 ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(1), &irq1); in adv7511_irq_process()
438 regmap_write(adv7511->regmap, ADV7511_REG_INT(0), irq0); in adv7511_irq_process()
439 regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1); in adv7511_irq_process()
442 drm_helper_hpd_irq_event(adv7511->encoder->dev); in adv7511_irq_process()
445 adv7511->edid_read = true; in adv7511_irq_process()
447 if (adv7511->i2c_main->irq) in adv7511_irq_process()
448 wake_up_all(&adv7511->wq); in adv7511_irq_process()
456 struct adv7511 *adv7511 = devid; in adv7511_irq_handler() local
459 ret = adv7511_irq_process(adv7511); in adv7511_irq_handler()
467 static int adv7511_wait_for_edid(struct adv7511 *adv7511, int timeout) in adv7511_wait_for_edid() argument
471 if (adv7511->i2c_main->irq) { in adv7511_wait_for_edid()
472 ret = wait_event_interruptible_timeout(adv7511->wq, in adv7511_wait_for_edid()
473 adv7511->edid_read, msecs_to_jiffies(timeout)); in adv7511_wait_for_edid()
476 ret = adv7511_irq_process(adv7511); in adv7511_wait_for_edid()
480 if (adv7511->edid_read) in adv7511_wait_for_edid()
487 return adv7511->edid_read ? 0 : -EIO; in adv7511_wait_for_edid()
493 struct adv7511 *adv7511 = data; in adv7511_get_edid_block() local
502 if (adv7511->current_edid_segment != block / 2) { in adv7511_get_edid_block()
505 ret = regmap_read(adv7511->regmap, ADV7511_REG_DDC_STATUS, in adv7511_get_edid_block()
511 adv7511->edid_read = false; in adv7511_get_edid_block()
512 regmap_write(adv7511->regmap, ADV7511_REG_EDID_SEGMENT, in adv7511_get_edid_block()
514 ret = adv7511_wait_for_edid(adv7511, 200); in adv7511_get_edid_block()
523 xfer[0].addr = adv7511->i2c_edid->addr; in adv7511_get_edid_block()
527 xfer[1].addr = adv7511->i2c_edid->addr; in adv7511_get_edid_block()
530 xfer[1].buf = adv7511->edid_buf; in adv7511_get_edid_block()
535 ret = i2c_transfer(adv7511->i2c_edid->adapter, xfer, in adv7511_get_edid_block()
546 adv7511->current_edid_segment = block / 2; in adv7511_get_edid_block()
550 memcpy(buf, adv7511->edid_buf, len); in adv7511_get_edid_block()
552 memcpy(buf, adv7511->edid_buf + 128, len); in adv7511_get_edid_block()
564 struct adv7511 *adv7511 = encoder_to_adv7511(encoder); in adv7511_get_modes() local
569 if (!adv7511->powered) { in adv7511_get_modes()
570 regmap_write(adv7511->regmap, ADV7511_REG_INT(0), in adv7511_get_modes()
572 regmap_write(adv7511->regmap, ADV7511_REG_INT(1), in adv7511_get_modes()
574 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, in adv7511_get_modes()
576 adv7511->current_edid_segment = -1; in adv7511_get_modes()
579 edid = drm_do_get_edid(connector, adv7511_get_edid_block, adv7511); in adv7511_get_modes()
581 if (!adv7511->powered) in adv7511_get_modes()
582 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, in adv7511_get_modes()
586 kfree(adv7511->edid); in adv7511_get_modes()
587 adv7511->edid = edid; in adv7511_get_modes()
594 adv7511_set_config_csc(adv7511, connector, adv7511->rgb); in adv7511_get_modes()
601 struct adv7511 *adv7511 = encoder_to_adv7511(encoder); in adv7511_encoder_dpms() local
604 adv7511_power_on(adv7511); in adv7511_encoder_dpms()
606 adv7511_power_off(adv7511); in adv7511_encoder_dpms()
613 struct adv7511 *adv7511 = encoder_to_adv7511(encoder); in adv7511_encoder_detect() local
619 ret = regmap_read(adv7511->regmap, ADV7511_REG_STATUS, &val); in adv7511_encoder_detect()
628 hpd = adv7511_hpd(adv7511); in adv7511_encoder_detect()
634 if (status == connector_status_connected && hpd && adv7511->powered) { in adv7511_encoder_detect()
635 regcache_mark_dirty(adv7511->regmap); in adv7511_encoder_detect()
636 adv7511_power_on(adv7511); in adv7511_encoder_detect()
638 if (adv7511->status == connector_status_connected) in adv7511_encoder_detect()
642 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2, in adv7511_encoder_detect()
647 adv7511->status = status; in adv7511_encoder_detect()
664 struct adv7511 *adv7511 = encoder_to_adv7511(encoder); in adv7511_encoder_mode_set() local
669 if (adv7511->embedded_sync) { in adv7511_encoder_mode_set()
685 regmap_write(adv7511->regmap, ADV7511_REG_HSYNC_PLACEMENT_MSB, in adv7511_encoder_mode_set()
687 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(0), in adv7511_encoder_mode_set()
689 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(1), in adv7511_encoder_mode_set()
692 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(2), in adv7511_encoder_mode_set()
695 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(3), in adv7511_encoder_mode_set()
698 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(4), in adv7511_encoder_mode_set()
722 if (adv7511->hsync_polarity != mode_hsync_polarity && in adv7511_encoder_mode_set()
723 adv7511->hsync_polarity != in adv7511_encoder_mode_set()
727 if (adv7511->vsync_polarity != mode_vsync_polarity && in adv7511_encoder_mode_set()
728 adv7511->vsync_polarity != in adv7511_encoder_mode_set()
742 regmap_update_bits(adv7511->regmap, 0xfb, in adv7511_encoder_mode_set()
744 regmap_update_bits(adv7511->regmap, 0x17, in adv7511_encoder_mode_set()
752 adv7511->f_tmds = mode->clock; in adv7511_encoder_mode_set()
859 struct adv7511 *adv7511; in adv7511_probe() local
867 adv7511 = devm_kzalloc(dev, sizeof(*adv7511), GFP_KERNEL); in adv7511_probe()
868 if (!adv7511) in adv7511_probe()
871 adv7511->powered = false; in adv7511_probe()
872 adv7511->status = connector_status_disconnected; in adv7511_probe()
882 adv7511->gpio_pd = devm_gpiod_get_optional(dev, "pd", GPIOD_OUT_HIGH); in adv7511_probe()
883 if (IS_ERR(adv7511->gpio_pd)) in adv7511_probe()
884 return PTR_ERR(adv7511->gpio_pd); in adv7511_probe()
886 if (adv7511->gpio_pd) { in adv7511_probe()
888 gpiod_set_value_cansleep(adv7511->gpio_pd, 0); in adv7511_probe()
891 adv7511->regmap = devm_regmap_init_i2c(i2c, &adv7511_regmap_config); in adv7511_probe()
892 if (IS_ERR(adv7511->regmap)) in adv7511_probe()
893 return PTR_ERR(adv7511->regmap); in adv7511_probe()
895 ret = regmap_read(adv7511->regmap, ADV7511_REG_CHIP_REVISION, &val); in adv7511_probe()
900 ret = regmap_register_patch(adv7511->regmap, adv7511_fixed_registers, in adv7511_probe()
905 regmap_write(adv7511->regmap, ADV7511_REG_EDID_I2C_ADDR, edid_i2c_addr); in adv7511_probe()
906 regmap_write(adv7511->regmap, ADV7511_REG_PACKET_I2C_ADDR, in adv7511_probe()
908 regmap_write(adv7511->regmap, ADV7511_REG_CEC_I2C_ADDR, cec_i2c_addr); in adv7511_probe()
909 adv7511_packet_disable(adv7511, 0xffff); in adv7511_probe()
911 adv7511->i2c_main = i2c; in adv7511_probe()
912 adv7511->i2c_edid = i2c_new_dummy(i2c->adapter, edid_i2c_addr >> 1); in adv7511_probe()
913 if (!adv7511->i2c_edid) in adv7511_probe()
917 init_waitqueue_head(&adv7511->wq); in adv7511_probe()
922 adv7511); in adv7511_probe()
928 regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL, in adv7511_probe()
931 adv7511_power_off(adv7511); in adv7511_probe()
933 i2c_set_clientdata(i2c, adv7511); in adv7511_probe()
935 adv7511_set_link_config(adv7511, &link_config); in adv7511_probe()
940 i2c_unregister_device(adv7511->i2c_edid); in adv7511_probe()
947 struct adv7511 *adv7511 = i2c_get_clientdata(i2c); in adv7511_remove() local
949 i2c_unregister_device(adv7511->i2c_edid); in adv7511_remove()
951 kfree(adv7511->edid); in adv7511_remove()
960 struct adv7511 *adv7511 = i2c_get_clientdata(i2c); in adv7511_encoder_init() local
962 encoder->slave_priv = adv7511; in adv7511_encoder_init()
965 adv7511->encoder = &encoder->base; in adv7511_encoder_init()