Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp1179411pxb; Fri, 21 Jan 2022 11:35:09 -0800 (PST) X-Google-Smtp-Source: ABdhPJz+MRfZLS6eBEBSWv6N4QI56CHg27NwCKW0IAoifAqvAInvsSaLpM+bbUqarWIlzl2MOsc4 X-Received: by 2002:aa7:88c4:0:b0:4c1:c2d3:f187 with SMTP id k4-20020aa788c4000000b004c1c2d3f187mr5015874pff.66.1642793709336; Fri, 21 Jan 2022 11:35:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642793709; cv=none; d=google.com; s=arc-20160816; b=wrW0RS6FMO1ScNUcl6EfJ0tGdfqlqV7g0gbQ+mEZfdAqWzioGRv60zjqaW/zaIDwjF HwCnpSDUJCb+x2Lp9uVZRACexEZ9V5v3uVXLbRf5zjbC37fshYV/zSFO4ZHN382Q6i0p dcMH0+3XAxLBpvZup4VZPJlCiAQgfoAiPEp+Ztr5ZBTQ9QPMwvxAmE6sNtF6cX5R0fAA NN2KkqX3JMuRtoWwMZX9jmLPux9pd7MjR9jgdag7n13AdFKaZknwPjejiaYyBB5bsdHp 3FWg8bovcIu7/XRPA6g6IXkijOll85zcMaT1qlvYLMfrJsffom7KHzYOoq2DSuAQZTLu rR0w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=ca2VVrnwlbvkOz2O67u7fxspTtkKF37Zaj8dip0NjTQ=; b=v5YSqr3iIa3SGgPNWdif2iOcl3WvNeA481cPnp61PEFEdIcRNLaoK5gSTk/YqDIun4 cO9z2aQtFq4if13MxUDpeeHLuLSOxKleVrJha/1cTogKsFa7aWRrSCrQTS8e5gmyNwy0 CRnBbiiueSrQkYqEisRY9aZv6HDdXuBZF981SlCCvKoP+udOcw69TcXUgEuaKm1otm8R eTguSMi1A2x+y0kuGgUWF8EZYSqrZxEDWpKIZwXL1IbOfVJ755lgaFG77RoB5dplRiZN UhSU+NgmgXzwuT184q9ol6hH+LVRUZKDWL7/LxuTsYs78oRGgwgZ4xNUBrWKSHK0VDVh wZvg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=D1jpejDp; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id mh5si17181101pjb.155.2022.01.21.11.34.57; Fri, 21 Jan 2022 11:35:09 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=D1jpejDp; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1355821AbiASPiz (ORCPT + 99 others); Wed, 19 Jan 2022 10:38:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32978 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1355749AbiASPiy (ORCPT ); Wed, 19 Jan 2022 10:38:54 -0500 Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 61E30C061574 for ; Wed, 19 Jan 2022 07:38:54 -0800 (PST) Received: by mail-pj1-x1031.google.com with SMTP id s2-20020a17090ad48200b001b501977b23so1805455pju.2 for ; Wed, 19 Jan 2022 07:38:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=ca2VVrnwlbvkOz2O67u7fxspTtkKF37Zaj8dip0NjTQ=; b=D1jpejDpd9SMLs89An6WE28gBHy6FegBK7DonnMALByufJSIEcSb5p5hKjTI5MLl+4 iVi34d4vAd5Nc6xAEQk+tXbttiqJpqF6nCwqpIuEpUTyiLzHiGd3XGWYfJnvmAiyWs+h ZAJ+N06nw7rDTplqkQnap/3m0bVd3LFKDRasAYV1DjbPbey3+1usvZABiFJKJUeCQI4i m+l2ERGlwqscy0w1cWO0EuBZ6/y+S3+X4pAFCn0F3lw1ezfdKJdNhvva0shcKaiwqfSe oLbLxHsWF06qBzzDvKZ1j1VZlyckuV3Eyf698jGbB1s6DmBpBA+btW+abEGT+nG9FPML iCtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=ca2VVrnwlbvkOz2O67u7fxspTtkKF37Zaj8dip0NjTQ=; b=ml5lhHRGniQjj/mSY92/lAZ9s04qt6nAV0vXin0f0uzkStBH382sXmDtxszSWdTAUN MbeDLWhq+ML+fRmTVGtIATVZQW27lCiJjUBsLibS9EL1i4FRaow7UWgL4dvqjDEg0IMt NppezogyGSdtPlKMwFQ2Ze/2IFzMUmyepaBXYenSLV4xgsIOvdk8CtIZXBQxIjoUi7pn Q5ZeJSU9VSuUwNQz1AmLGjVrLqpKcpUF5kOiBbGEuigvgm49RJKARHsWMKliSIPaB0C6 5DKjDPTaJ8SP+ZA8kxPYuJSlP5om0t1T6kkhDwfygz5tZ9jF+teZMu09I4nvBafzsq4w Y0xQ== X-Gm-Message-State: AOAM5325o/688vRZlGW92XiAXF77Kh+DpYATUTa3KyyR3SO7WTcuw/Tk 2fa+G5G831pGtN3qZBzei0hUb6/Oe6PbdsInhipvfA== X-Received: by 2002:a17:90b:3e8e:: with SMTP id rj14mr5020906pjb.179.1642606733843; Wed, 19 Jan 2022 07:38:53 -0800 (PST) MIME-Version: 1.0 References: <20220119151751.986185-1-hsinyi@chromium.org> In-Reply-To: <20220119151751.986185-1-hsinyi@chromium.org> From: Robert Foss Date: Wed, 19 Jan 2022 16:38:42 +0100 Message-ID: Subject: Re: [PATCH v5 1/4] drm/bridge: anx7625: send DPCD command to downstream To: Hsin-Yi Wang Cc: Rob Herring , Xin Ji , David Airlie , Daniel Vetter , Laurent Pinchart , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Andrzej Hajda , Neil Armstrong , Jonas Karlman , Jernej Skrabec , Sam Ravnborg , Maxime Ripard Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 19 Jan 2022 at 16:17, Hsin-Yi Wang wrote: > > From: Xin Ji > > Send DPCD command to downstream before anx7625 power down, > let downstream monitor enter into standby mode. > > Signed-off-by: Xin Ji > Signed-off-by: Hsin-Yi Wang Hsin-Yi: Can you supply a r-b tag to this patch if it looks good to you? > --- > v3->v4: > Use common DP_AUX_NATIVE_READ/WRITE > > Previously in: > https://patchwork.kernel.org/project/dri-devel/patch/1f36f8bf0a48fb2bba17bacec23700e58c1d407d.1641891874.git.xji@analogixsemi.com/ > --- > drivers/gpu/drm/bridge/analogix/anx7625.c | 42 +++++++++++++++++++---- > drivers/gpu/drm/bridge/analogix/anx7625.h | 2 -- > 2 files changed, 35 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/analogix/anx7625.c b/drivers/gpu/drm/bridge/analogix/anx7625.c > index 76662fce4ce61d..17b23940549a42 100644 > --- a/drivers/gpu/drm/bridge/analogix/anx7625.c > +++ b/drivers/gpu/drm/bridge/analogix/anx7625.c > @@ -129,6 +129,23 @@ static int anx7625_reg_write(struct anx7625_data *ctx, > return ret; > } > > +static int anx7625_reg_block_write(struct anx7625_data *ctx, > + struct i2c_client *client, > + u8 reg_addr, u8 len, u8 *buf) > +{ > + int ret; > + struct device *dev = &client->dev; > + > + i2c_access_workaround(ctx, client); > + > + ret = i2c_smbus_write_i2c_block_data(client, reg_addr, len, buf); > + if (ret < 0) > + dev_err(dev, "write i2c block failed id=%x\n:%x", > + client->addr, reg_addr); > + > + return ret; > +} > + > static int anx7625_write_or(struct anx7625_data *ctx, > struct i2c_client *client, > u8 offset, u8 mask) > @@ -214,8 +231,8 @@ static int wait_aux_op_finish(struct anx7625_data *ctx) > return 0; > } > > -static int anx7625_aux_dpcd_read(struct anx7625_data *ctx, > - u32 address, u8 len, u8 *buf) > +static int anx7625_aux_dpcd_trans(struct anx7625_data *ctx, u8 op, > + u32 address, u8 len, u8 *buf) > { > struct device *dev = &ctx->client->dev; > int ret; > @@ -231,8 +248,7 @@ static int anx7625_aux_dpcd_read(struct anx7625_data *ctx, > addrm = (address >> 8) & 0xFF; > addrh = (address >> 16) & 0xFF; > > - cmd = DPCD_CMD(len, DPCD_READ); > - cmd = ((len - 1) << 4) | 0x09; > + cmd = DPCD_CMD(len, op); > > /* Set command and length */ > ret = anx7625_reg_write(ctx, ctx->i2c.rx_p0_client, > @@ -246,6 +262,9 @@ static int anx7625_aux_dpcd_read(struct anx7625_data *ctx, > ret |= anx7625_reg_write(ctx, ctx->i2c.rx_p0_client, > AP_AUX_ADDR_19_16, addrh); > > + if (op == DP_AUX_NATIVE_WRITE) > + ret |= anx7625_reg_block_write(ctx, ctx->i2c.rx_p0_client, > + AP_AUX_BUFF_START, len, buf); > /* Enable aux access */ > ret |= anx7625_write_or(ctx, ctx->i2c.rx_p0_client, > AP_AUX_CTRL_STATUS, AP_AUX_CTRL_OP_EN); > @@ -255,14 +274,17 @@ static int anx7625_aux_dpcd_read(struct anx7625_data *ctx, > return -EIO; > } > > - usleep_range(2000, 2100); > - > ret = wait_aux_op_finish(ctx); > if (ret) { > dev_err(dev, "aux IO error: wait aux op finish.\n"); > return ret; > } > > + /* Write done */ > + if (op == DP_AUX_NATIVE_WRITE) > + return 0; > + > + /* Read done, read out dpcd data */ > ret = anx7625_reg_block_read(ctx, ctx->i2c.rx_p0_client, > AP_AUX_BUFF_START, len, buf); > if (ret < 0) { > @@ -845,7 +867,7 @@ static int anx7625_hdcp_enable(struct anx7625_data *ctx) > } > > /* Read downstream capability */ > - anx7625_aux_dpcd_read(ctx, 0x68028, 1, &bcap); > + anx7625_aux_dpcd_trans(ctx, DP_AUX_NATIVE_READ, 0x68028, 1, &bcap); > if (!(bcap & 0x01)) { > pr_warn("downstream not support HDCP 1.4, cap(%x).\n", bcap); > return 0; > @@ -918,6 +940,7 @@ static void anx7625_dp_stop(struct anx7625_data *ctx) > { > struct device *dev = &ctx->client->dev; > int ret; > + u8 data; > > DRM_DEV_DEBUG_DRIVER(dev, "stop dp output\n"); > > @@ -929,6 +952,11 @@ static void anx7625_dp_stop(struct anx7625_data *ctx) > ret |= anx7625_write_and(ctx, ctx->i2c.tx_p2_client, 0x08, 0x7f); > > ret |= anx7625_video_mute_control(ctx, 1); > + > + dev_dbg(dev, "notify downstream enter into standby\n"); > + /* Downstream monitor enter into standby mode */ > + data = 2; > + ret |= anx7625_aux_dpcd_trans(ctx, DP_AUX_NATIVE_WRITE, 0x000600, 1, &data); > if (ret < 0) > DRM_DEV_ERROR(dev, "IO error : mute video fail\n"); > > diff --git a/drivers/gpu/drm/bridge/analogix/anx7625.h b/drivers/gpu/drm/bridge/analogix/anx7625.h > index 56165f5b254c14..64a8ab56529404 100644 > --- a/drivers/gpu/drm/bridge/analogix/anx7625.h > +++ b/drivers/gpu/drm/bridge/analogix/anx7625.h > @@ -242,8 +242,6 @@ > > #define AP_AUX_COMMAND 0x27 /* com+len */ > #define LENGTH_SHIFT 4 > -#define DPCD_READ 0x09 > -#define DPCD_WRITE 0x08 > #define DPCD_CMD(len, cmd) ((((len) - 1) << LENGTH_SHIFT) | (cmd)) > > /* Bit 0&1: 3D video structure */ > -- > 2.34.1.703.g22d0c6ccf7-goog >