Lines Matching refs:anx6345

46 struct anx6345 {
68 static inline struct anx6345 *connector_to_anx6345(struct drm_connector *c)
70 return container_of(c, struct anx6345, connector);
73 static inline struct anx6345 *bridge_to_anx6345(struct drm_bridge *bridge)
75 return container_of(bridge, struct anx6345, bridge);
91 struct anx6345 *anx6345 = container_of(aux, struct anx6345, aux);
93 return anx_dp_aux_transfer(anx6345->map[I2C_IDX_DPTX], msg);
96 static int anx6345_dp_link_training(struct anx6345 *anx6345)
102 err = anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM],
108 err = drm_dp_dpcd_readb(&anx6345->aux, DP_MAX_LINK_RATE, &dp_bw);
122 err = anx6345_set_bits(anx6345->map[I2C_IDX_TXCOM], SP_VID_CTRL1_REG,
127 err = anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM],
133 err = drm_dp_dpcd_read(&anx6345->aux, DP_DPCD_REV,
134 &anx6345->dpcd, DP_RECEIVER_CAP_SIZE);
141 err = anx6345_clear_bits(anx6345->map[I2C_IDX_DPTX],
150 if (anx6345->dpcd[DP_DPCD_REV] >= 0x11) {
151 err = drm_dp_dpcd_readb(&anx6345->aux, DP_SET_POWER, &dpcd[0]);
161 err = drm_dp_dpcd_writeb(&anx6345->aux, DP_SET_POWER, dpcd[0]);
177 err = regmap_write(anx6345->map[I2C_IDX_DPTX],
182 if (anx6345->dpcd[DP_MAX_DOWNSPREAD] & DP_MAX_DOWNSPREAD_0_5) {
185 err = regmap_write(anx6345->map[I2C_IDX_DPTX],
190 err = drm_dp_dpcd_writeb(&anx6345->aux, DP_DOWNSPREAD_CTRL,
195 err = drm_dp_dpcd_writeb(&anx6345->aux, DP_DOWNSPREAD_CTRL, 0);
201 if (drm_dp_enhanced_frame_cap(anx6345->dpcd))
202 err = anx6345_set_bits(anx6345->map[I2C_IDX_DPTX],
206 err = anx6345_clear_bits(anx6345->map[I2C_IDX_DPTX],
213 err = regmap_write(anx6345->map[I2C_IDX_DPTX],
218 dpcd[1] = drm_dp_max_lane_count(anx6345->dpcd);
220 err = regmap_write(anx6345->map[I2C_IDX_DPTX],
225 if (drm_dp_enhanced_frame_cap(anx6345->dpcd))
228 err = drm_dp_dpcd_write(&anx6345->aux, DP_LINK_BW_SET, dpcd,
237 err = regmap_write(anx6345->map[I2C_IDX_DPTX], SP_DP_LT_CTRL_REG,
242 return regmap_read_poll_timeout(anx6345->map[I2C_IDX_DPTX],
248 static int anx6345_tx_initialization(struct anx6345 *anx6345)
253 err = regmap_write(anx6345->map[I2C_IDX_TXCOM], SP_VID_CTRL2_REG,
258 err = regmap_write(anx6345->map[I2C_IDX_DPTX], SP_DP_PLL_CTRL_REG, 0);
262 err = regmap_write(anx6345->map[I2C_IDX_TXCOM],
267 err = regmap_write(anx6345->map[I2C_IDX_DPTX],
273 err = regmap_write(anx6345->map[I2C_IDX_DPTX],
279 err = anx6345_set_bits(anx6345->map[I2C_IDX_DPTX],
287 err = regmap_write(anx6345->map[I2C_IDX_DPTX],
294 err = anx6345_set_bits(anx6345->map[I2C_IDX_TXCOM],
299 return anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM],
303 static void anx6345_poweron(struct anx6345 *anx6345)
308 gpiod_set_value_cansleep(anx6345->gpiod_reset, 1);
311 err = regulator_enable(anx6345->dvdd12);
321 err = regulator_enable(anx6345->dvdd25);
333 gpiod_set_value_cansleep(anx6345->gpiod_reset, 0);
336 anx6345_set_bits(anx6345->map[I2C_IDX_TXCOM], SP_POWERDOWN_CTRL_REG,
338 anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM], SP_POWERDOWN_CTRL_REG,
341 if (anx6345->panel)
342 drm_panel_prepare(anx6345->panel);
344 anx6345->powered = true;
347 static void anx6345_poweroff(struct anx6345 *anx6345)
351 gpiod_set_value_cansleep(anx6345->gpiod_reset, 1);
354 if (anx6345->panel)
355 drm_panel_unprepare(anx6345->panel);
357 err = regulator_disable(anx6345->dvdd25);
366 err = regulator_disable(anx6345->dvdd12);
375 anx6345->powered = false;
378 static int anx6345_start(struct anx6345 *anx6345)
382 if (!anx6345->powered)
383 anx6345_poweron(anx6345);
386 err = anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM],
390 err = anx6345_tx_initialization(anx6345);
393 anx6345_poweroff(anx6345);
397 err = anx6345_dp_link_training(anx6345);
400 anx6345_poweroff(anx6345);
413 static int anx6345_config_dp_output(struct anx6345 *anx6345)
417 err = anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM], SP_VID_CTRL1_REG,
423 err = anx6345_set_bits(anx6345->map[I2C_IDX_TXCOM], SP_VID_CTRL1_REG,
429 return anx6345_set_bits(anx6345->map[I2C_IDX_DPTX],
434 static int anx6345_get_downstream_info(struct anx6345 *anx6345)
439 err = drm_dp_dpcd_readb(&anx6345->aux, DP_SINK_COUNT, &value);
455 struct anx6345 *anx6345 = connector_to_anx6345(connector);
459 mutex_lock(&anx6345->lock);
461 if (!anx6345->edid) {
462 if (!anx6345->powered) {
463 anx6345_poweron(anx6345);
467 err = anx6345_get_downstream_info(anx6345);
473 anx6345->edid = drm_get_edid(connector, &anx6345->aux.ddc);
474 if (!anx6345->edid)
478 anx6345->edid);
485 num_modes += drm_add_edid_modes(connector, anx6345->edid);
492 anx6345_poweroff(anx6345);
494 mutex_unlock(&anx6345->lock);
496 if (!num_modes && anx6345->panel)
497 num_modes += drm_panel_get_modes(anx6345->panel, connector);
523 struct anx6345 *anx6345 = bridge_to_anx6345(bridge);
537 anx6345->aux.name = "DP-AUX";
538 anx6345->aux.dev = &anx6345->client->dev;
539 anx6345->aux.drm_dev = bridge->dev;
540 anx6345->aux.transfer = anx6345_aux_transfer;
542 err = drm_dp_aux_register(&anx6345->aux);
548 err = drm_connector_init(bridge->dev, &anx6345->connector,
556 drm_connector_helper_add(&anx6345->connector,
559 anx6345->connector.polled = DRM_CONNECTOR_POLL_HPD;
561 err = drm_connector_attach_encoder(&anx6345->connector,
568 err = drm_connector_register(&anx6345->connector);
576 drm_connector_cleanup(&anx6345->connector);
578 drm_dp_aux_unregister(&anx6345->aux);
604 struct anx6345 *anx6345 = bridge_to_anx6345(bridge);
607 anx6345_set_bits(anx6345->map[I2C_IDX_TXCOM], SP_POWERDOWN_CTRL_REG,
609 if (anx6345->panel)
610 drm_panel_disable(anx6345->panel);
612 if (anx6345->powered)
613 anx6345_poweroff(anx6345);
618 struct anx6345 *anx6345 = bridge_to_anx6345(bridge);
621 if (anx6345->panel)
622 drm_panel_enable(anx6345->panel);
624 err = anx6345_start(anx6345);
630 err = anx6345_config_dp_output(anx6345);
643 static void unregister_i2c_dummy_clients(struct anx6345 *anx6345)
647 for (i = 1; i < ARRAY_SIZE(anx6345->i2c_clients); i++)
648 if (anx6345->i2c_clients[i] &&
649 anx6345->i2c_clients[i]->addr != anx6345->client->addr)
650 i2c_unregister_device(anx6345->i2c_clients[i]);
664 static bool anx6345_get_chip_id(struct anx6345 *anx6345)
668 if (regmap_read(anx6345->map[I2C_IDX_TXCOM], SP_DEVICE_IDL_REG, &idl))
671 if (regmap_read(anx6345->map[I2C_IDX_TXCOM], SP_DEVICE_IDH_REG, &idh))
674 anx6345->chipid = (u8)idl | ((u8)idh << 8);
676 if (regmap_read(anx6345->map[I2C_IDX_TXCOM], SP_DEVICE_VERSION_REG,
681 if (anx6345->chipid == anx6345_chipid_list[i]) {
683 anx6345->chipid, version);
689 anx6345->chipid, version);
696 struct anx6345 *anx6345;
700 anx6345 = devm_kzalloc(&client->dev, sizeof(*anx6345), GFP_KERNEL);
701 if (!anx6345)
704 mutex_init(&anx6345->lock);
706 anx6345->bridge.of_node = client->dev.of_node;
708 anx6345->client = client;
709 i2c_set_clientdata(client, anx6345);
711 dev = &anx6345->client->dev;
714 &anx6345->panel, NULL);
722 anx6345->dvdd12 = devm_regulator_get(dev, "dvdd12");
723 if (IS_ERR(anx6345->dvdd12)) {
724 if (PTR_ERR(anx6345->dvdd12) != -EPROBE_DEFER)
726 PTR_ERR(anx6345->dvdd12));
727 return PTR_ERR(anx6345->dvdd12);
731 anx6345->dvdd25 = devm_regulator_get(dev, "dvdd25");
732 if (IS_ERR(anx6345->dvdd25)) {
733 if (PTR_ERR(anx6345->dvdd25) != -EPROBE_DEFER)
735 PTR_ERR(anx6345->dvdd25));
736 return PTR_ERR(anx6345->dvdd25);
740 anx6345->gpiod_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
741 if (IS_ERR(anx6345->gpiod_reset)) {
743 return PTR_ERR(anx6345->gpiod_reset);
749 anx6345->i2c_clients[i] = i2c_new_dummy_device(client->adapter,
752 anx6345->i2c_clients[i] = client;
754 if (IS_ERR(anx6345->i2c_clients[i])) {
755 err = PTR_ERR(anx6345->i2c_clients[i]);
761 anx6345->map[i] = devm_regmap_init_i2c(anx6345->i2c_clients[i],
763 if (IS_ERR(anx6345->map[i])) {
764 err = PTR_ERR(anx6345->map[i]);
772 anx6345_poweron(anx6345);
773 if (anx6345_get_chip_id(anx6345)) {
774 anx6345->bridge.funcs = &anx6345_bridge_funcs;
775 drm_bridge_add(&anx6345->bridge);
779 anx6345_poweroff(anx6345);
784 unregister_i2c_dummy_clients(anx6345);
790 struct anx6345 *anx6345 = i2c_get_clientdata(client);
792 drm_bridge_remove(&anx6345->bridge);
794 unregister_i2c_dummy_clients(anx6345);
796 kfree(anx6345->edid);
798 mutex_destroy(&anx6345->lock);
802 { "anx6345", 0 },
808 { .compatible = "analogix,anx6345", },
815 .name = "anx6345",