Lines Matching +full:bgvdd +full:- +full:supply

1 // SPDX-License-Identifier: GPL-2.0-only
42 /* -----------------------------------------------------------------------------
135 /* -----------------------------------------------------------------------------
145 regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(1),
150 regmap_update_bits(adv7511->regmap,
153 regmap_write(adv7511->regmap,
160 regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(0),
163 regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(0),
166 regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(1),
173 regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE0,
178 regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE1,
188 regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE0,
193 regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE1,
223 if ((connector->display_info.color_formats &
225 connector->display_info.is_hdmi) {
236 if (connector->display_info.is_hdmi)
245 regmap_update_bits(adv7511->regmap, ADV7511_REG_VIDEO_INPUT_CFG1, 0x81,
248 regmap_update_bits(adv7511->regmap, ADV7511_REG_HDCP_HDMI_CFG,
257 * hardware register field values :-(
265 clock_delay = (config->clock_delay + 1200) / 400;
266 color_depth = config->input_color_depth == 8 ? 3
267 : (config->input_color_depth == 10 ? 1 : 2);
270 if (config->input_colorspace != HDMI_COLORSPACE_YUV422)
271 input_id = config->input_clock == ADV7511_INPUT_CLOCK_DDR
273 else if (config->input_clock == ADV7511_INPUT_CLOCK_DDR)
274 input_id = config->embedded_sync ? 8 : 7;
275 else if (config->input_clock == ADV7511_INPUT_CLOCK_2X)
276 input_id = config->embedded_sync ? 4 : 3;
278 input_id = config->embedded_sync ? 2 : 1;
280 regmap_update_bits(adv7511->regmap, ADV7511_REG_I2C_FREQ_ID_CFG, 0xf,
282 regmap_update_bits(adv7511->regmap, ADV7511_REG_VIDEO_INPUT_CFG1, 0x7e,
284 (input_styles[config->input_style] << 2));
285 regmap_write(adv7511->regmap, ADV7511_REG_VIDEO_INPUT_CFG2,
286 config->input_justification << 3);
287 regmap_write(adv7511->regmap, ADV7511_REG_TIMING_GEN_SEQ,
288 config->sync_pulse << 2);
290 regmap_write(adv7511->regmap, 0xba, clock_delay << 5);
292 adv7511->embedded_sync = config->embedded_sync;
293 adv7511->hsync_polarity = config->hsync_polarity;
294 adv7511->vsync_polarity = config->vsync_polarity;
295 adv7511->rgb = config->input_colorspace == HDMI_COLORSPACE_RGB;
300 adv7511->current_edid_segment = -1;
302 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER,
304 if (adv7511->i2c_main->irq) {
310 regmap_write(adv7511->regmap, ADV7511_REG_INT_ENABLE(0),
312 regmap_update_bits(adv7511->regmap,
327 if (adv7511->info->hpd_override_enable)
328 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
332 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
344 regcache_sync(adv7511->regmap);
346 if (adv7511->info->has_dsi)
348 adv7511->powered = true;
354 if (adv7511->info->hpd_override_enable)
355 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
358 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER,
361 regmap_update_bits(adv7511->regmap,
364 regcache_mark_dirty(adv7511->regmap);
370 if (adv7511->info->has_dsi)
372 adv7511->powered = false;
375 /* -----------------------------------------------------------------------------
384 ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(0), &irq0);
389 regmap_write(adv7511->regmap, ADV7511_REG_INT(0),
404 ret = regmap_read(adv7511->regmap, ADV7511_REG_STATUS, &val);
418 adv7511->status == connector_status_disconnected &&
419 adv7511->powered) {
420 regcache_mark_dirty(adv7511->regmap);
424 if (adv7511->status != status) {
425 adv7511->status = status;
427 drm_bridge_hpd_notify(&adv7511->bridge, status);
438 ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(0), &irq0);
442 ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(1), &irq1);
446 regmap_write(adv7511->regmap, ADV7511_REG_INT(0), irq0);
447 regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1);
449 if (process_hpd && irq0 & ADV7511_INT0_HPD && adv7511->bridge.encoder) {
450 schedule_work(&adv7511->hpd_work);
455 adv7511->edid_read = true;
457 if (adv7511->i2c_main->irq)
458 wake_up_all(&adv7511->wq);
482 /* -----------------------------------------------------------------------------
490 if (adv7511->i2c_main->irq) {
491 ret = wait_event_interruptible_timeout(adv7511->wq,
492 adv7511->edid_read, msecs_to_jiffies(timeout));
494 for (; timeout > 0; timeout -= 25) {
499 if (adv7511->edid_read)
506 return adv7511->edid_read ? 0 : -EIO;
519 return -EINVAL;
521 if (adv7511->current_edid_segment != block / 2) {
524 ret = regmap_read(adv7511->regmap, ADV7511_REG_DDC_STATUS,
530 adv7511->edid_read = false;
531 regmap_write(adv7511->regmap, ADV7511_REG_EDID_SEGMENT,
542 xfer[0].addr = adv7511->i2c_edid->addr;
546 xfer[1].addr = adv7511->i2c_edid->addr;
549 xfer[1].buf = adv7511->edid_buf;
554 ret = i2c_transfer(adv7511->i2c_edid->adapter, xfer,
559 return -EIO;
565 adv7511->current_edid_segment = block / 2;
569 memcpy(buf, adv7511->edid_buf, len);
571 memcpy(buf, adv7511->edid_buf + 128, len);
576 /* -----------------------------------------------------------------------------
586 if (!adv7511->powered) {
588 (adv7511->i2c_edid->addr << 1);
593 regmap_write(adv7511->regmap, ADV7511_REG_EDID_I2C_ADDR,
599 if (!adv7511->powered)
613 ret = regmap_read(adv7511->regmap, ADV7511_REG_STATUS, &val);
628 if (status == connector_status_connected && hpd && adv7511->powered) {
629 regcache_mark_dirty(adv7511->regmap);
631 if (adv7511->status == connector_status_connected)
635 if (adv7511->info->hpd_override_enable)
636 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
640 regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
645 adv7511->status = status;
656 if (adv7511->embedded_sync) {
660 hsync_offset = adj_mode->crtc_hsync_start -
661 adj_mode->crtc_hdisplay;
662 vsync_offset = adj_mode->crtc_vsync_start -
663 adj_mode->crtc_vdisplay;
664 hsync_len = adj_mode->crtc_hsync_end -
665 adj_mode->crtc_hsync_start;
666 vsync_len = adj_mode->crtc_vsync_end -
667 adj_mode->crtc_vsync_start;
669 /* The hardware vsync generator has a off-by-one bug */
672 regmap_write(adv7511->regmap, ADV7511_REG_HSYNC_PLACEMENT_MSB,
674 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(0),
676 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(1),
679 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(2),
682 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(3),
685 regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(4),
688 hsync_polarity = !(adj_mode->flags & DRM_MODE_FLAG_PHSYNC);
689 vsync_polarity = !(adj_mode->flags & DRM_MODE_FLAG_PVSYNC);
699 if (adj_mode->flags & DRM_MODE_FLAG_NHSYNC)
704 if (adj_mode->flags & DRM_MODE_FLAG_NVSYNC)
709 if (adv7511->hsync_polarity != mode_hsync_polarity &&
710 adv7511->hsync_polarity !=
714 if (adv7511->vsync_polarity != mode_vsync_polarity &&
715 adv7511->vsync_polarity !=
729 if (adv7511->info->type == ADV7511)
730 regmap_update_bits(adv7511->regmap, 0xfb,
733 regmap_update_bits(adv7511->regmap, 0x4a,
736 regmap_update_bits(adv7511->regmap, 0x17,
739 drm_mode_copy(&adv7511->curr_mode, adj_mode);
742 if (adv7511->info->has_dsi && adv7511->use_timing_gen)
750 adv7511->f_tmds = adj_mode->clock;
755 struct drm_bridge *bridge = &adv->bridge;
758 connector = drm_bridge_connector_init(bridge->dev, bridge->encoder);
764 drm_connector_attach_encoder(connector, bridge->encoder);
769 /* -----------------------------------------------------------------------------
788 connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder);
796 crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc);
800 adv7511_set_config_csc(adv, connector, adv->rgb);
802 adv7511_mode_set(adv, &crtc_state->adjusted_mode);
822 if (tmds_rate > 1000ULL * adv->info->max_mode_clock_khz)
834 if (!adv->info->has_dsi)
847 if (adv->next_bridge) {
848 ret = drm_bridge_attach(encoder, adv->next_bridge, bridge,
860 if (adv->i2c_main->irq)
861 regmap_write(adv->regmap, ADV7511_REG_INT_ENABLE(0),
893 drm_dbg_driver(adv7511->bridge.dev, "Unsupported HDMI InfoFrame %x\n", type);
911 regmap_bulk_write(adv7511->regmap, ADV7511_REG_AVI_INFOFRAME_VERSION,
912 buffer + 1, len - 1);
917 drm_dbg_driver(adv7511->bridge.dev, "Unsupported HDMI InfoFrame %x\n", type);
950 /* -----------------------------------------------------------------------------
958 "bgvdd",
959 "dvdd-3v",
973 const char * const *supply_names = adv->info->supply_names;
974 unsigned int num_supplies = adv->info->num_supplies;
975 struct device *dev = &adv->i2c_main->dev;
979 adv->supplies = devm_kcalloc(dev, num_supplies,
980 sizeof(*adv->supplies), GFP_KERNEL);
981 if (!adv->supplies)
982 return -ENOMEM;
985 adv->supplies[i].supply = supply_names[i];
987 ret = devm_regulator_bulk_get(dev, num_supplies, adv->supplies);
991 return regulator_bulk_enable(num_supplies, adv->supplies);
996 regulator_bulk_disable(adv->info->num_supplies, adv->supplies);
1004 reg -= adv7511->info->reg_cec_offset;
1038 adv->i2c_cec = i2c_new_ancillary_device(adv->i2c_main, "cec",
1040 if (IS_ERR(adv->i2c_cec))
1041 return PTR_ERR(adv->i2c_cec);
1043 regmap_write(adv->regmap, ADV7511_REG_CEC_I2C_ADDR,
1044 adv->i2c_cec->addr << 1);
1046 i2c_set_clientdata(adv->i2c_cec, adv);
1048 adv->regmap_cec = devm_regmap_init_i2c(adv->i2c_cec,
1050 if (IS_ERR(adv->regmap_cec)) {
1051 ret = PTR_ERR(adv->regmap_cec);
1055 if (adv->info->reg_cec_offset == ADV7533_REG_CEC_OFFSET) {
1063 i2c_unregister_device(adv->i2c_cec);
1073 of_property_read_u32(np, "adi,input-depth", &config->input_color_depth);
1074 if (config->input_color_depth != 8 && config->input_color_depth != 10 &&
1075 config->input_color_depth != 12)
1076 return -EINVAL;
1078 ret = of_property_read_string(np, "adi,input-colorspace", &str);
1083 config->input_colorspace = HDMI_COLORSPACE_RGB;
1085 config->input_colorspace = HDMI_COLORSPACE_YUV422;
1087 config->input_colorspace = HDMI_COLORSPACE_YUV444;
1089 return -EINVAL;
1091 ret = of_property_read_string(np, "adi,input-clock", &str);
1096 config->input_clock = ADV7511_INPUT_CLOCK_1X;
1098 config->input_clock = ADV7511_INPUT_CLOCK_2X;
1100 config->input_clock = ADV7511_INPUT_CLOCK_DDR;
1102 return -EINVAL;
1104 if (config->input_colorspace == HDMI_COLORSPACE_YUV422 ||
1105 config->input_clock != ADV7511_INPUT_CLOCK_1X) {
1106 ret = of_property_read_u32(np, "adi,input-style",
1107 &config->input_style);
1111 if (config->input_style < 1 || config->input_style > 3)
1112 return -EINVAL;
1114 ret = of_property_read_string(np, "adi,input-justification",
1120 config->input_justification =
1123 config->input_justification =
1126 config->input_justification =
1129 return -EINVAL;
1132 config->input_style = 1;
1133 config->input_justification = ADV7511_INPUT_JUSTIFICATION_LEFT;
1136 of_property_read_u32(np, "adi,clock-delay", &config->clock_delay);
1137 if (config->clock_delay < -1200 || config->clock_delay > 1600)
1138 return -EINVAL;
1140 config->embedded_sync = of_property_read_bool(np, "adi,embedded-sync");
1143 config->sync_pulse = ADV7511_INPUT_SYNC_PULSE_NONE;
1144 config->vsync_polarity = ADV7511_SYNC_POLARITY_PASSTHROUGH;
1145 config->hsync_polarity = ADV7511_SYNC_POLARITY_PASSTHROUGH;
1154 struct device *dev = &i2c->dev;
1158 if (!dev->of_node)
1159 return -EINVAL;
1166 adv7511->i2c_main = i2c;
1167 adv7511->powered = false;
1168 adv7511->status = connector_status_disconnected;
1169 adv7511->info = i2c_get_match_data(i2c);
1173 ret = drm_of_find_panel_or_bridge(dev->of_node, 1, -1, NULL,
1174 &adv7511->next_bridge);
1175 if (ret && ret != -ENODEV)
1178 if (adv7511->info->link_config)
1179 ret = adv7511_parse_dt(dev->of_node, &link_config);
1181 ret = adv7533_parse_dt(dev->of_node, adv7511);
1195 adv7511->gpio_pd = devm_gpiod_get_optional(dev, "pd", GPIOD_OUT_HIGH);
1196 if (IS_ERR(adv7511->gpio_pd)) {
1197 ret = PTR_ERR(adv7511->gpio_pd);
1201 if (adv7511->gpio_pd) {
1203 gpiod_set_value_cansleep(adv7511->gpio_pd, 0);
1206 adv7511->regmap = devm_regmap_init_i2c(i2c, &adv7511_regmap_config);
1207 if (IS_ERR(adv7511->regmap)) {
1208 ret = PTR_ERR(adv7511->regmap);
1212 ret = regmap_read(adv7511->regmap, ADV7511_REG_CHIP_REVISION, &val);
1217 if (adv7511->info->type == ADV7511)
1218 ret = regmap_register_patch(adv7511->regmap,
1228 adv7511->i2c_edid = i2c_new_ancillary_device(i2c, "edid",
1230 if (IS_ERR(adv7511->i2c_edid)) {
1231 ret = PTR_ERR(adv7511->i2c_edid);
1235 regmap_write(adv7511->regmap, ADV7511_REG_EDID_I2C_ADDR,
1236 adv7511->i2c_edid->addr << 1);
1238 adv7511->i2c_packet = i2c_new_ancillary_device(i2c, "packet",
1240 if (IS_ERR(adv7511->i2c_packet)) {
1241 ret = PTR_ERR(adv7511->i2c_packet);
1245 regmap_write(adv7511->regmap, ADV7511_REG_PACKET_I2C_ADDR,
1246 adv7511->i2c_packet->addr << 1);
1252 INIT_WORK(&adv7511->hpd_work, adv7511_hpd_work);
1258 if (adv7511->info->link_config)
1261 regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL,
1264 adv7511->bridge.ops = DRM_BRIDGE_OP_DETECT |
1267 if (adv7511->i2c_main->irq)
1268 adv7511->bridge.ops |= DRM_BRIDGE_OP_HPD;
1270 adv7511->bridge.vendor = "Analog";
1271 adv7511->bridge.product = adv7511->info->name;
1274 adv7511->bridge.ops |= DRM_BRIDGE_OP_HDMI_AUDIO;
1275 adv7511->bridge.hdmi_audio_dev = dev;
1276 adv7511->bridge.hdmi_audio_max_i2s_playback_channels = 2;
1277 adv7511->bridge.hdmi_audio_i2s_formats = (SNDRV_PCM_FMTBIT_S16_LE |
1282 adv7511->bridge.hdmi_audio_spdif_playback = 1;
1283 adv7511->bridge.hdmi_audio_dai_port = 2;
1287 adv7511->bridge.ops |= DRM_BRIDGE_OP_HDMI_CEC_ADAPTER;
1288 adv7511->bridge.hdmi_cec_dev = dev;
1289 adv7511->bridge.hdmi_cec_adapter_name = dev_name(dev);
1290 adv7511->bridge.hdmi_cec_available_las = ADV7511_MAX_ADDRS;
1293 adv7511->bridge.of_node = dev->of_node;
1294 adv7511->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
1296 drm_bridge_add(&adv7511->bridge);
1298 if (i2c->irq) {
1299 init_waitqueue_head(&adv7511->wq);
1301 ret = devm_request_threaded_irq(dev, i2c->irq, NULL,
1310 if (adv7511->info->has_dsi) {
1319 drm_bridge_remove(&adv7511->bridge);
1320 i2c_unregister_device(adv7511->i2c_cec);
1321 clk_disable_unprepare(adv7511->cec_clk);
1323 i2c_unregister_device(adv7511->i2c_packet);
1325 i2c_unregister_device(adv7511->i2c_edid);
1329 of_node_put(adv7511->host_node);
1338 of_node_put(adv7511->host_node);
1342 drm_bridge_remove(&adv7511->bridge);
1344 i2c_unregister_device(adv7511->i2c_cec);
1345 clk_disable_unprepare(adv7511->cec_clk);
1347 i2c_unregister_device(adv7511->i2c_packet);
1348 i2c_unregister_device(adv7511->i2c_edid);
1446 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");