Lines Matching +full:aux +full:- +full:output +full:- +full:power

1 // SPDX-License-Identifier: GPL-2.0-only
29 #include "analogix-anx78xx.h"
67 struct drm_dp_aux aux;
108 static ssize_t anx78xx_aux_transfer(struct drm_dp_aux *aux,
111 struct anx78xx *anx78xx = container_of(aux, struct anx78xx, aux);
112 return anx_dp_aux_transfer(anx78xx->map[I2C_IDX_TX_P0], msg);
119 err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_RX_P0],
124 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL3_REG,
136 err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL3_REG,
141 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0],
163 err = regmap_write(anx78xx->map[I2C_IDX_RX_P0], SP_HDMI_MUTE_CTRL_REG,
168 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0], SP_CHIP_CTRL_REG,
174 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0],
180 err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_RX_P0],
187 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0],
193 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0],
199 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0], SP_AUDVID_CTRL_REG,
204 err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_RX_P0],
209 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0],
215 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
221 err = regmap_multi_reg_write(anx78xx->map[I2C_IDX_RX_P0],
248 err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_ANALOG_CTRL0_REG,
254 * Write DP TX output emphasis precise tune bits.
256 err = regmap_bulk_write(anx78xx->map[I2C_IDX_TX_P1],
272 err = regmap_update_bits(anx78xx->map[I2C_IDX_TX_P2],
279 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_AUX_CH_CTRL3_REG,
284 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_AUX_CH_CTRL4_REG,
289 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
294 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
300 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_AUX_MISC_CTRL_REG,
301 XTAL_CLK / 10 - 1);
305 err = regmap_read(anx78xx->map[I2C_IDX_RX_P0],
311 err = regmap_write(anx78xx->map[I2C_IDX_RX_P0],
314 ((((XTAL_CLK / 10) >> 1) - 2) << 3));
332 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_AUX_CH_CTRL2_REG,
337 /* Enable aux double diff output */
338 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
343 err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0],
349 err = regmap_multi_reg_write(anx78xx->map[I2C_IDX_TX_P0],
355 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
360 err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL8_REG,
369 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_HDCP_AUTO_TIMER_REG,
374 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
379 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
384 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2],
393 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_AUX_DEFER_CTRL_REG,
398 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
406 * polling for HDCP CTS item 1A-07
408 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
413 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
418 /* Power down the main link by default */
419 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
429 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
443 * BIT1: INT pin output type: 0 = push/pull
445 err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_INT_CTRL_REG, 0x01);
449 err = regmap_write(anx78xx->map[I2C_IDX_TX_P2],
454 err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_DP_INT_MASK1_REG,
459 err = regmap_write(anx78xx->map[I2C_IDX_RX_P0], SP_INT_MASK1_REG,
469 struct anx78xx_platform_data *pdata = &anx78xx->pdata;
472 if (WARN_ON(anx78xx->powered))
475 if (pdata->dvdd10) {
476 err = regulator_enable(pdata->dvdd10);
486 gpiod_set_value_cansleep(pdata->gpiod_reset, 1);
489 gpiod_set_value_cansleep(pdata->gpiod_pd, 0);
492 gpiod_set_value_cansleep(pdata->gpiod_reset, 0);
494 /* Power on registers module */
495 anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_POWERDOWN_CTRL_REG,
497 anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2], SP_POWERDOWN_CTRL_REG,
500 anx78xx->powered = true;
505 struct anx78xx_platform_data *pdata = &anx78xx->pdata;
508 if (WARN_ON(!anx78xx->powered))
511 gpiod_set_value_cansleep(pdata->gpiod_reset, 1);
514 gpiod_set_value_cansleep(pdata->gpiod_pd, 1);
517 if (pdata->dvdd10) {
518 err = regulator_disable(pdata->dvdd10);
528 anx78xx->powered = false;
535 /* Power on all modules */
536 err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2],
576 struct anx78xx_platform_data *pdata = &anx78xx->pdata;
577 struct device *dev = &anx78xx->client->dev;
579 /* 1.0V digital core power regulator */
580 pdata->dvdd10 = devm_regulator_get(dev, "dvdd10");
581 if (IS_ERR(pdata->dvdd10)) {
582 if (PTR_ERR(pdata->dvdd10) != -EPROBE_DEFER)
585 return PTR_ERR(pdata->dvdd10);
589 pdata->gpiod_hpd = devm_gpiod_get(dev, "hpd", GPIOD_IN);
590 if (IS_ERR(pdata->gpiod_hpd))
591 return PTR_ERR(pdata->gpiod_hpd);
593 /* GPIO for chip power down */
594 pdata->gpiod_pd = devm_gpiod_get(dev, "pd", GPIOD_OUT_HIGH);
595 if (IS_ERR(pdata->gpiod_pd))
596 return PTR_ERR(pdata->gpiod_pd);
599 pdata->gpiod_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
601 return PTR_ERR_OR_ZERO(pdata->gpiod_reset);
609 err = regmap_write(anx78xx->map[I2C_IDX_RX_P0], SP_HDMI_MUTE_CTRL_REG,
614 err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2],
620 err = drm_dp_dpcd_readb(&anx78xx->aux, DP_MAX_LINK_RATE, &dp_bw);
632 return -EINVAL;
635 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL1_REG,
640 err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2],
646 err = drm_dp_dpcd_read(&anx78xx->aux, DP_DPCD_REV,
647 &anx78xx->dpcd, DP_RECEIVER_CAP_SIZE);
653 /* Clear channel x SERDES power down */
654 err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0],
659 drm_dp_link_power_up(&anx78xx->aux, anx78xx->dpcd[DP_DPCD_REV]);
662 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
667 if (anx78xx->dpcd[DP_MAX_DOWNSPREAD] & DP_MAX_DOWNSPREAD_0_5) {
670 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
675 err = drm_dp_dpcd_writeb(&anx78xx->aux, DP_DOWNSPREAD_CTRL,
680 err = drm_dp_dpcd_writeb(&anx78xx->aux, DP_DOWNSPREAD_CTRL, 0);
686 if (drm_dp_enhanced_frame_cap(anx78xx->dpcd))
687 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
691 err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0],
697 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
699 anx78xx->dpcd[DP_MAX_LINK_RATE]);
703 dpcd[1] = drm_dp_max_lane_count(anx78xx->dpcd);
705 if (drm_dp_enhanced_frame_cap(anx78xx->dpcd))
708 err = drm_dp_dpcd_write(&anx78xx->aux, DP_LINK_BW_SET, dpcd,
716 err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_LT_CTRL_REG,
728 err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL1_REG,
733 /* Enable DP output */
734 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL1_REG,
754 err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0],
759 err = regmap_bulk_write(anx78xx->map[I2C_IDX_TX_P2],
761 frame->length);
765 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
770 err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
783 err = drm_dp_dpcd_readb(&anx78xx->aux, DP_SINK_COUNT, &value);
791 return -EIO;
802 if (WARN_ON(!anx78xx->powered))
805 if (anx78xx->drm_edid)
808 mutex_lock(&anx78xx->lock);
816 anx78xx->drm_edid = drm_edid_read_ddc(connector, &anx78xx->aux.ddc);
818 err = drm_edid_connector_update(connector, anx78xx->drm_edid);
820 if (!anx78xx->drm_edid) {
833 mutex_unlock(&anx78xx->lock);
847 if (!gpiod_get_value(anx78xx->pdata.gpiod_hpd))
871 return -EINVAL;
874 /* Register aux channel */
875 anx78xx->aux.name = "DP-AUX";
876 anx78xx->aux.dev = &anx78xx->client->dev;
877 anx78xx->aux.drm_dev = bridge->dev;
878 anx78xx->aux.transfer = anx78xx_aux_transfer;
880 err = drm_dp_aux_register(&anx78xx->aux);
882 DRM_ERROR("Failed to register aux channel: %d\n", err);
886 err = drm_connector_init(bridge->dev, &anx78xx->connector,
894 drm_connector_helper_add(&anx78xx->connector,
897 anx78xx->connector.polled = DRM_CONNECTOR_POLL_HPD;
899 err = drm_connector_attach_encoder(&anx78xx->connector,
906 err = drm_connector_register(&anx78xx->connector);
914 drm_connector_cleanup(&anx78xx->connector);
916 drm_dp_aux_unregister(&anx78xx->aux);
922 drm_dp_aux_unregister(&bridge_to_anx78xx(bridge)->aux);
930 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
934 if (mode->clock > 154000)
944 /* Power off all modules except configuration registers access */
945 anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_POWERDOWN_CTRL_REG,
957 if (WARN_ON(!anx78xx->powered))
960 mutex_lock(&anx78xx->lock);
963 &anx78xx->connector,
975 mutex_unlock(&anx78xx->lock);
1008 if (anx78xx->powered)
1011 mutex_lock(&anx78xx->lock);
1013 /* Cable is pulled, power on the chip */
1020 mutex_unlock(&anx78xx->lock);
1031 err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_DP_INT_STATUS1_REG,
1051 err = regmap_write(anx78xx->map[I2C_IDX_TX_P2],
1059 DRM_DEBUG_KMS("IRQ: Hot plug detect - cable is pulled out\n");
1063 drm_edid_free(anx78xx->drm_edid);
1064 anx78xx->drm_edid = NULL;
1066 DRM_DEBUG_KMS("IRQ: Hot plug detect - cable plug\n");
1080 err = regmap_write(anx78xx->map[I2C_IDX_RX_P0], SP_INT_STATUS1_REG,
1090 err = regmap_read(anx78xx->map[I2C_IDX_RX_P0],
1120 mutex_lock(&anx78xx->lock);
1122 err = regmap_read(anx78xx->map[I2C_IDX_TX_P2], SP_DP_INT_STATUS1_REG,
1132 err = regmap_read(anx78xx->map[I2C_IDX_TX_P2],
1144 if (!anx78xx->powered)
1147 err = regmap_read(anx78xx->map[I2C_IDX_RX_P0], SP_INT_STATUS1_REG,
1158 mutex_unlock(&anx78xx->lock);
1161 drm_helper_hpd_irq_event(anx78xx->connector.dev);
1170 for (i = 0; i < ARRAY_SIZE(anx78xx->i2c_dummy); i++)
1171 i2c_unregister_device(anx78xx->i2c_dummy[i]);
1196 anx78xx = devm_drm_bridge_alloc(&client->dev, struct anx78xx, bridge,
1201 pdata = &anx78xx->pdata;
1203 mutex_init(&anx78xx->lock);
1205 anx78xx->bridge.of_node = client->dev.of_node;
1207 anx78xx->client = client;
1212 if (err != -EPROBE_DEFER)
1218 pdata->hpd_irq = gpiod_to_irq(pdata->gpiod_hpd);
1219 if (pdata->hpd_irq < 0) {
1220 DRM_ERROR("Failed to get HPD IRQ: %d\n", pdata->hpd_irq);
1221 return -ENODEV;
1224 pdata->intp_irq = client->irq;
1225 if (!pdata->intp_irq) {
1227 return -ENODEV;
1231 i2c_addresses = device_get_match_data(&client->dev);
1235 i2c_dummy = i2c_new_dummy_device(client->adapter,
1244 anx78xx->i2c_dummy[i] = i2c_dummy;
1245 anx78xx->map[i] = devm_regmap_init_i2c(anx78xx->i2c_dummy[i],
1247 if (IS_ERR(anx78xx->map[i])) {
1248 err = PTR_ERR(anx78xx->map[i]);
1258 err = regmap_read(anx78xx->map[I2C_IDX_TX_P2], SP_DEVICE_IDL_REG,
1263 err = regmap_read(anx78xx->map[I2C_IDX_TX_P2], SP_DEVICE_IDH_REG,
1268 anx78xx->chipid = (u8)idl | ((u8)idh << 8);
1270 err = regmap_read(anx78xx->map[I2C_IDX_TX_P2], SP_DEVICE_VERSION_REG,
1276 if (anx78xx->chipid == anx78xx_chipid_list[i]) {
1278 anx78xx->chipid, version);
1286 anx78xx->chipid, version);
1287 err = -ENODEV;
1291 err = devm_request_threaded_irq(&client->dev, pdata->hpd_irq, NULL,
1294 "anx78xx-hpd", anx78xx);
1301 err = devm_request_threaded_irq(&client->dev, pdata->intp_irq, NULL,
1304 "anx78xx-intp", anx78xx);
1310 drm_bridge_add(&anx78xx->bridge);
1313 if (!gpiod_get_value(anx78xx->pdata.gpiod_hpd))
1330 drm_bridge_remove(&anx78xx->bridge);
1334 drm_edid_free(anx78xx->drm_edid);