Lines Matching refs:adv7511

135 static void adv7511_set_colormap(struct adv7511 *adv7511, bool enable,  in adv7511_set_colormap()  argument
141 regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(1), in adv7511_set_colormap()
146 regmap_update_bits(adv7511->regmap, in adv7511_set_colormap()
149 regmap_write(adv7511->regmap, in adv7511_set_colormap()
156 regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(0), in adv7511_set_colormap()
159 regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(0), in adv7511_set_colormap()
162 regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(1), in adv7511_set_colormap()
166 static int adv7511_packet_enable(struct adv7511 *adv7511, unsigned int packet) in adv7511_packet_enable() argument
169 regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE0, in adv7511_packet_enable()
174 regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE1, in adv7511_packet_enable()
181 static int adv7511_packet_disable(struct adv7511 *adv7511, unsigned int packet) in adv7511_packet_disable() argument
184 regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE0, in adv7511_packet_disable()
189 regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE1, in adv7511_packet_disable()
203 static void adv7511_set_config_csc(struct adv7511 *adv7511, in adv7511_set_config_csc() argument
260 adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); in adv7511_set_config_csc()
262 adv7511_set_colormap(adv7511, config.csc_enable, in adv7511_set_config_csc()
266 regmap_update_bits(adv7511->regmap, ADV7511_REG_VIDEO_INPUT_CFG1, 0x81, in adv7511_set_config_csc()
269 regmap_update_bits(adv7511->regmap, ADV7511_REG_HDCP_HDMI_CFG, in adv7511_set_config_csc()
276 regmap_bulk_write(adv7511->regmap, ADV7511_REG_AVI_INFOFRAME_VERSION, in adv7511_set_config_csc()
279 adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); in adv7511_set_config_csc()
282 static void adv7511_set_link_config(struct adv7511 *adv7511, in adv7511_set_link_config() argument
310 regmap_update_bits(adv7511->regmap, ADV7511_REG_I2C_FREQ_ID_CFG, 0xf, in adv7511_set_link_config()
312 regmap_update_bits(adv7511->regmap, ADV7511_REG_VIDEO_INPUT_CFG1, 0x7e, in adv7511_set_link_config()
315 regmap_write(adv7511->regmap, ADV7511_REG_VIDEO_INPUT_CFG2, in adv7511_set_link_config()
317 regmap_write(adv7511->regmap, ADV7511_REG_TIMING_GEN_SEQ, in adv7511_set_link_config()
320 regmap_write(adv7511->regmap, 0xba, clock_delay << 5); in adv7511_set_link_config()
322 adv7511->embedded_sync = config->embedded_sync; in adv7511_set_link_config()
323 adv7511->hsync_polarity = config->hsync_polarity; in adv7511_set_link_config()
324 adv7511->vsync_polarity = config->vsync_polarity; in adv7511_set_link_config()
325 adv7511->rgb = config->input_colorspace == HDMI_COLORSPACE_RGB; in adv7511_set_link_config()
328 static void __adv7511_power_on(struct adv7511 *adv7511) in __adv7511_power_on() argument
330 adv7511->current_edid_segment = -1; in __adv7511_power_on()
332 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, in __adv7511_power_on()
334 if (adv7511->i2c_main->irq) { in __adv7511_power_on()
340 regmap_write(adv7511->regmap, ADV7511_REG_INT_ENABLE(0), in __adv7511_power_on()
342 regmap_update_bits(adv7511->regmap, in __adv7511_power_on()
357 if (adv7511->type == ADV7535) in __adv7511_power_on()
358 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2, in __adv7511_power_on()
362 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2, in __adv7511_power_on()
367 static void adv7511_power_on(struct adv7511 *adv7511) in adv7511_power_on() argument
369 __adv7511_power_on(adv7511); in adv7511_power_on()
374 regcache_sync(adv7511->regmap); in adv7511_power_on()
376 if (adv7511->type == ADV7533 || adv7511->type == ADV7535) in adv7511_power_on()
377 adv7533_dsi_power_on(adv7511); in adv7511_power_on()
378 adv7511->powered = true; in adv7511_power_on()
381 static void __adv7511_power_off(struct adv7511 *adv7511) in __adv7511_power_off() argument
384 if (adv7511->type == ADV7535) in __adv7511_power_off()
385 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2, in __adv7511_power_off()
388 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, in __adv7511_power_off()
391 regmap_update_bits(adv7511->regmap, in __adv7511_power_off()
394 regcache_mark_dirty(adv7511->regmap); in __adv7511_power_off()
397 static void adv7511_power_off(struct adv7511 *adv7511) in adv7511_power_off() argument
399 __adv7511_power_off(adv7511); in adv7511_power_off()
400 if (adv7511->type == ADV7533 || adv7511->type == ADV7535) in adv7511_power_off()
401 adv7533_dsi_power_off(adv7511); in adv7511_power_off()
402 adv7511->powered = false; in adv7511_power_off()
409 static bool adv7511_hpd(struct adv7511 *adv7511) in adv7511_hpd() argument
414 ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(0), &irq0); in adv7511_hpd()
419 regmap_write(adv7511->regmap, ADV7511_REG_INT(0), in adv7511_hpd()
429 struct adv7511 *adv7511 = container_of(work, struct adv7511, hpd_work); in adv7511_hpd_work() local
434 ret = regmap_read(adv7511->regmap, ADV7511_REG_STATUS, &val); in adv7511_hpd_work()
448 adv7511->connector.status == connector_status_disconnected && in adv7511_hpd_work()
449 adv7511->powered) { in adv7511_hpd_work()
450 regcache_mark_dirty(adv7511->regmap); in adv7511_hpd_work()
451 adv7511_power_on(adv7511); in adv7511_hpd_work()
454 if (adv7511->connector.status != status) { in adv7511_hpd_work()
455 adv7511->connector.status = status; in adv7511_hpd_work()
457 if (adv7511->connector.dev) { in adv7511_hpd_work()
459 cec_phys_addr_invalidate(adv7511->cec_adap); in adv7511_hpd_work()
460 drm_kms_helper_hotplug_event(adv7511->connector.dev); in adv7511_hpd_work()
462 drm_bridge_hpd_notify(&adv7511->bridge, status); in adv7511_hpd_work()
467 static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd) in adv7511_irq_process() argument
472 ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(0), &irq0); in adv7511_irq_process()
476 ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(1), &irq1); in adv7511_irq_process()
480 regmap_write(adv7511->regmap, ADV7511_REG_INT(0), irq0); in adv7511_irq_process()
481 regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1); in adv7511_irq_process()
483 if (process_hpd && irq0 & ADV7511_INT0_HPD && adv7511->bridge.encoder) in adv7511_irq_process()
484 schedule_work(&adv7511->hpd_work); in adv7511_irq_process()
487 adv7511->edid_read = true; in adv7511_irq_process()
489 if (adv7511->i2c_main->irq) in adv7511_irq_process()
490 wake_up_all(&adv7511->wq); in adv7511_irq_process()
494 adv7511_cec_irq_process(adv7511, irq1); in adv7511_irq_process()
502 struct adv7511 *adv7511 = devid; in adv7511_irq_handler() local
505 ret = adv7511_irq_process(adv7511, true); in adv7511_irq_handler()
513 static int adv7511_wait_for_edid(struct adv7511 *adv7511, int timeout) in adv7511_wait_for_edid() argument
517 if (adv7511->i2c_main->irq) { in adv7511_wait_for_edid()
518 ret = wait_event_interruptible_timeout(adv7511->wq, in adv7511_wait_for_edid()
519 adv7511->edid_read, msecs_to_jiffies(timeout)); in adv7511_wait_for_edid()
522 ret = adv7511_irq_process(adv7511, false); in adv7511_wait_for_edid()
526 if (adv7511->edid_read) in adv7511_wait_for_edid()
533 return adv7511->edid_read ? 0 : -EIO; in adv7511_wait_for_edid()
539 struct adv7511 *adv7511 = data; in adv7511_get_edid_block() local
548 if (adv7511->current_edid_segment != block / 2) { in adv7511_get_edid_block()
551 ret = regmap_read(adv7511->regmap, ADV7511_REG_DDC_STATUS, in adv7511_get_edid_block()
557 adv7511->edid_read = false; in adv7511_get_edid_block()
558 regmap_write(adv7511->regmap, ADV7511_REG_EDID_SEGMENT, in adv7511_get_edid_block()
560 ret = adv7511_wait_for_edid(adv7511, 200); in adv7511_get_edid_block()
569 xfer[0].addr = adv7511->i2c_edid->addr; in adv7511_get_edid_block()
573 xfer[1].addr = adv7511->i2c_edid->addr; in adv7511_get_edid_block()
576 xfer[1].buf = adv7511->edid_buf; in adv7511_get_edid_block()
581 ret = i2c_transfer(adv7511->i2c_edid->adapter, xfer, in adv7511_get_edid_block()
592 adv7511->current_edid_segment = block / 2; in adv7511_get_edid_block()
596 memcpy(buf, adv7511->edid_buf, len); in adv7511_get_edid_block()
598 memcpy(buf, adv7511->edid_buf + 128, len); in adv7511_get_edid_block()
607 static struct edid *adv7511_get_edid(struct adv7511 *adv7511, in adv7511_get_edid() argument
613 if (!adv7511->powered) { in adv7511_get_edid()
615 (adv7511->i2c_edid->addr << 1); in adv7511_get_edid()
617 __adv7511_power_on(adv7511); in adv7511_get_edid()
620 regmap_write(adv7511->regmap, ADV7511_REG_EDID_I2C_ADDR, in adv7511_get_edid()
624 edid = drm_do_get_edid(connector, adv7511_get_edid_block, adv7511); in adv7511_get_edid()
626 if (!adv7511->powered) in adv7511_get_edid()
627 __adv7511_power_off(adv7511); in adv7511_get_edid()
629 adv7511_set_config_csc(adv7511, connector, adv7511->rgb, in adv7511_get_edid()
632 cec_s_phys_addr_from_edid(adv7511->cec_adap, edid); in adv7511_get_edid()
637 static int adv7511_get_modes(struct adv7511 *adv7511, in adv7511_get_modes() argument
643 edid = adv7511_get_edid(adv7511, connector); in adv7511_get_modes()
654 adv7511_detect(struct adv7511 *adv7511, struct drm_connector *connector) in adv7511_detect() argument
661 ret = regmap_read(adv7511->regmap, ADV7511_REG_STATUS, &val); in adv7511_detect()
670 hpd = adv7511_hpd(adv7511); in adv7511_detect()
676 if (status == connector_status_connected && hpd && adv7511->powered) { in adv7511_detect()
677 regcache_mark_dirty(adv7511->regmap); in adv7511_detect()
678 adv7511_power_on(adv7511); in adv7511_detect()
680 adv7511_get_modes(adv7511, connector); in adv7511_detect()
681 if (adv7511->status == connector_status_connected) in adv7511_detect()
685 if (adv7511->type == ADV7535) in adv7511_detect()
686 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2, in adv7511_detect()
690 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2, in adv7511_detect()
695 adv7511->status = status; in adv7511_detect()
699 static enum drm_mode_status adv7511_mode_valid(struct adv7511 *adv7511, in adv7511_mode_valid() argument
708 static void adv7511_mode_set(struct adv7511 *adv7511, in adv7511_mode_set() argument
716 if (adv7511->embedded_sync) { in adv7511_mode_set()
732 regmap_write(adv7511->regmap, ADV7511_REG_HSYNC_PLACEMENT_MSB, in adv7511_mode_set()
734 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(0), in adv7511_mode_set()
736 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(1), in adv7511_mode_set()
739 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(2), in adv7511_mode_set()
742 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(3), in adv7511_mode_set()
745 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(4), in adv7511_mode_set()
769 if (adv7511->hsync_polarity != mode_hsync_polarity && in adv7511_mode_set()
770 adv7511->hsync_polarity != in adv7511_mode_set()
774 if (adv7511->vsync_polarity != mode_vsync_polarity && in adv7511_mode_set()
775 adv7511->vsync_polarity != in adv7511_mode_set()
789 if (adv7511->type == ADV7511) in adv7511_mode_set()
790 regmap_update_bits(adv7511->regmap, 0xfb, in adv7511_mode_set()
793 regmap_update_bits(adv7511->regmap, 0x4a, in adv7511_mode_set()
796 regmap_update_bits(adv7511->regmap, 0x17, in adv7511_mode_set()
799 drm_mode_copy(&adv7511->curr_mode, adj_mode); in adv7511_mode_set()
806 adv7511->f_tmds = mode->clock; in adv7511_mode_set()
813 static struct adv7511 *connector_to_adv7511(struct drm_connector *connector) in connector_to_adv7511()
815 return container_of(connector, struct adv7511, connector); in connector_to_adv7511()
820 struct adv7511 *adv = connector_to_adv7511(connector); in adv7511_connector_get_modes()
829 struct adv7511 *adv = connector_to_adv7511(connector); in adv7511_connector_mode_valid()
842 struct adv7511 *adv = connector_to_adv7511(connector); in adv7511_connector_detect()
856 static int adv7511_connector_init(struct adv7511 *adv) in adv7511_connector_init()
890 static struct adv7511 *bridge_to_adv7511(struct drm_bridge *bridge) in bridge_to_adv7511()
892 return container_of(bridge, struct adv7511, bridge); in bridge_to_adv7511()
897 struct adv7511 *adv = bridge_to_adv7511(bridge); in adv7511_bridge_enable()
904 struct adv7511 *adv = bridge_to_adv7511(bridge); in adv7511_bridge_disable()
913 struct adv7511 *adv = bridge_to_adv7511(bridge); in adv7511_bridge_mode_set()
922 struct adv7511 *adv = bridge_to_adv7511(bridge); in adv7511_bridge_mode_valid()
933 struct adv7511 *adv = bridge_to_adv7511(bridge); in adv7511_bridge_attach()
951 struct adv7511 *adv = bridge_to_adv7511(bridge); in adv7511_bridge_detect()
959 struct adv7511 *adv = bridge_to_adv7511(bridge); in adv7511_bridge_get_edid()
967 struct adv7511 *adv = bridge_to_adv7511(bridge); in adv7511_bridge_hpd_notify()
1005 static int adv7511_init_regulators(struct adv7511 *adv) in adv7511_init_regulators()
1035 static void adv7511_uninit_regulators(struct adv7511 *adv) in adv7511_uninit_regulators()
1043 struct adv7511 *adv7511 = i2c_get_clientdata(i2c); in adv7511_cec_register_volatile() local
1045 reg -= adv7511->reg_cec_offset; in adv7511_cec_register_volatile()
1075 static int adv7511_init_cec_regmap(struct adv7511 *adv) in adv7511_init_cec_regmap()
1197 struct adv7511 *adv7511; in adv7511_probe() local
1205 adv7511 = devm_kzalloc(dev, sizeof(*adv7511), GFP_KERNEL); in adv7511_probe()
1206 if (!adv7511) in adv7511_probe()
1209 adv7511->i2c_main = i2c; in adv7511_probe()
1210 adv7511->powered = false; in adv7511_probe()
1211 adv7511->status = connector_status_disconnected; in adv7511_probe()
1214 adv7511->type = (enum adv7511_type)of_device_get_match_data(dev); in adv7511_probe()
1216 adv7511->type = id->driver_data; in adv7511_probe()
1220 if (adv7511->type == ADV7511) in adv7511_probe()
1223 ret = adv7533_parse_dt(dev->of_node, adv7511); in adv7511_probe()
1227 ret = adv7511_init_regulators(adv7511); in adv7511_probe()
1235 adv7511->gpio_pd = devm_gpiod_get_optional(dev, "pd", GPIOD_OUT_HIGH); in adv7511_probe()
1236 if (IS_ERR(adv7511->gpio_pd)) { in adv7511_probe()
1237 ret = PTR_ERR(adv7511->gpio_pd); in adv7511_probe()
1241 if (adv7511->gpio_pd) { in adv7511_probe()
1243 gpiod_set_value_cansleep(adv7511->gpio_pd, 0); in adv7511_probe()
1246 adv7511->regmap = devm_regmap_init_i2c(i2c, &adv7511_regmap_config); in adv7511_probe()
1247 if (IS_ERR(adv7511->regmap)) { in adv7511_probe()
1248 ret = PTR_ERR(adv7511->regmap); in adv7511_probe()
1252 ret = regmap_read(adv7511->regmap, ADV7511_REG_CHIP_REVISION, &val); in adv7511_probe()
1257 if (adv7511->type == ADV7511) in adv7511_probe()
1258 ret = regmap_register_patch(adv7511->regmap, in adv7511_probe()
1262 ret = adv7533_patch_registers(adv7511); in adv7511_probe()
1266 adv7511_packet_disable(adv7511, 0xffff); in adv7511_probe()
1268 adv7511->i2c_edid = i2c_new_ancillary_device(i2c, "edid", in adv7511_probe()
1270 if (IS_ERR(adv7511->i2c_edid)) { in adv7511_probe()
1271 ret = PTR_ERR(adv7511->i2c_edid); in adv7511_probe()
1275 regmap_write(adv7511->regmap, ADV7511_REG_EDID_I2C_ADDR, in adv7511_probe()
1276 adv7511->i2c_edid->addr << 1); in adv7511_probe()
1278 adv7511->i2c_packet = i2c_new_ancillary_device(i2c, "packet", in adv7511_probe()
1280 if (IS_ERR(adv7511->i2c_packet)) { in adv7511_probe()
1281 ret = PTR_ERR(adv7511->i2c_packet); in adv7511_probe()
1285 regmap_write(adv7511->regmap, ADV7511_REG_PACKET_I2C_ADDR, in adv7511_probe()
1286 adv7511->i2c_packet->addr << 1); in adv7511_probe()
1288 ret = adv7511_init_cec_regmap(adv7511); in adv7511_probe()
1292 INIT_WORK(&adv7511->hpd_work, adv7511_hpd_work); in adv7511_probe()
1295 init_waitqueue_head(&adv7511->wq); in adv7511_probe()
1300 adv7511); in adv7511_probe()
1305 adv7511_power_off(adv7511); in adv7511_probe()
1307 i2c_set_clientdata(i2c, adv7511); in adv7511_probe()
1309 if (adv7511->type == ADV7511) in adv7511_probe()
1310 adv7511_set_link_config(adv7511, &link_config); in adv7511_probe()
1312 ret = adv7511_cec_init(dev, adv7511); in adv7511_probe()
1316 adv7511->bridge.funcs = &adv7511_bridge_funcs; in adv7511_probe()
1317 adv7511->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID; in adv7511_probe()
1318 if (adv7511->i2c_main->irq) in adv7511_probe()
1319 adv7511->bridge.ops |= DRM_BRIDGE_OP_HPD; in adv7511_probe()
1321 adv7511->bridge.of_node = dev->of_node; in adv7511_probe()
1322 adv7511->bridge.type = DRM_MODE_CONNECTOR_HDMIA; in adv7511_probe()
1324 drm_bridge_add(&adv7511->bridge); in adv7511_probe()
1326 adv7511_audio_init(dev, adv7511); in adv7511_probe()
1328 if (adv7511->type == ADV7533 || adv7511->type == ADV7535) { in adv7511_probe()
1329 ret = adv7533_attach_dsi(adv7511); in adv7511_probe()
1337 adv7511_audio_exit(adv7511); in adv7511_probe()
1338 drm_bridge_remove(&adv7511->bridge); in adv7511_probe()
1340 cec_unregister_adapter(adv7511->cec_adap); in adv7511_probe()
1341 i2c_unregister_device(adv7511->i2c_cec); in adv7511_probe()
1342 clk_disable_unprepare(adv7511->cec_clk); in adv7511_probe()
1344 i2c_unregister_device(adv7511->i2c_packet); in adv7511_probe()
1346 i2c_unregister_device(adv7511->i2c_edid); in adv7511_probe()
1348 adv7511_uninit_regulators(adv7511); in adv7511_probe()
1355 struct adv7511 *adv7511 = i2c_get_clientdata(i2c); in adv7511_remove() local
1357 adv7511_uninit_regulators(adv7511); in adv7511_remove()
1359 drm_bridge_remove(&adv7511->bridge); in adv7511_remove()
1361 adv7511_audio_exit(adv7511); in adv7511_remove()
1363 cec_unregister_adapter(adv7511->cec_adap); in adv7511_remove()
1364 i2c_unregister_device(adv7511->i2c_cec); in adv7511_remove()
1365 clk_disable_unprepare(adv7511->cec_clk); in adv7511_remove()
1367 i2c_unregister_device(adv7511->i2c_packet); in adv7511_remove()
1368 i2c_unregister_device(adv7511->i2c_edid); in adv7511_remove()