From nobody Thu Sep 24 20:37:47 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6F66D3B3894; Mon, 21 Sep 2026 07:15:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789974943; cv=none; b=ThlBkGmBhfKgOpLOFw5jb0ys2lOpKp5U6jkZl6rZTC0ZqkEWfB+8yrIRVaoijKmuGLOxWaGkQAtbTcsbsYfWrINTk6Sb9AKYF5mdL7ljJMfczkqShOOrYk6xLWIZdvpZUn3/hbIeeSktdSWBBKZatLErhaMRoUdQFuKBHc/VLPs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789974943; c=relaxed/simple; bh=CA1vdHXhWbnNNgsoO5LTfxbVH+i5Ibg26wNqt5XKh4s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q2jYJZCWS8hUote8/BBUQ6g4jCSG6zKpWDwJcrV21L/1vFshZleLPSMyWIdO4ewfvm0C8OilHBVvttnZEVnDpsh+EMvKgxG5x+j+aCfhk0LvxywVKGCY/tkPg0Pl56K22cQhQWmt16fxgFtSEtdAbFrPEF4oE3uOCDonXvCvkq4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from [127.0.1.1] (unknown [IPv6:2a02:560:5dd5:4b00:9ebf:dff:fe00:fdb5]) (Authenticated sender: sha@pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id 6A52E2002AF; Mon, 21 Sep 2026 09:15:39 +0200 (CEST) From: Sascha Hauer Date: Mon, 21 Sep 2026 09:15:33 +0200 Subject: [PATCH 1/3] media: synopsys: hdmirx: fetch colordepth before calculating pixelclock Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260921-hdmirx-fixes-v1-1-495be0beaf93@pengutronix.de> References: <20260921-hdmirx-fixes-v1-0-495be0beaf93@pengutronix.de> In-Reply-To: <20260921-hdmirx-fixes-v1-0-495be0beaf93@pengutronix.de> To: Dmitry Osipenko , Mauro Carvalho Chehab , Shreeya Patel , Hans Verkuil , Dingxian Wen Cc: linux-media@vger.kernel.org, kernel@collabora.com, linux-kernel@vger.kernel.org, Sascha Hauer , Lucas Sinn , stable@vger.kernel.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789974939; l=5493; i=s.hauer@pengutronix.de; s=20230412; h=from:subject:message-id; bh=hJonb/RaIpzMkop4V1R/en1i0bc6g4gL0c5oy7ON+wM=; b=K54BUciRx3HqD18TDJe3KeDHUv+NReCLccaAk8i8BPDarJPDEUbjyu8hfK4XUEpN8XhAfHE2n fSuMtjD/MCMDfobmsgGwqSHLynjbr9/QKAmt9PwTonyxDO4lSGI4L0r X-Developer-Key: i=s.hauer@pengutronix.de; a=ed25519; pk=4kuc9ocmECiBJKWxYgqyhtZOHj5AWi7+d0n/UjhkwTg= From: Lucas Sinn hdmirx_get_detected_timings() divides the TMDS clock by hdmirx_dev->color_depth, but nothing on its own path ever sets it. The only producer is hdmirx_get_colordepth(), reached solely from hdmirx_format_change() at the tail of hdmirx_wait_signal_lock(). VIDIOC_QUERY_DV_TIMINGS does not come through there. It only refuses to proceed while signal_not_lock() is true, and that reads the lock state straight out of the hardware, so it can already be false while the work ending in hdmirx_format_change() has yet to run. Query the timings in that window, on the first lock after a boot, and color_depth is still zero from devm_kzalloc(). The division does not fault. do_div() is plain C on 64 bit and arm64 compiles it to udiv, which returns zero for a zero divisor. What comes out is a pixelclock of zero, and a stitched output frame. Read the colordepth where it is used instead. Assisted-by: Claude:claude-opus-5 Signed-off-by: Lucas Sinn Signed-off-by: Sascha Hauer Fixes: 7b59b132ad43 ("media: platform: synopsys: Add support for HDMI input= driver") Cc: stable@vger.kernel.org Reviewed-by: Dmitry Osipenko --- .../media/platform/synopsys/hdmirx/snps_hdmirx.c | 71 +++++++++++-------= ---- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c b/drivers= /media/platform/synopsys/hdmirx/snps_hdmirx.c index 25f8ca0d6d946..24ec6138a1fb6 100644 --- a/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c +++ b/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c @@ -156,7 +156,6 @@ struct snps_hdmirx_dev { int num_clks; u32 edid_blocks_written; u32 cur_fmt_fourcc; - u32 color_depth; spinlock_t rst_lock; /* to lock register access */ u8 edid[EDID_NUM_BLOCKS_MAX * EDID_BLOCK_SIZE]; }; @@ -380,6 +379,38 @@ static void hdmirx_toggle_polarity(struct snps_hdmirx_= dev *hdmirx_dev) VPROC_HSYNC_POL_OVR_EN, 0); } =20 +static u32 hdmirx_get_colordepth(struct snps_hdmirx_dev *hdmirx_dev) +{ + struct v4l2_device *v4l2_dev =3D &hdmirx_dev->v4l2_dev; + u32 val, color_depth_reg, color_depth; + + val =3D hdmirx_readl(hdmirx_dev, DMA_STATUS11); + color_depth_reg =3D (val & HDMIRX_COLOR_DEPTH_MASK) >> 3; + + switch (color_depth_reg) { + case 0x4: + color_depth =3D 24; + break; + case 0x5: + color_depth =3D 30; + break; + case 0x6: + color_depth =3D 36; + break; + case 0x7: + color_depth =3D 48; + break; + default: + color_depth =3D 24; + break; + } + + v4l2_dbg(1, debug, v4l2_dev, "%s: color_depth: %d, reg_val:%d\n", + __func__, color_depth, color_depth_reg); + + return color_depth; +} + /* * When querying DV timings during preview, if the DMA's timing is stable, * we retrieve the timings directly from the DMA. However, if the current @@ -393,7 +424,7 @@ static int hdmirx_get_detected_timings(struct snps_hdmi= rx_dev *hdmirx_dev, struct v4l2_bt_timings *bt =3D &timings->bt; u32 val, tmdsqpclk_freq, pix_clk; unsigned int num_retries =3D 0; - u32 field_type, deframer_st; + u32 field_type, deframer_st, color_depth; u64 tmp_data, tmds_clk; bool is_dvi_mode; int ret; @@ -414,10 +445,11 @@ static int hdmirx_get_detected_timings(struct snps_hd= mirx_dev *hdmirx_dev, deframer_st =3D hdmirx_readl(hdmirx_dev, DEFRAMER_STATUS); is_dvi_mode =3D !(deframer_st & OPMODE_STS_MASK); =20 + color_depth =3D hdmirx_get_colordepth(hdmirx_dev); tmdsqpclk_freq =3D hdmirx_readl(hdmirx_dev, CMU_TMDSQPCLK_FREQ); tmds_clk =3D tmdsqpclk_freq * 4 * 1000; tmp_data =3D tmds_clk * 24; - do_div(tmp_data, hdmirx_dev->color_depth); + do_div(tmp_data, color_depth); pix_clk =3D tmp_data; bt->pixelclock =3D pix_clk; =20 @@ -429,7 +461,7 @@ static int hdmirx_get_detected_timings(struct snps_hdmi= rx_dev *hdmirx_dev, v4l2_dbg(2, debug, v4l2_dev, "tmds_clk:%llu, pix_clk:%d\n", tmds_clk, pix= _clk); v4l2_dbg(1, debug, v4l2_dev, "interlace:%d, fmt:%d, color:%d, mode:%s\n", bt->interlaced, hdmirx_dev->pix_fmt, - hdmirx_dev->color_depth, + color_depth, is_dvi_mode ? "dvi" : "hdmi"); v4l2_dbg(2, debug, v4l2_dev, "deframer_st:%#x\n", deframer_st); =20 @@ -988,36 +1020,6 @@ static void hdmirx_controller_init(struct snps_hdmirx= _dev *hdmirx_dev) VS_REMAPFILTER_EN_QST | VS_FILTER_ORDER_QST(0x3)); } =20 -static void hdmirx_get_colordepth(struct snps_hdmirx_dev *hdmirx_dev) -{ - struct v4l2_device *v4l2_dev =3D &hdmirx_dev->v4l2_dev; - u32 val, color_depth_reg; - - val =3D hdmirx_readl(hdmirx_dev, DMA_STATUS11); - color_depth_reg =3D (val & HDMIRX_COLOR_DEPTH_MASK) >> 3; - - switch (color_depth_reg) { - case 0x4: - hdmirx_dev->color_depth =3D 24; - break; - case 0x5: - hdmirx_dev->color_depth =3D 30; - break; - case 0x6: - hdmirx_dev->color_depth =3D 36; - break; - case 0x7: - hdmirx_dev->color_depth =3D 48; - break; - default: - hdmirx_dev->color_depth =3D 24; - break; - } - - v4l2_dbg(1, debug, v4l2_dev, "%s: color_depth: %d, reg_val:%d\n", - __func__, hdmirx_dev->color_depth, color_depth_reg); -} - static void hdmirx_get_pix_fmt(struct snps_hdmirx_dev *hdmirx_dev) { struct v4l2_device *v4l2_dev =3D &hdmirx_dev->v4l2_dev; @@ -1128,7 +1130,6 @@ static void hdmirx_format_change(struct snps_hdmirx_d= ev *hdmirx_dev) }; =20 hdmirx_get_pix_fmt(hdmirx_dev); - hdmirx_get_colordepth(hdmirx_dev); hdmirx_get_avi_infoframe(hdmirx_dev); =20 v4l2_dbg(1, debug, v4l2_dev, "%s: queue res_chg_event\n", __func__); --=20 2.47.3 From nobody Thu Sep 24 20:37:47 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7013F3B38AD; Mon, 21 Sep 2026 07:15:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789974943; cv=none; b=g0VkXF6JnMbwQrAeYzXQeXe4c65IkJ1Pvl8ShIaekqTCBqejJ06NIgBnPrIylA8tW8xztYMaZPL7vVcSD20gHVfqdOcsL3OAvC2z8FU2O2ploeT0lMdyOS+u2yto/cHjWmvs7rhQiWcCvFq0UlaOmZ/n1orYsxgEECy9jaSFod0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789974943; c=relaxed/simple; bh=PtVU0SSW8Q+r9akKwdKPVsKrNP03P2tj6gjaGItYTO8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EZMAwdJOllTF43CNfLquQLzyqokBwMerGz9cken2W9W5C5iPf26SyZ4QoSKs0xWinKStfD9pqfjtPgagSjoi4rsxLpMjkVy4ejvK0aIM4/8FAIPZmYdOQv6mPEdwSWZ5jGhnwFMDNxW/5TIJKx2bfNT/0JD1xpFdk96yFiJrgEM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from [127.0.1.1] (unknown [IPv6:2a02:560:5dd5:4b00:9ebf:dff:fe00:fdb5]) (Authenticated sender: sha@pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id 7E23B2007E1; Mon, 21 Sep 2026 09:15:39 +0200 (CEST) From: Sascha Hauer Date: Mon, 21 Sep 2026 09:15:34 +0200 Subject: [PATCH 2/3] media: synopsys: hdmirx: add input status reporting to VIDIOC_ENUMINPUT Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260921-hdmirx-fixes-v1-2-495be0beaf93@pengutronix.de> References: <20260921-hdmirx-fixes-v1-0-495be0beaf93@pengutronix.de> In-Reply-To: <20260921-hdmirx-fixes-v1-0-495be0beaf93@pengutronix.de> To: Dmitry Osipenko , Mauro Carvalho Chehab , Shreeya Patel , Hans Verkuil , Dingxian Wen Cc: linux-media@vger.kernel.org, kernel@collabora.com, linux-kernel@vger.kernel.org, Sascha Hauer , Gerald Loacker X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789974939; l=1867; i=s.hauer@pengutronix.de; s=20230412; h=from:subject:message-id; bh=vzQ+7KpEp+9NsdwUJ+LjHZ50sl7sOg4nnUfFimSzS4w=; b=Jyz44n+uGTfRm/9XrnhGgbvSsylC0mu3kYnZh3ZQ12h0JKvHUiSh18UlwYUHlKipE9YbMjn42 z4x8SxEccK6Ahx5kqsEdijo7fX1cU4l70hHxbQhqx3MtMQ23GNq1V01 X-Developer-Key: i=s.hauer@pengutronix.de; a=ed25519; pk=4kuc9ocmECiBJKWxYgqyhtZOHj5AWi7+d0n/UjhkwTg= From: Gerald Loacker Userspace currently has to learn the cable and lock state from the error VIDIOC_QUERY_DV_TIMINGS returns, -ENOLINK or -ENOLCK. Both of those paths log at v4l2_err level, so waiting for a cable fills the kernel log. Report it where it belongs instead: V4L2_IN_ST_NO_POWER while the source is not driving the connector's +5V line, V4L2_IN_ST_NO_SIGNAL while the receiver has not locked. Both come from the helpers hdmirx_query_dv_timings() already uses, so the two cannot disagree. adv76xx_g_input_status() and adv7842_g_input_status() report the same two flags the same way. Signed-off-by: Gerald Loacker Signed-off-by: Sascha Hauer Reviewed-by: Dmitry Osipenko --- drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c b/drivers= /media/platform/synopsys/hdmirx/snps_hdmirx.c index 24ec6138a1fb6..75576a9366fd0 100644 --- a/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c +++ b/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c @@ -1199,6 +1199,9 @@ static void hdmirx_submodule_init(struct snps_hdmirx_= dev *hdmirx_dev) static int hdmirx_enum_input(struct file *file, void *priv, struct v4l2_input *input) { + struct hdmirx_stream *stream =3D video_drvdata(file); + struct snps_hdmirx_dev *hdmirx_dev =3D stream->hdmirx_dev; + if (input->index > 0) return -EINVAL; =20 @@ -1207,6 +1210,12 @@ static int hdmirx_enum_input(struct file *file, void= *priv, strscpy(input->name, "HDMI IN", sizeof(input->name)); input->capabilities =3D V4L2_IN_CAP_DV_TIMINGS; =20 + input->status =3D 0; + if (port_no_link(hdmirx_dev)) + input->status |=3D V4L2_IN_ST_NO_POWER; + if (signal_not_lock(hdmirx_dev)) + input->status |=3D V4L2_IN_ST_NO_SIGNAL; + return 0; } =20 --=20 2.47.3 From nobody Thu Sep 24 20:37:47 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 701CD3B38BE; Mon, 21 Sep 2026 07:15:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789974944; cv=none; b=fCo7MxUU+9ijJkY3U60TGH/HIdvUp93lW4uqnKMfrOhnL6mWMtxyJ9VVG954avZ54I2SPX5tLTrsvAbYHQ+ul/gcyn0cV95IaUGf9LXzVlhofiA/d0NT5OKw1clzlv7tN5SfHyzWLA/him+z00aViLvCxE1EWH6O15rYmg35RmU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789974944; c=relaxed/simple; bh=n42GS2qz2TG4P+2jLT1tckNyXixO4jDqv1JvJnxOrBU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Vp6n/oyz3X6lPyJ0838r4ic6OStPi1EgqvqbH7xOpWvKhmgLmM1qYQf1p1eapIHsBnxyjUWNNDigw2o/D/AEl8o9R8skfgwr6qyDnrqx/UhtohbW4W7cEOQlzk2sWGETnop1K3YxbagLQWewTq2+JlzU0G/0dvTVsDOuKjoph+U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from [127.0.1.1] (unknown [IPv6:2a02:560:5dd5:4b00:9ebf:dff:fe00:fdb5]) (Authenticated sender: sha@pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id 907B6200800; Mon, 21 Sep 2026 09:15:39 +0200 (CEST) From: Sascha Hauer Date: Mon, 21 Sep 2026 09:15:35 +0200 Subject: [PATCH 3/3] media: synopsys: hdmirx: stop logging a missing signal at error level Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260921-hdmirx-fixes-v1-3-495be0beaf93@pengutronix.de> References: <20260921-hdmirx-fixes-v1-0-495be0beaf93@pengutronix.de> In-Reply-To: <20260921-hdmirx-fixes-v1-0-495be0beaf93@pengutronix.de> To: Dmitry Osipenko , Mauro Carvalho Chehab , Shreeya Patel , Hans Verkuil , Dingxian Wen Cc: linux-media@vger.kernel.org, kernel@collabora.com, linux-kernel@vger.kernel.org, Sascha Hauer X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789974939; l=1768; i=s.hauer@pengutronix.de; s=20230412; h=from:subject:message-id; bh=n42GS2qz2TG4P+2jLT1tckNyXixO4jDqv1JvJnxOrBU=; b=rauu3Rp3IPv9xWK0Cm5kEADs9yxRz2LSum4R1pNNTYl8HeLAaQLXi1F+FIX5abU7WXShDxJ5A ColLsj5kRttDlAgHEcwNeXKVFqYEU9ZWKBJ25cRgIjZUkvaht3bMwHs X-Developer-Key: i=s.hauer@pengutronix.de; a=ed25519; pk=4kuc9ocmECiBJKWxYgqyhtZOHj5AWi7+d0n/UjhkwTg= hdmirx_query_dv_timings() refuses with -ENOLINK while the source is not driving the connector's +5V line and with -ENOLCK while the receiver has not locked, and prints both at v4l2_err level. Neither is a driver error. They are the two states a receiver sits in whenever nothing is plugged in, and the way userspace waits for a source is to poll until they clear, so an application doing the expected thing fills the kernel log. Both states are now reported through VIDIOC_ENUMINPUT as V4L2_IN_ST_NO_POWER and V4L2_IN_ST_NO_SIGNAL, from the same two helpers, so the prints no longer carry anything userspace cannot ask for. Drop them to v4l2_dbg level 1, where the other non-error outcome of this function, timings out of range, already is. Assisted-by: Claude:claude-opus-5 Signed-off-by: Sascha Hauer Reviewed-by: Dmitry Osipenko --- drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c b/drivers= /media/platform/synopsys/hdmirx/snps_hdmirx.c index 75576a9366fd0..41f6112ec8123 100644 --- a/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c +++ b/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c @@ -502,12 +502,12 @@ static int hdmirx_query_dv_timings(struct file *file,= void *priv, int ret; =20 if (port_no_link(hdmirx_dev)) { - v4l2_err(v4l2_dev, "%s: port has no link\n", __func__); + v4l2_dbg(1, debug, v4l2_dev, "%s: port has no link\n", __func__); return -ENOLINK; } =20 if (signal_not_lock(hdmirx_dev)) { - v4l2_err(v4l2_dev, "%s: signal is not locked\n", __func__); + v4l2_dbg(1, debug, v4l2_dev, "%s: signal is not locked\n", __func__); return -ENOLCK; } =20 --=20 2.47.3