Path: blob/master/drivers/gpu/drm/bridge/analogix/anx7625.c
26516 views
// SPDX-License-Identifier: GPL-2.0-only1/*2* Copyright(c) 2020, Analogix Semiconductor. All rights reserved.3*4*/5#include <linux/gcd.h>6#include <linux/gpio/consumer.h>7#include <linux/i2c.h>8#include <linux/interrupt.h>9#include <linux/iopoll.h>10#include <linux/kernel.h>11#include <linux/module.h>12#include <linux/mutex.h>13#include <linux/pm_runtime.h>14#include <linux/regulator/consumer.h>15#include <linux/slab.h>16#include <linux/types.h>17#include <linux/workqueue.h>1819#include <linux/of_graph.h>20#include <linux/of_platform.h>2122#include <drm/display/drm_dp_aux_bus.h>23#include <drm/display/drm_dp_helper.h>24#include <drm/display/drm_hdcp_helper.h>25#include <drm/drm_atomic_helper.h>26#include <drm/drm_bridge.h>27#include <drm/drm_edid.h>28#include <drm/drm_mipi_dsi.h>29#include <drm/drm_of.h>30#include <drm/drm_panel.h>31#include <drm/drm_print.h>32#include <drm/drm_probe_helper.h>3334#include <media/v4l2-fwnode.h>35#include <sound/hdmi-codec.h>36#include <video/display_timing.h>3738#include "anx7625.h"3940/*41* There is a sync issue while access I2C register between AP(CPU) and42* internal firmware(OCM), to avoid the race condition, AP should access43* the reserved slave address before slave address occurs changes.44*/45static int i2c_access_workaround(struct anx7625_data *ctx,46struct i2c_client *client)47{48u8 offset;49struct device *dev = &client->dev;50int ret;5152if (client == ctx->last_client)53return 0;5455ctx->last_client = client;5657if (client == ctx->i2c.tcpc_client)58offset = RSVD_00_ADDR;59else if (client == ctx->i2c.tx_p0_client)60offset = RSVD_D1_ADDR;61else if (client == ctx->i2c.tx_p1_client)62offset = RSVD_60_ADDR;63else if (client == ctx->i2c.rx_p0_client)64offset = RSVD_39_ADDR;65else if (client == ctx->i2c.rx_p1_client)66offset = RSVD_7F_ADDR;67else68offset = RSVD_00_ADDR;6970ret = i2c_smbus_write_byte_data(client, offset, 0x00);71if (ret < 0)72DRM_DEV_ERROR(dev,73"fail to access i2c id=%x\n:%x",74client->addr, offset);7576return ret;77}7879static int anx7625_reg_read(struct anx7625_data *ctx,80struct i2c_client *client, u8 reg_addr)81{82int ret;83struct device *dev = &client->dev;8485i2c_access_workaround(ctx, client);8687ret = i2c_smbus_read_byte_data(client, reg_addr);88if (ret < 0)89DRM_DEV_ERROR(dev, "read i2c fail id=%x:%x\n",90client->addr, reg_addr);9192return ret;93}9495static int anx7625_reg_block_read(struct anx7625_data *ctx,96struct i2c_client *client,97u8 reg_addr, u8 len, u8 *buf)98{99int ret;100struct device *dev = &client->dev;101102i2c_access_workaround(ctx, client);103104ret = i2c_smbus_read_i2c_block_data(client, reg_addr, len, buf);105if (ret < 0)106DRM_DEV_ERROR(dev, "read i2c block fail id=%x:%x\n",107client->addr, reg_addr);108109return ret;110}111112static int anx7625_reg_write(struct anx7625_data *ctx,113struct i2c_client *client,114u8 reg_addr, u8 reg_val)115{116int ret;117struct device *dev = &client->dev;118119i2c_access_workaround(ctx, client);120121ret = i2c_smbus_write_byte_data(client, reg_addr, reg_val);122123if (ret < 0)124DRM_DEV_ERROR(dev, "fail to write i2c id=%x\n:%x",125client->addr, reg_addr);126127return ret;128}129130static int anx7625_reg_block_write(struct anx7625_data *ctx,131struct i2c_client *client,132u8 reg_addr, u8 len, u8 *buf)133{134int ret;135struct device *dev = &client->dev;136137i2c_access_workaround(ctx, client);138139ret = i2c_smbus_write_i2c_block_data(client, reg_addr, len, buf);140if (ret < 0)141dev_err(dev, "write i2c block failed id=%x\n:%x",142client->addr, reg_addr);143144return ret;145}146147static int anx7625_write_or(struct anx7625_data *ctx,148struct i2c_client *client,149u8 offset, u8 mask)150{151int val;152153val = anx7625_reg_read(ctx, client, offset);154if (val < 0)155return val;156157return anx7625_reg_write(ctx, client, offset, (val | (mask)));158}159160static int anx7625_write_and(struct anx7625_data *ctx,161struct i2c_client *client,162u8 offset, u8 mask)163{164int val;165166val = anx7625_reg_read(ctx, client, offset);167if (val < 0)168return val;169170return anx7625_reg_write(ctx, client, offset, (val & (mask)));171}172173static int anx7625_write_and_or(struct anx7625_data *ctx,174struct i2c_client *client,175u8 offset, u8 and_mask, u8 or_mask)176{177int val;178179val = anx7625_reg_read(ctx, client, offset);180if (val < 0)181return val;182183return anx7625_reg_write(ctx, client,184offset, (val & and_mask) | (or_mask));185}186187static int anx7625_config_bit_matrix(struct anx7625_data *ctx)188{189int i, ret;190191ret = anx7625_write_or(ctx, ctx->i2c.tx_p2_client,192AUDIO_CONTROL_REGISTER, 0x80);193for (i = 0; i < 13; i++)194ret |= anx7625_reg_write(ctx, ctx->i2c.tx_p2_client,195VIDEO_BIT_MATRIX_12 + i,1960x18 + i);197198return ret;199}200201static int anx7625_read_ctrl_status_p0(struct anx7625_data *ctx)202{203return anx7625_reg_read(ctx, ctx->i2c.rx_p0_client, AP_AUX_CTRL_STATUS);204}205206static int wait_aux_op_finish(struct anx7625_data *ctx)207{208struct device *dev = ctx->dev;209int val;210int ret;211212ret = readx_poll_timeout(anx7625_read_ctrl_status_p0,213ctx, val,214(!(val & AP_AUX_CTRL_OP_EN) || (val < 0)),2152000,2162000 * 150);217if (ret) {218DRM_DEV_ERROR(dev, "aux operation fail!\n");219return -EIO;220}221222val = anx7625_reg_read(ctx, ctx->i2c.rx_p0_client,223AP_AUX_CTRL_STATUS);224if (val < 0 || (val & 0x0F)) {225DRM_DEV_ERROR(dev, "aux status %02x\n", val);226return -EIO;227}228229return 0;230}231232static int anx7625_aux_trans(struct anx7625_data *ctx, u8 op, u32 address,233u8 len, u8 *buf)234{235struct device *dev = ctx->dev;236int ret;237u8 addrh, addrm, addrl;238u8 cmd;239bool is_write = !(op & DP_AUX_I2C_READ);240241if (len > DP_AUX_MAX_PAYLOAD_BYTES) {242dev_err(dev, "exceed aux buffer len.\n");243return -EINVAL;244}245246if (!len)247return len;248249addrl = address & 0xFF;250addrm = (address >> 8) & 0xFF;251addrh = (address >> 16) & 0xFF;252253if (!is_write)254op &= ~DP_AUX_I2C_MOT;255cmd = DPCD_CMD(len, op);256257/* Set command and length */258ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,259AP_AUX_COMMAND, cmd);260261/* Set aux access address */262ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,263AP_AUX_ADDR_7_0, addrl);264ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,265AP_AUX_ADDR_15_8, addrm);266ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,267AP_AUX_ADDR_19_16, addrh);268269if (is_write)270ret |= anx7625_reg_block_write(ctx, ctx->i2c.rx_p0_client,271AP_AUX_BUFF_START, len, buf);272/* Enable aux access */273ret |= anx7625_write_or(ctx, ctx->i2c.rx_p0_client,274AP_AUX_CTRL_STATUS, AP_AUX_CTRL_OP_EN);275276if (ret < 0) {277dev_err(dev, "cannot access aux related register.\n");278return -EIO;279}280281ret = wait_aux_op_finish(ctx);282if (ret < 0) {283dev_err(dev, "aux IO error: wait aux op finish.\n");284return ret;285}286287/* Write done */288if (is_write)289return len;290291/* Read done, read out dpcd data */292ret = anx7625_reg_block_read(ctx, ctx->i2c.rx_p0_client,293AP_AUX_BUFF_START, len, buf);294if (ret < 0) {295dev_err(dev, "read dpcd register failed\n");296return -EIO;297}298299return len;300}301302static int anx7625_video_mute_control(struct anx7625_data *ctx,303u8 status)304{305int ret;306307if (status) {308/* Set mute on flag */309ret = anx7625_write_or(ctx, ctx->i2c.rx_p0_client,310AP_AV_STATUS, AP_MIPI_MUTE);311/* Clear mipi RX en */312ret |= anx7625_write_and(ctx, ctx->i2c.rx_p0_client,313AP_AV_STATUS, (u8)~AP_MIPI_RX_EN);314} else {315/* Mute off flag */316ret = anx7625_write_and(ctx, ctx->i2c.rx_p0_client,317AP_AV_STATUS, (u8)~AP_MIPI_MUTE);318/* Set MIPI RX EN */319ret |= anx7625_write_or(ctx, ctx->i2c.rx_p0_client,320AP_AV_STATUS, AP_MIPI_RX_EN);321}322323return ret;324}325326/* Reduction of fraction a/b */327static void anx7625_reduction_of_a_fraction(unsigned long *a, unsigned long *b)328{329unsigned long gcd_num;330unsigned long tmp_a, tmp_b;331u32 i = 1;332333gcd_num = gcd(*a, *b);334*a /= gcd_num;335*b /= gcd_num;336337tmp_a = *a;338tmp_b = *b;339340while ((*a > MAX_UNSIGNED_24BIT) || (*b > MAX_UNSIGNED_24BIT)) {341i++;342*a = tmp_a / i;343*b = tmp_b / i;344}345346/*347* In the end, make a, b larger to have higher ODFC PLL348* output frequency accuracy349*/350while ((*a < MAX_UNSIGNED_24BIT) && (*b < MAX_UNSIGNED_24BIT)) {351*a <<= 1;352*b <<= 1;353}354355*a >>= 1;356*b >>= 1;357}358359static int anx7625_calculate_m_n(u32 pixelclock,360unsigned long *m,361unsigned long *n,362u8 *post_divider)363{364if (pixelclock > PLL_OUT_FREQ_ABS_MAX / POST_DIVIDER_MIN) {365/* Pixel clock frequency is too high */366DRM_ERROR("pixelclock too high, act(%d), maximum(%lu)\n",367pixelclock,368PLL_OUT_FREQ_ABS_MAX / POST_DIVIDER_MIN);369return -EINVAL;370}371372if (pixelclock < PLL_OUT_FREQ_ABS_MIN / POST_DIVIDER_MAX) {373/* Pixel clock frequency is too low */374DRM_ERROR("pixelclock too low, act(%d), maximum(%lu)\n",375pixelclock,376PLL_OUT_FREQ_ABS_MIN / POST_DIVIDER_MAX);377return -EINVAL;378}379380for (*post_divider = 1;381pixelclock < (PLL_OUT_FREQ_MIN / (*post_divider));)382*post_divider += 1;383384if (*post_divider > POST_DIVIDER_MAX) {385for (*post_divider = 1;386(pixelclock <387(PLL_OUT_FREQ_ABS_MIN / (*post_divider)));)388*post_divider += 1;389390if (*post_divider > POST_DIVIDER_MAX) {391DRM_ERROR("cannot find property post_divider(%d)\n",392*post_divider);393return -EDOM;394}395}396397/* Patch to improve the accuracy */398if (*post_divider == 7) {399/* 27,000,000 is not divisible by 7 */400*post_divider = 8;401} else if (*post_divider == 11) {402/* 27,000,000 is not divisible by 11 */403*post_divider = 12;404} else if ((*post_divider == 13) || (*post_divider == 14)) {405/* 27,000,000 is not divisible by 13 or 14 */406*post_divider = 15;407}408409if (pixelclock * (*post_divider) > PLL_OUT_FREQ_ABS_MAX) {410DRM_ERROR("act clock(%u) large than maximum(%lu)\n",411pixelclock * (*post_divider),412PLL_OUT_FREQ_ABS_MAX);413return -EDOM;414}415416*m = pixelclock;417*n = XTAL_FRQ / (*post_divider);418419anx7625_reduction_of_a_fraction(m, n);420421return 0;422}423424static int anx7625_odfc_config(struct anx7625_data *ctx,425u8 post_divider)426{427int ret;428struct device *dev = ctx->dev;429430/* Config input reference clock frequency 27MHz/19.2MHz */431ret = anx7625_write_and(ctx, ctx->i2c.rx_p1_client, MIPI_DIGITAL_PLL_16,432~(REF_CLK_27000KHZ << MIPI_FREF_D_IND));433ret |= anx7625_write_or(ctx, ctx->i2c.rx_p1_client, MIPI_DIGITAL_PLL_16,434(REF_CLK_27000KHZ << MIPI_FREF_D_IND));435/* Post divider */436ret |= anx7625_write_and(ctx, ctx->i2c.rx_p1_client,437MIPI_DIGITAL_PLL_8, 0x0f);438ret |= anx7625_write_or(ctx, ctx->i2c.rx_p1_client, MIPI_DIGITAL_PLL_8,439post_divider << 4);440441/* Add patch for MIS2-125 (5pcs ANX7625 fail ATE MBIST test) */442ret |= anx7625_write_and(ctx, ctx->i2c.rx_p1_client, MIPI_DIGITAL_PLL_7,443~MIPI_PLL_VCO_TUNE_REG_VAL);444445/* Reset ODFC PLL */446ret |= anx7625_write_and(ctx, ctx->i2c.rx_p1_client, MIPI_DIGITAL_PLL_7,447~MIPI_PLL_RESET_N);448ret |= anx7625_write_or(ctx, ctx->i2c.rx_p1_client, MIPI_DIGITAL_PLL_7,449MIPI_PLL_RESET_N);450451if (ret < 0)452DRM_DEV_ERROR(dev, "IO error.\n");453454return ret;455}456457/*458* The MIPI source video data exist large variation (e.g. 59Hz ~ 61Hz),459* anx7625 defined K ratio for matching MIPI input video clock and460* DP output video clock. Increase K value can match bigger video data461* variation. IVO panel has small variation than DP CTS spec, need462* decrease the K value.463*/464static int anx7625_set_k_value(struct anx7625_data *ctx)465{466struct drm_edid_product_id id;467468drm_edid_get_product_id(ctx->cached_drm_edid, &id);469470if (be16_to_cpu(id.manufacturer_name) == IVO_MID)471return anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,472MIPI_DIGITAL_ADJ_1, 0x3B);473474return anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,475MIPI_DIGITAL_ADJ_1, 0x3D);476}477478static int anx7625_dsi_video_timing_config(struct anx7625_data *ctx)479{480struct device *dev = ctx->dev;481unsigned long m, n;482u16 htotal;483int ret;484u8 post_divider = 0;485486ret = anx7625_calculate_m_n(ctx->dt.pixelclock.min * 1000,487&m, &n, &post_divider);488489if (ret) {490DRM_DEV_ERROR(dev, "cannot get property m n value.\n");491return ret;492}493494DRM_DEV_DEBUG_DRIVER(dev, "compute M(%lu), N(%lu), divider(%d).\n",495m, n, post_divider);496497/* Configure pixel clock */498ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client, PIXEL_CLOCK_L,499(ctx->dt.pixelclock.min / 1000) & 0xFF);500ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client, PIXEL_CLOCK_H,501(ctx->dt.pixelclock.min / 1000) >> 8);502/* Lane count */503ret |= anx7625_write_and(ctx, ctx->i2c.rx_p1_client,504MIPI_LANE_CTRL_0, 0xfc);505ret |= anx7625_write_or(ctx, ctx->i2c.rx_p1_client,506MIPI_LANE_CTRL_0, ctx->pdata.mipi_lanes - 1);507508/* Htotal */509htotal = ctx->dt.hactive.min + ctx->dt.hfront_porch.min +510ctx->dt.hback_porch.min + ctx->dt.hsync_len.min;511ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client,512HORIZONTAL_TOTAL_PIXELS_L, htotal & 0xFF);513ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client,514HORIZONTAL_TOTAL_PIXELS_H, htotal >> 8);515/* Hactive */516ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client,517HORIZONTAL_ACTIVE_PIXELS_L, ctx->dt.hactive.min & 0xFF);518ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client,519HORIZONTAL_ACTIVE_PIXELS_H, ctx->dt.hactive.min >> 8);520/* HFP */521ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client,522HORIZONTAL_FRONT_PORCH_L, ctx->dt.hfront_porch.min);523ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client,524HORIZONTAL_FRONT_PORCH_H,525ctx->dt.hfront_porch.min >> 8);526/* HWS */527ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client,528HORIZONTAL_SYNC_WIDTH_L, ctx->dt.hsync_len.min);529ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client,530HORIZONTAL_SYNC_WIDTH_H, ctx->dt.hsync_len.min >> 8);531/* HBP */532ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client,533HORIZONTAL_BACK_PORCH_L, ctx->dt.hback_porch.min);534ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client,535HORIZONTAL_BACK_PORCH_H, ctx->dt.hback_porch.min >> 8);536/* Vactive */537ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client, ACTIVE_LINES_L,538ctx->dt.vactive.min);539ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client, ACTIVE_LINES_H,540ctx->dt.vactive.min >> 8);541/* VFP */542ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client,543VERTICAL_FRONT_PORCH, ctx->dt.vfront_porch.min);544/* VWS */545ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client,546VERTICAL_SYNC_WIDTH, ctx->dt.vsync_len.min);547/* VBP */548ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p2_client,549VERTICAL_BACK_PORCH, ctx->dt.vback_porch.min);550/* M value */551ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,552MIPI_PLL_M_NUM_23_16, (m >> 16) & 0xff);553ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,554MIPI_PLL_M_NUM_15_8, (m >> 8) & 0xff);555ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,556MIPI_PLL_M_NUM_7_0, (m & 0xff));557/* N value */558ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,559MIPI_PLL_N_NUM_23_16, (n >> 16) & 0xff);560ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,561MIPI_PLL_N_NUM_15_8, (n >> 8) & 0xff);562ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p1_client, MIPI_PLL_N_NUM_7_0,563(n & 0xff));564565anx7625_set_k_value(ctx);566567ret |= anx7625_odfc_config(ctx, post_divider - 1);568569if (ret < 0)570DRM_DEV_ERROR(dev, "mipi dsi setup IO error.\n");571572return ret;573}574575static int anx7625_swap_dsi_lane3(struct anx7625_data *ctx)576{577int val;578struct device *dev = ctx->dev;579580/* Swap MIPI-DSI data lane 3 P and N */581val = anx7625_reg_read(ctx, ctx->i2c.rx_p1_client, MIPI_SWAP);582if (val < 0) {583DRM_DEV_ERROR(dev, "IO error : access MIPI_SWAP.\n");584return -EIO;585}586587val |= (1 << MIPI_SWAP_CH3);588return anx7625_reg_write(ctx, ctx->i2c.rx_p1_client, MIPI_SWAP, val);589}590591static int anx7625_api_dsi_config(struct anx7625_data *ctx)592593{594int val, ret;595struct device *dev = ctx->dev;596597/* Swap MIPI-DSI data lane 3 P and N */598ret = anx7625_swap_dsi_lane3(ctx);599if (ret < 0) {600DRM_DEV_ERROR(dev, "IO error : swap dsi lane 3 fail.\n");601return ret;602}603604/* DSI clock settings */605val = (0 << MIPI_HS_PWD_CLK) |606(0 << MIPI_HS_RT_CLK) |607(0 << MIPI_PD_CLK) |608(1 << MIPI_CLK_RT_MANUAL_PD_EN) |609(1 << MIPI_CLK_HS_MANUAL_PD_EN) |610(0 << MIPI_CLK_DET_DET_BYPASS) |611(0 << MIPI_CLK_MISS_CTRL) |612(0 << MIPI_PD_LPTX_CH_MANUAL_PD_EN);613ret = anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,614MIPI_PHY_CONTROL_3, val);615616/*617* Decreased HS prepare timing delay from 160ns to 80ns work with618* a) Dragon board 810 series (Qualcomm AP)619* b) Moving Pixel DSI source (PG3A pattern generator +620* P332 D-PHY Probe) default D-PHY timing621* 5ns/step622*/623ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,624MIPI_TIME_HS_PRPR, 0x10);625626/* Enable DSI mode*/627ret |= anx7625_write_or(ctx, ctx->i2c.rx_p1_client, MIPI_DIGITAL_PLL_18,628SELECT_DSI << MIPI_DPI_SELECT);629630ret |= anx7625_dsi_video_timing_config(ctx);631if (ret < 0) {632DRM_DEV_ERROR(dev, "dsi video timing config fail\n");633return ret;634}635636/* Toggle m, n ready */637ret = anx7625_write_and(ctx, ctx->i2c.rx_p1_client, MIPI_DIGITAL_PLL_6,638~(MIPI_M_NUM_READY | MIPI_N_NUM_READY));639usleep_range(1000, 1100);640ret |= anx7625_write_or(ctx, ctx->i2c.rx_p1_client, MIPI_DIGITAL_PLL_6,641MIPI_M_NUM_READY | MIPI_N_NUM_READY);642643/* Configure integer stable register */644ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,645MIPI_VIDEO_STABLE_CNT, 0x02);646/* Power on MIPI RX */647ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,648MIPI_LANE_CTRL_10, 0x00);649ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,650MIPI_LANE_CTRL_10, 0x80);651652if (ret < 0)653DRM_DEV_ERROR(dev, "IO error : mipi dsi enable init fail.\n");654655return ret;656}657658static int anx7625_dsi_config(struct anx7625_data *ctx)659{660struct device *dev = ctx->dev;661int ret;662663DRM_DEV_DEBUG_DRIVER(dev, "config dsi.\n");664665/* DSC disable */666ret = anx7625_write_and(ctx, ctx->i2c.rx_p0_client,667R_DSC_CTRL_0, ~DSC_EN);668669ret |= anx7625_api_dsi_config(ctx);670671if (ret < 0) {672DRM_DEV_ERROR(dev, "IO error : api dsi config error.\n");673return ret;674}675676/* Set MIPI RX EN */677ret = anx7625_write_or(ctx, ctx->i2c.rx_p0_client,678AP_AV_STATUS, AP_MIPI_RX_EN);679/* Clear mute flag */680ret |= anx7625_write_and(ctx, ctx->i2c.rx_p0_client,681AP_AV_STATUS, (u8)~AP_MIPI_MUTE);682if (ret < 0)683DRM_DEV_ERROR(dev, "IO error : enable mipi rx fail.\n");684else685DRM_DEV_DEBUG_DRIVER(dev, "success to config DSI\n");686687return ret;688}689690static int anx7625_api_dpi_config(struct anx7625_data *ctx)691{692struct device *dev = ctx->dev;693u16 freq = ctx->dt.pixelclock.min / 1000;694int ret;695696/* configure pixel clock */697ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,698PIXEL_CLOCK_L, freq & 0xFF);699ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,700PIXEL_CLOCK_H, (freq >> 8));701702/* set DPI mode */703/* set to DPI PLL module sel */704ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,705MIPI_DIGITAL_PLL_9, 0x20);706/* power down MIPI */707ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,708MIPI_LANE_CTRL_10, 0x08);709/* enable DPI mode */710ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,711MIPI_DIGITAL_PLL_18, 0x1C);712/* set first edge */713ret |= anx7625_reg_write(ctx, ctx->i2c.tx_p2_client,714VIDEO_CONTROL_0, 0x06);715if (ret < 0)716DRM_DEV_ERROR(dev, "IO error : dpi phy set failed.\n");717718return ret;719}720721static int anx7625_dpi_config(struct anx7625_data *ctx)722{723struct device *dev = ctx->dev;724int ret;725726DRM_DEV_DEBUG_DRIVER(dev, "config dpi\n");727728/* DSC disable */729ret = anx7625_write_and(ctx, ctx->i2c.rx_p0_client,730R_DSC_CTRL_0, ~DSC_EN);731if (ret < 0) {732DRM_DEV_ERROR(dev, "IO error : disable dsc failed.\n");733return ret;734}735736ret = anx7625_config_bit_matrix(ctx);737if (ret < 0) {738DRM_DEV_ERROR(dev, "config bit matrix failed.\n");739return ret;740}741742ret = anx7625_api_dpi_config(ctx);743if (ret < 0) {744DRM_DEV_ERROR(dev, "mipi phy(dpi) setup failed.\n");745return ret;746}747748/* set MIPI RX EN */749ret = anx7625_write_or(ctx, ctx->i2c.rx_p0_client,750AP_AV_STATUS, AP_MIPI_RX_EN);751/* clear mute flag */752ret |= anx7625_write_and(ctx, ctx->i2c.rx_p0_client,753AP_AV_STATUS, (u8)~AP_MIPI_MUTE);754if (ret < 0)755DRM_DEV_ERROR(dev, "IO error : enable mipi rx failed.\n");756757return ret;758}759760static int anx7625_read_flash_status(struct anx7625_data *ctx)761{762return anx7625_reg_read(ctx, ctx->i2c.rx_p0_client, R_RAM_CTRL);763}764765static int anx7625_hdcp_key_probe(struct anx7625_data *ctx)766{767int ret, val;768struct device *dev = ctx->dev;769u8 ident[FLASH_BUF_LEN];770771ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,772FLASH_ADDR_HIGH, 0x91);773ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,774FLASH_ADDR_LOW, 0xA0);775if (ret < 0) {776dev_err(dev, "IO error : set key flash address.\n");777return ret;778}779780ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,781FLASH_LEN_HIGH, (FLASH_BUF_LEN - 1) >> 8);782ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,783FLASH_LEN_LOW, (FLASH_BUF_LEN - 1) & 0xFF);784if (ret < 0) {785dev_err(dev, "IO error : set key flash len.\n");786return ret;787}788789ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,790R_FLASH_RW_CTRL, FLASH_READ);791ret |= readx_poll_timeout(anx7625_read_flash_status,792ctx, val,793((val & FLASH_DONE) || (val < 0)),7942000,7952000 * 150);796if (ret) {797dev_err(dev, "flash read access fail!\n");798return -EIO;799}800801ret = anx7625_reg_block_read(ctx, ctx->i2c.rx_p0_client,802FLASH_BUF_BASE_ADDR,803FLASH_BUF_LEN, ident);804if (ret < 0) {805dev_err(dev, "read flash data fail!\n");806return -EIO;807}808809if (ident[29] == 0xFF && ident[30] == 0xFF && ident[31] == 0xFF)810return -EINVAL;811812return 0;813}814815static int anx7625_hdcp_key_load(struct anx7625_data *ctx)816{817int ret;818struct device *dev = ctx->dev;819820/* Select HDCP 1.4 KEY */821ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,822R_BOOT_RETRY, 0x12);823ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,824FLASH_ADDR_HIGH, HDCP14KEY_START_ADDR >> 8);825ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,826FLASH_ADDR_LOW, HDCP14KEY_START_ADDR & 0xFF);827ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,828R_RAM_LEN_H, HDCP14KEY_SIZE >> 12);829ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,830R_RAM_LEN_L, HDCP14KEY_SIZE >> 4);831832ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,833R_RAM_ADDR_H, 0);834ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,835R_RAM_ADDR_L, 0);836/* Enable HDCP 1.4 KEY load */837ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,838R_RAM_CTRL, DECRYPT_EN | LOAD_START);839dev_dbg(dev, "load HDCP 1.4 key done\n");840return ret;841}842843static int anx7625_hdcp_disable(struct anx7625_data *ctx)844{845int ret;846struct device *dev = ctx->dev;847848dev_dbg(dev, "disable HDCP 1.4\n");849850/* Disable HDCP */851ret = anx7625_write_and(ctx, ctx->i2c.rx_p1_client, 0xee, 0x9f);852/* Try auth flag */853ret |= anx7625_write_or(ctx, ctx->i2c.rx_p1_client, 0xec, 0x10);854/* Interrupt for DRM */855ret |= anx7625_write_or(ctx, ctx->i2c.rx_p1_client, 0xff, 0x01);856if (ret < 0)857dev_err(dev, "fail to disable HDCP\n");858859return anx7625_write_and(ctx, ctx->i2c.tx_p0_client,860TX_HDCP_CTRL0, ~HARD_AUTH_EN & 0xFF);861}862863static int anx7625_hdcp_enable(struct anx7625_data *ctx)864{865u8 bcap;866int ret;867struct device *dev = ctx->dev;868869ret = anx7625_hdcp_key_probe(ctx);870if (ret) {871dev_dbg(dev, "no key found, not to do hdcp\n");872return ret;873}874875/* Read downstream capability */876ret = anx7625_aux_trans(ctx, DP_AUX_NATIVE_READ, DP_AUX_HDCP_BCAPS, 1, &bcap);877if (ret < 0)878return ret;879880if (!(bcap & DP_BCAPS_HDCP_CAPABLE)) {881pr_warn("downstream not support HDCP 1.4, cap(%x).\n", bcap);882return 0;883}884885dev_dbg(dev, "enable HDCP 1.4\n");886887/* First clear HDCP state */888ret = anx7625_reg_write(ctx, ctx->i2c.tx_p0_client,889TX_HDCP_CTRL0,890KSVLIST_VLD | BKSV_SRM_PASS | RE_AUTHEN);891usleep_range(1000, 1100);892/* Second clear HDCP state */893ret |= anx7625_reg_write(ctx, ctx->i2c.tx_p0_client,894TX_HDCP_CTRL0,895KSVLIST_VLD | BKSV_SRM_PASS | RE_AUTHEN);896897/* Set time for waiting KSVR */898ret |= anx7625_reg_write(ctx, ctx->i2c.tx_p0_client,899SP_TX_WAIT_KSVR_TIME, 0xc8);900/* Set time for waiting R0 */901ret |= anx7625_reg_write(ctx, ctx->i2c.tx_p0_client,902SP_TX_WAIT_R0_TIME, 0xb0);903ret |= anx7625_hdcp_key_load(ctx);904if (ret) {905pr_warn("prepare HDCP key failed.\n");906return ret;907}908909ret = anx7625_write_or(ctx, ctx->i2c.rx_p1_client, 0xee, 0x20);910911/* Try auth flag */912ret |= anx7625_write_or(ctx, ctx->i2c.rx_p1_client, 0xec, 0x10);913/* Interrupt for DRM */914ret |= anx7625_write_or(ctx, ctx->i2c.rx_p1_client, 0xff, 0x01);915if (ret < 0)916dev_err(dev, "fail to enable HDCP\n");917918return anx7625_write_or(ctx, ctx->i2c.tx_p0_client,919TX_HDCP_CTRL0, HARD_AUTH_EN);920}921922static void anx7625_dp_start(struct anx7625_data *ctx)923{924int ret;925struct device *dev = ctx->dev;926u8 data;927928if (!ctx->display_timing_valid) {929DRM_DEV_ERROR(dev, "mipi not set display timing yet.\n");930return;931}932933dev_dbg(dev, "set downstream sink into normal\n");934/* Downstream sink enter into normal mode */935data = DP_SET_POWER_D0;936ret = anx7625_aux_trans(ctx, DP_AUX_NATIVE_WRITE, DP_SET_POWER, 1, &data);937if (ret < 0)938dev_err(dev, "IO error : set sink into normal mode fail\n");939940/* Disable HDCP */941anx7625_write_and(ctx, ctx->i2c.rx_p1_client, 0xee, 0x9f);942943if (ctx->pdata.is_dpi)944ret = anx7625_dpi_config(ctx);945else946ret = anx7625_dsi_config(ctx);947948if (ret < 0)949DRM_DEV_ERROR(dev, "MIPI phy setup error.\n");950951ctx->hdcp_cp = DRM_MODE_CONTENT_PROTECTION_UNDESIRED;952953ctx->dp_en = 1;954}955956static void anx7625_dp_stop(struct anx7625_data *ctx)957{958struct device *dev = ctx->dev;959int ret;960u8 data;961962DRM_DEV_DEBUG_DRIVER(dev, "stop dp output\n");963964/*965* Video disable: 0x72:08 bit 7 = 0;966* Audio disable: 0x70:87 bit 0 = 0;967*/968ret = anx7625_write_and(ctx, ctx->i2c.tx_p0_client, 0x87, 0xfe);969ret |= anx7625_write_and(ctx, ctx->i2c.tx_p2_client, 0x08, 0x7f);970971ret |= anx7625_video_mute_control(ctx, 1);972973dev_dbg(dev, "notify downstream enter into standby\n");974/* Downstream monitor enter into standby mode */975data = DP_SET_POWER_D3;976ret |= anx7625_aux_trans(ctx, DP_AUX_NATIVE_WRITE, DP_SET_POWER, 1, &data);977if (ret < 0)978DRM_DEV_ERROR(dev, "IO error : mute video fail\n");979980ctx->hdcp_cp = DRM_MODE_CONTENT_PROTECTION_UNDESIRED;981982ctx->dp_en = 0;983}984985static int sp_tx_rst_aux(struct anx7625_data *ctx)986{987int ret;988989ret = anx7625_write_or(ctx, ctx->i2c.tx_p2_client, RST_CTRL2,990AUX_RST);991ret |= anx7625_write_and(ctx, ctx->i2c.tx_p2_client, RST_CTRL2,992~AUX_RST);993return ret;994}995996static int sp_tx_aux_wr(struct anx7625_data *ctx, u8 offset)997{998int ret;9991000ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,1001AP_AUX_BUFF_START, offset);1002ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,1003AP_AUX_COMMAND, 0x04);1004ret |= anx7625_write_or(ctx, ctx->i2c.rx_p0_client,1005AP_AUX_CTRL_STATUS, AP_AUX_CTRL_OP_EN);1006return (ret | wait_aux_op_finish(ctx));1007}10081009static int sp_tx_aux_rd(struct anx7625_data *ctx, u8 len_cmd)1010{1011int ret;10121013ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,1014AP_AUX_COMMAND, len_cmd);1015ret |= anx7625_write_or(ctx, ctx->i2c.rx_p0_client,1016AP_AUX_CTRL_STATUS, AP_AUX_CTRL_OP_EN);1017return (ret | wait_aux_op_finish(ctx));1018}10191020static int sp_tx_get_edid_block(struct anx7625_data *ctx)1021{1022int c = 0;1023struct device *dev = ctx->dev;10241025sp_tx_aux_wr(ctx, 0x7e);1026sp_tx_aux_rd(ctx, 0x01);1027c = anx7625_reg_read(ctx, ctx->i2c.rx_p0_client, AP_AUX_BUFF_START);1028if (c < 0) {1029DRM_DEV_ERROR(dev, "IO error : access AUX BUFF.\n");1030return -EIO;1031}10321033DRM_DEV_DEBUG_DRIVER(dev, " EDID Block = %d\n", c + 1);10341035if (c > MAX_EDID_BLOCK)1036c = 1;10371038return c;1039}10401041static int edid_read(struct anx7625_data *ctx,1042u8 offset, u8 *pblock_buf)1043{1044int ret, cnt;1045struct device *dev = ctx->dev;10461047for (cnt = 0; cnt <= EDID_TRY_CNT; cnt++) {1048sp_tx_aux_wr(ctx, offset);1049/* Set I2C read com 0x01 mot = 0 and read 16 bytes */1050ret = sp_tx_aux_rd(ctx, 0xf1);10511052if (ret) {1053ret = sp_tx_rst_aux(ctx);1054DRM_DEV_DEBUG_DRIVER(dev, "edid read fail, reset!\n");1055} else {1056ret = anx7625_reg_block_read(ctx, ctx->i2c.rx_p0_client,1057AP_AUX_BUFF_START,1058MAX_DPCD_BUFFER_SIZE,1059pblock_buf);1060if (ret > 0)1061break;1062}1063}10641065if (cnt > EDID_TRY_CNT)1066return -EIO;10671068return ret;1069}10701071static int segments_edid_read(struct anx7625_data *ctx,1072u8 segment, u8 *buf, u8 offset)1073{1074u8 cnt;1075int ret;1076struct device *dev = ctx->dev;10771078/* Write address only */1079ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,1080AP_AUX_ADDR_7_0, 0x30);1081ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,1082AP_AUX_COMMAND, 0x04);1083ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,1084AP_AUX_CTRL_STATUS,1085AP_AUX_CTRL_ADDRONLY | AP_AUX_CTRL_OP_EN);10861087ret |= wait_aux_op_finish(ctx);1088/* Write segment address */1089ret |= sp_tx_aux_wr(ctx, segment);1090/* Data read */1091ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,1092AP_AUX_ADDR_7_0, 0x50);1093if (ret) {1094DRM_DEV_ERROR(dev, "IO error : aux initial fail.\n");1095return ret;1096}10971098for (cnt = 0; cnt <= EDID_TRY_CNT; cnt++) {1099sp_tx_aux_wr(ctx, offset);1100/* Set I2C read com 0x01 mot = 0 and read 16 bytes */1101ret = sp_tx_aux_rd(ctx, 0xf1);11021103if (ret) {1104ret = sp_tx_rst_aux(ctx);1105DRM_DEV_ERROR(dev, "segment read fail, reset!\n");1106} else {1107ret = anx7625_reg_block_read(ctx, ctx->i2c.rx_p0_client,1108AP_AUX_BUFF_START,1109MAX_DPCD_BUFFER_SIZE, buf);1110if (ret > 0)1111break;1112}1113}11141115if (cnt > EDID_TRY_CNT)1116return -EIO;11171118return ret;1119}11201121static int sp_tx_edid_read(struct anx7625_data *ctx,1122u8 *pedid_blocks_buf)1123{1124u8 offset;1125int edid_pos;1126int count, blocks_num;1127u8 pblock_buf[MAX_DPCD_BUFFER_SIZE];1128u8 i, j;1129int g_edid_break = 0;1130int ret;1131struct device *dev = ctx->dev;11321133/* Address initial */1134ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,1135AP_AUX_ADDR_7_0, 0x50);1136ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,1137AP_AUX_ADDR_15_8, 0);1138ret |= anx7625_write_and(ctx, ctx->i2c.rx_p0_client,1139AP_AUX_ADDR_19_16, 0xf0);1140if (ret < 0) {1141DRM_DEV_ERROR(dev, "access aux channel IO error.\n");1142return -EIO;1143}11441145blocks_num = sp_tx_get_edid_block(ctx);1146if (blocks_num < 0)1147return blocks_num;11481149count = 0;11501151do {1152switch (count) {1153case 0:1154case 1:1155for (i = 0; i < 8; i++) {1156offset = (i + count * 8) * MAX_DPCD_BUFFER_SIZE;1157g_edid_break = edid_read(ctx, offset,1158pblock_buf);11591160if (g_edid_break < 0)1161break;11621163memcpy(&pedid_blocks_buf[offset],1164pblock_buf,1165MAX_DPCD_BUFFER_SIZE);1166}11671168break;1169case 2:1170offset = 0x00;11711172for (j = 0; j < 8; j++) {1173edid_pos = (j + count * 8) *1174MAX_DPCD_BUFFER_SIZE;11751176if (g_edid_break == 1)1177break;11781179ret = segments_edid_read(ctx, count / 2,1180pblock_buf, offset);1181if (ret < 0)1182return ret;11831184memcpy(&pedid_blocks_buf[edid_pos],1185pblock_buf,1186MAX_DPCD_BUFFER_SIZE);1187offset = offset + 0x10;1188}11891190break;1191case 3:1192offset = 0x80;11931194for (j = 0; j < 8; j++) {1195edid_pos = (j + count * 8) *1196MAX_DPCD_BUFFER_SIZE;1197if (g_edid_break == 1)1198break;11991200ret = segments_edid_read(ctx, count / 2,1201pblock_buf, offset);1202if (ret < 0)1203return ret;12041205memcpy(&pedid_blocks_buf[edid_pos],1206pblock_buf,1207MAX_DPCD_BUFFER_SIZE);1208offset = offset + 0x10;1209}12101211break;1212default:1213break;1214}12151216count++;12171218} while (blocks_num >= count);12191220/* Check edid data */1221if (!drm_edid_is_valid((struct edid *)pedid_blocks_buf)) {1222DRM_DEV_ERROR(dev, "WARNING! edid check fail!\n");1223return -EINVAL;1224}12251226/* Reset aux channel */1227ret = sp_tx_rst_aux(ctx);1228if (ret < 0) {1229DRM_DEV_ERROR(dev, "Failed to reset aux channel!\n");1230return ret;1231}12321233return (blocks_num + 1);1234}12351236static void anx7625_power_on(struct anx7625_data *ctx)1237{1238struct device *dev = ctx->dev;1239int ret, i;12401241if (!ctx->pdata.low_power_mode) {1242DRM_DEV_DEBUG_DRIVER(dev, "not low power mode!\n");1243return;1244}12451246for (i = 0; i < ARRAY_SIZE(ctx->pdata.supplies); i++) {1247ret = regulator_enable(ctx->pdata.supplies[i].consumer);1248if (ret < 0) {1249DRM_DEV_DEBUG_DRIVER(dev, "cannot enable supply %d: %d\n",1250i, ret);1251goto reg_err;1252}1253usleep_range(2000, 2100);1254}12551256usleep_range(11000, 12000);12571258/* Power on pin enable */1259gpiod_set_value_cansleep(ctx->pdata.gpio_p_on, 1);1260usleep_range(10000, 11000);1261/* Power reset pin enable */1262gpiod_set_value_cansleep(ctx->pdata.gpio_reset, 1);1263usleep_range(10000, 11000);12641265DRM_DEV_DEBUG_DRIVER(dev, "power on !\n");1266return;1267reg_err:1268for (--i; i >= 0; i--)1269regulator_disable(ctx->pdata.supplies[i].consumer);1270}12711272static void anx7625_power_standby(struct anx7625_data *ctx)1273{1274struct device *dev = ctx->dev;1275int ret;12761277if (!ctx->pdata.low_power_mode) {1278DRM_DEV_DEBUG_DRIVER(dev, "not low power mode!\n");1279return;1280}12811282gpiod_set_value_cansleep(ctx->pdata.gpio_reset, 0);1283usleep_range(1000, 1100);1284gpiod_set_value_cansleep(ctx->pdata.gpio_p_on, 0);1285usleep_range(1000, 1100);12861287ret = regulator_bulk_disable(ARRAY_SIZE(ctx->pdata.supplies),1288ctx->pdata.supplies);1289if (ret < 0)1290DRM_DEV_DEBUG_DRIVER(dev, "cannot disable supplies %d\n", ret);12911292DRM_DEV_DEBUG_DRIVER(dev, "power down\n");1293}12941295/* Basic configurations of ANX7625 */1296static void anx7625_config(struct anx7625_data *ctx)1297{1298anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,1299XTAL_FRQ_SEL, XTAL_FRQ_27M);1300}13011302static int anx7625_hpd_timer_config(struct anx7625_data *ctx)1303{1304int ret;13051306/* Set irq detect window to 2ms */1307ret = anx7625_reg_write(ctx, ctx->i2c.tx_p2_client,1308HPD_DET_TIMER_BIT0_7, HPD_TIME & 0xFF);1309ret |= anx7625_reg_write(ctx, ctx->i2c.tx_p2_client,1310HPD_DET_TIMER_BIT8_15,1311(HPD_TIME >> 8) & 0xFF);1312ret |= anx7625_reg_write(ctx, ctx->i2c.tx_p2_client,1313HPD_DET_TIMER_BIT16_23,1314(HPD_TIME >> 16) & 0xFF);13151316return ret;1317}13181319static int anx7625_read_hpd_gpio_config_status(struct anx7625_data *ctx)1320{1321return anx7625_reg_read(ctx, ctx->i2c.rx_p0_client, GPIO_CTRL_2);1322}13231324static void anx7625_disable_pd_protocol(struct anx7625_data *ctx)1325{1326struct device *dev = ctx->dev;1327int ret, val;13281329/* Reset main ocm */1330ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client, 0x88, 0x40);1331/* Disable PD */1332ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,1333AP_AV_STATUS, AP_DISABLE_PD);1334/* Release main ocm */1335ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client, 0x88, 0x00);13361337if (ret < 0)1338DRM_DEV_DEBUG_DRIVER(dev, "disable PD feature fail.\n");1339else1340DRM_DEV_DEBUG_DRIVER(dev, "disable PD feature succeeded.\n");13411342/*1343* Make sure the HPD GPIO already be configured after OCM release before1344* setting HPD detect window register. Here we poll the status register1345* at maximum 40ms, then config HPD irq detect window register1346*/1347readx_poll_timeout(anx7625_read_hpd_gpio_config_status,1348ctx, val,1349((val & HPD_SOURCE) || (val < 0)),13502000, 2000 * 20);13511352/* Set HPD irq detect window to 2ms */1353anx7625_hpd_timer_config(ctx);1354}13551356static int anx7625_ocm_loading_check(struct anx7625_data *ctx)1357{1358int ret;1359struct device *dev = ctx->dev;13601361/* Check interface workable */1362ret = anx7625_reg_read(ctx, ctx->i2c.rx_p0_client,1363FLASH_LOAD_STA);1364if (ret < 0) {1365DRM_DEV_ERROR(dev, "IO error : access flash load.\n");1366return ret;1367}1368if ((ret & FLASH_LOAD_STA_CHK) != FLASH_LOAD_STA_CHK)1369return -ENODEV;13701371anx7625_disable_pd_protocol(ctx);13721373DRM_DEV_DEBUG_DRIVER(dev, "Firmware ver %02x%02x,",1374anx7625_reg_read(ctx,1375ctx->i2c.rx_p0_client,1376OCM_FW_VERSION),1377anx7625_reg_read(ctx,1378ctx->i2c.rx_p0_client,1379OCM_FW_REVERSION));1380DRM_DEV_DEBUG_DRIVER(dev, "Driver version %s\n",1381ANX7625_DRV_VERSION);13821383return 0;1384}13851386static void anx7625_power_on_init(struct anx7625_data *ctx)1387{1388int retry_count, i;13891390for (retry_count = 0; retry_count < 3; retry_count++) {1391anx7625_power_on(ctx);1392anx7625_config(ctx);13931394for (i = 0; i < OCM_LOADING_TIME; i++) {1395if (!anx7625_ocm_loading_check(ctx))1396return;1397usleep_range(1000, 1100);1398}1399anx7625_power_standby(ctx);1400}1401}14021403static void anx7625_init_gpio(struct anx7625_data *platform)1404{1405struct device *dev = platform->dev;14061407DRM_DEV_DEBUG_DRIVER(dev, "init gpio\n");14081409/* Gpio for chip power enable */1410platform->pdata.gpio_p_on =1411devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_LOW);1412if (IS_ERR_OR_NULL(platform->pdata.gpio_p_on)) {1413DRM_DEV_DEBUG_DRIVER(dev, "no enable gpio found\n");1414platform->pdata.gpio_p_on = NULL;1415}14161417/* Gpio for chip reset */1418platform->pdata.gpio_reset =1419devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);1420if (IS_ERR_OR_NULL(platform->pdata.gpio_reset)) {1421DRM_DEV_DEBUG_DRIVER(dev, "no reset gpio found\n");1422platform->pdata.gpio_reset = NULL;1423}14241425if (platform->pdata.gpio_p_on && platform->pdata.gpio_reset) {1426platform->pdata.low_power_mode = 1;1427DRM_DEV_DEBUG_DRIVER(dev, "low power mode, pon %d, reset %d.\n",1428desc_to_gpio(platform->pdata.gpio_p_on),1429desc_to_gpio(platform->pdata.gpio_reset));1430} else {1431platform->pdata.low_power_mode = 0;1432DRM_DEV_DEBUG_DRIVER(dev, "not low power mode.\n");1433}1434}14351436static void anx7625_stop_dp_work(struct anx7625_data *ctx)1437{1438ctx->hpd_status = 0;1439ctx->hpd_high_cnt = 0;1440}14411442static void anx7625_start_dp_work(struct anx7625_data *ctx)1443{1444int ret;1445struct device *dev = ctx->dev;14461447if (ctx->hpd_high_cnt >= 2) {1448DRM_DEV_DEBUG_DRIVER(dev, "filter useless HPD\n");1449return;1450}14511452ctx->hpd_status = 1;1453ctx->hpd_high_cnt++;14541455/* Not support HDCP */1456ret = anx7625_write_and(ctx, ctx->i2c.rx_p1_client, 0xee, 0x9f);14571458/* Try auth flag */1459ret |= anx7625_write_or(ctx, ctx->i2c.rx_p1_client, 0xec, 0x10);1460/* Interrupt for DRM */1461ret |= anx7625_write_or(ctx, ctx->i2c.rx_p1_client, 0xff, 0x01);1462if (ret < 0) {1463DRM_DEV_ERROR(dev, "fail to setting HDCP/auth\n");1464return;1465}14661467ret = anx7625_reg_read(ctx, ctx->i2c.rx_p1_client, 0x86);1468if (ret < 0)1469return;14701471DRM_DEV_DEBUG_DRIVER(dev, "Secure OCM version=%02x\n", ret);1472}14731474static int anx7625_read_hpd_status_p0(struct anx7625_data *ctx)1475{1476return anx7625_reg_read(ctx, ctx->i2c.rx_p0_client, SYSTEM_STSTUS);1477}14781479static int _anx7625_hpd_polling(struct anx7625_data *ctx,1480unsigned long wait_us)1481{1482int ret, val;1483struct device *dev = ctx->dev;14841485/* Interrupt mode, no need poll HPD status, just return */1486if (ctx->pdata.intp_irq)1487return 0;14881489ret = readx_poll_timeout(anx7625_read_hpd_status_p0,1490ctx, val,1491((val & HPD_STATUS) || (val < 0)),1492wait_us / 100,1493wait_us);1494if (ret) {1495DRM_DEV_ERROR(dev, "no hpd.\n");1496return ret;1497}14981499DRM_DEV_DEBUG_DRIVER(dev, "system status: 0x%x. HPD raise up.\n", val);1500anx7625_reg_write(ctx, ctx->i2c.tcpc_client,1501INTR_ALERT_1, 0xFF);1502anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,1503INTERFACE_CHANGE_INT, 0);15041505anx7625_start_dp_work(ctx);15061507if (!ctx->pdata.panel_bridge && ctx->bridge_attached)1508drm_helper_hpd_irq_event(ctx->bridge.dev);15091510return 0;1511}15121513static int anx7625_wait_hpd_asserted(struct drm_dp_aux *aux,1514unsigned long wait_us)1515{1516struct anx7625_data *ctx = container_of(aux, struct anx7625_data, aux);1517struct device *dev = ctx->dev;1518int ret;15191520pm_runtime_get_sync(dev);1521ret = _anx7625_hpd_polling(ctx, wait_us);1522pm_runtime_mark_last_busy(dev);1523pm_runtime_put_autosuspend(dev);15241525return ret;1526}15271528static void anx7625_remove_edid(struct anx7625_data *ctx)1529{1530drm_edid_free(ctx->cached_drm_edid);1531ctx->cached_drm_edid = NULL;1532}15331534static void anx7625_dp_adjust_swing(struct anx7625_data *ctx)1535{1536int i;15371538for (i = 0; i < ctx->pdata.dp_lane0_swing_reg_cnt; i++)1539anx7625_reg_write(ctx, ctx->i2c.tx_p1_client,1540DP_TX_LANE0_SWING_REG0 + i,1541ctx->pdata.lane0_reg_data[i]);15421543for (i = 0; i < ctx->pdata.dp_lane1_swing_reg_cnt; i++)1544anx7625_reg_write(ctx, ctx->i2c.tx_p1_client,1545DP_TX_LANE1_SWING_REG0 + i,1546ctx->pdata.lane1_reg_data[i]);1547}15481549static void dp_hpd_change_handler(struct anx7625_data *ctx, bool on)1550{1551struct device *dev = ctx->dev;15521553/* HPD changed */1554DRM_DEV_DEBUG_DRIVER(dev, "dp_hpd_change_default_func: %d\n",1555(u32)on);15561557if (on == 0) {1558DRM_DEV_DEBUG_DRIVER(dev, " HPD low\n");1559anx7625_remove_edid(ctx);1560anx7625_stop_dp_work(ctx);1561} else {1562DRM_DEV_DEBUG_DRIVER(dev, " HPD high\n");1563anx7625_start_dp_work(ctx);1564anx7625_dp_adjust_swing(ctx);1565}1566}15671568static int anx7625_hpd_change_detect(struct anx7625_data *ctx)1569{1570int intr_vector, status;1571struct device *dev = ctx->dev;15721573status = anx7625_reg_write(ctx, ctx->i2c.tcpc_client,1574INTR_ALERT_1, 0xFF);1575if (status < 0) {1576DRM_DEV_ERROR(dev, "cannot clear alert reg.\n");1577return status;1578}15791580intr_vector = anx7625_reg_read(ctx, ctx->i2c.rx_p0_client,1581INTERFACE_CHANGE_INT);1582if (intr_vector < 0) {1583DRM_DEV_ERROR(dev, "cannot access interrupt change reg.\n");1584return intr_vector;1585}1586DRM_DEV_DEBUG_DRIVER(dev, "0x7e:0x44=%x\n", intr_vector);1587status = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client,1588INTERFACE_CHANGE_INT,1589intr_vector & (~intr_vector));1590if (status < 0) {1591DRM_DEV_ERROR(dev, "cannot clear interrupt change reg.\n");1592return status;1593}15941595if (!(intr_vector & HPD_STATUS_CHANGE))1596return -ENOENT;15971598status = anx7625_reg_read(ctx, ctx->i2c.rx_p0_client,1599SYSTEM_STSTUS);1600if (status < 0) {1601DRM_DEV_ERROR(dev, "cannot clear interrupt status.\n");1602return status;1603}16041605DRM_DEV_DEBUG_DRIVER(dev, "0x7e:0x45=%x\n", status);1606dp_hpd_change_handler(ctx, status & HPD_STATUS);16071608return 0;1609}16101611static void anx7625_work_func(struct work_struct *work)1612{1613int event;1614struct anx7625_data *ctx = container_of(work,1615struct anx7625_data, work);16161617mutex_lock(&ctx->lock);16181619if (pm_runtime_suspended(ctx->dev)) {1620mutex_unlock(&ctx->lock);1621return;1622}16231624event = anx7625_hpd_change_detect(ctx);16251626mutex_unlock(&ctx->lock);16271628if (event < 0)1629return;16301631if (ctx->bridge_attached)1632drm_helper_hpd_irq_event(ctx->bridge.dev);1633}16341635static irqreturn_t anx7625_intr_hpd_isr(int irq, void *data)1636{1637struct anx7625_data *ctx = (struct anx7625_data *)data;16381639queue_work(ctx->workqueue, &ctx->work);16401641return IRQ_HANDLED;1642}16431644static int anx7625_get_swing_setting(struct device *dev,1645struct anx7625_platform_data *pdata)1646{1647int num_regs;16481649num_regs = of_property_read_variable_u8_array(dev->of_node, "analogix,lane0-swing",1650pdata->lane0_reg_data, 1, DP_TX_SWING_REG_CNT);1651if (num_regs > 0)1652pdata->dp_lane0_swing_reg_cnt = num_regs;16531654num_regs = of_property_read_variable_u8_array(dev->of_node, "analogix,lane1-swing",1655pdata->lane1_reg_data, 1, DP_TX_SWING_REG_CNT);1656if (num_regs > 0)1657pdata->dp_lane1_swing_reg_cnt = num_regs;16581659return 0;1660}16611662static int anx7625_parse_dt(struct device *dev,1663struct anx7625_platform_data *pdata)1664{1665struct device_node *np = dev->of_node, *ep0;1666int bus_type, mipi_lanes;16671668anx7625_get_swing_setting(dev, pdata);16691670pdata->is_dpi = 0; /* default dsi mode */1671of_node_put(pdata->mipi_host_node);1672pdata->mipi_host_node = of_graph_get_remote_node(np, 0, 0);1673if (!pdata->mipi_host_node) {1674DRM_DEV_ERROR(dev, "fail to get internal panel.\n");1675return -ENODEV;1676}16771678bus_type = 0;1679mipi_lanes = MAX_LANES_SUPPORT;1680ep0 = of_graph_get_endpoint_by_regs(np, 0, 0);1681if (ep0) {1682if (of_property_read_u32(ep0, "bus-type", &bus_type))1683bus_type = 0;16841685mipi_lanes = drm_of_get_data_lanes_count(ep0, 1, MAX_LANES_SUPPORT);1686of_node_put(ep0);1687}16881689if (bus_type == V4L2_FWNODE_BUS_TYPE_DPI) /* bus type is DPI */1690pdata->is_dpi = 1;16911692pdata->mipi_lanes = MAX_LANES_SUPPORT;1693if (mipi_lanes > 0)1694pdata->mipi_lanes = mipi_lanes;16951696if (pdata->is_dpi)1697DRM_DEV_DEBUG_DRIVER(dev, "found MIPI DPI host node.\n");1698else1699DRM_DEV_DEBUG_DRIVER(dev, "found MIPI DSI host node.\n");17001701if (of_property_read_bool(np, "analogix,audio-enable"))1702pdata->audio_en = 1;17031704return 0;1705}17061707static int anx7625_parse_dt_panel(struct device *dev,1708struct anx7625_platform_data *pdata)1709{1710struct device_node *np = dev->of_node;17111712pdata->panel_bridge = devm_drm_of_get_bridge(dev, np, 1, 0);1713if (IS_ERR(pdata->panel_bridge)) {1714if (PTR_ERR(pdata->panel_bridge) == -ENODEV) {1715pdata->panel_bridge = NULL;1716return 0;1717}17181719return PTR_ERR(pdata->panel_bridge);1720}17211722DRM_DEV_DEBUG_DRIVER(dev, "get panel node.\n");17231724return 0;1725}17261727static bool anx7625_of_panel_on_aux_bus(struct device *dev)1728{1729struct device_node *bus, *panel;17301731bus = of_get_child_by_name(dev->of_node, "aux-bus");1732if (!bus)1733return false;17341735panel = of_get_child_by_name(bus, "panel");1736of_node_put(bus);1737if (!panel)1738return false;1739of_node_put(panel);17401741return true;1742}17431744static inline struct anx7625_data *bridge_to_anx7625(struct drm_bridge *bridge)1745{1746return container_of(bridge, struct anx7625_data, bridge);1747}17481749static ssize_t anx7625_aux_transfer(struct drm_dp_aux *aux,1750struct drm_dp_aux_msg *msg)1751{1752struct anx7625_data *ctx = container_of(aux, struct anx7625_data, aux);1753struct device *dev = ctx->dev;1754u8 request = msg->request & ~DP_AUX_I2C_MOT;1755int ret = 0;17561757mutex_lock(&ctx->aux_lock);1758pm_runtime_get_sync(dev);1759msg->reply = 0;1760switch (request) {1761case DP_AUX_NATIVE_WRITE:1762case DP_AUX_I2C_WRITE:1763case DP_AUX_NATIVE_READ:1764case DP_AUX_I2C_READ:1765break;1766default:1767ret = -EINVAL;1768}1769if (!ret)1770ret = anx7625_aux_trans(ctx, msg->request, msg->address,1771msg->size, msg->buffer);1772pm_runtime_mark_last_busy(dev);1773pm_runtime_put_autosuspend(dev);1774mutex_unlock(&ctx->aux_lock);17751776return ret;1777}17781779static const struct drm_edid *anx7625_edid_read(struct anx7625_data *ctx)1780{1781struct device *dev = ctx->dev;1782u8 *edid_buf;1783int edid_num;17841785if (ctx->cached_drm_edid)1786goto out;17871788edid_buf = kmalloc(FOUR_BLOCK_SIZE, GFP_KERNEL);1789if (!edid_buf)1790return NULL;17911792pm_runtime_get_sync(dev);1793_anx7625_hpd_polling(ctx, 5000 * 100);1794edid_num = sp_tx_edid_read(ctx, edid_buf);1795pm_runtime_put_sync(dev);17961797if (edid_num < 1) {1798DRM_DEV_ERROR(dev, "Fail to read EDID: %d\n", edid_num);1799kfree(edid_buf);1800return NULL;1801}18021803ctx->cached_drm_edid = drm_edid_alloc(edid_buf, FOUR_BLOCK_SIZE);1804kfree(edid_buf);18051806out:1807return drm_edid_dup(ctx->cached_drm_edid);1808}18091810static enum drm_connector_status anx7625_sink_detect(struct anx7625_data *ctx)1811{1812struct device *dev = ctx->dev;18131814DRM_DEV_DEBUG_DRIVER(dev, "sink detect\n");18151816return ctx->hpd_status ? connector_status_connected :1817connector_status_disconnected;1818}18191820static int anx7625_audio_hw_params(struct device *dev, void *data,1821struct hdmi_codec_daifmt *fmt,1822struct hdmi_codec_params *params)1823{1824struct anx7625_data *ctx = dev_get_drvdata(dev);1825int wl, ch, rate;1826int ret = 0;18271828if (anx7625_sink_detect(ctx) == connector_status_disconnected) {1829DRM_DEV_DEBUG_DRIVER(dev, "DP not connected\n");1830return 0;1831}18321833if (fmt->fmt != HDMI_DSP_A && fmt->fmt != HDMI_I2S) {1834DRM_DEV_ERROR(dev, "only supports DSP_A & I2S\n");1835return -EINVAL;1836}18371838DRM_DEV_DEBUG_DRIVER(dev, "setting %d Hz, %d bit, %d channels\n",1839params->sample_rate, params->sample_width,1840params->cea.channels);18411842if (fmt->fmt == HDMI_DSP_A)1843ret = anx7625_write_and_or(ctx, ctx->i2c.tx_p2_client,1844AUDIO_CHANNEL_STATUS_6,1845~I2S_SLAVE_MODE,1846TDM_SLAVE_MODE);1847else1848ret = anx7625_write_and_or(ctx, ctx->i2c.tx_p2_client,1849AUDIO_CHANNEL_STATUS_6,1850~TDM_SLAVE_MODE,1851I2S_SLAVE_MODE);18521853/* Word length */1854switch (params->sample_width) {1855case 16:1856wl = AUDIO_W_LEN_16_20MAX;1857break;1858case 18:1859wl = AUDIO_W_LEN_18_20MAX;1860break;1861case 20:1862wl = AUDIO_W_LEN_20_20MAX;1863break;1864case 24:1865wl = AUDIO_W_LEN_24_24MAX;1866break;1867default:1868DRM_DEV_DEBUG_DRIVER(dev, "wordlength: %d bit not support",1869params->sample_width);1870return -EINVAL;1871}1872ret |= anx7625_write_and_or(ctx, ctx->i2c.tx_p2_client,1873AUDIO_CHANNEL_STATUS_5,18740xf0, wl);18751876/* Channel num */1877switch (params->cea.channels) {1878case 2:1879ch = I2S_CH_2;1880break;1881case 4:1882ch = TDM_CH_4;1883break;1884case 6:1885ch = TDM_CH_6;1886break;1887case 8:1888ch = TDM_CH_8;1889break;1890default:1891DRM_DEV_DEBUG_DRIVER(dev, "channel number: %d not support",1892params->cea.channels);1893return -EINVAL;1894}1895ret |= anx7625_write_and_or(ctx, ctx->i2c.tx_p2_client,1896AUDIO_CHANNEL_STATUS_6, 0x1f, ch << 5);1897if (ch > I2S_CH_2)1898ret |= anx7625_write_or(ctx, ctx->i2c.tx_p2_client,1899AUDIO_CHANNEL_STATUS_6, AUDIO_LAYOUT);1900else1901ret |= anx7625_write_and(ctx, ctx->i2c.tx_p2_client,1902AUDIO_CHANNEL_STATUS_6, ~AUDIO_LAYOUT);19031904/* FS */1905switch (params->sample_rate) {1906case 32000:1907rate = AUDIO_FS_32K;1908break;1909case 44100:1910rate = AUDIO_FS_441K;1911break;1912case 48000:1913rate = AUDIO_FS_48K;1914break;1915case 88200:1916rate = AUDIO_FS_882K;1917break;1918case 96000:1919rate = AUDIO_FS_96K;1920break;1921case 176400:1922rate = AUDIO_FS_1764K;1923break;1924case 192000:1925rate = AUDIO_FS_192K;1926break;1927default:1928DRM_DEV_DEBUG_DRIVER(dev, "sample rate: %d not support",1929params->sample_rate);1930return -EINVAL;1931}1932ret |= anx7625_write_and_or(ctx, ctx->i2c.tx_p2_client,1933AUDIO_CHANNEL_STATUS_4,19340xf0, rate);1935ret |= anx7625_write_or(ctx, ctx->i2c.rx_p0_client,1936AP_AV_STATUS, AP_AUDIO_CHG);1937if (ret < 0) {1938DRM_DEV_ERROR(dev, "IO error : config audio.\n");1939return -EIO;1940}19411942return 0;1943}19441945static void anx7625_audio_shutdown(struct device *dev, void *data)1946{1947DRM_DEV_DEBUG_DRIVER(dev, "stop audio\n");1948}19491950static int anx7625_hdmi_i2s_get_dai_id(struct snd_soc_component *component,1951struct device_node *endpoint,1952void *data)1953{1954struct of_endpoint of_ep;1955int ret;19561957ret = of_graph_parse_endpoint(endpoint, &of_ep);1958if (ret < 0)1959return ret;19601961/*1962* HDMI sound should be located at external DPI port1963* Didn't have good way to check where is internal(DSI)1964* or external(DPI) bridge1965*/1966return 0;1967}19681969static void1970anx7625_audio_update_connector_status(struct anx7625_data *ctx,1971enum drm_connector_status status)1972{1973if (ctx->plugged_cb && ctx->codec_dev) {1974ctx->plugged_cb(ctx->codec_dev,1975status == connector_status_connected);1976}1977}19781979static int anx7625_audio_hook_plugged_cb(struct device *dev, void *data,1980hdmi_codec_plugged_cb fn,1981struct device *codec_dev)1982{1983struct anx7625_data *ctx = data;19841985ctx->plugged_cb = fn;1986ctx->codec_dev = codec_dev;1987anx7625_audio_update_connector_status(ctx, anx7625_sink_detect(ctx));19881989return 0;1990}19911992static int anx7625_audio_get_eld(struct device *dev, void *data,1993u8 *buf, size_t len)1994{1995struct anx7625_data *ctx = dev_get_drvdata(dev);19961997if (!ctx->connector) {1998/* Pass en empty ELD if connector not available */1999memset(buf, 0, len);2000} else {2001dev_dbg(dev, "audio copy eld\n");2002mutex_lock(&ctx->connector->eld_mutex);2003memcpy(buf, ctx->connector->eld,2004min(sizeof(ctx->connector->eld), len));2005mutex_unlock(&ctx->connector->eld_mutex);2006}20072008return 0;2009}20102011static const struct hdmi_codec_ops anx7625_codec_ops = {2012.hw_params = anx7625_audio_hw_params,2013.audio_shutdown = anx7625_audio_shutdown,2014.get_eld = anx7625_audio_get_eld,2015.get_dai_id = anx7625_hdmi_i2s_get_dai_id,2016.hook_plugged_cb = anx7625_audio_hook_plugged_cb,2017};20182019static void anx7625_unregister_audio(struct anx7625_data *ctx)2020{2021struct device *dev = ctx->dev;20222023if (ctx->audio_pdev) {2024platform_device_unregister(ctx->audio_pdev);2025ctx->audio_pdev = NULL;2026}20272028DRM_DEV_DEBUG_DRIVER(dev, "unbound to %s", HDMI_CODEC_DRV_NAME);2029}20302031static int anx7625_register_audio(struct device *dev, struct anx7625_data *ctx)2032{2033struct hdmi_codec_pdata codec_data = {2034.ops = &anx7625_codec_ops,2035.max_i2s_channels = 8,2036.i2s = 1,2037.data = ctx,2038};20392040ctx->audio_pdev = platform_device_register_data(dev,2041HDMI_CODEC_DRV_NAME,2042PLATFORM_DEVID_AUTO,2043&codec_data,2044sizeof(codec_data));20452046if (IS_ERR(ctx->audio_pdev))2047return PTR_ERR(ctx->audio_pdev);20482049DRM_DEV_DEBUG_DRIVER(dev, "bound to %s", HDMI_CODEC_DRV_NAME);20502051return 0;2052}20532054static int anx7625_setup_dsi_device(struct anx7625_data *ctx)2055{2056struct mipi_dsi_device *dsi;2057struct device *dev = ctx->dev;2058struct mipi_dsi_host *host;2059const struct mipi_dsi_device_info info = {2060.type = "anx7625",2061.channel = 0,2062.node = NULL,2063};20642065host = of_find_mipi_dsi_host_by_node(ctx->pdata.mipi_host_node);2066if (!host)2067return dev_err_probe(dev, -EPROBE_DEFER, "fail to find dsi host.\n");20682069dsi = devm_mipi_dsi_device_register_full(dev, host, &info);2070if (IS_ERR(dsi)) {2071DRM_DEV_ERROR(dev, "fail to create dsi device.\n");2072return -EINVAL;2073}20742075dsi->lanes = ctx->pdata.mipi_lanes;2076dsi->format = MIPI_DSI_FMT_RGB888;2077dsi->mode_flags = MIPI_DSI_MODE_VIDEO |2078MIPI_DSI_MODE_VIDEO_SYNC_PULSE |2079MIPI_DSI_MODE_VIDEO_HSE |2080MIPI_DSI_HS_PKT_END_ALIGNED;20812082ctx->dsi = dsi;20832084return 0;2085}20862087static int anx7625_attach_dsi(struct anx7625_data *ctx)2088{2089struct device *dev = ctx->dev;2090int ret;20912092DRM_DEV_DEBUG_DRIVER(dev, "attach dsi\n");20932094ret = devm_mipi_dsi_attach(dev, ctx->dsi);2095if (ret) {2096DRM_DEV_ERROR(dev, "fail to attach dsi to host.\n");2097return ret;2098}20992100DRM_DEV_DEBUG_DRIVER(dev, "attach dsi succeeded.\n");21012102return 0;2103}21042105static void hdcp_check_work_func(struct work_struct *work)2106{2107u8 status;2108struct delayed_work *dwork;2109struct anx7625_data *ctx;2110struct device *dev;2111struct drm_device *drm_dev;21122113dwork = to_delayed_work(work);2114ctx = container_of(dwork, struct anx7625_data, hdcp_work);2115dev = ctx->dev;21162117if (!ctx->connector) {2118dev_err(dev, "HDCP connector is null!");2119return;2120}21212122drm_dev = ctx->connector->dev;2123drm_modeset_lock(&drm_dev->mode_config.connection_mutex, NULL);2124mutex_lock(&ctx->hdcp_wq_lock);21252126status = anx7625_reg_read(ctx, ctx->i2c.tx_p0_client, 0);2127dev_dbg(dev, "sink HDCP status check: %.02x\n", status);2128if (status & BIT(1)) {2129ctx->hdcp_cp = DRM_MODE_CONTENT_PROTECTION_ENABLED;2130drm_hdcp_update_content_protection(ctx->connector,2131ctx->hdcp_cp);2132dev_dbg(dev, "update CP to ENABLE\n");2133}21342135mutex_unlock(&ctx->hdcp_wq_lock);2136drm_modeset_unlock(&drm_dev->mode_config.connection_mutex);2137}21382139static int anx7625_bridge_attach(struct drm_bridge *bridge,2140struct drm_encoder *encoder,2141enum drm_bridge_attach_flags flags)2142{2143struct anx7625_data *ctx = bridge_to_anx7625(bridge);2144int err;2145struct device *dev = ctx->dev;21462147DRM_DEV_DEBUG_DRIVER(dev, "drm attach\n");2148if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR))2149return -EINVAL;21502151ctx->aux.drm_dev = bridge->dev;2152err = drm_dp_aux_register(&ctx->aux);2153if (err) {2154dev_err(dev, "failed to register aux channel: %d\n", err);2155return err;2156}21572158if (ctx->pdata.panel_bridge) {2159err = drm_bridge_attach(encoder,2160ctx->pdata.panel_bridge,2161&ctx->bridge, flags);2162if (err)2163return err;2164}21652166ctx->bridge_attached = 1;21672168return 0;2169}21702171static void anx7625_bridge_detach(struct drm_bridge *bridge)2172{2173struct anx7625_data *ctx = bridge_to_anx7625(bridge);21742175drm_dp_aux_unregister(&ctx->aux);2176}21772178static enum drm_mode_status2179anx7625_bridge_mode_valid(struct drm_bridge *bridge,2180const struct drm_display_info *info,2181const struct drm_display_mode *mode)2182{2183struct anx7625_data *ctx = bridge_to_anx7625(bridge);2184struct device *dev = ctx->dev;21852186DRM_DEV_DEBUG_DRIVER(dev, "drm mode checking\n");21872188/* Max 1200p at 5.4 Ghz, one lane, pixel clock 300M */2189if (mode->clock > SUPPORT_PIXEL_CLOCK) {2190DRM_DEV_DEBUG_DRIVER(dev,2191"drm mode invalid, pixelclock too high.\n");2192return MODE_CLOCK_HIGH;2193}21942195DRM_DEV_DEBUG_DRIVER(dev, "drm mode valid.\n");21962197return MODE_OK;2198}21992200static void anx7625_bridge_mode_set(struct drm_bridge *bridge,2201const struct drm_display_mode *old_mode,2202const struct drm_display_mode *mode)2203{2204struct anx7625_data *ctx = bridge_to_anx7625(bridge);2205struct device *dev = ctx->dev;22062207DRM_DEV_DEBUG_DRIVER(dev, "drm mode set\n");22082209ctx->dt.pixelclock.min = mode->clock;2210ctx->dt.hactive.min = mode->hdisplay;2211ctx->dt.hsync_len.min = mode->hsync_end - mode->hsync_start;2212ctx->dt.hfront_porch.min = mode->hsync_start - mode->hdisplay;2213ctx->dt.hback_porch.min = mode->htotal - mode->hsync_end;2214ctx->dt.vactive.min = mode->vdisplay;2215ctx->dt.vsync_len.min = mode->vsync_end - mode->vsync_start;2216ctx->dt.vfront_porch.min = mode->vsync_start - mode->vdisplay;2217ctx->dt.vback_porch.min = mode->vtotal - mode->vsync_end;22182219ctx->display_timing_valid = 1;22202221DRM_DEV_DEBUG_DRIVER(dev, "pixelclock(%d).\n", ctx->dt.pixelclock.min);2222DRM_DEV_DEBUG_DRIVER(dev, "hactive(%d), hsync(%d), hfp(%d), hbp(%d)\n",2223ctx->dt.hactive.min,2224ctx->dt.hsync_len.min,2225ctx->dt.hfront_porch.min,2226ctx->dt.hback_porch.min);2227DRM_DEV_DEBUG_DRIVER(dev, "vactive(%d), vsync(%d), vfp(%d), vbp(%d)\n",2228ctx->dt.vactive.min,2229ctx->dt.vsync_len.min,2230ctx->dt.vfront_porch.min,2231ctx->dt.vback_porch.min);2232DRM_DEV_DEBUG_DRIVER(dev, "hdisplay(%d),hsync_start(%d).\n",2233mode->hdisplay,2234mode->hsync_start);2235DRM_DEV_DEBUG_DRIVER(dev, "hsync_end(%d),htotal(%d).\n",2236mode->hsync_end,2237mode->htotal);2238DRM_DEV_DEBUG_DRIVER(dev, "vdisplay(%d),vsync_start(%d).\n",2239mode->vdisplay,2240mode->vsync_start);2241DRM_DEV_DEBUG_DRIVER(dev, "vsync_end(%d),vtotal(%d).\n",2242mode->vsync_end,2243mode->vtotal);2244}22452246static bool anx7625_bridge_mode_fixup(struct drm_bridge *bridge,2247const struct drm_display_mode *mode,2248struct drm_display_mode *adj)2249{2250struct anx7625_data *ctx = bridge_to_anx7625(bridge);2251struct device *dev = ctx->dev;2252u32 hsync, hfp, hbp, hblanking;2253u32 adj_hsync, adj_hfp, adj_hbp, adj_hblanking, delta_adj;2254u32 vref, adj_clock;22552256DRM_DEV_DEBUG_DRIVER(dev, "drm mode fixup set\n");22572258/* No need fixup for external monitor */2259if (!ctx->pdata.panel_bridge)2260return true;22612262hsync = mode->hsync_end - mode->hsync_start;2263hfp = mode->hsync_start - mode->hdisplay;2264hbp = mode->htotal - mode->hsync_end;2265hblanking = mode->htotal - mode->hdisplay;22662267DRM_DEV_DEBUG_DRIVER(dev, "before mode fixup\n");2268DRM_DEV_DEBUG_DRIVER(dev, "hsync(%d), hfp(%d), hbp(%d), clock(%d)\n",2269hsync, hfp, hbp, adj->clock);2270DRM_DEV_DEBUG_DRIVER(dev, "hsync_start(%d), hsync_end(%d), htot(%d)\n",2271adj->hsync_start, adj->hsync_end, adj->htotal);22722273adj_hfp = hfp;2274adj_hsync = hsync;2275adj_hbp = hbp;2276adj_hblanking = hblanking;22772278/* HFP needs to be even */2279if (hfp & 0x1) {2280adj_hfp += 1;2281adj_hblanking += 1;2282}22832284/* HBP needs to be even */2285if (hbp & 0x1) {2286adj_hbp -= 1;2287adj_hblanking -= 1;2288}22892290/* HSYNC needs to be even */2291if (hsync & 0x1) {2292if (adj_hblanking < hblanking)2293adj_hsync += 1;2294else2295adj_hsync -= 1;2296}22972298/*2299* Once illegal timing detected, use default HFP, HSYNC, HBP2300* This adjusting made for built-in eDP panel, for the externel2301* DP monitor, may need return false.2302*/2303if (hblanking < HBLANKING_MIN || (hfp < HP_MIN && hbp < HP_MIN)) {2304adj_hsync = SYNC_LEN_DEF;2305adj_hfp = HFP_HBP_DEF;2306adj_hbp = HFP_HBP_DEF;2307vref = adj->clock * 1000 / (adj->htotal * adj->vtotal);2308if (hblanking < HBLANKING_MIN) {2309delta_adj = HBLANKING_MIN - hblanking;2310adj_clock = vref * delta_adj * adj->vtotal;2311adj->clock += DIV_ROUND_UP(adj_clock, 1000);2312} else {2313delta_adj = hblanking - HBLANKING_MIN;2314adj_clock = vref * delta_adj * adj->vtotal;2315adj->clock -= DIV_ROUND_UP(adj_clock, 1000);2316}23172318DRM_WARN("illegal hblanking timing, use default.\n");2319DRM_WARN("hfp(%d), hbp(%d), hsync(%d).\n", hfp, hbp, hsync);2320} else if (adj_hfp < HP_MIN) {2321/* Adjust hfp if hfp less than HP_MIN */2322delta_adj = HP_MIN - adj_hfp;2323adj_hfp = HP_MIN;23242325/*2326* Balance total HBlanking pixel, if HBP does not have enough2327* space, adjust HSYNC length, otherwise adjust HBP2328*/2329if ((adj_hbp - delta_adj) < HP_MIN)2330/* HBP not enough space */2331adj_hsync -= delta_adj;2332else2333adj_hbp -= delta_adj;2334} else if (adj_hbp < HP_MIN) {2335delta_adj = HP_MIN - adj_hbp;2336adj_hbp = HP_MIN;23372338/*2339* Balance total HBlanking pixel, if HBP hasn't enough space,2340* adjust HSYNC length, otherwize adjust HBP2341*/2342if ((adj_hfp - delta_adj) < HP_MIN)2343/* HFP not enough space */2344adj_hsync -= delta_adj;2345else2346adj_hfp -= delta_adj;2347}23482349DRM_DEV_DEBUG_DRIVER(dev, "after mode fixup\n");2350DRM_DEV_DEBUG_DRIVER(dev, "hsync(%d), hfp(%d), hbp(%d), clock(%d)\n",2351adj_hsync, adj_hfp, adj_hbp, adj->clock);23522353/* Reconstruct timing */2354adj->hsync_start = adj->hdisplay + adj_hfp;2355adj->hsync_end = adj->hsync_start + adj_hsync;2356adj->htotal = adj->hsync_end + adj_hbp;2357DRM_DEV_DEBUG_DRIVER(dev, "hsync_start(%d), hsync_end(%d), htot(%d)\n",2358adj->hsync_start, adj->hsync_end, adj->htotal);23592360return true;2361}23622363static int anx7625_bridge_atomic_check(struct drm_bridge *bridge,2364struct drm_bridge_state *bridge_state,2365struct drm_crtc_state *crtc_state,2366struct drm_connector_state *conn_state)2367{2368struct anx7625_data *ctx = bridge_to_anx7625(bridge);2369struct device *dev = ctx->dev;23702371dev_dbg(dev, "drm bridge atomic check\n");23722373anx7625_bridge_mode_fixup(bridge, &crtc_state->mode,2374&crtc_state->adjusted_mode);23752376return 0;2377}23782379static void anx7625_bridge_atomic_enable(struct drm_bridge *bridge,2380struct drm_atomic_state *state)2381{2382struct anx7625_data *ctx = bridge_to_anx7625(bridge);2383struct device *dev = ctx->dev;2384struct drm_connector *connector;2385struct drm_connector_state *conn_state;23862387dev_dbg(dev, "drm atomic enable\n");23882389connector = drm_atomic_get_new_connector_for_encoder(state,2390bridge->encoder);2391if (!connector)2392return;23932394ctx->connector = connector;23952396pm_runtime_get_sync(dev);2397_anx7625_hpd_polling(ctx, 5000 * 100);23982399anx7625_dp_start(ctx);24002401conn_state = drm_atomic_get_new_connector_state(state, connector);24022403if (WARN_ON(!conn_state))2404return;24052406if (conn_state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED) {2407if (ctx->dp_en) {2408dev_dbg(dev, "enable HDCP\n");2409anx7625_hdcp_enable(ctx);24102411queue_delayed_work(ctx->hdcp_workqueue,2412&ctx->hdcp_work,2413msecs_to_jiffies(2000));2414}2415}2416}24172418static void anx7625_bridge_atomic_disable(struct drm_bridge *bridge,2419struct drm_atomic_state *state)2420{2421struct anx7625_data *ctx = bridge_to_anx7625(bridge);2422struct device *dev = ctx->dev;24232424dev_dbg(dev, "drm atomic disable\n");24252426flush_workqueue(ctx->hdcp_workqueue);24272428if (ctx->connector &&2429ctx->hdcp_cp == DRM_MODE_CONTENT_PROTECTION_ENABLED) {2430anx7625_hdcp_disable(ctx);2431ctx->hdcp_cp = DRM_MODE_CONTENT_PROTECTION_DESIRED;2432drm_hdcp_update_content_protection(ctx->connector,2433ctx->hdcp_cp);2434dev_dbg(dev, "update CP to DESIRE\n");2435}24362437ctx->connector = NULL;2438anx7625_dp_stop(ctx);24392440mutex_lock(&ctx->aux_lock);2441pm_runtime_put_sync_suspend(dev);2442mutex_unlock(&ctx->aux_lock);2443}24442445static void2446anx7625_audio_update_connector_status(struct anx7625_data *ctx,2447enum drm_connector_status status);24482449static enum drm_connector_status2450anx7625_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)2451{2452struct anx7625_data *ctx = bridge_to_anx7625(bridge);2453struct device *dev = ctx->dev;2454enum drm_connector_status status;24552456DRM_DEV_DEBUG_DRIVER(dev, "drm bridge detect\n");24572458status = anx7625_sink_detect(ctx);2459anx7625_audio_update_connector_status(ctx, status);2460return status;2461}24622463static const struct drm_edid *anx7625_bridge_edid_read(struct drm_bridge *bridge,2464struct drm_connector *connector)2465{2466struct anx7625_data *ctx = bridge_to_anx7625(bridge);2467struct device *dev = ctx->dev;24682469DRM_DEV_DEBUG_DRIVER(dev, "drm bridge get edid\n");24702471return anx7625_edid_read(ctx);2472}24732474static void anx7625_bridge_hpd_enable(struct drm_bridge *bridge)2475{2476struct anx7625_data *ctx = bridge_to_anx7625(bridge);2477struct device *dev = ctx->dev;24782479pm_runtime_get_sync(dev);2480}24812482static void anx7625_bridge_hpd_disable(struct drm_bridge *bridge)2483{2484struct anx7625_data *ctx = bridge_to_anx7625(bridge);2485struct device *dev = ctx->dev;24862487pm_runtime_put_sync(dev);2488}24892490static const struct drm_bridge_funcs anx7625_bridge_funcs = {2491.attach = anx7625_bridge_attach,2492.detach = anx7625_bridge_detach,2493.mode_valid = anx7625_bridge_mode_valid,2494.mode_set = anx7625_bridge_mode_set,2495.atomic_check = anx7625_bridge_atomic_check,2496.atomic_enable = anx7625_bridge_atomic_enable,2497.atomic_disable = anx7625_bridge_atomic_disable,2498.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,2499.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,2500.atomic_reset = drm_atomic_helper_bridge_reset,2501.detect = anx7625_bridge_detect,2502.edid_read = anx7625_bridge_edid_read,2503.hpd_enable = anx7625_bridge_hpd_enable,2504.hpd_disable = anx7625_bridge_hpd_disable,2505};25062507static int anx7625_register_i2c_dummy_clients(struct anx7625_data *ctx,2508struct i2c_client *client)2509{2510struct device *dev = ctx->dev;25112512ctx->i2c.tx_p0_client = devm_i2c_new_dummy_device(dev, client->adapter,2513TX_P0_ADDR >> 1);2514if (IS_ERR(ctx->i2c.tx_p0_client))2515return PTR_ERR(ctx->i2c.tx_p0_client);25162517ctx->i2c.tx_p1_client = devm_i2c_new_dummy_device(dev, client->adapter,2518TX_P1_ADDR >> 1);2519if (IS_ERR(ctx->i2c.tx_p1_client))2520return PTR_ERR(ctx->i2c.tx_p1_client);25212522ctx->i2c.tx_p2_client = devm_i2c_new_dummy_device(dev, client->adapter,2523TX_P2_ADDR >> 1);2524if (IS_ERR(ctx->i2c.tx_p2_client))2525return PTR_ERR(ctx->i2c.tx_p2_client);25262527ctx->i2c.rx_p0_client = devm_i2c_new_dummy_device(dev, client->adapter,2528RX_P0_ADDR >> 1);2529if (IS_ERR(ctx->i2c.rx_p0_client))2530return PTR_ERR(ctx->i2c.rx_p0_client);25312532ctx->i2c.rx_p1_client = devm_i2c_new_dummy_device(dev, client->adapter,2533RX_P1_ADDR >> 1);2534if (IS_ERR(ctx->i2c.rx_p1_client))2535return PTR_ERR(ctx->i2c.rx_p1_client);25362537ctx->i2c.rx_p2_client = devm_i2c_new_dummy_device(dev, client->adapter,2538RX_P2_ADDR >> 1);2539if (IS_ERR(ctx->i2c.rx_p2_client))2540return PTR_ERR(ctx->i2c.rx_p2_client);25412542ctx->i2c.tcpc_client = devm_i2c_new_dummy_device(dev, client->adapter,2543TCPC_INTERFACE_ADDR >> 1);2544if (IS_ERR(ctx->i2c.tcpc_client))2545return PTR_ERR(ctx->i2c.tcpc_client);25462547return 0;2548}25492550static int __maybe_unused anx7625_runtime_pm_suspend(struct device *dev)2551{2552struct anx7625_data *ctx = dev_get_drvdata(dev);25532554mutex_lock(&ctx->lock);25552556anx7625_stop_dp_work(ctx);2557if (!ctx->pdata.panel_bridge)2558anx7625_remove_edid(ctx);2559anx7625_power_standby(ctx);25602561mutex_unlock(&ctx->lock);25622563return 0;2564}25652566static int __maybe_unused anx7625_runtime_pm_resume(struct device *dev)2567{2568struct anx7625_data *ctx = dev_get_drvdata(dev);25692570mutex_lock(&ctx->lock);25712572anx7625_power_on_init(ctx);25732574mutex_unlock(&ctx->lock);25752576return 0;2577}25782579static const struct dev_pm_ops anx7625_pm_ops = {2580SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,2581pm_runtime_force_resume)2582SET_RUNTIME_PM_OPS(anx7625_runtime_pm_suspend,2583anx7625_runtime_pm_resume, NULL)2584};25852586static int anx7625_link_bridge(struct drm_dp_aux *aux)2587{2588struct anx7625_data *platform = container_of(aux, struct anx7625_data, aux);2589struct device *dev = aux->dev;2590int ret;25912592ret = anx7625_parse_dt_panel(dev, &platform->pdata);2593if (ret) {2594DRM_DEV_ERROR(dev, "fail to parse DT for panel : %d\n", ret);2595return ret;2596}25972598platform->bridge.of_node = dev->of_node;2599if (!anx7625_of_panel_on_aux_bus(dev))2600platform->bridge.ops |= DRM_BRIDGE_OP_EDID;2601if (!platform->pdata.panel_bridge || !anx7625_of_panel_on_aux_bus(dev))2602platform->bridge.ops |= DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_DETECT;2603platform->bridge.type = platform->pdata.panel_bridge ?2604DRM_MODE_CONNECTOR_eDP :2605DRM_MODE_CONNECTOR_DisplayPort;26062607drm_bridge_add(&platform->bridge);26082609if (!platform->pdata.is_dpi) {2610ret = anx7625_attach_dsi(platform);2611if (ret)2612drm_bridge_remove(&platform->bridge);2613}26142615return ret;2616}26172618static int anx7625_i2c_probe(struct i2c_client *client)2619{2620struct anx7625_data *platform;2621struct anx7625_platform_data *pdata;2622int ret = 0;2623struct device *dev = &client->dev;26242625if (!i2c_check_functionality(client->adapter,2626I2C_FUNC_SMBUS_I2C_BLOCK)) {2627DRM_DEV_ERROR(dev, "anx7625's i2c bus doesn't support\n");2628return -ENODEV;2629}26302631platform = devm_drm_bridge_alloc(dev, struct anx7625_data, bridge, &anx7625_bridge_funcs);2632if (IS_ERR(platform)) {2633DRM_DEV_ERROR(dev, "fail to allocate driver data\n");2634return PTR_ERR(platform);2635}26362637pdata = &platform->pdata;26382639platform->dev = &client->dev;2640i2c_set_clientdata(client, platform);26412642pdata->supplies[0].supply = "vdd10";2643pdata->supplies[1].supply = "vdd18";2644pdata->supplies[2].supply = "vdd33";2645ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(pdata->supplies),2646pdata->supplies);2647if (ret) {2648DRM_DEV_ERROR(dev, "fail to get power supplies: %d\n", ret);2649return ret;2650}2651anx7625_init_gpio(platform);26522653mutex_init(&platform->lock);2654mutex_init(&platform->hdcp_wq_lock);2655mutex_init(&platform->aux_lock);26562657INIT_DELAYED_WORK(&platform->hdcp_work, hdcp_check_work_func);2658platform->hdcp_workqueue = create_workqueue("hdcp workqueue");2659if (!platform->hdcp_workqueue) {2660dev_err(dev, "fail to create work queue\n");2661ret = -ENOMEM;2662return ret;2663}26642665platform->pdata.intp_irq = client->irq;2666if (platform->pdata.intp_irq) {2667INIT_WORK(&platform->work, anx7625_work_func);2668platform->workqueue = alloc_workqueue("anx7625_work",2669WQ_FREEZABLE | WQ_MEM_RECLAIM, 1);2670if (!platform->workqueue) {2671DRM_DEV_ERROR(dev, "fail to create work queue\n");2672ret = -ENOMEM;2673goto free_hdcp_wq;2674}26752676ret = devm_request_threaded_irq(dev, platform->pdata.intp_irq,2677NULL, anx7625_intr_hpd_isr,2678IRQF_TRIGGER_FALLING |2679IRQF_ONESHOT,2680"anx7625-intp", platform);2681if (ret) {2682DRM_DEV_ERROR(dev, "fail to request irq\n");2683goto free_wq;2684}2685}26862687platform->aux.name = "anx7625-aux";2688platform->aux.dev = dev;2689platform->aux.transfer = anx7625_aux_transfer;2690platform->aux.wait_hpd_asserted = anx7625_wait_hpd_asserted;2691drm_dp_aux_init(&platform->aux);26922693ret = anx7625_parse_dt(dev, pdata);2694if (ret) {2695if (ret != -EPROBE_DEFER)2696DRM_DEV_ERROR(dev, "fail to parse DT : %d\n", ret);2697goto free_wq;2698}26992700if (!platform->pdata.is_dpi) {2701ret = anx7625_setup_dsi_device(platform);2702if (ret < 0)2703goto free_wq;2704}27052706/*2707* Registering the i2c devices will retrigger deferred probe, so it2708* needs to be done after calls that might return EPROBE_DEFER,2709* otherwise we can get an infinite loop.2710*/2711if (anx7625_register_i2c_dummy_clients(platform, client) != 0) {2712ret = -ENOMEM;2713DRM_DEV_ERROR(dev, "fail to reserve I2C bus.\n");2714goto free_wq;2715}27162717pm_runtime_set_autosuspend_delay(dev, 1000);2718pm_runtime_use_autosuspend(dev);2719pm_suspend_ignore_children(dev, true);2720ret = devm_pm_runtime_enable(dev);2721if (ret)2722goto free_wq;27232724/*2725* Populating the aux bus will retrigger deferred probe, so it needs to2726* be done after calls that might return EPROBE_DEFER, otherwise we can2727* get an infinite loop.2728*/2729ret = devm_of_dp_aux_populate_bus(&platform->aux, anx7625_link_bridge);2730if (ret) {2731if (ret != -ENODEV) {2732DRM_DEV_ERROR(dev, "failed to populate aux bus : %d\n", ret);2733goto free_wq;2734}27352736ret = anx7625_link_bridge(&platform->aux);2737if (ret)2738goto free_wq;2739}27402741if (!platform->pdata.low_power_mode) {2742anx7625_disable_pd_protocol(platform);2743pm_runtime_get_sync(dev);2744_anx7625_hpd_polling(platform, 5000 * 100);2745}27462747/* Add work function */2748if (platform->pdata.intp_irq)2749queue_work(platform->workqueue, &platform->work);27502751if (platform->pdata.audio_en)2752anx7625_register_audio(dev, platform);27532754DRM_DEV_DEBUG_DRIVER(dev, "probe done\n");27552756return 0;27572758free_wq:2759if (platform->workqueue)2760destroy_workqueue(platform->workqueue);27612762free_hdcp_wq:2763if (platform->hdcp_workqueue)2764destroy_workqueue(platform->hdcp_workqueue);27652766return ret;2767}27682769static void anx7625_i2c_remove(struct i2c_client *client)2770{2771struct anx7625_data *platform = i2c_get_clientdata(client);27722773drm_bridge_remove(&platform->bridge);27742775if (platform->pdata.intp_irq)2776destroy_workqueue(platform->workqueue);27772778if (platform->hdcp_workqueue) {2779cancel_delayed_work(&platform->hdcp_work);2780destroy_workqueue(platform->hdcp_workqueue);2781}27822783if (!platform->pdata.low_power_mode)2784pm_runtime_put_sync_suspend(&client->dev);27852786if (platform->pdata.audio_en)2787anx7625_unregister_audio(platform);2788}27892790static const struct i2c_device_id anx7625_id[] = {2791{ "anx7625" },2792{}2793};27942795MODULE_DEVICE_TABLE(i2c, anx7625_id);27962797static const struct of_device_id anx_match_table[] = {2798{.compatible = "analogix,anx7625",},2799{},2800};2801MODULE_DEVICE_TABLE(of, anx_match_table);28022803static struct i2c_driver anx7625_driver = {2804.driver = {2805.name = "anx7625",2806.of_match_table = anx_match_table,2807.pm = &anx7625_pm_ops,2808},2809.probe = anx7625_i2c_probe,2810.remove = anx7625_i2c_remove,28112812.id_table = anx7625_id,2813};28142815module_i2c_driver(anx7625_driver);28162817MODULE_DESCRIPTION("MIPI2DP anx7625 driver");2818MODULE_AUTHOR("Xin Ji <[email protected]>");2819MODULE_LICENSE("GPL v2");2820MODULE_VERSION(ANX7625_DRV_VERSION);282128222823