821 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright(c) 2016, Analogix Semiconductor.4 * Copyright(c) 2017, Icenowy Zheng <icenowy@aosc.io>5 *6 * Based on anx7808 driver obtained from chromeos with copyright:7 * Copyright(c) 2013, Google Inc.8 */9#include <linux/delay.h>10#include <linux/err.h>11#include <linux/gpio/consumer.h>12#include <linux/i2c.h>13#include <linux/interrupt.h>14#include <linux/kernel.h>15#include <linux/module.h>16#include <linux/of_platform.h>17#include <linux/regmap.h>18#include <linux/regulator/consumer.h>19#include <linux/types.h>20 21#include <drm/display/drm_dp_helper.h>22#include <drm/drm_atomic_helper.h>23#include <drm/drm_bridge.h>24#include <drm/drm_crtc.h>25#include <drm/drm_edid.h>26#include <drm/drm_of.h>27#include <drm/drm_panel.h>28#include <drm/drm_print.h>29#include <drm/drm_probe_helper.h>30 31#include "analogix-i2c-dptx.h"32#include "analogix-i2c-txcommon.h"33 34#define POLL_DELAY 50000 /* us */35#define POLL_TIMEOUT 5000000 /* us */36 37#define I2C_IDX_DPTX 038#define I2C_IDX_TXCOM 139 40static const u8 anx6345_i2c_addresses[] = {41 [I2C_IDX_DPTX] = 0x70,42 [I2C_IDX_TXCOM] = 0x72,43};44#define I2C_NUM_ADDRESSES ARRAY_SIZE(anx6345_i2c_addresses)45 46struct anx6345 {47 struct drm_dp_aux aux;48 struct drm_bridge bridge;49 struct i2c_client *client;50 const struct drm_edid *drm_edid;51 struct drm_connector connector;52 struct drm_panel *panel;53 struct regulator *dvdd12;54 struct regulator *dvdd25;55 struct gpio_desc *gpiod_reset;56 struct mutex lock; /* protect EDID access */57 58 /* I2C Slave addresses of ANX6345 are mapped as DPTX and SYS */59 struct i2c_client *i2c_clients[I2C_NUM_ADDRESSES];60 struct regmap *map[I2C_NUM_ADDRESSES];61 62 u16 chipid;63 u8 dpcd[DP_RECEIVER_CAP_SIZE];64 65 bool powered;66};67 68static inline struct anx6345 *connector_to_anx6345(struct drm_connector *c)69{70 return container_of(c, struct anx6345, connector);71}72 73static inline struct anx6345 *bridge_to_anx6345(struct drm_bridge *bridge)74{75 return container_of(bridge, struct anx6345, bridge);76}77 78static int anx6345_set_bits(struct regmap *map, u8 reg, u8 mask)79{80 return regmap_update_bits(map, reg, mask, mask);81}82 83static int anx6345_clear_bits(struct regmap *map, u8 reg, u8 mask)84{85 return regmap_update_bits(map, reg, mask, 0);86}87 88static ssize_t anx6345_aux_transfer(struct drm_dp_aux *aux,89 struct drm_dp_aux_msg *msg)90{91 struct anx6345 *anx6345 = container_of(aux, struct anx6345, aux);92 93 return anx_dp_aux_transfer(anx6345->map[I2C_IDX_DPTX], msg);94}95 96static int anx6345_dp_link_training(struct anx6345 *anx6345)97{98 unsigned int value;99 u8 dp_bw, dpcd[2];100 int err;101 102 err = anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM],103 SP_POWERDOWN_CTRL_REG,104 SP_TOTAL_PD);105 if (err)106 return err;107 108 err = drm_dp_dpcd_readb(&anx6345->aux, DP_MAX_LINK_RATE, &dp_bw);109 if (err < 0)110 return err;111 112 switch (dp_bw) {113 case DP_LINK_BW_1_62:114 case DP_LINK_BW_2_7:115 break;116 117 default:118 DRM_DEBUG_KMS("DP bandwidth (%#02x) not supported\n", dp_bw);119 return -EINVAL;120 }121 122 err = anx6345_set_bits(anx6345->map[I2C_IDX_TXCOM], SP_VID_CTRL1_REG,123 SP_VIDEO_MUTE);124 if (err)125 return err;126 127 err = anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM],128 SP_VID_CTRL1_REG, SP_VIDEO_EN);129 if (err)130 return err;131 132 /* Get DPCD info */133 err = drm_dp_dpcd_read(&anx6345->aux, DP_DPCD_REV,134 &anx6345->dpcd, DP_RECEIVER_CAP_SIZE);135 if (err < 0) {136 DRM_ERROR("Failed to read DPCD: %d\n", err);137 return err;138 }139 140 /* Clear channel x SERDES power down */141 err = anx6345_clear_bits(anx6345->map[I2C_IDX_DPTX],142 SP_DP_ANALOG_POWER_DOWN_REG, SP_CH0_PD);143 if (err)144 return err;145 146 /*147 * Power up the sink (DP_SET_POWER register is only available on DPCD148 * v1.1 and later).149 */150 if (anx6345->dpcd[DP_DPCD_REV] >= 0x11) {151 err = drm_dp_dpcd_readb(&anx6345->aux, DP_SET_POWER, &dpcd[0]);152 if (err < 0) {153 DRM_ERROR("Failed to read DP_SET_POWER register: %d\n",154 err);155 return err;156 }157 158 dpcd[0] &= ~DP_SET_POWER_MASK;159 dpcd[0] |= DP_SET_POWER_D0;160 161 err = drm_dp_dpcd_writeb(&anx6345->aux, DP_SET_POWER, dpcd[0]);162 if (err < 0) {163 DRM_ERROR("Failed to power up DisplayPort link: %d\n",164 err);165 return err;166 }167 168 /*169 * According to the DP 1.1 specification, a "Sink Device must170 * exit the power saving state within 1 ms" (Section 2.5.3.1,171 * Table 5-52, "Sink Control Field" (register 0x600).172 */173 usleep_range(1000, 2000);174 }175 176 /* Possibly enable downspread on the sink */177 err = regmap_write(anx6345->map[I2C_IDX_DPTX],178 SP_DP_DOWNSPREAD_CTRL1_REG, 0);179 if (err)180 return err;181 182 if (anx6345->dpcd[DP_MAX_DOWNSPREAD] & DP_MAX_DOWNSPREAD_0_5) {183 DRM_DEBUG("Enable downspread on the sink\n");184 /* 4000PPM */185 err = regmap_write(anx6345->map[I2C_IDX_DPTX],186 SP_DP_DOWNSPREAD_CTRL1_REG, 8);187 if (err)188 return err;189 190 err = drm_dp_dpcd_writeb(&anx6345->aux, DP_DOWNSPREAD_CTRL,191 DP_SPREAD_AMP_0_5);192 if (err < 0)193 return err;194 } else {195 err = drm_dp_dpcd_writeb(&anx6345->aux, DP_DOWNSPREAD_CTRL, 0);196 if (err < 0)197 return err;198 }199 200 /* Set the lane count and the link rate on the sink */201 if (drm_dp_enhanced_frame_cap(anx6345->dpcd))202 err = anx6345_set_bits(anx6345->map[I2C_IDX_DPTX],203 SP_DP_SYSTEM_CTRL_BASE + 4,204 SP_ENHANCED_MODE);205 else206 err = anx6345_clear_bits(anx6345->map[I2C_IDX_DPTX],207 SP_DP_SYSTEM_CTRL_BASE + 4,208 SP_ENHANCED_MODE);209 if (err)210 return err;211 212 dpcd[0] = dp_bw;213 err = regmap_write(anx6345->map[I2C_IDX_DPTX],214 SP_DP_MAIN_LINK_BW_SET_REG, dpcd[0]);215 if (err)216 return err;217 218 dpcd[1] = drm_dp_max_lane_count(anx6345->dpcd);219 220 err = regmap_write(anx6345->map[I2C_IDX_DPTX],221 SP_DP_LANE_COUNT_SET_REG, dpcd[1]);222 if (err)223 return err;224 225 if (drm_dp_enhanced_frame_cap(anx6345->dpcd))226 dpcd[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;227 228 err = drm_dp_dpcd_write(&anx6345->aux, DP_LINK_BW_SET, dpcd,229 sizeof(dpcd));230 231 if (err < 0) {232 DRM_ERROR("Failed to configure link: %d\n", err);233 return err;234 }235 236 /* Start training on the source */237 err = regmap_write(anx6345->map[I2C_IDX_DPTX], SP_DP_LT_CTRL_REG,238 SP_LT_EN);239 if (err)240 return err;241 242 return regmap_read_poll_timeout(anx6345->map[I2C_IDX_DPTX],243 SP_DP_LT_CTRL_REG,244 value, !(value & SP_DP_LT_INPROGRESS),245 POLL_DELAY, POLL_TIMEOUT);246}247 248static int anx6345_tx_initialization(struct anx6345 *anx6345)249{250 int err, i;251 252 /* FIXME: colordepth is hardcoded for now */253 err = regmap_write(anx6345->map[I2C_IDX_TXCOM], SP_VID_CTRL2_REG,254 SP_IN_BPC_6BIT << SP_IN_BPC_SHIFT);255 if (err)256 return err;257 258 err = regmap_write(anx6345->map[I2C_IDX_DPTX], SP_DP_PLL_CTRL_REG, 0);259 if (err)260 return err;261 262 err = regmap_write(anx6345->map[I2C_IDX_TXCOM],263 SP_ANALOG_DEBUG1_REG, 0);264 if (err)265 return err;266 267 err = regmap_write(anx6345->map[I2C_IDX_DPTX],268 SP_DP_LINK_DEBUG_CTRL_REG,269 SP_NEW_PRBS7 | SP_M_VID_DEBUG);270 if (err)271 return err;272 273 err = regmap_write(anx6345->map[I2C_IDX_DPTX],274 SP_DP_ANALOG_POWER_DOWN_REG, 0);275 if (err)276 return err;277 278 /* Force HPD */279 err = anx6345_set_bits(anx6345->map[I2C_IDX_DPTX],280 SP_DP_SYSTEM_CTRL_BASE + 3,281 SP_HPD_FORCE | SP_HPD_CTRL);282 if (err)283 return err;284 285 for (i = 0; i < 4; i++) {286 /* 4 lanes */287 err = regmap_write(anx6345->map[I2C_IDX_DPTX],288 SP_DP_LANE0_LT_CTRL_REG + i, 0);289 if (err)290 return err;291 }292 293 /* Reset AUX */294 err = anx6345_set_bits(anx6345->map[I2C_IDX_TXCOM],295 SP_RESET_CTRL2_REG, SP_AUX_RST);296 if (err)297 return err;298 299 return anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM],300 SP_RESET_CTRL2_REG, SP_AUX_RST);301}302 303static void anx6345_poweron(struct anx6345 *anx6345)304{305 int err;306 307 /* Ensure reset is asserted before starting power on sequence */308 gpiod_set_value_cansleep(anx6345->gpiod_reset, 1);309 usleep_range(1000, 2000);310 311 err = regulator_enable(anx6345->dvdd12);312 if (err) {313 DRM_ERROR("Failed to enable dvdd12 regulator: %d\n",314 err);315 return;316 }317 318 /* T1 - delay between VDD12 and VDD25 should be 0-2ms */319 usleep_range(1000, 2000);320 321 err = regulator_enable(anx6345->dvdd25);322 if (err) {323 DRM_ERROR("Failed to enable dvdd25 regulator: %d\n",324 err);325 return;326 }327 328 /* T2 - delay between RESETN and all power rail stable,329 * should be 2-5ms330 */331 usleep_range(2000, 5000);332 333 gpiod_set_value_cansleep(anx6345->gpiod_reset, 0);334 335 /* Power on registers module */336 anx6345_set_bits(anx6345->map[I2C_IDX_TXCOM], SP_POWERDOWN_CTRL_REG,337 SP_HDCP_PD | SP_AUDIO_PD | SP_VIDEO_PD | SP_LINK_PD);338 anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM], SP_POWERDOWN_CTRL_REG,339 SP_REGISTER_PD | SP_TOTAL_PD);340 341 if (anx6345->panel)342 drm_panel_prepare(anx6345->panel);343 344 anx6345->powered = true;345}346 347static void anx6345_poweroff(struct anx6345 *anx6345)348{349 int err;350 351 gpiod_set_value_cansleep(anx6345->gpiod_reset, 1);352 usleep_range(1000, 2000);353 354 if (anx6345->panel)355 drm_panel_unprepare(anx6345->panel);356 357 err = regulator_disable(anx6345->dvdd25);358 if (err) {359 DRM_ERROR("Failed to disable dvdd25 regulator: %d\n",360 err);361 return;362 }363 364 usleep_range(5000, 10000);365 366 err = regulator_disable(anx6345->dvdd12);367 if (err) {368 DRM_ERROR("Failed to disable dvdd12 regulator: %d\n",369 err);370 return;371 }372 373 usleep_range(1000, 2000);374 375 anx6345->powered = false;376}377 378static int anx6345_start(struct anx6345 *anx6345)379{380 int err;381 382 if (!anx6345->powered)383 anx6345_poweron(anx6345);384 385 /* Power on needed modules */386 err = anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM],387 SP_POWERDOWN_CTRL_REG,388 SP_VIDEO_PD | SP_LINK_PD);389 390 err = anx6345_tx_initialization(anx6345);391 if (err) {392 DRM_ERROR("Failed eDP transmitter initialization: %d\n", err);393 anx6345_poweroff(anx6345);394 return err;395 }396 397 err = anx6345_dp_link_training(anx6345);398 if (err) {399 DRM_ERROR("Failed link training: %d\n", err);400 anx6345_poweroff(anx6345);401 return err;402 }403 404 /*405 * This delay seems to help keep the hardware in a good state. Without406 * it, there are times where it fails silently.407 */408 usleep_range(10000, 15000);409 410 return 0;411}412 413static int anx6345_config_dp_output(struct anx6345 *anx6345)414{415 int err;416 417 err = anx6345_clear_bits(anx6345->map[I2C_IDX_TXCOM], SP_VID_CTRL1_REG,418 SP_VIDEO_MUTE);419 if (err)420 return err;421 422 /* Enable DP output */423 err = anx6345_set_bits(anx6345->map[I2C_IDX_TXCOM], SP_VID_CTRL1_REG,424 SP_VIDEO_EN);425 if (err)426 return err;427 428 /* Force stream valid */429 return anx6345_set_bits(anx6345->map[I2C_IDX_DPTX],430 SP_DP_SYSTEM_CTRL_BASE + 3,431 SP_STRM_FORCE | SP_STRM_CTRL);432}433 434static int anx6345_get_downstream_info(struct anx6345 *anx6345)435{436 u8 value;437 int err;438 439 err = drm_dp_dpcd_readb(&anx6345->aux, DP_SINK_COUNT, &value);440 if (err < 0) {441 DRM_ERROR("Get sink count failed %d\n", err);442 return err;443 }444 445 if (!DP_GET_SINK_COUNT(value)) {446 DRM_ERROR("Downstream disconnected\n");447 return -EIO;448 }449 450 return 0;451}452 453static int anx6345_get_modes(struct drm_connector *connector)454{455 struct anx6345 *anx6345 = connector_to_anx6345(connector);456 int err, num_modes = 0;457 bool power_off = false;458 459 mutex_lock(&anx6345->lock);460 461 if (!anx6345->drm_edid) {462 if (!anx6345->powered) {463 anx6345_poweron(anx6345);464 power_off = true;465 }466 467 err = anx6345_get_downstream_info(anx6345);468 if (err) {469 DRM_ERROR("Failed to get downstream info: %d\n", err);470 goto unlock;471 }472 473 anx6345->drm_edid = drm_edid_read_ddc(connector, &anx6345->aux.ddc);474 if (!anx6345->drm_edid)475 DRM_ERROR("Failed to read EDID from panel\n");476 477 err = drm_edid_connector_update(connector, anx6345->drm_edid);478 if (err) {479 DRM_ERROR("Failed to update EDID property: %d\n", err);480 goto unlock;481 }482 }483 484 num_modes += drm_edid_connector_add_modes(connector);485 486 /* Driver currently supports only 6bpc */487 connector->display_info.bpc = 6;488 489unlock:490 if (power_off)491 anx6345_poweroff(anx6345);492 493 mutex_unlock(&anx6345->lock);494 495 if (!num_modes && anx6345->panel)496 num_modes += drm_panel_get_modes(anx6345->panel, connector);497 498 return num_modes;499}500 501static const struct drm_connector_helper_funcs anx6345_connector_helper_funcs = {502 .get_modes = anx6345_get_modes,503};504 505static void506anx6345_connector_destroy(struct drm_connector *connector)507{508 drm_connector_cleanup(connector);509}510 511static const struct drm_connector_funcs anx6345_connector_funcs = {512 .fill_modes = drm_helper_probe_single_connector_modes,513 .destroy = anx6345_connector_destroy,514 .reset = drm_atomic_helper_connector_reset,515 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,516 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,517};518 519static int anx6345_bridge_attach(struct drm_bridge *bridge,520 enum drm_bridge_attach_flags flags)521{522 struct anx6345 *anx6345 = bridge_to_anx6345(bridge);523 int err;524 525 if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) {526 DRM_ERROR("Fix bridge driver to make connector optional!");527 return -EINVAL;528 }529 530 /* Register aux channel */531 anx6345->aux.name = "DP-AUX";532 anx6345->aux.dev = &anx6345->client->dev;533 anx6345->aux.drm_dev = bridge->dev;534 anx6345->aux.transfer = anx6345_aux_transfer;535 536 err = drm_dp_aux_register(&anx6345->aux);537 if (err < 0) {538 DRM_ERROR("Failed to register aux channel: %d\n", err);539 return err;540 }541 542 err = drm_connector_init(bridge->dev, &anx6345->connector,543 &anx6345_connector_funcs,544 DRM_MODE_CONNECTOR_eDP);545 if (err) {546 DRM_ERROR("Failed to initialize connector: %d\n", err);547 goto aux_unregister;548 }549 550 drm_connector_helper_add(&anx6345->connector,551 &anx6345_connector_helper_funcs);552 553 anx6345->connector.polled = DRM_CONNECTOR_POLL_HPD;554 555 err = drm_connector_attach_encoder(&anx6345->connector,556 bridge->encoder);557 if (err) {558 DRM_ERROR("Failed to link up connector to encoder: %d\n", err);559 goto connector_cleanup;560 }561 562 err = drm_connector_register(&anx6345->connector);563 if (err) {564 DRM_ERROR("Failed to register connector: %d\n", err);565 goto connector_cleanup;566 }567 568 return 0;569connector_cleanup:570 drm_connector_cleanup(&anx6345->connector);571aux_unregister:572 drm_dp_aux_unregister(&anx6345->aux);573 return err;574}575 576static void anx6345_bridge_detach(struct drm_bridge *bridge)577{578 drm_dp_aux_unregister(&bridge_to_anx6345(bridge)->aux);579}580 581static enum drm_mode_status582anx6345_bridge_mode_valid(struct drm_bridge *bridge,583 const struct drm_display_info *info,584 const struct drm_display_mode *mode)585{586 if (mode->flags & DRM_MODE_FLAG_INTERLACE)587 return MODE_NO_INTERLACE;588 589 /* Max 1200p at 5.4 Ghz, one lane */590 if (mode->clock > 154000)591 return MODE_CLOCK_HIGH;592 593 return MODE_OK;594}595 596static void anx6345_bridge_disable(struct drm_bridge *bridge)597{598 struct anx6345 *anx6345 = bridge_to_anx6345(bridge);599 600 /* Power off all modules except configuration registers access */601 anx6345_set_bits(anx6345->map[I2C_IDX_TXCOM], SP_POWERDOWN_CTRL_REG,602 SP_HDCP_PD | SP_AUDIO_PD | SP_VIDEO_PD | SP_LINK_PD);603 if (anx6345->panel)604 drm_panel_disable(anx6345->panel);605 606 if (anx6345->powered)607 anx6345_poweroff(anx6345);608}609 610static void anx6345_bridge_enable(struct drm_bridge *bridge)611{612 struct anx6345 *anx6345 = bridge_to_anx6345(bridge);613 int err;614 615 if (anx6345->panel)616 drm_panel_enable(anx6345->panel);617 618 err = anx6345_start(anx6345);619 if (err) {620 DRM_ERROR("Failed to initialize: %d\n", err);621 return;622 }623 624 err = anx6345_config_dp_output(anx6345);625 if (err)626 DRM_ERROR("Failed to enable DP output: %d\n", err);627}628 629static const struct drm_bridge_funcs anx6345_bridge_funcs = {630 .attach = anx6345_bridge_attach,631 .detach = anx6345_bridge_detach,632 .mode_valid = anx6345_bridge_mode_valid,633 .disable = anx6345_bridge_disable,634 .enable = anx6345_bridge_enable,635};636 637static void unregister_i2c_dummy_clients(struct anx6345 *anx6345)638{639 unsigned int i;640 641 for (i = 1; i < ARRAY_SIZE(anx6345->i2c_clients); i++)642 if (anx6345->i2c_clients[i] &&643 anx6345->i2c_clients[i]->addr != anx6345->client->addr)644 i2c_unregister_device(anx6345->i2c_clients[i]);645}646 647static const struct regmap_config anx6345_regmap_config = {648 .reg_bits = 8,649 .val_bits = 8,650 .max_register = 0xff,651 .cache_type = REGCACHE_NONE,652};653 654static const u16 anx6345_chipid_list[] = {655 0x6345,656};657 658static bool anx6345_get_chip_id(struct anx6345 *anx6345)659{660 unsigned int i, idl, idh, version;661 662 if (regmap_read(anx6345->map[I2C_IDX_TXCOM], SP_DEVICE_IDL_REG, &idl))663 return false;664 665 if (regmap_read(anx6345->map[I2C_IDX_TXCOM], SP_DEVICE_IDH_REG, &idh))666 return false;667 668 anx6345->chipid = (u8)idl | ((u8)idh << 8);669 670 if (regmap_read(anx6345->map[I2C_IDX_TXCOM], SP_DEVICE_VERSION_REG,671 &version))672 return false;673 674 for (i = 0; i < ARRAY_SIZE(anx6345_chipid_list); i++) {675 if (anx6345->chipid == anx6345_chipid_list[i]) {676 DRM_INFO("Found ANX%x (ver. %d) eDP Transmitter\n",677 anx6345->chipid, version);678 return true;679 }680 }681 682 DRM_ERROR("ANX%x (ver. %d) not supported by this driver\n",683 anx6345->chipid, version);684 685 return false;686}687 688static int anx6345_i2c_probe(struct i2c_client *client)689{690 struct anx6345 *anx6345;691 struct device *dev;692 int i, err;693 694 anx6345 = devm_kzalloc(&client->dev, sizeof(*anx6345), GFP_KERNEL);695 if (!anx6345)696 return -ENOMEM;697 698 mutex_init(&anx6345->lock);699 700 anx6345->bridge.of_node = client->dev.of_node;701 702 anx6345->client = client;703 i2c_set_clientdata(client, anx6345);704 705 dev = &anx6345->client->dev;706 707 err = drm_of_find_panel_or_bridge(client->dev.of_node, 1, 0,708 &anx6345->panel, NULL);709 if (err == -EPROBE_DEFER)710 return err;711 712 if (err)713 DRM_DEBUG("No panel found\n");714 715 /* 1.2V digital core power regulator */716 anx6345->dvdd12 = devm_regulator_get(dev, "dvdd12");717 if (IS_ERR(anx6345->dvdd12)) {718 if (PTR_ERR(anx6345->dvdd12) != -EPROBE_DEFER)719 DRM_ERROR("Failed to get dvdd12 supply (%ld)\n",720 PTR_ERR(anx6345->dvdd12));721 return PTR_ERR(anx6345->dvdd12);722 }723 724 /* 2.5V digital core power regulator */725 anx6345->dvdd25 = devm_regulator_get(dev, "dvdd25");726 if (IS_ERR(anx6345->dvdd25)) {727 if (PTR_ERR(anx6345->dvdd25) != -EPROBE_DEFER)728 DRM_ERROR("Failed to get dvdd25 supply (%ld)\n",729 PTR_ERR(anx6345->dvdd25));730 return PTR_ERR(anx6345->dvdd25);731 }732 733 /* GPIO for chip reset */734 anx6345->gpiod_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);735 if (IS_ERR(anx6345->gpiod_reset)) {736 DRM_ERROR("Reset gpio not found\n");737 return PTR_ERR(anx6345->gpiod_reset);738 }739 740 /* Map slave addresses of ANX6345 */741 for (i = 0; i < I2C_NUM_ADDRESSES; i++) {742 if (anx6345_i2c_addresses[i] >> 1 != client->addr)743 anx6345->i2c_clients[i] = i2c_new_dummy_device(client->adapter,744 anx6345_i2c_addresses[i] >> 1);745 else746 anx6345->i2c_clients[i] = client;747 748 if (IS_ERR(anx6345->i2c_clients[i])) {749 err = PTR_ERR(anx6345->i2c_clients[i]);750 DRM_ERROR("Failed to reserve I2C bus %02x\n",751 anx6345_i2c_addresses[i]);752 goto err_unregister_i2c;753 }754 755 anx6345->map[i] = devm_regmap_init_i2c(anx6345->i2c_clients[i],756 &anx6345_regmap_config);757 if (IS_ERR(anx6345->map[i])) {758 err = PTR_ERR(anx6345->map[i]);759 DRM_ERROR("Failed regmap initialization %02x\n",760 anx6345_i2c_addresses[i]);761 goto err_unregister_i2c;762 }763 }764 765 /* Look for supported chip ID */766 anx6345_poweron(anx6345);767 if (anx6345_get_chip_id(anx6345)) {768 anx6345->bridge.funcs = &anx6345_bridge_funcs;769 drm_bridge_add(&anx6345->bridge);770 771 return 0;772 } else {773 anx6345_poweroff(anx6345);774 err = -ENODEV;775 }776 777err_unregister_i2c:778 unregister_i2c_dummy_clients(anx6345);779 return err;780}781 782static void anx6345_i2c_remove(struct i2c_client *client)783{784 struct anx6345 *anx6345 = i2c_get_clientdata(client);785 786 drm_bridge_remove(&anx6345->bridge);787 788 unregister_i2c_dummy_clients(anx6345);789 790 drm_edid_free(anx6345->drm_edid);791 792 mutex_destroy(&anx6345->lock);793}794 795static const struct i2c_device_id anx6345_id[] = {796 { "anx6345", 0 },797 { /* sentinel */ }798};799MODULE_DEVICE_TABLE(i2c, anx6345_id);800 801static const struct of_device_id anx6345_match_table[] = {802 { .compatible = "analogix,anx6345", },803 { /* sentinel */ },804};805MODULE_DEVICE_TABLE(of, anx6345_match_table);806 807static struct i2c_driver anx6345_driver = {808 .driver = {809 .name = "anx6345",810 .of_match_table = anx6345_match_table,811 },812 .probe = anx6345_i2c_probe,813 .remove = anx6345_i2c_remove,814 .id_table = anx6345_id,815};816module_i2c_driver(anx6345_driver);817 818MODULE_DESCRIPTION("ANX6345 eDP Transmitter driver");819MODULE_AUTHOR("Icenowy Zheng <icenowy@aosc.io>");820MODULE_LICENSE("GPL v2");821