brintos

brintos / linux-shallow public Read only

0
0
Text · 19.7 KiB · b754947 Raw
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