From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-23.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 01F0AC07E9A for ; Sun, 4 Jul 2021 09:04:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E090161090 for ; Sun, 4 Jul 2021 09:04:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229681AbhGDJHa (ORCPT ); Sun, 4 Jul 2021 05:07:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60022 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229492AbhGDJH3 (ORCPT ); Sun, 4 Jul 2021 05:07:29 -0400 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 DFC6BC061764 for ; Sun, 4 Jul 2021 02:04:53 -0700 (PDT) Received: by mail-pj1-x1031.google.com with SMTP id mn20-20020a17090b1894b02901707fc074e8so9965300pjb.0 for ; Sun, 04 Jul 2021 02:04:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=x8DbojDoEb5uY2A25IR0p63F/P/5IlsfDnb3J5qKSYc=; b=rEorpVedLG1oQSRSSrGYnCBfnLDbabcwXssx1B6hMLIqKt69o4ff788l87rMdxf/pp pwDtiBvQJtdNdVn/k8VG9HVHce/GFm8U/2ylCENloi5gRCYHqPLAN42Ji5H/paBAAaMr LXScI9ZNQLzeSwjkN8Sxf64eJQtK5noK3fuu0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=x8DbojDoEb5uY2A25IR0p63F/P/5IlsfDnb3J5qKSYc=; b=CjmGeEtsqUdK5oChycs4QuKfgzP+7g9h+10lqRXl+1igaPE2C9fkKXCILMrixiMSqU oqsQF884aDUuyv/rH7q1jcXx/T1C37USDiXHOiVG0a3LECT/VrcD5Qm28jZkeZaeIykQ nlgth3QPoMPwcfsDejEV8RTEFrCyfqqZxXEGhUTcHLkoXBiT3hQeEDZnkSghWMLVRMbP WXkYXqcT61PpjazQnX67Te0QjSrnJEibw+6l2WWhxIG/20t4lDHYsIgR1w6D3iLO1u8u LWgNwBS67RG8kPqXvOCGGoPYZ84DbLhZKT/CGT8MmQ4n9cMfgPUmaXmtoT1pOyCX1B1U pWCw== X-Gm-Message-State: AOAM533ux1z1cPZblzkWmiZtL+2OdDXAR2S8ZuPu+ZJykVfWru3uaFRv YpPieMZ8UJo05w4A76O1Brp/og== X-Google-Smtp-Source: ABdhPJzYYBARwzR5yMlFsILzXaBPaBOK0zUuORaq+uVPg1s53a5rVb2Ko/Qi+cQQksrJdZ+L3SbLmA== X-Received: by 2002:a17:90a:1d43:: with SMTP id u3mr8833730pju.121.1625389493174; Sun, 04 Jul 2021 02:04:53 -0700 (PDT) Received: from localhost.localdomain ([2405:201:c00a:a884:1ae9:772f:6f0f:3e24]) by smtp.gmail.com with ESMTPSA id m24sm3360793pgd.60.2021.07.04.02.04.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 04 Jul 2021 02:04:52 -0700 (PDT) From: Jagan Teki To: Inki Dae , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Frieder Schrempf , Daniel Vetter , Marek Vasut , Krzysztof Kozlowski , Fabio Estevam Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, NXP Linux Team , linux-amarula , Jagan Teki Subject: [RFC PATCH 07/17] drm: bridge: Move exynos_drm_dsi into bridges Date: Sun, 4 Jul 2021 14:32:20 +0530 Message-Id: <20210704090230.26489-8-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210704090230.26489-1-jagan@amarulasolutions.com> References: <20210704090230.26489-1-jagan@amarulasolutions.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org The MIPI DSI IP used in Exynos and i.MX8MM are based Samsung MIPI DSIM bridge.     In order to access the common bridge between platforms the ideal way to push the driver into the bridge area.     So, this patch will move the exynos_drm_dsi.c driver into samsung-dsim.c and do the necessary function name changes.     This would help to improve the bridge driver in future patches in order to make use of different SoC families and platforms. The bridge now support two implementations, A. With component_ops and exynos specific code exclusively for exynos dsi drivers and it's legacy bindings. B. Without componenet_ops for newly implemented bridges and its users like i.MX8MM. The future plan is to fix the implementation A) by dropping component_ops and fixing exynos specific code in order to make the bridge more mature to use. Updated MAINTAINERS file for this bridge with exynos drm maintainers along with Andrzej as he is the original author. Tomasz Figa has been not included in MAINTAINERS as he is not available via samsung.com. Signed-off-by: Jagan Teki --- MAINTAINERS | 11 + drivers/gpu/drm/bridge/Kconfig | 15 + drivers/gpu/drm/bridge/Makefile | 1 + .../samsung-dsim.c} | 433 +++++++++--------- drivers/gpu/drm/exynos/Kconfig | 9 - drivers/gpu/drm/exynos/Makefile | 1 - 6 files changed, 246 insertions(+), 224 deletions(-) rename drivers/gpu/drm/{exynos/exynos_drm_dsi.c => bridge/samsung-dsim.c} (77%) diff --git a/MAINTAINERS b/MAINTAINERS index cae0c6148590..733c2ebc0393 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -5864,6 +5864,17 @@ T: git git://anongit.freedesktop.org/drm/drm-misc F: Documentation/devicetree/bindings/display/panel/samsung,lms397kf04.yaml F: drivers/gpu/drm/panel/panel-samsung-db7430.c +DRM DRIVER FOR SAMSUNG MIPI DSIM BRIDGE +M: Inki Dae +M: Joonyoung Shim +M: Seung-Woo Kim +M: Kyungmin Park +M: Andrzej Hajda +M: Jagan Teki +S: Maintained +T: git git://anongit.freedesktop.org/drm/drm-misc +F: drivers/gpu/drm/bridge/samsung-dsim.c + DRM DRIVER FOR SITRONIX ST7703 PANELS M: Guido Günther R: Purism Kernel Team diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index 4de6dbb8821b..c8a3b13f730b 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -190,6 +190,21 @@ config DRM_PARADE_PS8640 The PS8640 is a high-performance and low-power MIPI DSI to eDP converter +config DRM_SAMSUNG_DSIM + tristate "Samsung MIPI DSIM bridge driver" + depends on DRM + depends on COMMON_CLK + depends on OF && HAS_IOMEM + depends on DRM_EXYNOS_FIMD || DRM_EXYNOS5433_DECON || DRM_EXYNOS7_DECON + select DRM_KMS_HELPER + select DRM_MIPI_DSI + select DRM_PANEL_BRIDGE + select REGMAP_MMIO + help + This enables the Samsung MIPI DSIM bridge controller driver. + This MIPI DSIM bridge can be found it on Exynos and NXP's + i.MX8M Mini and Nano SoC's. + config DRM_SIL_SII8620 tristate "Silicon Image SII8620 HDMI/MHL bridge" depends on OF diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile index ec2b9fa2699e..1eb04e4857e5 100644 --- a/drivers/gpu/drm/bridge/Makefile +++ b/drivers/gpu/drm/bridge/Makefile @@ -12,6 +12,7 @@ obj-$(CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW) += megachips-stdpxxxx-ge-b850v obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o obj-$(CONFIG_DRM_PARADE_PS8622) += parade-ps8622.o obj-$(CONFIG_DRM_PARADE_PS8640) += parade-ps8640.o +obj-$(CONFIG_DRM_SAMSUNG_DSIM) += samsung-dsim.o obj-$(CONFIG_DRM_SIL_SII8620) += sil-sii8620.o obj-$(CONFIG_DRM_SII902X) += sii902x.o obj-$(CONFIG_DRM_SII9234) += sii9234.o diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/bridge/samsung-dsim.c similarity index 77% rename from drivers/gpu/drm/exynos/exynos_drm_dsi.c rename to drivers/gpu/drm/bridge/samsung-dsim.c index 53d878d4d2d7..eed6b3ffdea7 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c +++ b/drivers/gpu/drm/bridge/samsung-dsim.c @@ -1,11 +1,15 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Samsung SoC MIPI DSI Master driver. + * Samsung MIPI DSIM bridge driver. * + * Copyright (C) 2021 Amarula Solutions(India) * Copyright (c) 2014 Samsung Electronics Co., Ltd * - * Contacts: Tomasz Figa -*/ + * TODO: + * - Move or handle exynos specifics in exynos drm drivers stack. + * - Try to drop component_ops, but it indeed require to change + * exynos drm drivers stack. + */ #include #include @@ -33,8 +37,8 @@ #include #include -#include "exynos_drm_crtc.h" -#include "exynos_drm_drv.h" +#include "../exynos/exynos_drm_crtc.h" +#include "../exynos/exynos_drm_drv.h" /* returns true iff both arguments logically differs */ #define NEQV(a, b) (!(a) ^ !(b)) @@ -217,12 +221,12 @@ static const char *const clk_names[5] = { "bus_clk", "sclk_mipi", "phyclk_mipidphy0_bitclkdiv8", "phyclk_mipidphy0_rxclkesc0", "sclk_rgb_vclk_to_dsim0" }; -enum exynos_dsi_transfer_type { +enum samsung_dsim_transfer_type { EXYNOS_DSI_TX, EXYNOS_DSI_RX, }; -struct exynos_dsi_transfer { +struct samsung_dsim_transfer { struct list_head list; struct completion completed; int result; @@ -240,7 +244,7 @@ struct exynos_dsi_transfer { #define DSIM_STATE_CMD_LPM BIT(2) #define DSIM_STATE_VIDOUT_AVAILABLE BIT(3) -struct exynos_dsi_driver_data { +struct samsung_dsim_driver_data { const unsigned int *reg_ofs; unsigned int plltmr_reg; unsigned int has_freqband:1; @@ -253,7 +257,7 @@ struct exynos_dsi_driver_data { bool exynos_specific; }; -struct exynos_dsi { +struct samsung_dsim { struct drm_encoder encoder; struct mipi_dsi_host dsi_host; struct drm_bridge bridge; @@ -283,14 +287,14 @@ struct exynos_dsi { spinlock_t transfer_lock; /* protects transfer_list */ struct list_head transfer_list; - const struct exynos_dsi_driver_data *driver_data; + const struct samsung_dsim_driver_data *driver_data; }; -#define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host) +#define host_to_dsi(host) container_of(host, struct samsung_dsim, dsi_host) -static inline struct exynos_dsi *bridge_to_dsi(struct drm_bridge *b) +static inline struct samsung_dsim *bridge_to_dsi(struct drm_bridge *b) { - return container_of(b, struct exynos_dsi, bridge); + return container_of(b, struct samsung_dsim, bridge); } enum reg_idx { @@ -318,14 +322,14 @@ enum reg_idx { NUM_REGS }; -static inline void exynos_dsi_write(struct exynos_dsi *dsi, enum reg_idx idx, - u32 val) +static inline void samsung_dsim_write(struct samsung_dsim *dsi, enum reg_idx idx, + u32 val) { writel(val, dsi->reg_base + dsi->driver_data->reg_ofs[idx]); } -static inline u32 exynos_dsi_read(struct exynos_dsi *dsi, enum reg_idx idx) +static inline u32 samsung_dsim_read(struct samsung_dsim *dsi, enum reg_idx idx) { return readl(dsi->reg_base + dsi->driver_data->reg_ofs[idx]); } @@ -450,7 +454,7 @@ static const unsigned int exynos5433_reg_values[] = { [PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0c), }; -static const struct exynos_dsi_driver_data exynos3_dsi_driver_data = { +static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = { .reg_ofs = exynos_reg_ofs, .plltmr_reg = 0x50, .has_freqband = 1, @@ -463,7 +467,7 @@ static const struct exynos_dsi_driver_data exynos3_dsi_driver_data = { .exynos_specific = true, }; -static const struct exynos_dsi_driver_data exynos4_dsi_driver_data = { +static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = { .reg_ofs = exynos_reg_ofs, .plltmr_reg = 0x50, .has_freqband = 1, @@ -476,7 +480,7 @@ static const struct exynos_dsi_driver_data exynos4_dsi_driver_data = { .exynos_specific = true, }; -static const struct exynos_dsi_driver_data exynos5_dsi_driver_data = { +static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = { .reg_ofs = exynos_reg_ofs, .plltmr_reg = 0x58, .num_clks = 2, @@ -487,7 +491,7 @@ static const struct exynos_dsi_driver_data exynos5_dsi_driver_data = { .exynos_specific = true, }; -static const struct exynos_dsi_driver_data exynos5433_dsi_driver_data = { +static const struct samsung_dsim_driver_data exynos5433_dsi_driver_data = { .reg_ofs = exynos5433_reg_ofs, .plltmr_reg = 0xa0, .has_clklane_stop = 1, @@ -499,7 +503,7 @@ static const struct exynos_dsi_driver_data exynos5433_dsi_driver_data = { .exynos_specific = true, }; -static const struct exynos_dsi_driver_data exynos5422_dsi_driver_data = { +static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = { .reg_ofs = exynos5433_reg_ofs, .plltmr_reg = 0xa0, .has_clklane_stop = 1, @@ -511,7 +515,7 @@ static const struct exynos_dsi_driver_data exynos5422_dsi_driver_data = { .exynos_specific = true, }; -static const struct of_device_id exynos_dsi_of_match[] = { +static const struct of_device_id samsung_dsim_of_match[] = { { .compatible = "samsung,exynos3250-mipi-dsi", .data = &exynos3_dsi_driver_data }, { .compatible = "samsung,exynos4210-mipi-dsi", @@ -525,7 +529,7 @@ static const struct of_device_id exynos_dsi_of_match[] = { { } }; -static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi) +static void samsung_dsim_wait_for_reset(struct samsung_dsim *dsi) { if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300))) return; @@ -533,22 +537,22 @@ static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi) dev_err(dsi->dev, "timeout waiting for reset\n"); } -static void exynos_dsi_reset(struct exynos_dsi *dsi) +static void samsung_dsim_reset(struct samsung_dsim *dsi) { u32 reset_val = dsi->driver_data->reg_values[RESET_TYPE]; reinit_completion(&dsi->completed); - exynos_dsi_write(dsi, DSIM_SWRST_REG, reset_val); + samsung_dsim_write(dsi, DSIM_SWRST_REG, reset_val); } #ifndef MHZ #define MHZ (1000*1000) #endif -static unsigned long exynos_dsi_pll_find_pms(struct exynos_dsi *dsi, +static unsigned long samsung_dsim_pll_find_pms(struct samsung_dsim *dsi, unsigned long fin, unsigned long fout, u8 *p, u16 *m, u8 *s) { - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; unsigned long best_freq = 0; u32 min_delta = 0xffffffff; u8 p_min, p_max; @@ -599,10 +603,10 @@ static unsigned long exynos_dsi_pll_find_pms(struct exynos_dsi *dsi, return best_freq; } -static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi, - unsigned long freq) +static unsigned long samsung_dsim_set_pll(struct samsung_dsim *dsi, + unsigned long freq) { - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; unsigned long fin, fout; int timeout; u8 p, s; @@ -610,7 +614,7 @@ static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi, u32 reg; fin = dsi->pll_clk_rate; - fout = exynos_dsi_pll_find_pms(dsi, fin, freq, &p, &m, &s); + fout = samsung_dsim_pll_find_pms(dsi, fin, freq, &p, &m, &s); if (!fout) { dev_err(dsi->dev, "failed to find PLL PMS for requested frequency\n"); @@ -641,7 +645,7 @@ static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi, reg |= DSIM_FREQ_BAND(band); } - exynos_dsi_write(dsi, DSIM_PLLCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_PLLCTRL_REG, reg); timeout = 1000; do { @@ -649,19 +653,19 @@ static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi, dev_err(dsi->dev, "PLL failed to stabilize\n"); return 0; } - reg = exynos_dsi_read(dsi, DSIM_STATUS_REG); + reg = samsung_dsim_read(dsi, DSIM_STATUS_REG); } while ((reg & DSIM_PLL_STABLE) == 0); return fout; } -static int exynos_dsi_enable_clock(struct exynos_dsi *dsi) +static int samsung_dsim_enable_clock(struct samsung_dsim *dsi) { unsigned long hs_clk, byte_clk, esc_clk; unsigned long esc_div; u32 reg; - hs_clk = exynos_dsi_set_pll(dsi, dsi->burst_clk_rate); + hs_clk = samsung_dsim_set_pll(dsi, dsi->burst_clk_rate); if (!hs_clk) { dev_err(dsi->dev, "failed to configure DSI PLL\n"); return -EFAULT; @@ -679,7 +683,7 @@ static int exynos_dsi_enable_clock(struct exynos_dsi *dsi) dev_dbg(dsi->dev, "hs_clk = %lu, byte_clk = %lu, esc_clk = %lu\n", hs_clk, byte_clk, esc_clk); - reg = exynos_dsi_read(dsi, DSIM_CLKCTRL_REG); + reg = samsung_dsim_read(dsi, DSIM_CLKCTRL_REG); reg &= ~(DSIM_ESC_PRESCALER_MASK | DSIM_LANE_ESC_CLK_EN_CLK | DSIM_LANE_ESC_CLK_EN_DATA_MASK | DSIM_PLL_BYPASS | DSIM_BYTE_CLK_SRC_MASK); @@ -689,14 +693,14 @@ static int exynos_dsi_enable_clock(struct exynos_dsi *dsi) | DSIM_LANE_ESC_CLK_EN_DATA(BIT(dsi->lanes) - 1) | DSIM_BYTE_CLK_SRC(0) | DSIM_TX_REQUEST_HSCLK; - exynos_dsi_write(dsi, DSIM_CLKCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_CLKCTRL_REG, reg); return 0; } -static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) +static void samsung_dsim_set_phy_ctrl(struct samsung_dsim *dsi) { - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; const unsigned int *reg_values = driver_data->reg_values; u32 reg; @@ -706,7 +710,7 @@ static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) /* B D-PHY: D-PHY Master & Slave Analog Block control */ reg = reg_values[PHYCTRL_ULPS_EXIT] | reg_values[PHYCTRL_VREG_LP] | reg_values[PHYCTRL_SLEW_UP]; - exynos_dsi_write(dsi, DSIM_PHYCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_PHYCTRL_REG, reg); /* * T LPX: Transmitted length of any Low-Power state period @@ -714,7 +718,7 @@ static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) * burst */ reg = reg_values[PHYTIMING_LPX] | reg_values[PHYTIMING_HS_EXIT]; - exynos_dsi_write(dsi, DSIM_PHYTIMING_REG, reg); + samsung_dsim_write(dsi, DSIM_PHYTIMING_REG, reg); /* * T CLK-PREPARE: Time that the transmitter drives the Clock Lane LP-00 @@ -734,7 +738,7 @@ static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) reg_values[PHYTIMING_CLK_POST] | reg_values[PHYTIMING_CLK_TRAIL]; - exynos_dsi_write(dsi, DSIM_PHYTIMING1_REG, reg); + samsung_dsim_write(dsi, DSIM_PHYTIMING1_REG, reg); /* * T HS-PREPARE: Time that the transmitter drives the Data Lane LP-00 @@ -747,47 +751,47 @@ static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) */ reg = reg_values[PHYTIMING_HS_PREPARE] | reg_values[PHYTIMING_HS_ZERO] | reg_values[PHYTIMING_HS_TRAIL]; - exynos_dsi_write(dsi, DSIM_PHYTIMING2_REG, reg); + samsung_dsim_write(dsi, DSIM_PHYTIMING2_REG, reg); } -static void exynos_dsi_disable_clock(struct exynos_dsi *dsi) +static void samsung_dsim_disable_clock(struct samsung_dsim *dsi) { u32 reg; - reg = exynos_dsi_read(dsi, DSIM_CLKCTRL_REG); + reg = samsung_dsim_read(dsi, DSIM_CLKCTRL_REG); reg &= ~(DSIM_LANE_ESC_CLK_EN_CLK | DSIM_LANE_ESC_CLK_EN_DATA_MASK | DSIM_ESC_CLKEN | DSIM_BYTE_CLKEN); - exynos_dsi_write(dsi, DSIM_CLKCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_CLKCTRL_REG, reg); - reg = exynos_dsi_read(dsi, DSIM_PLLCTRL_REG); + reg = samsung_dsim_read(dsi, DSIM_PLLCTRL_REG); reg &= ~DSIM_PLL_EN; - exynos_dsi_write(dsi, DSIM_PLLCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_PLLCTRL_REG, reg); } -static void exynos_dsi_enable_lane(struct exynos_dsi *dsi, u32 lane) +static void samsung_dsim_enable_lane(struct samsung_dsim *dsi, u32 lane) { - u32 reg = exynos_dsi_read(dsi, DSIM_CONFIG_REG); + u32 reg = samsung_dsim_read(dsi, DSIM_CONFIG_REG); reg |= (DSIM_NUM_OF_DATA_LANE(dsi->lanes - 1) | DSIM_LANE_EN_CLK | DSIM_LANE_EN(lane)); - exynos_dsi_write(dsi, DSIM_CONFIG_REG, reg); + samsung_dsim_write(dsi, DSIM_CONFIG_REG, reg); } -static int exynos_dsi_init_link(struct exynos_dsi *dsi) +static int samsung_dsim_init_link(struct samsung_dsim *dsi) { - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; int timeout; u32 reg; u32 lanes_mask; /* Initialize FIFO pointers */ - reg = exynos_dsi_read(dsi, DSIM_FIFOCTRL_REG); + reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG); reg &= ~0x1f; - exynos_dsi_write(dsi, DSIM_FIFOCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_FIFOCTRL_REG, reg); usleep_range(9000, 11000); reg |= 0x1f; - exynos_dsi_write(dsi, DSIM_FIFOCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_FIFOCTRL_REG, reg); usleep_range(9000, 11000); /* DSI configuration */ @@ -856,10 +860,10 @@ static int exynos_dsi_init_link(struct exynos_dsi *dsi) dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) { reg |= DSIM_CLKLANE_STOP; } - exynos_dsi_write(dsi, DSIM_CONFIG_REG, reg); + samsung_dsim_write(dsi, DSIM_CONFIG_REG, reg); lanes_mask = BIT(dsi->lanes) - 1; - exynos_dsi_enable_lane(dsi, lanes_mask); + samsung_dsim_enable_lane(dsi, lanes_mask); /* Check clock and data lane state are stop state */ timeout = 100; @@ -869,24 +873,24 @@ static int exynos_dsi_init_link(struct exynos_dsi *dsi) return -EFAULT; } - reg = exynos_dsi_read(dsi, DSIM_STATUS_REG); + reg = samsung_dsim_read(dsi, DSIM_STATUS_REG); if ((reg & DSIM_STOP_STATE_DAT(lanes_mask)) != DSIM_STOP_STATE_DAT(lanes_mask)) continue; } while (!(reg & (DSIM_STOP_STATE_CLK | DSIM_TX_READY_HS_CLK))); - reg = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); + reg = samsung_dsim_read(dsi, DSIM_ESCMODE_REG); reg &= ~DSIM_STOP_STATE_CNT_MASK; reg |= DSIM_STOP_STATE_CNT(driver_data->reg_values[STOP_STATE_CNT]); - exynos_dsi_write(dsi, DSIM_ESCMODE_REG, reg); + samsung_dsim_write(dsi, DSIM_ESCMODE_REG, reg); reg = DSIM_BTA_TIMEOUT(0xff) | DSIM_LPDR_TIMEOUT(0xffff); - exynos_dsi_write(dsi, DSIM_TIMEOUT_REG, reg); + samsung_dsim_write(dsi, DSIM_TIMEOUT_REG, reg); return 0; } -static void exynos_dsi_set_display_mode(struct exynos_dsi *dsi) +static void samsung_dsim_set_display_mode(struct samsung_dsim *dsi) { struct drm_display_mode *m = &dsi->mode; unsigned int num_bits_resol = dsi->driver_data->num_bits_resol; @@ -896,42 +900,42 @@ static void exynos_dsi_set_display_mode(struct exynos_dsi *dsi) reg = DSIM_CMD_ALLOW(0xf) | DSIM_STABLE_VFP(m->vsync_start - m->vdisplay) | DSIM_MAIN_VBP(m->vtotal - m->vsync_end); - exynos_dsi_write(dsi, DSIM_MVPORCH_REG, reg); + samsung_dsim_write(dsi, DSIM_MVPORCH_REG, reg); reg = DSIM_MAIN_HFP(m->hsync_start - m->hdisplay) | DSIM_MAIN_HBP(m->htotal - m->hsync_end); - exynos_dsi_write(dsi, DSIM_MHPORCH_REG, reg); + samsung_dsim_write(dsi, DSIM_MHPORCH_REG, reg); reg = DSIM_MAIN_VSA(m->vsync_end - m->vsync_start) | DSIM_MAIN_HSA(m->hsync_end - m->hsync_start); - exynos_dsi_write(dsi, DSIM_MSYNC_REG, reg); + samsung_dsim_write(dsi, DSIM_MSYNC_REG, reg); } reg = DSIM_MAIN_HRESOL(m->hdisplay, num_bits_resol) | DSIM_MAIN_VRESOL(m->vdisplay, num_bits_resol); - exynos_dsi_write(dsi, DSIM_MDRESOL_REG, reg); + samsung_dsim_write(dsi, DSIM_MDRESOL_REG, reg); dev_dbg(dsi->dev, "LCD size = %dx%d\n", m->hdisplay, m->vdisplay); } -static void exynos_dsi_set_display_enable(struct exynos_dsi *dsi, bool enable) +static void samsung_dsim_set_display_enable(struct samsung_dsim *dsi, bool enable) { u32 reg; - reg = exynos_dsi_read(dsi, DSIM_MDRESOL_REG); + reg = samsung_dsim_read(dsi, DSIM_MDRESOL_REG); if (enable) reg |= DSIM_MAIN_STAND_BY; else reg &= ~DSIM_MAIN_STAND_BY; - exynos_dsi_write(dsi, DSIM_MDRESOL_REG, reg); + samsung_dsim_write(dsi, DSIM_MDRESOL_REG, reg); } -static int exynos_dsi_wait_for_hdr_fifo(struct exynos_dsi *dsi) +static int samsung_dsim_wait_for_hdr_fifo(struct samsung_dsim *dsi) { int timeout = 2000; do { - u32 reg = exynos_dsi_read(dsi, DSIM_FIFOCTRL_REG); + u32 reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG); if (!(reg & DSIM_SFR_HEADER_FULL)) return 0; @@ -943,27 +947,27 @@ static int exynos_dsi_wait_for_hdr_fifo(struct exynos_dsi *dsi) return -ETIMEDOUT; } -static void exynos_dsi_set_cmd_lpm(struct exynos_dsi *dsi, bool lpm) +static void samsung_dsim_set_cmd_lpm(struct samsung_dsim *dsi, bool lpm) { - u32 v = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); + u32 v = samsung_dsim_read(dsi, DSIM_ESCMODE_REG); if (lpm) v |= DSIM_CMD_LPDT_LP; else v &= ~DSIM_CMD_LPDT_LP; - exynos_dsi_write(dsi, DSIM_ESCMODE_REG, v); + samsung_dsim_write(dsi, DSIM_ESCMODE_REG, v); } -static void exynos_dsi_force_bta(struct exynos_dsi *dsi) +static void samsung_dsim_force_bta(struct samsung_dsim *dsi) { - u32 v = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); + u32 v = samsung_dsim_read(dsi, DSIM_ESCMODE_REG); v |= DSIM_FORCE_BTA; - exynos_dsi_write(dsi, DSIM_ESCMODE_REG, v); + samsung_dsim_write(dsi, DSIM_ESCMODE_REG, v); } -static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi, - struct exynos_dsi_transfer *xfer) +static void samsung_dsim_send_to_fifo(struct samsung_dsim *dsi, + struct samsung_dsim_transfer *xfer) { struct device *dev = dsi->dev; struct mipi_dsi_packet *pkt = &xfer->packet; @@ -983,7 +987,7 @@ static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi, /* Send payload */ while (length >= 4) { reg = get_unaligned_le32(payload); - exynos_dsi_write(dsi, DSIM_PAYLOAD_REG, reg); + samsung_dsim_write(dsi, DSIM_PAYLOAD_REG, reg); payload += 4; length -= 4; } @@ -998,7 +1002,7 @@ static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi, fallthrough; case 1: reg |= payload[0]; - exynos_dsi_write(dsi, DSIM_PAYLOAD_REG, reg); + samsung_dsim_write(dsi, DSIM_PAYLOAD_REG, reg); break; } @@ -1007,25 +1011,25 @@ static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi, return; reg = get_unaligned_le32(pkt->header); - if (exynos_dsi_wait_for_hdr_fifo(dsi)) { + if (samsung_dsim_wait_for_hdr_fifo(dsi)) { dev_err(dev, "waiting for header FIFO timed out\n"); return; } if (NEQV(xfer->flags & MIPI_DSI_MSG_USE_LPM, dsi->state & DSIM_STATE_CMD_LPM)) { - exynos_dsi_set_cmd_lpm(dsi, xfer->flags & MIPI_DSI_MSG_USE_LPM); + samsung_dsim_set_cmd_lpm(dsi, xfer->flags & MIPI_DSI_MSG_USE_LPM); dsi->state ^= DSIM_STATE_CMD_LPM; } - exynos_dsi_write(dsi, DSIM_PKTHDR_REG, reg); + samsung_dsim_write(dsi, DSIM_PKTHDR_REG, reg); if (xfer->flags & MIPI_DSI_MSG_REQ_ACK) - exynos_dsi_force_bta(dsi); + samsung_dsim_force_bta(dsi); } -static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, - struct exynos_dsi_transfer *xfer) +static void samsung_dsim_read_from_fifo(struct samsung_dsim *dsi, + struct samsung_dsim_transfer *xfer) { u8 *payload = xfer->rx_payload + xfer->rx_done; bool first = !xfer->rx_done; @@ -1034,7 +1038,7 @@ static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, u32 reg; if (first) { - reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); + reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); switch (reg & 0x3f) { case MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_2BYTE: @@ -1073,7 +1077,7 @@ static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, /* Receive payload */ while (length >= 4) { - reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); + reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); payload[0] = (reg >> 0) & 0xff; payload[1] = (reg >> 8) & 0xff; payload[2] = (reg >> 16) & 0xff; @@ -1083,7 +1087,7 @@ static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, } if (length) { - reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); + reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); switch (length) { case 3: payload[2] = (reg >> 16) & 0xff; @@ -1102,16 +1106,16 @@ static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, clear_fifo: length = DSI_RX_FIFO_SIZE / 4; do { - reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); + reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); if (reg == DSI_RX_FIFO_EMPTY) break; } while (--length); } -static void exynos_dsi_transfer_start(struct exynos_dsi *dsi) +static void samsung_dsim_transfer_start(struct samsung_dsim *dsi) { unsigned long flags; - struct exynos_dsi_transfer *xfer; + struct samsung_dsim_transfer *xfer; bool start = false; again: @@ -1123,7 +1127,7 @@ static void exynos_dsi_transfer_start(struct exynos_dsi *dsi) } xfer = list_first_entry(&dsi->transfer_list, - struct exynos_dsi_transfer, list); + struct samsung_dsim_transfer, list); spin_unlock_irqrestore(&dsi->transfer_lock, flags); @@ -1132,7 +1136,7 @@ static void exynos_dsi_transfer_start(struct exynos_dsi *dsi) /* waiting for RX */ return; - exynos_dsi_send_to_fifo(dsi, xfer); + samsung_dsim_send_to_fifo(dsi, xfer); if (xfer->packet.payload_length || xfer->rx_len) return; @@ -1151,9 +1155,9 @@ static void exynos_dsi_transfer_start(struct exynos_dsi *dsi) goto again; } -static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi) +static bool samsung_dsim_transfer_finish(struct samsung_dsim *dsi) { - struct exynos_dsi_transfer *xfer; + struct samsung_dsim_transfer *xfer; unsigned long flags; bool start = true; @@ -1165,7 +1169,7 @@ static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi) } xfer = list_first_entry(&dsi->transfer_list, - struct exynos_dsi_transfer, list); + struct samsung_dsim_transfer, list); spin_unlock_irqrestore(&dsi->transfer_lock, flags); @@ -1178,7 +1182,7 @@ static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi) return true; if (xfer->rx_done != xfer->rx_len) - exynos_dsi_read_from_fifo(dsi, xfer); + samsung_dsim_read_from_fifo(dsi, xfer); if (xfer->rx_done != xfer->rx_len) return true; @@ -1197,8 +1201,8 @@ static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi) return start; } -static void exynos_dsi_remove_transfer(struct exynos_dsi *dsi, - struct exynos_dsi_transfer *xfer) +static void samsung_dsim_remove_transfer(struct samsung_dsim *dsi, + struct samsung_dsim_transfer *xfer) { unsigned long flags; bool start; @@ -1207,12 +1211,12 @@ static void exynos_dsi_remove_transfer(struct exynos_dsi *dsi, if (!list_empty(&dsi->transfer_list) && xfer == list_first_entry(&dsi->transfer_list, - struct exynos_dsi_transfer, list)) { + struct samsung_dsim_transfer, list)) { list_del_init(&xfer->list); start = !list_empty(&dsi->transfer_list); spin_unlock_irqrestore(&dsi->transfer_lock, flags); if (start) - exynos_dsi_transfer_start(dsi); + samsung_dsim_transfer_start(dsi); return; } @@ -1221,8 +1225,8 @@ static void exynos_dsi_remove_transfer(struct exynos_dsi *dsi, spin_unlock_irqrestore(&dsi->transfer_lock, flags); } -static int exynos_dsi_transfer(struct exynos_dsi *dsi, - struct exynos_dsi_transfer *xfer) +static int samsung_dsim_transfer(struct samsung_dsim *dsi, + struct samsung_dsim_transfer *xfer) { unsigned long flags; bool stopped; @@ -1240,13 +1244,13 @@ static int exynos_dsi_transfer(struct exynos_dsi *dsi, spin_unlock_irqrestore(&dsi->transfer_lock, flags); if (stopped) - exynos_dsi_transfer_start(dsi); + samsung_dsim_transfer_start(dsi); wait_for_completion_timeout(&xfer->completed, msecs_to_jiffies(DSI_XFER_TIMEOUT_MS)); if (xfer->result == -ETIMEDOUT) { struct mipi_dsi_packet *pkt = &xfer->packet; - exynos_dsi_remove_transfer(dsi, xfer); + samsung_dsim_remove_transfer(dsi, xfer); dev_err(dsi->dev, "xfer timed out: %*ph %*ph\n", 4, pkt->header, (int)pkt->payload_length, pkt->payload); return -ETIMEDOUT; @@ -1256,25 +1260,25 @@ static int exynos_dsi_transfer(struct exynos_dsi *dsi, return xfer->result; } -static irqreturn_t exynos_dsi_irq(int irq, void *dev_id) +static irqreturn_t samsung_dsim_irq(int irq, void *dev_id) { - struct exynos_dsi *dsi = dev_id; + struct samsung_dsim *dsi = dev_id; u32 status; - status = exynos_dsi_read(dsi, DSIM_INTSRC_REG); + status = samsung_dsim_read(dsi, DSIM_INTSRC_REG); if (!status) { static unsigned long int j; if (printk_timed_ratelimit(&j, 500)) dev_warn(dsi->dev, "spurious interrupt\n"); return IRQ_HANDLED; } - exynos_dsi_write(dsi, DSIM_INTSRC_REG, status); + samsung_dsim_write(dsi, DSIM_INTSRC_REG, status); if (status & DSIM_INT_SW_RST_RELEASE) { u32 mask = ~(DSIM_INT_RX_DONE | DSIM_INT_SFR_FIFO_EMPTY | DSIM_INT_SFR_HDR_FIFO_EMPTY | DSIM_INT_RX_ECC_ERR | DSIM_INT_SW_RST_RELEASE); - exynos_dsi_write(dsi, DSIM_INTMSK_REG, mask); + samsung_dsim_write(dsi, DSIM_INTMSK_REG, mask); complete(&dsi->completed); return IRQ_HANDLED; } @@ -1283,15 +1287,15 @@ static irqreturn_t exynos_dsi_irq(int irq, void *dev_id) DSIM_INT_PLL_STABLE))) return IRQ_HANDLED; - if (exynos_dsi_transfer_finish(dsi)) - exynos_dsi_transfer_start(dsi); + if (samsung_dsim_transfer_finish(dsi)) + samsung_dsim_transfer_start(dsi); return IRQ_HANDLED; } -static irqreturn_t exynos_dsi_te_irq_handler(int irq, void *dev_id) +static irqreturn_t samsung_dsim_te_irq_handler(int irq, void *dev_id) { - struct exynos_dsi *dsi = (struct exynos_dsi *)dev_id; + struct samsung_dsim *dsi = (struct samsung_dsim *)dev_id; struct drm_encoder *encoder = &dsi->encoder; if (dsi->state & DSIM_STATE_VIDOUT_AVAILABLE) @@ -1300,7 +1304,7 @@ static irqreturn_t exynos_dsi_te_irq_handler(int irq, void *dev_id) return IRQ_HANDLED; } -static void exynos_dsi_enable_irq(struct exynos_dsi *dsi) +static void samsung_dsim_enable_irq(struct samsung_dsim *dsi) { enable_irq(dsi->irq); @@ -1308,7 +1312,7 @@ static void exynos_dsi_enable_irq(struct exynos_dsi *dsi) enable_irq(gpio_to_irq(dsi->te_gpio)); } -static void exynos_dsi_disable_irq(struct exynos_dsi *dsi) +static void samsung_dsim_disable_irq(struct samsung_dsim *dsi) { if (gpio_is_valid(dsi->te_gpio)) disable_irq(gpio_to_irq(dsi->te_gpio)); @@ -1316,27 +1320,27 @@ static void exynos_dsi_disable_irq(struct exynos_dsi *dsi) disable_irq(dsi->irq); } -static int exynos_dsi_init(struct exynos_dsi *dsi) +static int samsung_dsim_init(struct samsung_dsim *dsi) { - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; - exynos_dsi_reset(dsi); - exynos_dsi_enable_irq(dsi); + samsung_dsim_reset(dsi); + samsung_dsim_enable_irq(dsi); if (driver_data->reg_values[RESET_TYPE] == DSIM_FUNCRST) - exynos_dsi_enable_lane(dsi, BIT(dsi->lanes) - 1); + samsung_dsim_enable_lane(dsi, BIT(dsi->lanes) - 1); - exynos_dsi_enable_clock(dsi); + samsung_dsim_enable_clock(dsi); if (driver_data->wait_for_reset) - exynos_dsi_wait_for_reset(dsi); - exynos_dsi_set_phy_ctrl(dsi); - exynos_dsi_init_link(dsi); + samsung_dsim_wait_for_reset(dsi); + samsung_dsim_set_phy_ctrl(dsi); + samsung_dsim_init_link(dsi); return 0; } -static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi, - struct device *panel) +static int samsung_dsim_register_te_irq(struct samsung_dsim *dsi, + struct device *panel) { int ret; int te_gpio_irq; @@ -1359,7 +1363,7 @@ static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi, te_gpio_irq = gpio_to_irq(dsi->te_gpio); - ret = request_threaded_irq(te_gpio_irq, exynos_dsi_te_irq_handler, NULL, + ret = request_threaded_irq(te_gpio_irq, samsung_dsim_te_irq_handler, NULL, IRQF_TRIGGER_RISING | IRQF_NO_AUTOEN, "TE", dsi); if (ret) { dev_err(dsi->dev, "request interrupt failed with %d\n", ret); @@ -1371,7 +1375,7 @@ static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi, return ret; } -static void exynos_dsi_unregister_te_irq(struct exynos_dsi *dsi) +static void samsung_dsim_unregister_te_irq(struct samsung_dsim *dsi) { if (gpio_is_valid(dsi->te_gpio)) { free_irq(gpio_to_irq(dsi->te_gpio), dsi); @@ -1380,9 +1384,9 @@ static void exynos_dsi_unregister_te_irq(struct exynos_dsi *dsi) } } -static void exynos_dsi_bridge_enable(struct drm_bridge *bridge) +static void samsung_dsim_bridge_enable(struct drm_bridge *bridge) { - struct exynos_dsi *dsi = bridge_to_dsi(bridge); + struct samsung_dsim *dsi = bridge_to_dsi(bridge); int ret; if (dsi->state & DSIM_STATE_ENABLED) @@ -1396,39 +1400,39 @@ static void exynos_dsi_bridge_enable(struct drm_bridge *bridge) dsi->state |= DSIM_STATE_ENABLED; - exynos_dsi_set_display_mode(dsi); - exynos_dsi_set_display_enable(dsi, true); + samsung_dsim_set_display_mode(dsi); + samsung_dsim_set_display_enable(dsi, true); dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE; return; } -static void exynos_dsi_bridge_disable(struct drm_bridge *bridge) +static void samsung_dsim_bridge_disable(struct drm_bridge *bridge) { - struct exynos_dsi *dsi = bridge_to_dsi(bridge); + struct samsung_dsim *dsi = bridge_to_dsi(bridge); if (!(dsi->state & DSIM_STATE_ENABLED)) return; dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE; - exynos_dsi_set_display_enable(dsi, false); + samsung_dsim_set_display_enable(dsi, false); dsi->state &= ~DSIM_STATE_ENABLED; pm_runtime_put_sync(dsi->dev); } -static void exynos_dsi_bridge_mode_set(struct drm_bridge *bridge, - const struct drm_display_mode *mode, - const struct drm_display_mode *adjusted_mode) +static void samsung_dsim_bridge_mode_set(struct drm_bridge *bridge, + const struct drm_display_mode *mode, + const struct drm_display_mode *adjusted_mode) { - struct exynos_dsi *dsi = bridge_to_dsi(bridge); + struct samsung_dsim *dsi = bridge_to_dsi(bridge); drm_mode_copy(&dsi->mode, adjusted_mode); } -static int exynos_dsi_panel_or_bridge(struct exynos_dsi *dsi, - struct device_node *node) +static int samsung_dsim_panel_or_bridge(struct samsung_dsim *dsi, + struct device_node *node) { struct drm_bridge *panel_bridge; struct drm_panel *panel; @@ -1453,10 +1457,10 @@ static int exynos_dsi_panel_or_bridge(struct exynos_dsi *dsi, return 0; } -static int exynos_dsi_bridge_attach(struct drm_bridge *bridge, - enum drm_bridge_attach_flags flags) +static int samsung_dsim_bridge_attach(struct drm_bridge *bridge, + enum drm_bridge_attach_flags flags) { - struct exynos_dsi *dsi = bridge_to_dsi(bridge); + struct samsung_dsim *dsi = bridge_to_dsi(bridge); dsi->drm = bridge->dev; @@ -1464,23 +1468,23 @@ static int exynos_dsi_bridge_attach(struct drm_bridge *bridge, flags); } -static const struct drm_bridge_funcs exynos_dsi_bridge_funcs = { - .enable = exynos_dsi_bridge_enable, - .disable = exynos_dsi_bridge_disable, - .mode_set = exynos_dsi_bridge_mode_set, - .attach = exynos_dsi_bridge_attach, +static const struct drm_bridge_funcs samsung_dsim_bridge_funcs = { + .enable = samsung_dsim_bridge_enable, + .disable = samsung_dsim_bridge_disable, + .mode_set = samsung_dsim_bridge_mode_set, + .attach = samsung_dsim_bridge_attach, }; -MODULE_DEVICE_TABLE(of, exynos_dsi_of_match); +MODULE_DEVICE_TABLE(of, samsung_dsim_of_match); -static int exynos_dsi_host_attach(struct mipi_dsi_host *host, - struct mipi_dsi_device *device) +static int samsung_dsim_host_attach(struct mipi_dsi_host *host, + struct mipi_dsi_device *device) { - struct exynos_dsi *dsi = host_to_dsi(host); + struct samsung_dsim *dsi = host_to_dsi(host); struct drm_device *drm = dsi->drm; int ret; - ret = exynos_dsi_panel_or_bridge(dsi, device->dev.of_node); + ret = samsung_dsim_panel_or_bridge(dsi, device->dev.of_node); if (ret) return ret; @@ -1492,7 +1496,7 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host, */ if (dsi->driver_data->exynos_specific && !(device->mode_flags & MIPI_DSI_MODE_VIDEO)) { - int ret = exynos_dsi_register_te_irq(dsi, &device->dev); + int ret = samsung_dsim_register_te_irq(dsi, &device->dev); if (ret) return ret; } @@ -1514,33 +1518,33 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host, return 0; } -static int exynos_dsi_host_detach(struct mipi_dsi_host *host, - struct mipi_dsi_device *device) +static int samsung_dsim_host_detach(struct mipi_dsi_host *host, + struct mipi_dsi_device *device) { - struct exynos_dsi *dsi = host_to_dsi(host); + struct samsung_dsim *dsi = host_to_dsi(host); struct drm_device *drm = dsi->drm; if (drm->mode_config.poll_enabled) drm_kms_helper_hotplug_event(drm); if (dsi->driver_data->exynos_specific) - exynos_dsi_unregister_te_irq(dsi); + samsung_dsim_unregister_te_irq(dsi); return 0; } -static ssize_t exynos_dsi_host_transfer(struct mipi_dsi_host *host, - const struct mipi_dsi_msg *msg) +static ssize_t samsung_dsim_host_transfer(struct mipi_dsi_host *host, + const struct mipi_dsi_msg *msg) { - struct exynos_dsi *dsi = host_to_dsi(host); - struct exynos_dsi_transfer xfer; + struct samsung_dsim *dsi = host_to_dsi(host); + struct samsung_dsim_transfer xfer; int ret; if (!(dsi->state & DSIM_STATE_ENABLED)) return -EINVAL; if (!(dsi->state & DSIM_STATE_INITIALIZED)) { - ret = exynos_dsi_init(dsi); + ret = samsung_dsim_init(dsi); if (ret) return ret; dsi->state |= DSIM_STATE_INITIALIZED; @@ -1554,18 +1558,18 @@ static ssize_t exynos_dsi_host_transfer(struct mipi_dsi_host *host, xfer.rx_payload = msg->rx_buf; xfer.flags = msg->flags; - ret = exynos_dsi_transfer(dsi, &xfer); + ret = samsung_dsim_transfer(dsi, &xfer); return (ret < 0) ? ret : xfer.rx_done; } -static const struct mipi_dsi_host_ops exynos_dsi_ops = { - .attach = exynos_dsi_host_attach, - .detach = exynos_dsi_host_detach, - .transfer = exynos_dsi_host_transfer, +static const struct mipi_dsi_host_ops samsung_dsim_ops = { + .attach = samsung_dsim_host_attach, + .detach = samsung_dsim_host_detach, + .transfer = samsung_dsim_host_transfer, }; -static int exynos_dsi_of_read_u32(const struct device_node *np, - const char *propname, u32 *out_value) +static int samsung_dsim_of_read_u32(const struct device_node *np, + const char *propname, u32 *out_value) { int ret = of_property_read_u32(np, propname, out_value); @@ -1580,23 +1584,23 @@ enum { DSI_PORT_OUT }; -static int exynos_dsi_parse_dt(struct exynos_dsi *dsi) +static int samsung_dsim_parse_dt(struct samsung_dsim *dsi) { struct device *dev = dsi->dev; struct device_node *node = dev->of_node; int ret; - ret = exynos_dsi_of_read_u32(node, "samsung,pll-clock-frequency", + ret = samsung_dsim_of_read_u32(node, "samsung,pll-clock-frequency", &dsi->pll_clk_rate); if (ret < 0) return ret; - ret = exynos_dsi_of_read_u32(node, "samsung,burst-clock-frequency", + ret = samsung_dsim_of_read_u32(node, "samsung,burst-clock-frequency", &dsi->burst_clk_rate); if (ret < 0) return ret; - ret = exynos_dsi_of_read_u32(node, "samsung,esc-clock-frequency", + ret = samsung_dsim_of_read_u32(node, "samsung,esc-clock-frequency", &dsi->esc_clk_rate); if (ret < 0) return ret; @@ -1604,10 +1608,10 @@ static int exynos_dsi_parse_dt(struct exynos_dsi *dsi) return 0; } -static int exynos_dsi_bind(struct device *dev, struct device *master, - void *data) +static int samsung_dsim_bind(struct device *dev, struct device *master, + void *data) { - struct exynos_dsi *dsi = dev_get_drvdata(dev); + struct samsung_dsim *dsi = dev_get_drvdata(dev); struct drm_encoder *encoder = &dsi->encoder; struct drm_device *drm_dev = data; struct device_node *in_bridge_node; @@ -1650,26 +1654,26 @@ static int exynos_dsi_bind(struct device *dev, struct device *master, return mipi_dsi_host_register(&dsi->dsi_host); } -static void exynos_dsi_unbind(struct device *dev, struct device *master, +static void samsung_dsim_unbind(struct device *dev, struct device *master, void *data) { - struct exynos_dsi *dsi = dev_get_drvdata(dev); + struct samsung_dsim *dsi = dev_get_drvdata(dev); - exynos_dsi_bridge_disable(&dsi->bridge); + samsung_dsim_bridge_disable(&dsi->bridge); drm_encoder_cleanup(&dsi->encoder); mipi_dsi_host_unregister(&dsi->dsi_host); } -static const struct component_ops exynos_dsi_component_ops = { - .bind = exynos_dsi_bind, - .unbind = exynos_dsi_unbind, +static const struct component_ops samsung_dsim_component_ops = { + .bind = samsung_dsim_bind, + .unbind = samsung_dsim_unbind, }; -static int exynos_dsi_probe(struct platform_device *pdev) +static int samsung_dsim_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct resource *res; - struct exynos_dsi *dsi; + struct samsung_dsim *dsi; int ret, i; dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); @@ -1683,7 +1687,7 @@ static int exynos_dsi_probe(struct platform_device *pdev) spin_lock_init(&dsi->transfer_lock); INIT_LIST_HEAD(&dsi->transfer_list); - dsi->dsi_host.ops = &exynos_dsi_ops; + dsi->dsi_host.ops = &samsung_dsim_ops; dsi->dsi_host.dev = dev; dsi->dev = dev; @@ -1734,7 +1738,7 @@ static int exynos_dsi_probe(struct platform_device *pdev) return dsi->irq; ret = devm_request_threaded_irq(dev, dsi->irq, NULL, - exynos_dsi_irq, + samsung_dsim_irq, IRQF_ONESHOT | IRQF_NO_AUTOEN, dev_name(dev), dsi); if (ret) { @@ -1742,7 +1746,7 @@ static int exynos_dsi_probe(struct platform_device *pdev) return ret; } - ret = exynos_dsi_parse_dt(dsi); + ret = samsung_dsim_parse_dt(dsi); if (ret) return ret; @@ -1759,14 +1763,14 @@ static int exynos_dsi_probe(struct platform_device *pdev) pm_runtime_enable(dev); - dsi->bridge.funcs = &exynos_dsi_bridge_funcs; + dsi->bridge.funcs = &samsung_dsim_bridge_funcs; dsi->bridge.of_node = dev->of_node; dsi->bridge.type = DRM_MODE_CONNECTOR_DSI; drm_bridge_add(&dsi->bridge); if (dsi->driver_data->exynos_specific) { - ret = component_add(dev, &exynos_dsi_component_ops); + ret = component_add(dev, &samsung_dsim_component_ops); if (ret) goto err_disable_runtime; } @@ -1779,24 +1783,24 @@ static int exynos_dsi_probe(struct platform_device *pdev) return ret; } -static int exynos_dsi_remove(struct platform_device *pdev) +static int samsung_dsim_remove(struct platform_device *pdev) { - struct exynos_dsi *dsi = platform_get_drvdata(pdev); + struct samsung_dsim *dsi = platform_get_drvdata(pdev); drm_bridge_remove(&dsi->bridge); pm_runtime_disable(&pdev->dev); if (dsi->driver_data->exynos_specific) - component_del(&pdev->dev, &exynos_dsi_component_ops); + component_del(&pdev->dev, &samsung_dsim_component_ops); return 0; } -static int __maybe_unused exynos_dsi_suspend(struct device *dev) +static int __maybe_unused samsung_dsim_suspend(struct device *dev) { - struct exynos_dsi *dsi = dev_get_drvdata(dev); - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + struct samsung_dsim *dsi = dev_get_drvdata(dev); + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; int ret, i; usleep_range(10000, 20000); @@ -1804,9 +1808,9 @@ static int __maybe_unused exynos_dsi_suspend(struct device *dev) if (dsi->state & DSIM_STATE_INITIALIZED) { dsi->state &= ~DSIM_STATE_INITIALIZED; - exynos_dsi_disable_clock(dsi); + samsung_dsim_disable_clock(dsi); - exynos_dsi_disable_irq(dsi); + samsung_dsim_disable_irq(dsi); } dsi->state &= ~DSIM_STATE_CMD_LPM; @@ -1823,10 +1827,10 @@ static int __maybe_unused exynos_dsi_suspend(struct device *dev) return 0; } -static int __maybe_unused exynos_dsi_resume(struct device *dev) +static int __maybe_unused samsung_dsim_resume(struct device *dev) { - struct exynos_dsi *dsi = dev_get_drvdata(dev); - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + struct samsung_dsim *dsi = dev_get_drvdata(dev); + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; int ret, i; ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies); @@ -1857,24 +1861,25 @@ static int __maybe_unused exynos_dsi_resume(struct device *dev) return ret; } -static const struct dev_pm_ops exynos_dsi_pm_ops = { - SET_RUNTIME_PM_OPS(exynos_dsi_suspend, exynos_dsi_resume, NULL) +static const struct dev_pm_ops samsung_dsim_pm_ops = { + SET_RUNTIME_PM_OPS(samsung_dsim_suspend, samsung_dsim_resume, NULL) SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume) }; struct platform_driver dsi_driver = { - .probe = exynos_dsi_probe, - .remove = exynos_dsi_remove, + .probe = samsung_dsim_probe, + .remove = samsung_dsim_remove, .driver = { - .name = "exynos-dsi", + .name = "samsung-dsim", .owner = THIS_MODULE, - .pm = &exynos_dsi_pm_ops, - .of_match_table = exynos_dsi_of_match, + .pm = &samsung_dsim_pm_ops, + .of_match_table = samsung_dsim_of_match, }, }; MODULE_AUTHOR("Tomasz Figa "); MODULE_AUTHOR("Andrzej Hajda "); -MODULE_DESCRIPTION("Samsung SoC MIPI DSI Master"); +MODULE_AUTHOR("Jagan Teki "); +MODULE_DESCRIPTION("Samsung MIPI DSIM bridge"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig index 6a251e3aa779..6bcd0fe03c70 100644 --- a/drivers/gpu/drm/exynos/Kconfig +++ b/drivers/gpu/drm/exynos/Kconfig @@ -53,15 +53,6 @@ config DRM_EXYNOS_DPI help This enables support for Exynos parallel output. -config DRM_EXYNOS_DSI - bool "MIPI-DSI host" - depends on DRM_EXYNOS_FIMD || DRM_EXYNOS5433_DECON || DRM_EXYNOS7_DECON - select DRM_MIPI_DSI - select DRM_PANEL - default n - help - This enables support for Exynos MIPI-DSI device. - config DRM_EXYNOS_DP bool "Exynos specific extensions for Analogix DP driver" depends on DRM_EXYNOS_FIMD || DRM_EXYNOS7_DECON diff --git a/drivers/gpu/drm/exynos/Makefile b/drivers/gpu/drm/exynos/Makefile index 2fd2f3ee4fcf..04832f92051d 100644 --- a/drivers/gpu/drm/exynos/Makefile +++ b/drivers/gpu/drm/exynos/Makefile @@ -11,7 +11,6 @@ exynosdrm-$(CONFIG_DRM_EXYNOS_FIMD) += exynos_drm_fimd.o exynosdrm-$(CONFIG_DRM_EXYNOS5433_DECON) += exynos5433_drm_decon.o exynosdrm-$(CONFIG_DRM_EXYNOS7_DECON) += exynos7_drm_decon.o exynosdrm-$(CONFIG_DRM_EXYNOS_DPI) += exynos_drm_dpi.o -exynosdrm-$(CONFIG_DRM_EXYNOS_DSI) += exynos_drm_dsi.o exynosdrm-$(CONFIG_DRM_EXYNOS_DP) += exynos_dp.o exynosdrm-$(CONFIG_DRM_EXYNOS_MIXER) += exynos_mixer.o exynosdrm-$(CONFIG_DRM_EXYNOS_HDMI) += exynos_hdmi.o -- 2.25.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-23.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DE785C07E95 for ; Sun, 4 Jul 2021 09:08:00 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A58CF60241 for ; Sun, 4 Jul 2021 09:08:00 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A58CF60241 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=amarulasolutions.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=QECJGdCX7Pnce3dtw40TAMN9J5Jf274DpQa/1vb1wjw=; b=0ksdjxkGgMym9V jmjFgdM2so8qRT4IoodL1H9+Ut3JNgCs5QzmGbSEjsxfoK53GPaDT6nGqmkZwnAj2OkpM1dJgcRwv I51CZMIuMmDaOyjnbax/s9PBk8YdHimG7HqqG5uUiUXXq63zH9agrhKp3r2tRxJyL1mm4M+hQeMDm L8QZ/LMPTC+XtX2kltK949ay6ndRW0/g9Ds4YROaG7B+1XDvxcjPFe+GHFyicdAHkjACtn9Klv7sq nLfcq0RbC2LB21oAFflbuluDABP9ibI+PUdUovHlPpU5X3pO6U0atBeZe6S3cpW9H/fcsaFsOEnDe /QOYszaO358l3bVOjG9w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lzy4d-0061F3-Ga; Sun, 04 Jul 2021 09:05:59 +0000 Received: from mail-pj1-x102f.google.com ([2607:f8b0:4864:20::102f]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lzy3a-0060kL-5A for linux-arm-kernel@lists.infradead.org; Sun, 04 Jul 2021 09:04:58 +0000 Received: by mail-pj1-x102f.google.com with SMTP id g6-20020a17090adac6b029015d1a9a6f1aso9965431pjx.1 for ; Sun, 04 Jul 2021 02:04:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=x8DbojDoEb5uY2A25IR0p63F/P/5IlsfDnb3J5qKSYc=; b=rEorpVedLG1oQSRSSrGYnCBfnLDbabcwXssx1B6hMLIqKt69o4ff788l87rMdxf/pp pwDtiBvQJtdNdVn/k8VG9HVHce/GFm8U/2ylCENloi5gRCYHqPLAN42Ji5H/paBAAaMr LXScI9ZNQLzeSwjkN8Sxf64eJQtK5noK3fuu0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=x8DbojDoEb5uY2A25IR0p63F/P/5IlsfDnb3J5qKSYc=; b=r1NHHB2yHhguKszkbD2PdaUg/S5VVyh5eW3jnAwu5T/eQ8zUZA7dHogdA1GRmWlfug KRXswiVvW7pZuJ5ZgD1Cz003uK1YghUrjkZ4pOg+9BEh23XuU8aDUNw/euu8VK7xl509 3XovqPaZ5m5kKgAF6EwMMUK2n1vdIYKh6VaC/uuQy1jYmlyzUrE22CinRFxCATjC9UvQ 5pzQjetNfmgjaEgzNr3sMI+MapPr1RyfLkFK/SkblTbGPNPAvmmkWk/Xfje1RVrIaF/r JwAz7ti84xwdTFg4Nlmv4KCi8Iuabsdyjjmk+eslqNk9Ba+nynkJc4TUo605fb+SVnrB K15g== X-Gm-Message-State: AOAM5320++h+PLLnkcMihuEJqIxyMM5/z4Tj9/eF1DvRDjsk5lQhw7oX G8hoahwpsiikUNkKacaBbW5VtA== X-Google-Smtp-Source: ABdhPJzYYBARwzR5yMlFsILzXaBPaBOK0zUuORaq+uVPg1s53a5rVb2Ko/Qi+cQQksrJdZ+L3SbLmA== X-Received: by 2002:a17:90a:1d43:: with SMTP id u3mr8833730pju.121.1625389493174; Sun, 04 Jul 2021 02:04:53 -0700 (PDT) Received: from localhost.localdomain ([2405:201:c00a:a884:1ae9:772f:6f0f:3e24]) by smtp.gmail.com with ESMTPSA id m24sm3360793pgd.60.2021.07.04.02.04.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 04 Jul 2021 02:04:52 -0700 (PDT) From: Jagan Teki To: Inki Dae , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Frieder Schrempf , Daniel Vetter , Marek Vasut , Krzysztof Kozlowski , Fabio Estevam Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, NXP Linux Team , linux-amarula , Jagan Teki Subject: [RFC PATCH 07/17] drm: bridge: Move exynos_drm_dsi into bridges Date: Sun, 4 Jul 2021 14:32:20 +0530 Message-Id: <20210704090230.26489-8-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210704090230.26489-1-jagan@amarulasolutions.com> References: <20210704090230.26489-1-jagan@amarulasolutions.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210704_020454_304235_30751C82 X-CRM114-Status: GOOD ( 27.29 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org VGhlIE1JUEkgRFNJIElQIHVzZWQgaW4gRXh5bm9zIGFuZCBpLk1YOE1NIGFyZSBiYXNlZApTYW1z dW5nIE1JUEkgRFNJTSBicmlkZ2UuCsKgIMKgCkluIG9yZGVyIHRvIGFjY2VzcyB0aGUgY29tbW9u IGJyaWRnZSBiZXR3ZWVuIHBsYXRmb3Jtcwp0aGUgaWRlYWwgd2F5IHRvIHB1c2ggdGhlIGRyaXZl ciBpbnRvIHRoZSBicmlkZ2UgYXJlYS4KwqAgwqAKU28sIHRoaXMgcGF0Y2ggd2lsbCBtb3ZlIHRo ZSBleHlub3NfZHJtX2RzaS5jIGRyaXZlcgppbnRvIHNhbXN1bmctZHNpbS5jIGFuZCBkbyB0aGUg bmVjZXNzYXJ5IGZ1bmN0aW9uIG5hbWUKY2hhbmdlcy4KwqAgwqAKVGhpcyB3b3VsZCBoZWxwIHRv IGltcHJvdmUgdGhlIGJyaWRnZSBkcml2ZXIgaW4gZnV0dXJlCnBhdGNoZXMgaW4gb3JkZXIgdG8g bWFrZSB1c2Ugb2YgZGlmZmVyZW50IFNvQyBmYW1pbGllcwphbmQgcGxhdGZvcm1zLgoKVGhlIGJy aWRnZSBub3cgc3VwcG9ydCB0d28gaW1wbGVtZW50YXRpb25zLAoKQS4gV2l0aCBjb21wb25lbnRf b3BzIGFuZCBleHlub3Mgc3BlY2lmaWMgY29kZSBleGNsdXNpdmVseQogICBmb3IgZXh5bm9zIGRz aSBkcml2ZXJzIGFuZCBpdCdzIGxlZ2FjeSBiaW5kaW5ncy4KCkIuIFdpdGhvdXQgY29tcG9uZW5l dF9vcHMgZm9yIG5ld2x5IGltcGxlbWVudGVkIGJyaWRnZXMKICAgYW5kIGl0cyB1c2VycyBsaWtl IGkuTVg4TU0uCgpUaGUgZnV0dXJlIHBsYW4gaXMgdG8gZml4IHRoZSBpbXBsZW1lbnRhdGlvbiBB KSBieSBkcm9wcGluZwpjb21wb25lbnRfb3BzIGFuZCBmaXhpbmcgZXh5bm9zIHNwZWNpZmljIGNv ZGUgaW4gb3JkZXIgdG8KbWFrZSB0aGUgYnJpZGdlIG1vcmUgbWF0dXJlIHRvIHVzZS4KClVwZGF0 ZWQgTUFJTlRBSU5FUlMgZmlsZSBmb3IgdGhpcyBicmlkZ2Ugd2l0aCBleHlub3MgZHJtCm1haW50 YWluZXJzIGFsb25nIHdpdGggQW5kcnplaiBhcyBoZSBpcyB0aGUgb3JpZ2luYWwgYXV0aG9yLgoK VG9tYXN6IEZpZ2EgaGFzIGJlZW4gbm90IGluY2x1ZGVkIGluIE1BSU5UQUlORVJTIGFzIGhlIGlz Cm5vdCBhdmFpbGFibGUgdmlhIHNhbXN1bmcuY29tLgoKU2lnbmVkLW9mZi1ieTogSmFnYW4gVGVr aSA8amFnYW5AYW1hcnVsYXNvbHV0aW9ucy5jb20+Ci0tLQogTUFJTlRBSU5FUlMgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDExICsKIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2Uv S2NvbmZpZyAgICAgICAgICAgICAgICB8ICAxNSArCiBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL01h a2VmaWxlICAgICAgICAgICAgICAgfCAgIDEgKwogLi4uL3NhbXN1bmctZHNpbS5jfSAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgNDMzICsrKysrKysrKy0tLS0tLS0tLQogZHJpdmVycy9ncHUv ZHJtL2V4eW5vcy9LY29uZmlnICAgICAgICAgICAgICAgIHwgICA5IC0KIGRyaXZlcnMvZ3B1L2Ry bS9leHlub3MvTWFrZWZpbGUgICAgICAgICAgICAgICB8ICAgMSAtCiA2IGZpbGVzIGNoYW5nZWQs IDI0NiBpbnNlcnRpb25zKCspLCAyMjQgZGVsZXRpb25zKC0pCiByZW5hbWUgZHJpdmVycy9ncHUv ZHJtL3tleHlub3MvZXh5bm9zX2RybV9kc2kuYyA9PiBicmlkZ2Uvc2Ftc3VuZy1kc2ltLmN9ICg3 NyUpCgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCBjYWUwYzYx NDg1OTAuLjczM2MyZWJjMDM5MyAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRB SU5FUlMKQEAgLTU4NjQsNiArNTg2NCwxNyBAQCBUOglnaXQgZ2l0Oi8vYW5vbmdpdC5mcmVlZGVz a3RvcC5vcmcvZHJtL2RybS1taXNjCiBGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGlu Z3MvZGlzcGxheS9wYW5lbC9zYW1zdW5nLGxtczM5N2tmMDQueWFtbAogRjoJZHJpdmVycy9ncHUv ZHJtL3BhbmVsL3BhbmVsLXNhbXN1bmctZGI3NDMwLmMKIAorRFJNIERSSVZFUiBGT1IgU0FNU1VO RyBNSVBJIERTSU0gQlJJREdFCitNOglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CitN OglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CitNOglTZXVuZy1Xb28g S2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorTToJS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4u cGFya0BzYW1zdW5nLmNvbT4KK006CUFuZHJ6ZWogSGFqZGEgPGEuaGFqZGFAc2Ftc3VuZy5jb20+ CitNOglKYWdhbiBUZWtpIDxqYWdhbkBhbWFydWxhc29sdXRpb25zLmNvbT4KK1M6CU1haW50YWlu ZWQKK1Q6CWdpdCBnaXQ6Ly9hbm9uZ2l0LmZyZWVkZXNrdG9wLm9yZy9kcm0vZHJtLW1pc2MKK0Y6 CWRyaXZlcnMvZ3B1L2RybS9icmlkZ2Uvc2Ftc3VuZy1kc2ltLmMKKwogRFJNIERSSVZFUiBGT1Ig U0lUUk9OSVggU1Q3NzAzIFBBTkVMUwogTToJR3VpZG8gR8O8bnRoZXIgPGFneEBzaWd4Y3B1Lm9y Zz4KIFI6CVB1cmlzbSBLZXJuZWwgVGVhbSA8a2VybmVsQHB1cmkuc20+CmRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tj b25maWcKaW5kZXggNGRlNmRiYjg4MjFiLi5jOGEzYjEzZjczMGIgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvZ3B1L2RybS9icmlkZ2UvS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tj b25maWcKQEAgLTE5MCw2ICsxOTAsMjEgQEAgY29uZmlnIERSTV9QQVJBREVfUFM4NjQwCiAJICBU aGUgUFM4NjQwIGlzIGEgaGlnaC1wZXJmb3JtYW5jZSBhbmQgbG93LXBvd2VyCiAJICBNSVBJIERT SSB0byBlRFAgY29udmVydGVyCiAKK2NvbmZpZyBEUk1fU0FNU1VOR19EU0lNCisJdHJpc3RhdGUg IlNhbXN1bmcgTUlQSSBEU0lNIGJyaWRnZSBkcml2ZXIiCisJZGVwZW5kcyBvbiBEUk0KKwlkZXBl bmRzIG9uIENPTU1PTl9DTEsKKwlkZXBlbmRzIG9uIE9GICYmIEhBU19JT01FTQorCWRlcGVuZHMg b24gRFJNX0VYWU5PU19GSU1EIHx8IERSTV9FWFlOT1M1NDMzX0RFQ09OIHx8IERSTV9FWFlOT1M3 X0RFQ09OCisJc2VsZWN0IERSTV9LTVNfSEVMUEVSCisJc2VsZWN0IERSTV9NSVBJX0RTSQorCXNl bGVjdCBEUk1fUEFORUxfQlJJREdFCisJc2VsZWN0IFJFR01BUF9NTUlPCisJaGVscAorCSAgVGhp cyBlbmFibGVzIHRoZSBTYW1zdW5nIE1JUEkgRFNJTSBicmlkZ2UgY29udHJvbGxlciBkcml2ZXIu CisJICBUaGlzIE1JUEkgRFNJTSBicmlkZ2UgY2FuIGJlIGZvdW5kIGl0IG9uIEV4eW5vcyBhbmQg TlhQJ3MKKwkgIGkuTVg4TSBNaW5pIGFuZCBOYW5vIFNvQydzLgorCiBjb25maWcgRFJNX1NJTF9T SUk4NjIwCiAJdHJpc3RhdGUgIlNpbGljb24gSW1hZ2UgU0lJODYyMCBIRE1JL01ITCBicmlkZ2Ui CiAJZGVwZW5kcyBvbiBPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9NYWtl ZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUKaW5kZXggZWMyYjlmYTI2OTll Li4xZWIwNGU0ODU3ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZp bGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9NYWtlZmlsZQpAQCAtMTIsNiArMTIsNyBA QCBvYmotJChDT05GSUdfRFJNX01FR0FDSElQU19TVERQWFhYWF9HRV9CODUwVjNfRlcpICs9IG1l Z2FjaGlwcy1zdGRweHh4eC1nZS1iODUwdgogb2JqLSQoQ09ORklHX0RSTV9OWFBfUFROMzQ2MCkg Kz0gbnhwLXB0bjM0NjAubwogb2JqLSQoQ09ORklHX0RSTV9QQVJBREVfUFM4NjIyKSArPSBwYXJh ZGUtcHM4NjIyLm8KIG9iai0kKENPTkZJR19EUk1fUEFSQURFX1BTODY0MCkgKz0gcGFyYWRlLXBz ODY0MC5vCitvYmotJChDT05GSUdfRFJNX1NBTVNVTkdfRFNJTSkgKz0gc2Ftc3VuZy1kc2ltLm8K IG9iai0kKENPTkZJR19EUk1fU0lMX1NJSTg2MjApICs9IHNpbC1zaWk4NjIwLm8KIG9iai0kKENP TkZJR19EUk1fU0lJOTAyWCkgKz0gc2lpOTAyeC5vCiBvYmotJChDT05GSUdfRFJNX1NJSTkyMzQp ICs9IHNpaTkyMzQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3Nf ZHJtX2RzaS5jIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9zYW1zdW5nLWRzaW0uYwpzaW1pbGFy aXR5IGluZGV4IDc3JQpyZW5hbWUgZnJvbSBkcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19k cm1fZHNpLmMKcmVuYW1lIHRvIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2Uvc2Ftc3VuZy1kc2ltLmMK aW5kZXggNTNkODc4ZDRkMmQ3Li5lZWQ2YjNmZmRlYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9leHlub3MvZXh5bm9zX2RybV9kc2kuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdl L3NhbXN1bmctZHNpbS5jCkBAIC0xLDExICsxLDE1IEBACiAvLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMC1vbmx5CiAvKgotICogU2Ftc3VuZyBTb0MgTUlQSSBEU0kgTWFzdGVyIGRy aXZlci4KKyAqIFNhbXN1bmcgTUlQSSBEU0lNIGJyaWRnZSBkcml2ZXIuCiAgKgorICogQ29weXJp Z2h0IChDKSAyMDIxIEFtYXJ1bGEgU29sdXRpb25zKEluZGlhKQogICogQ29weXJpZ2h0IChjKSAy MDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQKICAqCi0gKiBDb250YWN0czogVG9tYXN6 IEZpZ2EgPHQuZmlnYUBzYW1zdW5nLmNvbT4KLSovCisgKiBUT0RPOgorICogLSBNb3ZlIG9yIGhh bmRsZSBleHlub3Mgc3BlY2lmaWNzIGluIGV4eW5vcyBkcm0gZHJpdmVycyBzdGFjay4KKyAqIC0g VHJ5IHRvIGRyb3AgY29tcG9uZW50X29wcywgYnV0IGl0IGluZGVlZCByZXF1aXJlIHRvIGNoYW5n ZQorICogICBleHlub3MgZHJtIGRyaXZlcnMgc3RhY2suCisgKi8KIAogI2luY2x1ZGUgPGxpbnV4 L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0zMyw4ICszNyw4IEBACiAjaW5j bHVkZSA8ZHJtL2RybV9wcm9iZV9oZWxwZXIuaD4KICNpbmNsdWRlIDxkcm0vZHJtX3NpbXBsZV9r bXNfaGVscGVyLmg+CiAKLSNpbmNsdWRlICJleHlub3NfZHJtX2NydGMuaCIKLSNpbmNsdWRlICJl eHlub3NfZHJtX2Rydi5oIgorI2luY2x1ZGUgIi4uL2V4eW5vcy9leHlub3NfZHJtX2NydGMuaCIK KyNpbmNsdWRlICIuLi9leHlub3MvZXh5bm9zX2RybV9kcnYuaCIKIAogLyogcmV0dXJucyB0cnVl IGlmZiBib3RoIGFyZ3VtZW50cyBsb2dpY2FsbHkgZGlmZmVycyAqLwogI2RlZmluZSBORVFWKGEs IGIpICghKGEpIF4gIShiKSkKQEAgLTIxNywxMiArMjIxLDEyIEBAIHN0YXRpYyBjb25zdCBjaGFy ICpjb25zdCBjbGtfbmFtZXNbNV0gPSB7ICJidXNfY2xrIiwgInNjbGtfbWlwaSIsCiAJInBoeWNs a19taXBpZHBoeTBfYml0Y2xrZGl2OCIsICJwaHljbGtfbWlwaWRwaHkwX3J4Y2xrZXNjMCIsCiAJ InNjbGtfcmdiX3ZjbGtfdG9fZHNpbTAiIH07CiAKLWVudW0gZXh5bm9zX2RzaV90cmFuc2Zlcl90 eXBlIHsKK2VudW0gc2Ftc3VuZ19kc2ltX3RyYW5zZmVyX3R5cGUgewogCUVYWU5PU19EU0lfVFgs CiAJRVhZTk9TX0RTSV9SWCwKIH07CiAKLXN0cnVjdCBleHlub3NfZHNpX3RyYW5zZmVyIHsKK3N0 cnVjdCBzYW1zdW5nX2RzaW1fdHJhbnNmZXIgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlz dHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0ZWQ7CiAJaW50IHJlc3VsdDsKQEAgLTI0MCw3ICsyNDQs NyBAQCBzdHJ1Y3QgZXh5bm9zX2RzaV90cmFuc2ZlciB7CiAjZGVmaW5lIERTSU1fU1RBVEVfQ01E X0xQTQkJQklUKDIpCiAjZGVmaW5lIERTSU1fU1RBVEVfVklET1VUX0FWQUlMQUJMRQlCSVQoMykK IAotc3RydWN0IGV4eW5vc19kc2lfZHJpdmVyX2RhdGEgeworc3RydWN0IHNhbXN1bmdfZHNpbV9k cml2ZXJfZGF0YSB7CiAJY29uc3QgdW5zaWduZWQgaW50ICpyZWdfb2ZzOwogCXVuc2lnbmVkIGlu dCBwbGx0bXJfcmVnOwogCXVuc2lnbmVkIGludCBoYXNfZnJlcWJhbmQ6MTsKQEAgLTI1Myw3ICsy NTcsNyBAQCBzdHJ1Y3QgZXh5bm9zX2RzaV9kcml2ZXJfZGF0YSB7CiAJYm9vbCBleHlub3Nfc3Bl Y2lmaWM7CiB9OwogCi1zdHJ1Y3QgZXh5bm9zX2RzaSB7CitzdHJ1Y3Qgc2Ftc3VuZ19kc2ltIHsK IAlzdHJ1Y3QgZHJtX2VuY29kZXIgZW5jb2RlcjsKIAlzdHJ1Y3QgbWlwaV9kc2lfaG9zdCBkc2lf aG9zdDsKIAlzdHJ1Y3QgZHJtX2JyaWRnZSBicmlkZ2U7CkBAIC0yODMsMTQgKzI4NywxNCBAQCBz dHJ1Y3QgZXh5bm9zX2RzaSB7CiAJc3BpbmxvY2tfdCB0cmFuc2Zlcl9sb2NrOyAvKiBwcm90ZWN0 cyB0cmFuc2Zlcl9saXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCB0cmFuc2Zlcl9saXN0OwogCi0J Y29uc3Qgc3RydWN0IGV4eW5vc19kc2lfZHJpdmVyX2RhdGEgKmRyaXZlcl9kYXRhOworCWNvbnN0 IHN0cnVjdCBzYW1zdW5nX2RzaW1fZHJpdmVyX2RhdGEgKmRyaXZlcl9kYXRhOwogfTsKIAotI2Rl ZmluZSBob3N0X3RvX2RzaShob3N0KSBjb250YWluZXJfb2YoaG9zdCwgc3RydWN0IGV4eW5vc19k c2ksIGRzaV9ob3N0KQorI2RlZmluZSBob3N0X3RvX2RzaShob3N0KSBjb250YWluZXJfb2YoaG9z dCwgc3RydWN0IHNhbXN1bmdfZHNpbSwgZHNpX2hvc3QpCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0 IGV4eW5vc19kc2kgKmJyaWRnZV90b19kc2koc3RydWN0IGRybV9icmlkZ2UgKmIpCitzdGF0aWMg aW5saW5lIHN0cnVjdCBzYW1zdW5nX2RzaW0gKmJyaWRnZV90b19kc2koc3RydWN0IGRybV9icmlk Z2UgKmIpCiB7Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihiLCBzdHJ1Y3QgZXh5bm9zX2RzaSwgYnJp ZGdlKTsKKwlyZXR1cm4gY29udGFpbmVyX29mKGIsIHN0cnVjdCBzYW1zdW5nX2RzaW0sIGJyaWRn ZSk7CiB9CiAKIGVudW0gcmVnX2lkeCB7CkBAIC0zMTgsMTQgKzMyMiwxNCBAQCBlbnVtIHJlZ19p ZHggewogCU5VTV9SRUdTCiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZXh5bm9zX2RzaV93cml0 ZShzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpLCBlbnVtIHJlZ19pZHggaWR4LAotCQkJCSAgICB1MzIg dmFsKQorc3RhdGljIGlubGluZSB2b2lkIHNhbXN1bmdfZHNpbV93cml0ZShzdHJ1Y3Qgc2Ftc3Vu Z19kc2ltICpkc2ksIGVudW0gcmVnX2lkeCBpZHgsCisJCQkJICAgICAgdTMyIHZhbCkKIHsKIAog CXdyaXRlbCh2YWwsIGRzaS0+cmVnX2Jhc2UgKyBkc2ktPmRyaXZlcl9kYXRhLT5yZWdfb2ZzW2lk eF0pOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBleHlub3NfZHNpX3JlYWQoc3RydWN0IGV4eW5v c19kc2kgKmRzaSwgZW51bSByZWdfaWR4IGlkeCkKK3N0YXRpYyBpbmxpbmUgdTMyIHNhbXN1bmdf ZHNpbV9yZWFkKHN0cnVjdCBzYW1zdW5nX2RzaW0gKmRzaSwgZW51bSByZWdfaWR4IGlkeCkKIHsK IAlyZXR1cm4gcmVhZGwoZHNpLT5yZWdfYmFzZSArIGRzaS0+ZHJpdmVyX2RhdGEtPnJlZ19vZnNb aWR4XSk7CiB9CkBAIC00NTAsNyArNDU0LDcgQEAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBl eHlub3M1NDMzX3JlZ192YWx1ZXNbXSA9IHsKIAlbUEhZVElNSU5HX0hTX1RSQUlMXSA9IERTSU1f UEhZVElNSU5HMl9IU19UUkFJTCgweDBjKSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXh5 bm9zX2RzaV9kcml2ZXJfZGF0YSBleHlub3MzX2RzaV9kcml2ZXJfZGF0YSA9IHsKK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgc2Ftc3VuZ19kc2ltX2RyaXZlcl9kYXRhIGV4eW5vczNfZHNpX2RyaXZlcl9k YXRhID0gewogCS5yZWdfb2ZzID0gZXh5bm9zX3JlZ19vZnMsCiAJLnBsbHRtcl9yZWcgPSAweDUw LAogCS5oYXNfZnJlcWJhbmQgPSAxLApAQCAtNDYzLDcgKzQ2Nyw3IEBAIHN0YXRpYyBjb25zdCBz dHJ1Y3QgZXh5bm9zX2RzaV9kcml2ZXJfZGF0YSBleHlub3MzX2RzaV9kcml2ZXJfZGF0YSA9IHsK IAkuZXh5bm9zX3NwZWNpZmljID0gdHJ1ZSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXh5 bm9zX2RzaV9kcml2ZXJfZGF0YSBleHlub3M0X2RzaV9kcml2ZXJfZGF0YSA9IHsKK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgc2Ftc3VuZ19kc2ltX2RyaXZlcl9kYXRhIGV4eW5vczRfZHNpX2RyaXZlcl9k YXRhID0gewogCS5yZWdfb2ZzID0gZXh5bm9zX3JlZ19vZnMsCiAJLnBsbHRtcl9yZWcgPSAweDUw LAogCS5oYXNfZnJlcWJhbmQgPSAxLApAQCAtNDc2LDcgKzQ4MCw3IEBAIHN0YXRpYyBjb25zdCBz dHJ1Y3QgZXh5bm9zX2RzaV9kcml2ZXJfZGF0YSBleHlub3M0X2RzaV9kcml2ZXJfZGF0YSA9IHsK IAkuZXh5bm9zX3NwZWNpZmljID0gdHJ1ZSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXh5 bm9zX2RzaV9kcml2ZXJfZGF0YSBleHlub3M1X2RzaV9kcml2ZXJfZGF0YSA9IHsKK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgc2Ftc3VuZ19kc2ltX2RyaXZlcl9kYXRhIGV4eW5vczVfZHNpX2RyaXZlcl9k YXRhID0gewogCS5yZWdfb2ZzID0gZXh5bm9zX3JlZ19vZnMsCiAJLnBsbHRtcl9yZWcgPSAweDU4 LAogCS5udW1fY2xrcyA9IDIsCkBAIC00ODcsNyArNDkxLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVj dCBleHlub3NfZHNpX2RyaXZlcl9kYXRhIGV4eW5vczVfZHNpX2RyaXZlcl9kYXRhID0gewogCS5l eHlub3Nfc3BlY2lmaWMgPSB0cnVlLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBleHlub3Nf ZHNpX2RyaXZlcl9kYXRhIGV4eW5vczU0MzNfZHNpX2RyaXZlcl9kYXRhID0geworc3RhdGljIGNv bnN0IHN0cnVjdCBzYW1zdW5nX2RzaW1fZHJpdmVyX2RhdGEgZXh5bm9zNTQzM19kc2lfZHJpdmVy X2RhdGEgPSB7CiAJLnJlZ19vZnMgPSBleHlub3M1NDMzX3JlZ19vZnMsCiAJLnBsbHRtcl9yZWcg PSAweGEwLAogCS5oYXNfY2xrbGFuZV9zdG9wID0gMSwKQEAgLTQ5OSw3ICs1MDMsNyBAQCBzdGF0 aWMgY29uc3Qgc3RydWN0IGV4eW5vc19kc2lfZHJpdmVyX2RhdGEgZXh5bm9zNTQzM19kc2lfZHJp dmVyX2RhdGEgPSB7CiAJLmV4eW5vc19zcGVjaWZpYyA9IHRydWUsCiB9OwogCi1zdGF0aWMgY29u c3Qgc3RydWN0IGV4eW5vc19kc2lfZHJpdmVyX2RhdGEgZXh5bm9zNTQyMl9kc2lfZHJpdmVyX2Rh dGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfZHNpbV9kcml2ZXJfZGF0YSBleHlu b3M1NDIyX2RzaV9kcml2ZXJfZGF0YSA9IHsKIAkucmVnX29mcyA9IGV4eW5vczU0MzNfcmVnX29m cywKIAkucGxsdG1yX3JlZyA9IDB4YTAsCiAJLmhhc19jbGtsYW5lX3N0b3AgPSAxLApAQCAtNTEx LDcgKzUxNSw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXh5bm9zX2RzaV9kcml2ZXJfZGF0YSBl eHlub3M1NDIyX2RzaV9kcml2ZXJfZGF0YSA9IHsKIAkuZXh5bm9zX3NwZWNpZmljID0gdHJ1ZSwK IH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGV4eW5vc19kc2lfb2ZfbWF0 Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNhbXN1bmdfZHNpbV9v Zl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3MzMjUwLW1pcGkt ZHNpIiwKIAkgIC5kYXRhID0gJmV4eW5vczNfZHNpX2RyaXZlcl9kYXRhIH0sCiAJeyAuY29tcGF0 aWJsZSA9ICJzYW1zdW5nLGV4eW5vczQyMTAtbWlwaS1kc2kiLApAQCAtNTI1LDcgKzUyOSw3IEBA IHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGV4eW5vc19kc2lfb2ZfbWF0Y2hbXSA9 IHsKIAl7IH0KIH07CiAKLXN0YXRpYyB2b2lkIGV4eW5vc19kc2lfd2FpdF9mb3JfcmVzZXQoc3Ry dWN0IGV4eW5vc19kc2kgKmRzaSkKK3N0YXRpYyB2b2lkIHNhbXN1bmdfZHNpbV93YWl0X2Zvcl9y ZXNldChzdHJ1Y3Qgc2Ftc3VuZ19kc2ltICpkc2kpCiB7CiAJaWYgKHdhaXRfZm9yX2NvbXBsZXRp b25fdGltZW91dCgmZHNpLT5jb21wbGV0ZWQsIG1zZWNzX3RvX2ppZmZpZXMoMzAwKSkpCiAJCXJl dHVybjsKQEAgLTUzMywyMiArNTM3LDIyIEBAIHN0YXRpYyB2b2lkIGV4eW5vc19kc2lfd2FpdF9m b3JfcmVzZXQoc3RydWN0IGV4eW5vc19kc2kgKmRzaSkKIAlkZXZfZXJyKGRzaS0+ZGV2LCAidGlt ZW91dCB3YWl0aW5nIGZvciByZXNldFxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIGV4eW5vc19kc2lf cmVzZXQoc3RydWN0IGV4eW5vc19kc2kgKmRzaSkKK3N0YXRpYyB2b2lkIHNhbXN1bmdfZHNpbV9y ZXNldChzdHJ1Y3Qgc2Ftc3VuZ19kc2ltICpkc2kpCiB7CiAJdTMyIHJlc2V0X3ZhbCA9IGRzaS0+ ZHJpdmVyX2RhdGEtPnJlZ192YWx1ZXNbUkVTRVRfVFlQRV07CiAKIAlyZWluaXRfY29tcGxldGlv bigmZHNpLT5jb21wbGV0ZWQpOwotCWV4eW5vc19kc2lfd3JpdGUoZHNpLCBEU0lNX1NXUlNUX1JF RywgcmVzZXRfdmFsKTsKKwlzYW1zdW5nX2RzaW1fd3JpdGUoZHNpLCBEU0lNX1NXUlNUX1JFRywg cmVzZXRfdmFsKTsKIH0KIAogI2lmbmRlZiBNSFoKICNkZWZpbmUgTUhaCSgxMDAwKjEwMDApCiAj ZW5kaWYKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh5bm9zX2RzaV9wbGxfZmluZF9wbXMoc3Ry dWN0IGV4eW5vc19kc2kgKmRzaSwKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNhbXN1bmdfZHNpbV9w bGxfZmluZF9wbXMoc3RydWN0IHNhbXN1bmdfZHNpbSAqZHNpLAogCQl1bnNpZ25lZCBsb25nIGZp biwgdW5zaWduZWQgbG9uZyBmb3V0LCB1OCAqcCwgdTE2ICptLCB1OCAqcykKIHsKLQljb25zdCBz dHJ1Y3QgZXh5bm9zX2RzaV9kcml2ZXJfZGF0YSAqZHJpdmVyX2RhdGEgPSBkc2ktPmRyaXZlcl9k YXRhOworCWNvbnN0IHN0cnVjdCBzYW1zdW5nX2RzaW1fZHJpdmVyX2RhdGEgKmRyaXZlcl9kYXRh ID0gZHNpLT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGJlc3RfZnJlcSA9IDA7CiAJdTMy IG1pbl9kZWx0YSA9IDB4ZmZmZmZmZmY7CiAJdTggcF9taW4sIHBfbWF4OwpAQCAtNTk5LDEwICs2 MDMsMTAgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh5bm9zX2RzaV9wbGxfZmluZF9wbXMoc3Ry dWN0IGV4eW5vc19kc2kgKmRzaSwKIAlyZXR1cm4gYmVzdF9mcmVxOwogfQogCi1zdGF0aWMgdW5z aWduZWQgbG9uZyBleHlub3NfZHNpX3NldF9wbGwoc3RydWN0IGV4eW5vc19kc2kgKmRzaSwKLQkJ CQkJdW5zaWduZWQgbG9uZyBmcmVxKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgc2Ftc3VuZ19kc2lt X3NldF9wbGwoc3RydWN0IHNhbXN1bmdfZHNpbSAqZHNpLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcg ZnJlcSkKIHsKLQljb25zdCBzdHJ1Y3QgZXh5bm9zX2RzaV9kcml2ZXJfZGF0YSAqZHJpdmVyX2Rh dGEgPSBkc2ktPmRyaXZlcl9kYXRhOworCWNvbnN0IHN0cnVjdCBzYW1zdW5nX2RzaW1fZHJpdmVy X2RhdGEgKmRyaXZlcl9kYXRhID0gZHNpLT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZp biwgZm91dDsKIAlpbnQgdGltZW91dDsKIAl1OCBwLCBzOwpAQCAtNjEwLDcgKzYxNCw3IEBAIHN0 YXRpYyB1bnNpZ25lZCBsb25nIGV4eW5vc19kc2lfc2V0X3BsbChzdHJ1Y3QgZXh5bm9zX2RzaSAq ZHNpLAogCXUzMiByZWc7CiAKIAlmaW4gPSBkc2ktPnBsbF9jbGtfcmF0ZTsKLQlmb3V0ID0gZXh5 bm9zX2RzaV9wbGxfZmluZF9wbXMoZHNpLCBmaW4sIGZyZXEsICZwLCAmbSwgJnMpOworCWZvdXQg PSBzYW1zdW5nX2RzaW1fcGxsX2ZpbmRfcG1zKGRzaSwgZmluLCBmcmVxLCAmcCwgJm0sICZzKTsK IAlpZiAoIWZvdXQpIHsKIAkJZGV2X2Vycihkc2ktPmRldiwKIAkJCSJmYWlsZWQgdG8gZmluZCBQ TEwgUE1TIGZvciByZXF1ZXN0ZWQgZnJlcXVlbmN5XG4iKTsKQEAgLTY0MSw3ICs2NDUsNyBAQCBz dGF0aWMgdW5zaWduZWQgbG9uZyBleHlub3NfZHNpX3NldF9wbGwoc3RydWN0IGV4eW5vc19kc2kg KmRzaSwKIAkJcmVnIHw9IERTSU1fRlJFUV9CQU5EKGJhbmQpOwogCX0KIAotCWV4eW5vc19kc2lf d3JpdGUoZHNpLCBEU0lNX1BMTENUUkxfUkVHLCByZWcpOworCXNhbXN1bmdfZHNpbV93cml0ZShk c2ksIERTSU1fUExMQ1RSTF9SRUcsIHJlZyk7CiAKIAl0aW1lb3V0ID0gMTAwMDsKIAlkbyB7CkBA IC02NDksMTkgKzY1MywxOSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBleHlub3NfZHNpX3NldF9w bGwoc3RydWN0IGV4eW5vc19kc2kgKmRzaSwKIAkJCWRldl9lcnIoZHNpLT5kZXYsICJQTEwgZmFp bGVkIHRvIHN0YWJpbGl6ZVxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlyZWcgPSBleHlub3Nf ZHNpX3JlYWQoZHNpLCBEU0lNX1NUQVRVU19SRUcpOworCQlyZWcgPSBzYW1zdW5nX2RzaW1fcmVh ZChkc2ksIERTSU1fU1RBVFVTX1JFRyk7CiAJfSB3aGlsZSAoKHJlZyAmIERTSU1fUExMX1NUQUJM RSkgPT0gMCk7CiAKIAlyZXR1cm4gZm91dDsKIH0KIAotc3RhdGljIGludCBleHlub3NfZHNpX2Vu YWJsZV9jbG9jayhzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpKQorc3RhdGljIGludCBzYW1zdW5nX2Rz aW1fZW5hYmxlX2Nsb2NrKHN0cnVjdCBzYW1zdW5nX2RzaW0gKmRzaSkKIHsKIAl1bnNpZ25lZCBs b25nIGhzX2NsaywgYnl0ZV9jbGssIGVzY19jbGs7CiAJdW5zaWduZWQgbG9uZyBlc2NfZGl2Owog CXUzMiByZWc7CiAKLQloc19jbGsgPSBleHlub3NfZHNpX3NldF9wbGwoZHNpLCBkc2ktPmJ1cnN0 X2Nsa19yYXRlKTsKKwloc19jbGsgPSBzYW1zdW5nX2RzaW1fc2V0X3BsbChkc2ksIGRzaS0+YnVy c3RfY2xrX3JhdGUpOwogCWlmICghaHNfY2xrKSB7CiAJCWRldl9lcnIoZHNpLT5kZXYsICJmYWls ZWQgdG8gY29uZmlndXJlIERTSSBQTExcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTY3OSw3 ICs2ODMsNyBAQCBzdGF0aWMgaW50IGV4eW5vc19kc2lfZW5hYmxlX2Nsb2NrKHN0cnVjdCBleHlu b3NfZHNpICpkc2kpCiAJZGV2X2RiZyhkc2ktPmRldiwgImhzX2NsayA9ICVsdSwgYnl0ZV9jbGsg PSAlbHUsIGVzY19jbGsgPSAlbHVcbiIsCiAJCWhzX2NsaywgYnl0ZV9jbGssIGVzY19jbGspOwog Ci0JcmVnID0gZXh5bm9zX2RzaV9yZWFkKGRzaSwgRFNJTV9DTEtDVFJMX1JFRyk7CisJcmVnID0g c2Ftc3VuZ19kc2ltX3JlYWQoZHNpLCBEU0lNX0NMS0NUUkxfUkVHKTsKIAlyZWcgJj0gfihEU0lN X0VTQ19QUkVTQ0FMRVJfTUFTSyB8IERTSU1fTEFORV9FU0NfQ0xLX0VOX0NMSwogCQkJfCBEU0lN X0xBTkVfRVNDX0NMS19FTl9EQVRBX01BU0sgfCBEU0lNX1BMTF9CWVBBU1MKIAkJCXwgRFNJTV9C WVRFX0NMS19TUkNfTUFTSyk7CkBAIC02ODksMTQgKzY5MywxNCBAQCBzdGF0aWMgaW50IGV4eW5v c19kc2lfZW5hYmxlX2Nsb2NrKHN0cnVjdCBleHlub3NfZHNpICpkc2kpCiAJCQl8IERTSU1fTEFO RV9FU0NfQ0xLX0VOX0RBVEEoQklUKGRzaS0+bGFuZXMpIC0gMSkKIAkJCXwgRFNJTV9CWVRFX0NM S19TUkMoMCkKIAkJCXwgRFNJTV9UWF9SRVFVRVNUX0hTQ0xLOwotCWV4eW5vc19kc2lfd3JpdGUo ZHNpLCBEU0lNX0NMS0NUUkxfUkVHLCByZWcpOworCXNhbXN1bmdfZHNpbV93cml0ZShkc2ksIERT SU1fQ0xLQ1RSTF9SRUcsIHJlZyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZXh5 bm9zX2RzaV9zZXRfcGh5X2N0cmwoc3RydWN0IGV4eW5vc19kc2kgKmRzaSkKK3N0YXRpYyB2b2lk IHNhbXN1bmdfZHNpbV9zZXRfcGh5X2N0cmwoc3RydWN0IHNhbXN1bmdfZHNpbSAqZHNpKQogewot CWNvbnN0IHN0cnVjdCBleHlub3NfZHNpX2RyaXZlcl9kYXRhICpkcml2ZXJfZGF0YSA9IGRzaS0+ ZHJpdmVyX2RhdGE7CisJY29uc3Qgc3RydWN0IHNhbXN1bmdfZHNpbV9kcml2ZXJfZGF0YSAqZHJp dmVyX2RhdGEgPSBkc2ktPmRyaXZlcl9kYXRhOwogCWNvbnN0IHVuc2lnbmVkIGludCAqcmVnX3Zh bHVlcyA9IGRyaXZlcl9kYXRhLT5yZWdfdmFsdWVzOwogCXUzMiByZWc7CiAKQEAgLTcwNiw3ICs3 MTAsNyBAQCBzdGF0aWMgdm9pZCBleHlub3NfZHNpX3NldF9waHlfY3RybChzdHJ1Y3QgZXh5bm9z X2RzaSAqZHNpKQogCS8qIEIgRC1QSFk6IEQtUEhZIE1hc3RlciAmIFNsYXZlIEFuYWxvZyBCbG9j ayBjb250cm9sICovCiAJcmVnID0gcmVnX3ZhbHVlc1tQSFlDVFJMX1VMUFNfRVhJVF0gfCByZWdf dmFsdWVzW1BIWUNUUkxfVlJFR19MUF0gfAogCQlyZWdfdmFsdWVzW1BIWUNUUkxfU0xFV19VUF07 Ci0JZXh5bm9zX2RzaV93cml0ZShkc2ksIERTSU1fUEhZQ1RSTF9SRUcsIHJlZyk7CisJc2Ftc3Vu Z19kc2ltX3dyaXRlKGRzaSwgRFNJTV9QSFlDVFJMX1JFRywgcmVnKTsKIAogCS8qCiAJICogVCBM UFg6IFRyYW5zbWl0dGVkIGxlbmd0aCBvZiBhbnkgTG93LVBvd2VyIHN0YXRlIHBlcmlvZApAQCAt NzE0LDcgKzcxOCw3IEBAIHN0YXRpYyB2b2lkIGV4eW5vc19kc2lfc2V0X3BoeV9jdHJsKHN0cnVj dCBleHlub3NfZHNpICpkc2kpCiAJICoJYnVyc3QKIAkgKi8KIAlyZWcgPSByZWdfdmFsdWVzW1BI WVRJTUlOR19MUFhdIHwgcmVnX3ZhbHVlc1tQSFlUSU1JTkdfSFNfRVhJVF07Ci0JZXh5bm9zX2Rz aV93cml0ZShkc2ksIERTSU1fUEhZVElNSU5HX1JFRywgcmVnKTsKKwlzYW1zdW5nX2RzaW1fd3Jp dGUoZHNpLCBEU0lNX1BIWVRJTUlOR19SRUcsIHJlZyk7CiAKIAkvKgogCSAqIFQgQ0xLLVBSRVBB UkU6IFRpbWUgdGhhdCB0aGUgdHJhbnNtaXR0ZXIgZHJpdmVzIHRoZSBDbG9jayBMYW5lIExQLTAw CkBAIC03MzQsNyArNzM4LDcgQEAgc3RhdGljIHZvaWQgZXh5bm9zX2RzaV9zZXRfcGh5X2N0cmwo c3RydWN0IGV4eW5vc19kc2kgKmRzaSkKIAkJcmVnX3ZhbHVlc1tQSFlUSU1JTkdfQ0xLX1BPU1Rd IHwKIAkJcmVnX3ZhbHVlc1tQSFlUSU1JTkdfQ0xLX1RSQUlMXTsKIAotCWV4eW5vc19kc2lfd3Jp dGUoZHNpLCBEU0lNX1BIWVRJTUlORzFfUkVHLCByZWcpOworCXNhbXN1bmdfZHNpbV93cml0ZShk c2ksIERTSU1fUEhZVElNSU5HMV9SRUcsIHJlZyk7CiAKIAkvKgogCSAqIFQgSFMtUFJFUEFSRTog VGltZSB0aGF0IHRoZSB0cmFuc21pdHRlciBkcml2ZXMgdGhlIERhdGEgTGFuZSBMUC0wMApAQCAt NzQ3LDQ3ICs3NTEsNDcgQEAgc3RhdGljIHZvaWQgZXh5bm9zX2RzaV9zZXRfcGh5X2N0cmwoc3Ry dWN0IGV4eW5vc19kc2kgKmRzaSkKIAkgKi8KIAlyZWcgPSByZWdfdmFsdWVzW1BIWVRJTUlOR19I U19QUkVQQVJFXSB8IHJlZ192YWx1ZXNbUEhZVElNSU5HX0hTX1pFUk9dIHwKIAkJcmVnX3ZhbHVl c1tQSFlUSU1JTkdfSFNfVFJBSUxdOwotCWV4eW5vc19kc2lfd3JpdGUoZHNpLCBEU0lNX1BIWVRJ TUlORzJfUkVHLCByZWcpOworCXNhbXN1bmdfZHNpbV93cml0ZShkc2ksIERTSU1fUEhZVElNSU5H Ml9SRUcsIHJlZyk7CiB9CiAKLXN0YXRpYyB2b2lkIGV4eW5vc19kc2lfZGlzYWJsZV9jbG9jayhz dHJ1Y3QgZXh5bm9zX2RzaSAqZHNpKQorc3RhdGljIHZvaWQgc2Ftc3VuZ19kc2ltX2Rpc2FibGVf Y2xvY2soc3RydWN0IHNhbXN1bmdfZHNpbSAqZHNpKQogewogCXUzMiByZWc7CiAKLQlyZWcgPSBl eHlub3NfZHNpX3JlYWQoZHNpLCBEU0lNX0NMS0NUUkxfUkVHKTsKKwlyZWcgPSBzYW1zdW5nX2Rz aW1fcmVhZChkc2ksIERTSU1fQ0xLQ1RSTF9SRUcpOwogCXJlZyAmPSB+KERTSU1fTEFORV9FU0Nf Q0xLX0VOX0NMSyB8IERTSU1fTEFORV9FU0NfQ0xLX0VOX0RBVEFfTUFTSwogCQkJfCBEU0lNX0VT Q19DTEtFTiB8IERTSU1fQllURV9DTEtFTik7Ci0JZXh5bm9zX2RzaV93cml0ZShkc2ksIERTSU1f Q0xLQ1RSTF9SRUcsIHJlZyk7CisJc2Ftc3VuZ19kc2ltX3dyaXRlKGRzaSwgRFNJTV9DTEtDVFJM X1JFRywgcmVnKTsKIAotCXJlZyA9IGV4eW5vc19kc2lfcmVhZChkc2ksIERTSU1fUExMQ1RSTF9S RUcpOworCXJlZyA9IHNhbXN1bmdfZHNpbV9yZWFkKGRzaSwgRFNJTV9QTExDVFJMX1JFRyk7CiAJ cmVnICY9IH5EU0lNX1BMTF9FTjsKLQlleHlub3NfZHNpX3dyaXRlKGRzaSwgRFNJTV9QTExDVFJM X1JFRywgcmVnKTsKKwlzYW1zdW5nX2RzaW1fd3JpdGUoZHNpLCBEU0lNX1BMTENUUkxfUkVHLCBy ZWcpOwogfQogCi1zdGF0aWMgdm9pZCBleHlub3NfZHNpX2VuYWJsZV9sYW5lKHN0cnVjdCBleHlu b3NfZHNpICpkc2ksIHUzMiBsYW5lKQorc3RhdGljIHZvaWQgc2Ftc3VuZ19kc2ltX2VuYWJsZV9s YW5lKHN0cnVjdCBzYW1zdW5nX2RzaW0gKmRzaSwgdTMyIGxhbmUpCiB7Ci0JdTMyIHJlZyA9IGV4 eW5vc19kc2lfcmVhZChkc2ksIERTSU1fQ09ORklHX1JFRyk7CisJdTMyIHJlZyA9IHNhbXN1bmdf ZHNpbV9yZWFkKGRzaSwgRFNJTV9DT05GSUdfUkVHKTsKIAlyZWcgfD0gKERTSU1fTlVNX09GX0RB VEFfTEFORShkc2ktPmxhbmVzIC0gMSkgfCBEU0lNX0xBTkVfRU5fQ0xLIHwKIAkJCURTSU1fTEFO RV9FTihsYW5lKSk7Ci0JZXh5bm9zX2RzaV93cml0ZShkc2ksIERTSU1fQ09ORklHX1JFRywgcmVn KTsKKwlzYW1zdW5nX2RzaW1fd3JpdGUoZHNpLCBEU0lNX0NPTkZJR19SRUcsIHJlZyk7CiB9CiAK LXN0YXRpYyBpbnQgZXh5bm9zX2RzaV9pbml0X2xpbmsoc3RydWN0IGV4eW5vc19kc2kgKmRzaSkK K3N0YXRpYyBpbnQgc2Ftc3VuZ19kc2ltX2luaXRfbGluayhzdHJ1Y3Qgc2Ftc3VuZ19kc2ltICpk c2kpCiB7Ci0JY29uc3Qgc3RydWN0IGV4eW5vc19kc2lfZHJpdmVyX2RhdGEgKmRyaXZlcl9kYXRh ID0gZHNpLT5kcml2ZXJfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19kc2ltX2RyaXZlcl9k YXRhICpkcml2ZXJfZGF0YSA9IGRzaS0+ZHJpdmVyX2RhdGE7CiAJaW50IHRpbWVvdXQ7CiAJdTMy IHJlZzsKIAl1MzIgbGFuZXNfbWFzazsKIAogCS8qIEluaXRpYWxpemUgRklGTyBwb2ludGVycyAq LwotCXJlZyA9IGV4eW5vc19kc2lfcmVhZChkc2ksIERTSU1fRklGT0NUUkxfUkVHKTsKKwlyZWcg PSBzYW1zdW5nX2RzaW1fcmVhZChkc2ksIERTSU1fRklGT0NUUkxfUkVHKTsKIAlyZWcgJj0gfjB4 MWY7Ci0JZXh5bm9zX2RzaV93cml0ZShkc2ksIERTSU1fRklGT0NUUkxfUkVHLCByZWcpOworCXNh bXN1bmdfZHNpbV93cml0ZShkc2ksIERTSU1fRklGT0NUUkxfUkVHLCByZWcpOwogCiAJdXNsZWVw X3JhbmdlKDkwMDAsIDExMDAwKTsKIAogCXJlZyB8PSAweDFmOwotCWV4eW5vc19kc2lfd3JpdGUo ZHNpLCBEU0lNX0ZJRk9DVFJMX1JFRywgcmVnKTsKKwlzYW1zdW5nX2RzaW1fd3JpdGUoZHNpLCBE U0lNX0ZJRk9DVFJMX1JFRywgcmVnKTsKIAl1c2xlZXBfcmFuZ2UoOTAwMCwgMTEwMDApOwogCiAJ LyogRFNJIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTg1NiwxMCArODYwLDEwIEBAIHN0YXRpYyBpbnQg ZXh5bm9zX2RzaV9pbml0X2xpbmsoc3RydWN0IGV4eW5vc19kc2kgKmRzaSkKIAkJCWRzaS0+bW9k ZV9mbGFncyAmIE1JUElfRFNJX0NMT0NLX05PTl9DT05USU5VT1VTKSB7CiAJCXJlZyB8PSBEU0lN X0NMS0xBTkVfU1RPUDsKIAl9Ci0JZXh5bm9zX2RzaV93cml0ZShkc2ksIERTSU1fQ09ORklHX1JF RywgcmVnKTsKKwlzYW1zdW5nX2RzaW1fd3JpdGUoZHNpLCBEU0lNX0NPTkZJR19SRUcsIHJlZyk7 CiAKIAlsYW5lc19tYXNrID0gQklUKGRzaS0+bGFuZXMpIC0gMTsKLQlleHlub3NfZHNpX2VuYWJs ZV9sYW5lKGRzaSwgbGFuZXNfbWFzayk7CisJc2Ftc3VuZ19kc2ltX2VuYWJsZV9sYW5lKGRzaSwg bGFuZXNfbWFzayk7CiAKIAkvKiBDaGVjayBjbG9jayBhbmQgZGF0YSBsYW5lIHN0YXRlIGFyZSBz dG9wIHN0YXRlICovCiAJdGltZW91dCA9IDEwMDsKQEAgLTg2OSwyNCArODczLDI0IEBAIHN0YXRp YyBpbnQgZXh5bm9zX2RzaV9pbml0X2xpbmsoc3RydWN0IGV4eW5vc19kc2kgKmRzaSkKIAkJCXJl dHVybiAtRUZBVUxUOwogCQl9CiAKLQkJcmVnID0gZXh5bm9zX2RzaV9yZWFkKGRzaSwgRFNJTV9T VEFUVVNfUkVHKTsKKwkJcmVnID0gc2Ftc3VuZ19kc2ltX3JlYWQoZHNpLCBEU0lNX1NUQVRVU19S RUcpOwogCQlpZiAoKHJlZyAmIERTSU1fU1RPUF9TVEFURV9EQVQobGFuZXNfbWFzaykpCiAJCSAg ICAhPSBEU0lNX1NUT1BfU1RBVEVfREFUKGxhbmVzX21hc2spKQogCQkJY29udGludWU7CiAJfSB3 aGlsZSAoIShyZWcgJiAoRFNJTV9TVE9QX1NUQVRFX0NMSyB8IERTSU1fVFhfUkVBRFlfSFNfQ0xL KSkpOwogCi0JcmVnID0gZXh5bm9zX2RzaV9yZWFkKGRzaSwgRFNJTV9FU0NNT0RFX1JFRyk7CisJ cmVnID0gc2Ftc3VuZ19kc2ltX3JlYWQoZHNpLCBEU0lNX0VTQ01PREVfUkVHKTsKIAlyZWcgJj0g fkRTSU1fU1RPUF9TVEFURV9DTlRfTUFTSzsKIAlyZWcgfD0gRFNJTV9TVE9QX1NUQVRFX0NOVChk cml2ZXJfZGF0YS0+cmVnX3ZhbHVlc1tTVE9QX1NUQVRFX0NOVF0pOwotCWV4eW5vc19kc2lfd3Jp dGUoZHNpLCBEU0lNX0VTQ01PREVfUkVHLCByZWcpOworCXNhbXN1bmdfZHNpbV93cml0ZShkc2ks IERTSU1fRVNDTU9ERV9SRUcsIHJlZyk7CiAKIAlyZWcgPSBEU0lNX0JUQV9USU1FT1VUKDB4ZmYp IHwgRFNJTV9MUERSX1RJTUVPVVQoMHhmZmZmKTsKLQlleHlub3NfZHNpX3dyaXRlKGRzaSwgRFNJ TV9USU1FT1VUX1JFRywgcmVnKTsKKwlzYW1zdW5nX2RzaW1fd3JpdGUoZHNpLCBEU0lNX1RJTUVP VVRfUkVHLCByZWcpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGV4eW5vc19kc2lf c2V0X2Rpc3BsYXlfbW9kZShzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpKQorc3RhdGljIHZvaWQgc2Ft c3VuZ19kc2ltX3NldF9kaXNwbGF5X21vZGUoc3RydWN0IHNhbXN1bmdfZHNpbSAqZHNpKQogewog CXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptID0gJmRzaS0+bW9kZTsKIAl1bnNpZ25lZCBpbnQg bnVtX2JpdHNfcmVzb2wgPSBkc2ktPmRyaXZlcl9kYXRhLT5udW1fYml0c19yZXNvbDsKQEAgLTg5 Niw0MiArOTAwLDQyIEBAIHN0YXRpYyB2b2lkIGV4eW5vc19kc2lfc2V0X2Rpc3BsYXlfbW9kZShz dHJ1Y3QgZXh5bm9zX2RzaSAqZHNpKQogCQlyZWcgPSBEU0lNX0NNRF9BTExPVygweGYpCiAJCQl8 IERTSU1fU1RBQkxFX1ZGUChtLT52c3luY19zdGFydCAtIG0tPnZkaXNwbGF5KQogCQkJfCBEU0lN X01BSU5fVkJQKG0tPnZ0b3RhbCAtIG0tPnZzeW5jX2VuZCk7Ci0JCWV4eW5vc19kc2lfd3JpdGUo ZHNpLCBEU0lNX01WUE9SQ0hfUkVHLCByZWcpOworCQlzYW1zdW5nX2RzaW1fd3JpdGUoZHNpLCBE U0lNX01WUE9SQ0hfUkVHLCByZWcpOwogCiAJCXJlZyA9IERTSU1fTUFJTl9IRlAobS0+aHN5bmNf c3RhcnQgLSBtLT5oZGlzcGxheSkKIAkJCXwgRFNJTV9NQUlOX0hCUChtLT5odG90YWwgLSBtLT5o c3luY19lbmQpOwotCQlleHlub3NfZHNpX3dyaXRlKGRzaSwgRFNJTV9NSFBPUkNIX1JFRywgcmVn KTsKKwkJc2Ftc3VuZ19kc2ltX3dyaXRlKGRzaSwgRFNJTV9NSFBPUkNIX1JFRywgcmVnKTsKIAog CQlyZWcgPSBEU0lNX01BSU5fVlNBKG0tPnZzeW5jX2VuZCAtIG0tPnZzeW5jX3N0YXJ0KQogCQkJ fCBEU0lNX01BSU5fSFNBKG0tPmhzeW5jX2VuZCAtIG0tPmhzeW5jX3N0YXJ0KTsKLQkJZXh5bm9z X2RzaV93cml0ZShkc2ksIERTSU1fTVNZTkNfUkVHLCByZWcpOworCQlzYW1zdW5nX2RzaW1fd3Jp dGUoZHNpLCBEU0lNX01TWU5DX1JFRywgcmVnKTsKIAl9CiAJcmVnID0gIERTSU1fTUFJTl9IUkVT T0wobS0+aGRpc3BsYXksIG51bV9iaXRzX3Jlc29sKSB8CiAJCURTSU1fTUFJTl9WUkVTT0wobS0+ dmRpc3BsYXksIG51bV9iaXRzX3Jlc29sKTsKIAotCWV4eW5vc19kc2lfd3JpdGUoZHNpLCBEU0lN X01EUkVTT0xfUkVHLCByZWcpOworCXNhbXN1bmdfZHNpbV93cml0ZShkc2ksIERTSU1fTURSRVNP TF9SRUcsIHJlZyk7CiAKIAlkZXZfZGJnKGRzaS0+ZGV2LCAiTENEIHNpemUgPSAlZHglZFxuIiwg bS0+aGRpc3BsYXksIG0tPnZkaXNwbGF5KTsKIH0KIAotc3RhdGljIHZvaWQgZXh5bm9zX2RzaV9z ZXRfZGlzcGxheV9lbmFibGUoc3RydWN0IGV4eW5vc19kc2kgKmRzaSwgYm9vbCBlbmFibGUpCitz dGF0aWMgdm9pZCBzYW1zdW5nX2RzaW1fc2V0X2Rpc3BsYXlfZW5hYmxlKHN0cnVjdCBzYW1zdW5n X2RzaW0gKmRzaSwgYm9vbCBlbmFibGUpCiB7CiAJdTMyIHJlZzsKIAotCXJlZyA9IGV4eW5vc19k c2lfcmVhZChkc2ksIERTSU1fTURSRVNPTF9SRUcpOworCXJlZyA9IHNhbXN1bmdfZHNpbV9yZWFk KGRzaSwgRFNJTV9NRFJFU09MX1JFRyk7CiAJaWYgKGVuYWJsZSkKIAkJcmVnIHw9IERTSU1fTUFJ Tl9TVEFORF9CWTsKIAllbHNlCiAJCXJlZyAmPSB+RFNJTV9NQUlOX1NUQU5EX0JZOwotCWV4eW5v c19kc2lfd3JpdGUoZHNpLCBEU0lNX01EUkVTT0xfUkVHLCByZWcpOworCXNhbXN1bmdfZHNpbV93 cml0ZShkc2ksIERTSU1fTURSRVNPTF9SRUcsIHJlZyk7CiB9CiAKLXN0YXRpYyBpbnQgZXh5bm9z X2RzaV93YWl0X2Zvcl9oZHJfZmlmbyhzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpKQorc3RhdGljIGlu dCBzYW1zdW5nX2RzaW1fd2FpdF9mb3JfaGRyX2ZpZm8oc3RydWN0IHNhbXN1bmdfZHNpbSAqZHNp KQogewogCWludCB0aW1lb3V0ID0gMjAwMDsKIAogCWRvIHsKLQkJdTMyIHJlZyA9IGV4eW5vc19k c2lfcmVhZChkc2ksIERTSU1fRklGT0NUUkxfUkVHKTsKKwkJdTMyIHJlZyA9IHNhbXN1bmdfZHNp bV9yZWFkKGRzaSwgRFNJTV9GSUZPQ1RSTF9SRUcpOwogCiAJCWlmICghKHJlZyAmIERTSU1fU0ZS X0hFQURFUl9GVUxMKSkKIAkJCXJldHVybiAwOwpAQCAtOTQzLDI3ICs5NDcsMjcgQEAgc3RhdGlj IGludCBleHlub3NfZHNpX3dhaXRfZm9yX2hkcl9maWZvKHN0cnVjdCBleHlub3NfZHNpICpkc2kp CiAJcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAKLXN0YXRpYyB2b2lkIGV4eW5vc19kc2lfc2V0X2Nt ZF9scG0oc3RydWN0IGV4eW5vc19kc2kgKmRzaSwgYm9vbCBscG0pCitzdGF0aWMgdm9pZCBzYW1z dW5nX2RzaW1fc2V0X2NtZF9scG0oc3RydWN0IHNhbXN1bmdfZHNpbSAqZHNpLCBib29sIGxwbSkK IHsKLQl1MzIgdiA9IGV4eW5vc19kc2lfcmVhZChkc2ksIERTSU1fRVNDTU9ERV9SRUcpOworCXUz MiB2ID0gc2Ftc3VuZ19kc2ltX3JlYWQoZHNpLCBEU0lNX0VTQ01PREVfUkVHKTsKIAogCWlmIChs cG0pCiAJCXYgfD0gRFNJTV9DTURfTFBEVF9MUDsKIAllbHNlCiAJCXYgJj0gfkRTSU1fQ01EX0xQ RFRfTFA7CiAKLQlleHlub3NfZHNpX3dyaXRlKGRzaSwgRFNJTV9FU0NNT0RFX1JFRywgdik7CisJ c2Ftc3VuZ19kc2ltX3dyaXRlKGRzaSwgRFNJTV9FU0NNT0RFX1JFRywgdik7CiB9CiAKLXN0YXRp YyB2b2lkIGV4eW5vc19kc2lfZm9yY2VfYnRhKHN0cnVjdCBleHlub3NfZHNpICpkc2kpCitzdGF0 aWMgdm9pZCBzYW1zdW5nX2RzaW1fZm9yY2VfYnRhKHN0cnVjdCBzYW1zdW5nX2RzaW0gKmRzaSkK IHsKLQl1MzIgdiA9IGV4eW5vc19kc2lfcmVhZChkc2ksIERTSU1fRVNDTU9ERV9SRUcpOworCXUz MiB2ID0gc2Ftc3VuZ19kc2ltX3JlYWQoZHNpLCBEU0lNX0VTQ01PREVfUkVHKTsKIAl2IHw9IERT SU1fRk9SQ0VfQlRBOwotCWV4eW5vc19kc2lfd3JpdGUoZHNpLCBEU0lNX0VTQ01PREVfUkVHLCB2 KTsKKwlzYW1zdW5nX2RzaW1fd3JpdGUoZHNpLCBEU0lNX0VTQ01PREVfUkVHLCB2KTsKIH0KIAot c3RhdGljIHZvaWQgZXh5bm9zX2RzaV9zZW5kX3RvX2ZpZm8oc3RydWN0IGV4eW5vc19kc2kgKmRz aSwKLQkJCQkJc3RydWN0IGV4eW5vc19kc2lfdHJhbnNmZXIgKnhmZXIpCitzdGF0aWMgdm9pZCBz YW1zdW5nX2RzaW1fc2VuZF90b19maWZvKHN0cnVjdCBzYW1zdW5nX2RzaW0gKmRzaSwKKwkJCQkg ICAgICBzdHJ1Y3Qgc2Ftc3VuZ19kc2ltX3RyYW5zZmVyICp4ZmVyKQogewogCXN0cnVjdCBkZXZp Y2UgKmRldiA9IGRzaS0+ZGV2OwogCXN0cnVjdCBtaXBpX2RzaV9wYWNrZXQgKnBrdCA9ICZ4ZmVy LT5wYWNrZXQ7CkBAIC05ODMsNyArOTg3LDcgQEAgc3RhdGljIHZvaWQgZXh5bm9zX2RzaV9zZW5k X3RvX2ZpZm8oc3RydWN0IGV4eW5vc19kc2kgKmRzaSwKIAkvKiBTZW5kIHBheWxvYWQgKi8KIAl3 aGlsZSAobGVuZ3RoID49IDQpIHsKIAkJcmVnID0gZ2V0X3VuYWxpZ25lZF9sZTMyKHBheWxvYWQp OwotCQlleHlub3NfZHNpX3dyaXRlKGRzaSwgRFNJTV9QQVlMT0FEX1JFRywgcmVnKTsKKwkJc2Ft c3VuZ19kc2ltX3dyaXRlKGRzaSwgRFNJTV9QQVlMT0FEX1JFRywgcmVnKTsKIAkJcGF5bG9hZCAr PSA0OwogCQlsZW5ndGggLT0gNDsKIAl9CkBAIC05OTgsNyArMTAwMiw3IEBAIHN0YXRpYyB2b2lk IGV4eW5vc19kc2lfc2VuZF90b19maWZvKHN0cnVjdCBleHlub3NfZHNpICpkc2ksCiAJCWZhbGx0 aHJvdWdoOwogCWNhc2UgMToKIAkJcmVnIHw9IHBheWxvYWRbMF07Ci0JCWV4eW5vc19kc2lfd3Jp dGUoZHNpLCBEU0lNX1BBWUxPQURfUkVHLCByZWcpOworCQlzYW1zdW5nX2RzaW1fd3JpdGUoZHNp LCBEU0lNX1BBWUxPQURfUkVHLCByZWcpOwogCQlicmVhazsKIAl9CiAKQEAgLTEwMDcsMjUgKzEw MTEsMjUgQEAgc3RhdGljIHZvaWQgZXh5bm9zX2RzaV9zZW5kX3RvX2ZpZm8oc3RydWN0IGV4eW5v c19kc2kgKmRzaSwKIAkJcmV0dXJuOwogCiAJcmVnID0gZ2V0X3VuYWxpZ25lZF9sZTMyKHBrdC0+ aGVhZGVyKTsKLQlpZiAoZXh5bm9zX2RzaV93YWl0X2Zvcl9oZHJfZmlmbyhkc2kpKSB7CisJaWYg KHNhbXN1bmdfZHNpbV93YWl0X2Zvcl9oZHJfZmlmbyhkc2kpKSB7CiAJCWRldl9lcnIoZGV2LCAi d2FpdGluZyBmb3IgaGVhZGVyIEZJRk8gdGltZWQgb3V0XG4iKTsKIAkJcmV0dXJuOwogCX0KIAog CWlmIChORVFWKHhmZXItPmZsYWdzICYgTUlQSV9EU0lfTVNHX1VTRV9MUE0sCiAJCSBkc2ktPnN0 YXRlICYgRFNJTV9TVEFURV9DTURfTFBNKSkgewotCQlleHlub3NfZHNpX3NldF9jbWRfbHBtKGRz aSwgeGZlci0+ZmxhZ3MgJiBNSVBJX0RTSV9NU0dfVVNFX0xQTSk7CisJCXNhbXN1bmdfZHNpbV9z ZXRfY21kX2xwbShkc2ksIHhmZXItPmZsYWdzICYgTUlQSV9EU0lfTVNHX1VTRV9MUE0pOwogCQlk c2ktPnN0YXRlIF49IERTSU1fU1RBVEVfQ01EX0xQTTsKIAl9CiAKLQlleHlub3NfZHNpX3dyaXRl KGRzaSwgRFNJTV9QS1RIRFJfUkVHLCByZWcpOworCXNhbXN1bmdfZHNpbV93cml0ZShkc2ksIERT SU1fUEtUSERSX1JFRywgcmVnKTsKIAogCWlmICh4ZmVyLT5mbGFncyAmIE1JUElfRFNJX01TR19S RVFfQUNLKQotCQlleHlub3NfZHNpX2ZvcmNlX2J0YShkc2kpOworCQlzYW1zdW5nX2RzaW1fZm9y Y2VfYnRhKGRzaSk7CiB9CiAKLXN0YXRpYyB2b2lkIGV4eW5vc19kc2lfcmVhZF9mcm9tX2ZpZm8o c3RydWN0IGV4eW5vc19kc2kgKmRzaSwKLQkJCQkJc3RydWN0IGV4eW5vc19kc2lfdHJhbnNmZXIg KnhmZXIpCitzdGF0aWMgdm9pZCBzYW1zdW5nX2RzaW1fcmVhZF9mcm9tX2ZpZm8oc3RydWN0IHNh bXN1bmdfZHNpbSAqZHNpLAorCQkJCQlzdHJ1Y3Qgc2Ftc3VuZ19kc2ltX3RyYW5zZmVyICp4ZmVy KQogewogCXU4ICpwYXlsb2FkID0geGZlci0+cnhfcGF5bG9hZCArIHhmZXItPnJ4X2RvbmU7CiAJ Ym9vbCBmaXJzdCA9ICF4ZmVyLT5yeF9kb25lOwpAQCAtMTAzNCw3ICsxMDM4LDcgQEAgc3RhdGlj IHZvaWQgZXh5bm9zX2RzaV9yZWFkX2Zyb21fZmlmbyhzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpLAog CXUzMiByZWc7CiAKIAlpZiAoZmlyc3QpIHsKLQkJcmVnID0gZXh5bm9zX2RzaV9yZWFkKGRzaSwg RFNJTV9SWEZJRk9fUkVHKTsKKwkJcmVnID0gc2Ftc3VuZ19kc2ltX3JlYWQoZHNpLCBEU0lNX1JY RklGT19SRUcpOwogCiAJCXN3aXRjaCAocmVnICYgMHgzZikgewogCQljYXNlIE1JUElfRFNJX1JY X0dFTkVSSUNfU0hPUlRfUkVBRF9SRVNQT05TRV8yQllURToKQEAgLTEwNzMsNyArMTA3Nyw3IEBA IHN0YXRpYyB2b2lkIGV4eW5vc19kc2lfcmVhZF9mcm9tX2ZpZm8oc3RydWN0IGV4eW5vc19kc2kg KmRzaSwKIAogCS8qIFJlY2VpdmUgcGF5bG9hZCAqLwogCXdoaWxlIChsZW5ndGggPj0gNCkgewot CQlyZWcgPSBleHlub3NfZHNpX3JlYWQoZHNpLCBEU0lNX1JYRklGT19SRUcpOworCQlyZWcgPSBz YW1zdW5nX2RzaW1fcmVhZChkc2ksIERTSU1fUlhGSUZPX1JFRyk7CiAJCXBheWxvYWRbMF0gPSAo cmVnID4+ICAwKSAmIDB4ZmY7CiAJCXBheWxvYWRbMV0gPSAocmVnID4+ICA4KSAmIDB4ZmY7CiAJ CXBheWxvYWRbMl0gPSAocmVnID4+IDE2KSAmIDB4ZmY7CkBAIC0xMDgzLDcgKzEwODcsNyBAQCBz dGF0aWMgdm9pZCBleHlub3NfZHNpX3JlYWRfZnJvbV9maWZvKHN0cnVjdCBleHlub3NfZHNpICpk c2ksCiAJfQogCiAJaWYgKGxlbmd0aCkgewotCQlyZWcgPSBleHlub3NfZHNpX3JlYWQoZHNpLCBE U0lNX1JYRklGT19SRUcpOworCQlyZWcgPSBzYW1zdW5nX2RzaW1fcmVhZChkc2ksIERTSU1fUlhG SUZPX1JFRyk7CiAJCXN3aXRjaCAobGVuZ3RoKSB7CiAJCWNhc2UgMzoKIAkJCXBheWxvYWRbMl0g PSAocmVnID4+IDE2KSAmIDB4ZmY7CkBAIC0xMTAyLDE2ICsxMTA2LDE2IEBAIHN0YXRpYyB2b2lk IGV4eW5vc19kc2lfcmVhZF9mcm9tX2ZpZm8oc3RydWN0IGV4eW5vc19kc2kgKmRzaSwKIGNsZWFy X2ZpZm86CiAJbGVuZ3RoID0gRFNJX1JYX0ZJRk9fU0laRSAvIDQ7CiAJZG8gewotCQlyZWcgPSBl eHlub3NfZHNpX3JlYWQoZHNpLCBEU0lNX1JYRklGT19SRUcpOworCQlyZWcgPSBzYW1zdW5nX2Rz aW1fcmVhZChkc2ksIERTSU1fUlhGSUZPX1JFRyk7CiAJCWlmIChyZWcgPT0gRFNJX1JYX0ZJRk9f RU1QVFkpCiAJCQlicmVhazsKIAl9IHdoaWxlICgtLWxlbmd0aCk7CiB9CiAKLXN0YXRpYyB2b2lk IGV4eW5vc19kc2lfdHJhbnNmZXJfc3RhcnQoc3RydWN0IGV4eW5vc19kc2kgKmRzaSkKK3N0YXRp YyB2b2lkIHNhbXN1bmdfZHNpbV90cmFuc2Zlcl9zdGFydChzdHJ1Y3Qgc2Ftc3VuZ19kc2ltICpk c2kpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZXh5bm9zX2RzaV90cmFuc2Zl ciAqeGZlcjsKKwlzdHJ1Y3Qgc2Ftc3VuZ19kc2ltX3RyYW5zZmVyICp4ZmVyOwogCWJvb2wgc3Rh cnQgPSBmYWxzZTsKIAogYWdhaW46CkBAIC0xMTIzLDcgKzExMjcsNyBAQCBzdGF0aWMgdm9pZCBl eHlub3NfZHNpX3RyYW5zZmVyX3N0YXJ0KHN0cnVjdCBleHlub3NfZHNpICpkc2kpCiAJfQogCiAJ eGZlciA9IGxpc3RfZmlyc3RfZW50cnkoJmRzaS0+dHJhbnNmZXJfbGlzdCwKLQkJCQkJc3RydWN0 IGV4eW5vc19kc2lfdHJhbnNmZXIsIGxpc3QpOworCQkJCQlzdHJ1Y3Qgc2Ftc3VuZ19kc2ltX3Ry YW5zZmVyLCBsaXN0KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzaS0+dHJhbnNmZXJf bG9jaywgZmxhZ3MpOwogCkBAIC0xMTMyLDcgKzExMzYsNyBAQCBzdGF0aWMgdm9pZCBleHlub3Nf ZHNpX3RyYW5zZmVyX3N0YXJ0KHN0cnVjdCBleHlub3NfZHNpICpkc2kpCiAJCS8qIHdhaXRpbmcg Zm9yIFJYICovCiAJCXJldHVybjsKIAotCWV4eW5vc19kc2lfc2VuZF90b19maWZvKGRzaSwgeGZl cik7CisJc2Ftc3VuZ19kc2ltX3NlbmRfdG9fZmlmbyhkc2ksIHhmZXIpOwogCiAJaWYgKHhmZXIt PnBhY2tldC5wYXlsb2FkX2xlbmd0aCB8fCB4ZmVyLT5yeF9sZW4pCiAJCXJldHVybjsKQEAgLTEx NTEsOSArMTE1NSw5IEBAIHN0YXRpYyB2b2lkIGV4eW5vc19kc2lfdHJhbnNmZXJfc3RhcnQoc3Ry dWN0IGV4eW5vc19kc2kgKmRzaSkKIAkJZ290byBhZ2FpbjsKIH0KIAotc3RhdGljIGJvb2wgZXh5 bm9zX2RzaV90cmFuc2Zlcl9maW5pc2goc3RydWN0IGV4eW5vc19kc2kgKmRzaSkKK3N0YXRpYyBi b29sIHNhbXN1bmdfZHNpbV90cmFuc2Zlcl9maW5pc2goc3RydWN0IHNhbXN1bmdfZHNpbSAqZHNp KQogewotCXN0cnVjdCBleHlub3NfZHNpX3RyYW5zZmVyICp4ZmVyOworCXN0cnVjdCBzYW1zdW5n X2RzaW1fdHJhbnNmZXIgKnhmZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIHN0YXJ0 ID0gdHJ1ZTsKIApAQCAtMTE2NSw3ICsxMTY5LDcgQEAgc3RhdGljIGJvb2wgZXh5bm9zX2RzaV90 cmFuc2Zlcl9maW5pc2goc3RydWN0IGV4eW5vc19kc2kgKmRzaSkKIAl9CiAKIAl4ZmVyID0gbGlz dF9maXJzdF9lbnRyeSgmZHNpLT50cmFuc2Zlcl9saXN0LAotCQkJCQlzdHJ1Y3QgZXh5bm9zX2Rz aV90cmFuc2ZlciwgbGlzdCk7CisJCQkJCXN0cnVjdCBzYW1zdW5nX2RzaW1fdHJhbnNmZXIsIGxp c3QpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNpLT50cmFuc2Zlcl9sb2NrLCBmbGFn cyk7CiAKQEAgLTExNzgsNyArMTE4Miw3IEBAIHN0YXRpYyBib29sIGV4eW5vc19kc2lfdHJhbnNm ZXJfZmluaXNoKHN0cnVjdCBleHlub3NfZHNpICpkc2kpCiAJCXJldHVybiB0cnVlOwogCiAJaWYg KHhmZXItPnJ4X2RvbmUgIT0geGZlci0+cnhfbGVuKQotCQlleHlub3NfZHNpX3JlYWRfZnJvbV9m aWZvKGRzaSwgeGZlcik7CisJCXNhbXN1bmdfZHNpbV9yZWFkX2Zyb21fZmlmbyhkc2ksIHhmZXIp OwogCiAJaWYgKHhmZXItPnJ4X2RvbmUgIT0geGZlci0+cnhfbGVuKQogCQlyZXR1cm4gdHJ1ZTsK QEAgLTExOTcsOCArMTIwMSw4IEBAIHN0YXRpYyBib29sIGV4eW5vc19kc2lfdHJhbnNmZXJfZmlu aXNoKHN0cnVjdCBleHlub3NfZHNpICpkc2kpCiAJcmV0dXJuIHN0YXJ0OwogfQogCi1zdGF0aWMg dm9pZCBleHlub3NfZHNpX3JlbW92ZV90cmFuc2ZlcihzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpLAot CQkJCQlzdHJ1Y3QgZXh5bm9zX2RzaV90cmFuc2ZlciAqeGZlcikKK3N0YXRpYyB2b2lkIHNhbXN1 bmdfZHNpbV9yZW1vdmVfdHJhbnNmZXIoc3RydWN0IHNhbXN1bmdfZHNpbSAqZHNpLAorCQkJCQkg c3RydWN0IHNhbXN1bmdfZHNpbV90cmFuc2ZlciAqeGZlcikKIHsKIAl1bnNpZ25lZCBsb25nIGZs YWdzOwogCWJvb2wgc3RhcnQ7CkBAIC0xMjA3LDEyICsxMjExLDEyIEBAIHN0YXRpYyB2b2lkIGV4 eW5vc19kc2lfcmVtb3ZlX3RyYW5zZmVyKHN0cnVjdCBleHlub3NfZHNpICpkc2ksCiAKIAlpZiAo IWxpc3RfZW1wdHkoJmRzaS0+dHJhbnNmZXJfbGlzdCkgJiYKIAkgICAgeGZlciA9PSBsaXN0X2Zp cnN0X2VudHJ5KCZkc2ktPnRyYW5zZmVyX2xpc3QsCi0JCQkJICAgICBzdHJ1Y3QgZXh5bm9zX2Rz aV90cmFuc2ZlciwgbGlzdCkpIHsKKwkJCQkgICAgIHN0cnVjdCBzYW1zdW5nX2RzaW1fdHJhbnNm ZXIsIGxpc3QpKSB7CiAJCWxpc3RfZGVsX2luaXQoJnhmZXItPmxpc3QpOwogCQlzdGFydCA9ICFs aXN0X2VtcHR5KCZkc2ktPnRyYW5zZmVyX2xpc3QpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZkc2ktPnRyYW5zZmVyX2xvY2ssIGZsYWdzKTsKIAkJaWYgKHN0YXJ0KQotCQkJZXh5bm9zX2Rz aV90cmFuc2Zlcl9zdGFydChkc2kpOworCQkJc2Ftc3VuZ19kc2ltX3RyYW5zZmVyX3N0YXJ0KGRz aSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEyMjEsOCArMTIyNSw4IEBAIHN0YXRpYyB2b2lkIGV4 eW5vc19kc2lfcmVtb3ZlX3RyYW5zZmVyKHN0cnVjdCBleHlub3NfZHNpICpkc2ksCiAJc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmZHNpLT50cmFuc2Zlcl9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRp YyBpbnQgZXh5bm9zX2RzaV90cmFuc2ZlcihzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpLAotCQkJCQlz dHJ1Y3QgZXh5bm9zX2RzaV90cmFuc2ZlciAqeGZlcikKK3N0YXRpYyBpbnQgc2Ftc3VuZ19kc2lt X3RyYW5zZmVyKHN0cnVjdCBzYW1zdW5nX2RzaW0gKmRzaSwKKwkJCQkgc3RydWN0IHNhbXN1bmdf ZHNpbV90cmFuc2ZlciAqeGZlcikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJvb2wgc3Rv cHBlZDsKQEAgLTEyNDAsMTMgKzEyNDQsMTMgQEAgc3RhdGljIGludCBleHlub3NfZHNpX3RyYW5z ZmVyKHN0cnVjdCBleHlub3NfZHNpICpkc2ksCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNp LT50cmFuc2Zlcl9sb2NrLCBmbGFncyk7CiAKIAlpZiAoc3RvcHBlZCkKLQkJZXh5bm9zX2RzaV90 cmFuc2Zlcl9zdGFydChkc2kpOworCQlzYW1zdW5nX2RzaW1fdHJhbnNmZXJfc3RhcnQoZHNpKTsK IAogCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmeGZlci0+Y29tcGxldGVkLAogCQkJCSAg ICBtc2Vjc190b19qaWZmaWVzKERTSV9YRkVSX1RJTUVPVVRfTVMpKTsKIAlpZiAoeGZlci0+cmVz dWx0ID09IC1FVElNRURPVVQpIHsKIAkJc3RydWN0IG1pcGlfZHNpX3BhY2tldCAqcGt0ID0gJnhm ZXItPnBhY2tldDsKLQkJZXh5bm9zX2RzaV9yZW1vdmVfdHJhbnNmZXIoZHNpLCB4ZmVyKTsKKwkJ c2Ftc3VuZ19kc2ltX3JlbW92ZV90cmFuc2Zlcihkc2ksIHhmZXIpOwogCQlkZXZfZXJyKGRzaS0+ ZGV2LCAieGZlciB0aW1lZCBvdXQ6ICUqcGggJSpwaFxuIiwgNCwgcGt0LT5oZWFkZXIsCiAJCQko aW50KXBrdC0+cGF5bG9hZF9sZW5ndGgsIHBrdC0+cGF5bG9hZCk7CiAJCXJldHVybiAtRVRJTUVE T1VUOwpAQCAtMTI1NiwyNSArMTI2MCwyNSBAQCBzdGF0aWMgaW50IGV4eW5vc19kc2lfdHJhbnNm ZXIoc3RydWN0IGV4eW5vc19kc2kgKmRzaSwKIAlyZXR1cm4geGZlci0+cmVzdWx0OwogfQogCi1z dGF0aWMgaXJxcmV0dXJuX3QgZXh5bm9zX2RzaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQor c3RhdGljIGlycXJldHVybl90IHNhbXN1bmdfZHNpbV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lk KQogewotCXN0cnVjdCBleHlub3NfZHNpICpkc2kgPSBkZXZfaWQ7CisJc3RydWN0IHNhbXN1bmdf ZHNpbSAqZHNpID0gZGV2X2lkOwogCXUzMiBzdGF0dXM7CiAKLQlzdGF0dXMgPSBleHlub3NfZHNp X3JlYWQoZHNpLCBEU0lNX0lOVFNSQ19SRUcpOworCXN0YXR1cyA9IHNhbXN1bmdfZHNpbV9yZWFk KGRzaSwgRFNJTV9JTlRTUkNfUkVHKTsKIAlpZiAoIXN0YXR1cykgewogCQlzdGF0aWMgdW5zaWdu ZWQgbG9uZyBpbnQgajsKIAkJaWYgKHByaW50a190aW1lZF9yYXRlbGltaXQoJmosIDUwMCkpCiAJ CQlkZXZfd2Fybihkc2ktPmRldiwgInNwdXJpb3VzIGludGVycnVwdFxuIik7CiAJCXJldHVybiBJ UlFfSEFORExFRDsKIAl9Ci0JZXh5bm9zX2RzaV93cml0ZShkc2ksIERTSU1fSU5UU1JDX1JFRywg c3RhdHVzKTsKKwlzYW1zdW5nX2RzaW1fd3JpdGUoZHNpLCBEU0lNX0lOVFNSQ19SRUcsIHN0YXR1 cyk7CiAKIAlpZiAoc3RhdHVzICYgRFNJTV9JTlRfU1dfUlNUX1JFTEVBU0UpIHsKIAkJdTMyIG1h c2sgPSB+KERTSU1fSU5UX1JYX0RPTkUgfCBEU0lNX0lOVF9TRlJfRklGT19FTVBUWSB8CiAJCQlE U0lNX0lOVF9TRlJfSERSX0ZJRk9fRU1QVFkgfCBEU0lNX0lOVF9SWF9FQ0NfRVJSIHwKIAkJCURT SU1fSU5UX1NXX1JTVF9SRUxFQVNFKTsKLQkJZXh5bm9zX2RzaV93cml0ZShkc2ksIERTSU1fSU5U TVNLX1JFRywgbWFzayk7CisJCXNhbXN1bmdfZHNpbV93cml0ZShkc2ksIERTSU1fSU5UTVNLX1JF RywgbWFzayk7CiAJCWNvbXBsZXRlKCZkc2ktPmNvbXBsZXRlZCk7CiAJCXJldHVybiBJUlFfSEFO RExFRDsKIAl9CkBAIC0xMjgzLDE1ICsxMjg3LDE1IEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBleHlu b3NfZHNpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiAJCQlEU0lNX0lOVF9QTExfU1RBQkxF KSkpCiAJCXJldHVybiBJUlFfSEFORExFRDsKIAotCWlmIChleHlub3NfZHNpX3RyYW5zZmVyX2Zp bmlzaChkc2kpKQotCQlleHlub3NfZHNpX3RyYW5zZmVyX3N0YXJ0KGRzaSk7CisJaWYgKHNhbXN1 bmdfZHNpbV90cmFuc2Zlcl9maW5pc2goZHNpKSkKKwkJc2Ftc3VuZ19kc2ltX3RyYW5zZmVyX3N0 YXJ0KGRzaSk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5f dCBleHlub3NfZHNpX3RlX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3N0YXRp YyBpcnFyZXR1cm5fdCBzYW1zdW5nX2RzaW1fdGVfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAq ZGV2X2lkKQogewotCXN0cnVjdCBleHlub3NfZHNpICpkc2kgPSAoc3RydWN0IGV4eW5vc19kc2kg KilkZXZfaWQ7CisJc3RydWN0IHNhbXN1bmdfZHNpbSAqZHNpID0gKHN0cnVjdCBzYW1zdW5nX2Rz aW0gKilkZXZfaWQ7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gJmRzaS0+ZW5jb2Rl cjsKIAogCWlmIChkc2ktPnN0YXRlICYgRFNJTV9TVEFURV9WSURPVVRfQVZBSUxBQkxFKQpAQCAt MTMwMCw3ICsxMzA0LDcgQEAgc3RhdGljIGlycXJldHVybl90IGV4eW5vc19kc2lfdGVfaXJxX2hh bmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAot c3RhdGljIHZvaWQgZXh5bm9zX2RzaV9lbmFibGVfaXJxKHN0cnVjdCBleHlub3NfZHNpICpkc2kp CitzdGF0aWMgdm9pZCBzYW1zdW5nX2RzaW1fZW5hYmxlX2lycShzdHJ1Y3Qgc2Ftc3VuZ19kc2lt ICpkc2kpCiB7CiAJZW5hYmxlX2lycShkc2ktPmlycSk7CiAKQEAgLTEzMDgsNyArMTMxMiw3IEBA IHN0YXRpYyB2b2lkIGV4eW5vc19kc2lfZW5hYmxlX2lycShzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNp KQogCQllbmFibGVfaXJxKGdwaW9fdG9faXJxKGRzaS0+dGVfZ3BpbykpOwogfQogCi1zdGF0aWMg dm9pZCBleHlub3NfZHNpX2Rpc2FibGVfaXJxKHN0cnVjdCBleHlub3NfZHNpICpkc2kpCitzdGF0 aWMgdm9pZCBzYW1zdW5nX2RzaW1fZGlzYWJsZV9pcnEoc3RydWN0IHNhbXN1bmdfZHNpbSAqZHNp KQogewogCWlmIChncGlvX2lzX3ZhbGlkKGRzaS0+dGVfZ3BpbykpCiAJCWRpc2FibGVfaXJxKGdw aW9fdG9faXJxKGRzaS0+dGVfZ3BpbykpOwpAQCAtMTMxNiwyNyArMTMyMCwyNyBAQCBzdGF0aWMg dm9pZCBleHlub3NfZHNpX2Rpc2FibGVfaXJxKHN0cnVjdCBleHlub3NfZHNpICpkc2kpCiAJZGlz YWJsZV9pcnEoZHNpLT5pcnEpOwogfQogCi1zdGF0aWMgaW50IGV4eW5vc19kc2lfaW5pdChzdHJ1 Y3QgZXh5bm9zX2RzaSAqZHNpKQorc3RhdGljIGludCBzYW1zdW5nX2RzaW1faW5pdChzdHJ1Y3Qg c2Ftc3VuZ19kc2ltICpkc2kpCiB7Ci0JY29uc3Qgc3RydWN0IGV4eW5vc19kc2lfZHJpdmVyX2Rh dGEgKmRyaXZlcl9kYXRhID0gZHNpLT5kcml2ZXJfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2Ftc3Vu Z19kc2ltX2RyaXZlcl9kYXRhICpkcml2ZXJfZGF0YSA9IGRzaS0+ZHJpdmVyX2RhdGE7CiAKLQll eHlub3NfZHNpX3Jlc2V0KGRzaSk7Ci0JZXh5bm9zX2RzaV9lbmFibGVfaXJxKGRzaSk7CisJc2Ft c3VuZ19kc2ltX3Jlc2V0KGRzaSk7CisJc2Ftc3VuZ19kc2ltX2VuYWJsZV9pcnEoZHNpKTsKIAog CWlmIChkcml2ZXJfZGF0YS0+cmVnX3ZhbHVlc1tSRVNFVF9UWVBFXSA9PSBEU0lNX0ZVTkNSU1Qp Ci0JCWV4eW5vc19kc2lfZW5hYmxlX2xhbmUoZHNpLCBCSVQoZHNpLT5sYW5lcykgLSAxKTsKKwkJ c2Ftc3VuZ19kc2ltX2VuYWJsZV9sYW5lKGRzaSwgQklUKGRzaS0+bGFuZXMpIC0gMSk7CiAKLQll eHlub3NfZHNpX2VuYWJsZV9jbG9jayhkc2kpOworCXNhbXN1bmdfZHNpbV9lbmFibGVfY2xvY2so ZHNpKTsKIAlpZiAoZHJpdmVyX2RhdGEtPndhaXRfZm9yX3Jlc2V0KQotCQlleHlub3NfZHNpX3dh aXRfZm9yX3Jlc2V0KGRzaSk7Ci0JZXh5bm9zX2RzaV9zZXRfcGh5X2N0cmwoZHNpKTsKLQlleHlu b3NfZHNpX2luaXRfbGluayhkc2kpOworCQlzYW1zdW5nX2RzaW1fd2FpdF9mb3JfcmVzZXQoZHNp KTsKKwlzYW1zdW5nX2RzaW1fc2V0X3BoeV9jdHJsKGRzaSk7CisJc2Ftc3VuZ19kc2ltX2luaXRf bGluayhkc2kpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZXh5bm9zX2RzaV9yZWdp c3Rlcl90ZV9pcnEoc3RydWN0IGV4eW5vc19kc2kgKmRzaSwKLQkJCQkgICAgICBzdHJ1Y3QgZGV2 aWNlICpwYW5lbCkKK3N0YXRpYyBpbnQgc2Ftc3VuZ19kc2ltX3JlZ2lzdGVyX3RlX2lycShzdHJ1 Y3Qgc2Ftc3VuZ19kc2ltICpkc2ksCisJCQkJCXN0cnVjdCBkZXZpY2UgKnBhbmVsKQogewogCWlu dCByZXQ7CiAJaW50IHRlX2dwaW9faXJxOwpAQCAtMTM1OSw3ICsxMzYzLDcgQEAgc3RhdGljIGlu dCBleHlub3NfZHNpX3JlZ2lzdGVyX3RlX2lycShzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpLAogCiAJ dGVfZ3Bpb19pcnEgPSBncGlvX3RvX2lycShkc2ktPnRlX2dwaW8pOwogCi0JcmV0ID0gcmVxdWVz dF90aHJlYWRlZF9pcnEodGVfZ3Bpb19pcnEsIGV4eW5vc19kc2lfdGVfaXJxX2hhbmRsZXIsIE5V TEwsCisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEodGVfZ3Bpb19pcnEsIHNhbXN1bmdfZHNp bV90ZV9pcnFfaGFuZGxlciwgTlVMTCwKIAkJCQkgICBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJR Rl9OT19BVVRPRU4sICJURSIsIGRzaSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRzaS0+ZGV2 LCAicmVxdWVzdCBpbnRlcnJ1cHQgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7CkBAIC0xMzcxLDcg KzEzNzUsNyBAQCBzdGF0aWMgaW50IGV4eW5vc19kc2lfcmVnaXN0ZXJfdGVfaXJxKHN0cnVjdCBl eHlub3NfZHNpICpkc2ksCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZXh5bm9zX2Rz aV91bnJlZ2lzdGVyX3RlX2lycShzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpKQorc3RhdGljIHZvaWQg c2Ftc3VuZ19kc2ltX3VucmVnaXN0ZXJfdGVfaXJxKHN0cnVjdCBzYW1zdW5nX2RzaW0gKmRzaSkK IHsKIAlpZiAoZ3Bpb19pc192YWxpZChkc2ktPnRlX2dwaW8pKSB7CiAJCWZyZWVfaXJxKGdwaW9f dG9faXJxKGRzaS0+dGVfZ3BpbyksIGRzaSk7CkBAIC0xMzgwLDkgKzEzODQsOSBAQCBzdGF0aWMg dm9pZCBleHlub3NfZHNpX3VucmVnaXN0ZXJfdGVfaXJxKHN0cnVjdCBleHlub3NfZHNpICpkc2kp CiAJfQogfQogCi1zdGF0aWMgdm9pZCBleHlub3NfZHNpX2JyaWRnZV9lbmFibGUoc3RydWN0IGRy bV9icmlkZ2UgKmJyaWRnZSkKK3N0YXRpYyB2b2lkIHNhbXN1bmdfZHNpbV9icmlkZ2VfZW5hYmxl KHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCiB7Ci0Jc3RydWN0IGV4eW5vc19kc2kgKmRzaSA9 IGJyaWRnZV90b19kc2koYnJpZGdlKTsKKwlzdHJ1Y3Qgc2Ftc3VuZ19kc2ltICpkc2kgPSBicmlk Z2VfdG9fZHNpKGJyaWRnZSk7CiAJaW50IHJldDsKIAogCWlmIChkc2ktPnN0YXRlICYgRFNJTV9T VEFURV9FTkFCTEVEKQpAQCAtMTM5NiwzOSArMTQwMCwzOSBAQCBzdGF0aWMgdm9pZCBleHlub3Nf ZHNpX2JyaWRnZV9lbmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKIAogCWRzaS0+c3Rh dGUgfD0gRFNJTV9TVEFURV9FTkFCTEVEOwogCi0JZXh5bm9zX2RzaV9zZXRfZGlzcGxheV9tb2Rl KGRzaSk7Ci0JZXh5bm9zX2RzaV9zZXRfZGlzcGxheV9lbmFibGUoZHNpLCB0cnVlKTsKKwlzYW1z dW5nX2RzaW1fc2V0X2Rpc3BsYXlfbW9kZShkc2kpOworCXNhbXN1bmdfZHNpbV9zZXRfZGlzcGxh eV9lbmFibGUoZHNpLCB0cnVlKTsKIAogCWRzaS0+c3RhdGUgfD0gRFNJTV9TVEFURV9WSURPVVRf QVZBSUxBQkxFOwogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgZXh5bm9zX2RzaV9icmlkZ2Vf ZGlzYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQorc3RhdGljIHZvaWQgc2Ftc3VuZ19k c2ltX2JyaWRnZV9kaXNhYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCiB7Ci0Jc3RydWN0 IGV4eW5vc19kc2kgKmRzaSA9IGJyaWRnZV90b19kc2koYnJpZGdlKTsKKwlzdHJ1Y3Qgc2Ftc3Vu Z19kc2ltICpkc2kgPSBicmlkZ2VfdG9fZHNpKGJyaWRnZSk7CiAKIAlpZiAoIShkc2ktPnN0YXRl ICYgRFNJTV9TVEFURV9FTkFCTEVEKSkKIAkJcmV0dXJuOwogCiAJZHNpLT5zdGF0ZSAmPSB+RFNJ TV9TVEFURV9WSURPVVRfQVZBSUxBQkxFOwogCi0JZXh5bm9zX2RzaV9zZXRfZGlzcGxheV9lbmFi bGUoZHNpLCBmYWxzZSk7CisJc2Ftc3VuZ19kc2ltX3NldF9kaXNwbGF5X2VuYWJsZShkc2ksIGZh bHNlKTsKIAogCWRzaS0+c3RhdGUgJj0gfkRTSU1fU1RBVEVfRU5BQkxFRDsKIAlwbV9ydW50aW1l X3B1dF9zeW5jKGRzaS0+ZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgZXh5bm9zX2RzaV9icmlkZ2Vf bW9kZV9zZXQoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSwKLQkJCQkgICAgICAgY29uc3Qgc3Ry dWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBkcm1f ZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQorc3RhdGljIHZvaWQgc2Ftc3VuZ19kc2ltX2Jy aWRnZV9tb2RlX3NldChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAorCQkJCQkgY29uc3Qgc3Ry dWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJCSBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3Bs YXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKIHsKLQlzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpID0gYnJp ZGdlX3RvX2RzaShicmlkZ2UpOworCXN0cnVjdCBzYW1zdW5nX2RzaW0gKmRzaSA9IGJyaWRnZV90 b19kc2koYnJpZGdlKTsKIAogCWRybV9tb2RlX2NvcHkoJmRzaS0+bW9kZSwgYWRqdXN0ZWRfbW9k ZSk7CiB9CiAKLXN0YXRpYyBpbnQgZXh5bm9zX2RzaV9wYW5lbF9vcl9icmlkZ2Uoc3RydWN0IGV4 eW5vc19kc2kgKmRzaSwKLQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCitzdGF0 aWMgaW50IHNhbXN1bmdfZHNpbV9wYW5lbF9vcl9icmlkZ2Uoc3RydWN0IHNhbXN1bmdfZHNpbSAq ZHNpLAorCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7CiAJc3RydWN0IGRybV9icmlk Z2UgKnBhbmVsX2JyaWRnZTsKIAlzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbDsKQEAgLTE0NTMsMTAg KzE0NTcsMTAgQEAgc3RhdGljIGludCBleHlub3NfZHNpX3BhbmVsX29yX2JyaWRnZShzdHJ1Y3Qg ZXh5bm9zX2RzaSAqZHNpLAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGV4eW5vc19kc2lf YnJpZGdlX2F0dGFjaChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAotCQkJCSAgICBlbnVtIGRy bV9icmlkZ2VfYXR0YWNoX2ZsYWdzIGZsYWdzKQorc3RhdGljIGludCBzYW1zdW5nX2RzaW1fYnJp ZGdlX2F0dGFjaChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAorCQkJCSAgICAgIGVudW0gZHJt X2JyaWRnZV9hdHRhY2hfZmxhZ3MgZmxhZ3MpCiB7Ci0Jc3RydWN0IGV4eW5vc19kc2kgKmRzaSA9 IGJyaWRnZV90b19kc2koYnJpZGdlKTsKKwlzdHJ1Y3Qgc2Ftc3VuZ19kc2ltICpkc2kgPSBicmlk Z2VfdG9fZHNpKGJyaWRnZSk7CiAKIAlkc2ktPmRybSA9IGJyaWRnZS0+ZGV2OwogCkBAIC0xNDY0 LDIzICsxNDY4LDIzIEBAIHN0YXRpYyBpbnQgZXh5bm9zX2RzaV9icmlkZ2VfYXR0YWNoKHN0cnVj dCBkcm1fYnJpZGdlICpicmlkZ2UsCiAJCQkJIGZsYWdzKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0 cnVjdCBkcm1fYnJpZGdlX2Z1bmNzIGV4eW5vc19kc2lfYnJpZGdlX2Z1bmNzID0gewotCS5lbmFi bGUgPSBleHlub3NfZHNpX2JyaWRnZV9lbmFibGUsCi0JLmRpc2FibGUgPSBleHlub3NfZHNpX2Jy aWRnZV9kaXNhYmxlLAotCS5tb2RlX3NldCA9IGV4eW5vc19kc2lfYnJpZGdlX21vZGVfc2V0LAot CS5hdHRhY2ggPSBleHlub3NfZHNpX2JyaWRnZV9hdHRhY2gsCitzdGF0aWMgY29uc3Qgc3RydWN0 IGRybV9icmlkZ2VfZnVuY3Mgc2Ftc3VuZ19kc2ltX2JyaWRnZV9mdW5jcyA9IHsKKwkuZW5hYmxl ID0gc2Ftc3VuZ19kc2ltX2JyaWRnZV9lbmFibGUsCisJLmRpc2FibGUgPSBzYW1zdW5nX2RzaW1f YnJpZGdlX2Rpc2FibGUsCisJLm1vZGVfc2V0ID0gc2Ftc3VuZ19kc2ltX2JyaWRnZV9tb2RlX3Nl dCwKKwkuYXR0YWNoID0gc2Ftc3VuZ19kc2ltX2JyaWRnZV9hdHRhY2gsCiB9OwogCi1NT0RVTEVf REVWSUNFX1RBQkxFKG9mLCBleHlub3NfZHNpX29mX21hdGNoKTsKK01PRFVMRV9ERVZJQ0VfVEFC TEUob2YsIHNhbXN1bmdfZHNpbV9vZl9tYXRjaCk7CiAKLXN0YXRpYyBpbnQgZXh5bm9zX2RzaV9o b3N0X2F0dGFjaChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKLQkJCQkgIHN0cnVjdCBtaXBp X2RzaV9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgc2Ftc3VuZ19kc2ltX2hvc3RfYXR0YWNo KHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAorCQkJCSAgICBzdHJ1Y3QgbWlwaV9kc2lfZGV2 aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGV4eW5vc19kc2kgKmRzaSA9IGhvc3RfdG9fZHNpKGhv c3QpOworCXN0cnVjdCBzYW1zdW5nX2RzaW0gKmRzaSA9IGhvc3RfdG9fZHNpKGhvc3QpOwogCXN0 cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkc2ktPmRybTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZXh5 bm9zX2RzaV9wYW5lbF9vcl9icmlkZ2UoZHNpLCBkZXZpY2UtPmRldi5vZl9ub2RlKTsKKwlyZXQg PSBzYW1zdW5nX2RzaW1fcGFuZWxfb3JfYnJpZGdlKGRzaSwgZGV2aWNlLT5kZXYub2Zfbm9kZSk7 CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTQ5Miw3ICsxNDk2LDcgQEAgc3RhdGlj IGludCBleHlub3NfZHNpX2hvc3RfYXR0YWNoKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAog CSAqLwogCWlmIChkc2ktPmRyaXZlcl9kYXRhLT5leHlub3Nfc3BlY2lmaWMgJiYKIAkgICAgIShk ZXZpY2UtPm1vZGVfZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVPKSkgewotCQlpbnQgcmV0ID0g ZXh5bm9zX2RzaV9yZWdpc3Rlcl90ZV9pcnEoZHNpLCAmZGV2aWNlLT5kZXYpOworCQlpbnQgcmV0 ID0gc2Ftc3VuZ19kc2ltX3JlZ2lzdGVyX3RlX2lycShkc2ksICZkZXZpY2UtPmRldik7CiAJCWlm IChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE1MTQsMzMgKzE1MTgsMzMgQEAgc3RhdGlj IGludCBleHlub3NfZHNpX2hvc3RfYXR0YWNoKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAog CXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGV4eW5vc19kc2lfaG9zdF9kZXRhY2goc3RydWN0 IG1pcGlfZHNpX2hvc3QgKmhvc3QsCi0JCQkJICBzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkZXZp Y2UpCitzdGF0aWMgaW50IHNhbXN1bmdfZHNpbV9ob3N0X2RldGFjaChzdHJ1Y3QgbWlwaV9kc2lf aG9zdCAqaG9zdCwKKwkJCQkgICAgc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZGV2aWNlKQogewot CXN0cnVjdCBleHlub3NfZHNpICpkc2kgPSBob3N0X3RvX2RzaShob3N0KTsKKwlzdHJ1Y3Qgc2Ft c3VuZ19kc2ltICpkc2kgPSBob3N0X3RvX2RzaShob3N0KTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAq ZHJtID0gZHNpLT5kcm07CiAKIAlpZiAoZHJtLT5tb2RlX2NvbmZpZy5wb2xsX2VuYWJsZWQpCiAJ CWRybV9rbXNfaGVscGVyX2hvdHBsdWdfZXZlbnQoZHJtKTsKIAogCWlmIChkc2ktPmRyaXZlcl9k YXRhLT5leHlub3Nfc3BlY2lmaWMpCi0JCWV4eW5vc19kc2lfdW5yZWdpc3Rlcl90ZV9pcnEoZHNp KTsKKwkJc2Ftc3VuZ19kc2ltX3VucmVnaXN0ZXJfdGVfaXJxKGRzaSk7CiAKIAlyZXR1cm4gMDsK IH0KIAotc3RhdGljIHNzaXplX3QgZXh5bm9zX2RzaV9ob3N0X3RyYW5zZmVyKHN0cnVjdCBtaXBp X2RzaV9ob3N0ICpob3N0LAotCQkJCQkgY29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKQor c3RhdGljIHNzaXplX3Qgc2Ftc3VuZ19kc2ltX2hvc3RfdHJhbnNmZXIoc3RydWN0IG1pcGlfZHNp X2hvc3QgKmhvc3QsCisJCQkJCSAgY29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKQogewot CXN0cnVjdCBleHlub3NfZHNpICpkc2kgPSBob3N0X3RvX2RzaShob3N0KTsKLQlzdHJ1Y3QgZXh5 bm9zX2RzaV90cmFuc2ZlciB4ZmVyOworCXN0cnVjdCBzYW1zdW5nX2RzaW0gKmRzaSA9IGhvc3Rf dG9fZHNpKGhvc3QpOworCXN0cnVjdCBzYW1zdW5nX2RzaW1fdHJhbnNmZXIgeGZlcjsKIAlpbnQg cmV0OwogCiAJaWYgKCEoZHNpLT5zdGF0ZSAmIERTSU1fU1RBVEVfRU5BQkxFRCkpCiAJCXJldHVy biAtRUlOVkFMOwogCiAJaWYgKCEoZHNpLT5zdGF0ZSAmIERTSU1fU1RBVEVfSU5JVElBTElaRUQp KSB7Ci0JCXJldCA9IGV4eW5vc19kc2lfaW5pdChkc2kpOworCQlyZXQgPSBzYW1zdW5nX2RzaW1f aW5pdChkc2kpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAkJZHNpLT5zdGF0ZSB8PSBE U0lNX1NUQVRFX0lOSVRJQUxJWkVEOwpAQCAtMTU1NCwxOCArMTU1OCwxOCBAQCBzdGF0aWMgc3Np emVfdCBleHlub3NfZHNpX2hvc3RfdHJhbnNmZXIoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3Qs CiAJeGZlci5yeF9wYXlsb2FkID0gbXNnLT5yeF9idWY7CiAJeGZlci5mbGFncyA9IG1zZy0+Zmxh Z3M7CiAKLQlyZXQgPSBleHlub3NfZHNpX3RyYW5zZmVyKGRzaSwgJnhmZXIpOworCXJldCA9IHNh bXN1bmdfZHNpbV90cmFuc2Zlcihkc2ksICZ4ZmVyKTsKIAlyZXR1cm4gKHJldCA8IDApID8gcmV0 IDogeGZlci5yeF9kb25lOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1pcGlfZHNpX2hvc3Rf b3BzIGV4eW5vc19kc2lfb3BzID0gewotCS5hdHRhY2ggPSBleHlub3NfZHNpX2hvc3RfYXR0YWNo LAotCS5kZXRhY2ggPSBleHlub3NfZHNpX2hvc3RfZGV0YWNoLAotCS50cmFuc2ZlciA9IGV4eW5v c19kc2lfaG9zdF90cmFuc2ZlciwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwaV9kc2lfaG9zdF9v cHMgc2Ftc3VuZ19kc2ltX29wcyA9IHsKKwkuYXR0YWNoID0gc2Ftc3VuZ19kc2ltX2hvc3RfYXR0 YWNoLAorCS5kZXRhY2ggPSBzYW1zdW5nX2RzaW1faG9zdF9kZXRhY2gsCisJLnRyYW5zZmVyID0g c2Ftc3VuZ19kc2ltX2hvc3RfdHJhbnNmZXIsCiB9OwogCi1zdGF0aWMgaW50IGV4eW5vc19kc2lf b2ZfcmVhZF91MzIoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkgIGNvbnN0IGNo YXIgKnByb3BuYW1lLCB1MzIgKm91dF92YWx1ZSkKK3N0YXRpYyBpbnQgc2Ftc3VuZ19kc2ltX29m X3JlYWRfdTMyKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJICAgIGNvbnN0IGNo YXIgKnByb3BuYW1lLCB1MzIgKm91dF92YWx1ZSkKIHsKIAlpbnQgcmV0ID0gb2ZfcHJvcGVydHlf cmVhZF91MzIobnAsIHByb3BuYW1lLCBvdXRfdmFsdWUpOwogCkBAIC0xNTgwLDIzICsxNTg0LDIz IEBAIGVudW0gewogCURTSV9QT1JUX09VVAogfTsKIAotc3RhdGljIGludCBleHlub3NfZHNpX3Bh cnNlX2R0KHN0cnVjdCBleHlub3NfZHNpICpkc2kpCitzdGF0aWMgaW50IHNhbXN1bmdfZHNpbV9w YXJzZV9kdChzdHJ1Y3Qgc2Ftc3VuZ19kc2ltICpkc2kpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2 ID0gZHNpLT5kZXY7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gZGV2LT5vZl9ub2RlOwog CWludCByZXQ7CiAKLQlyZXQgPSBleHlub3NfZHNpX29mX3JlYWRfdTMyKG5vZGUsICJzYW1zdW5n LHBsbC1jbG9jay1mcmVxdWVuY3kiLAorCXJldCA9IHNhbXN1bmdfZHNpbV9vZl9yZWFkX3UzMihu b2RlLCAic2Ftc3VuZyxwbGwtY2xvY2stZnJlcXVlbmN5IiwKIAkJCQkgICAgICZkc2ktPnBsbF9j bGtfcmF0ZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBleHlub3Nf ZHNpX29mX3JlYWRfdTMyKG5vZGUsICJzYW1zdW5nLGJ1cnN0LWNsb2NrLWZyZXF1ZW5jeSIsCisJ cmV0ID0gc2Ftc3VuZ19kc2ltX29mX3JlYWRfdTMyKG5vZGUsICJzYW1zdW5nLGJ1cnN0LWNsb2Nr LWZyZXF1ZW5jeSIsCiAJCQkJICAgICAmZHNpLT5idXJzdF9jbGtfcmF0ZSk7CiAJaWYgKHJldCA8 IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBleHlub3NfZHNpX29mX3JlYWRfdTMyKG5vZGUs ICJzYW1zdW5nLGVzYy1jbG9jay1mcmVxdWVuY3kiLAorCXJldCA9IHNhbXN1bmdfZHNpbV9vZl9y ZWFkX3UzMihub2RlLCAic2Ftc3VuZyxlc2MtY2xvY2stZnJlcXVlbmN5IiwKIAkJCQkgICAgICZk c2ktPmVzY19jbGtfcmF0ZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC0xNjA0 LDEwICsxNjA4LDEwIEBAIHN0YXRpYyBpbnQgZXh5bm9zX2RzaV9wYXJzZV9kdChzdHJ1Y3QgZXh5 bm9zX2RzaSAqZHNpKQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGV4eW5vc19kc2lfYmlu ZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKLQkJCQl2b2lkICpk YXRhKQorc3RhdGljIGludCBzYW1zdW5nX2RzaW1fYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0 cnVjdCBkZXZpY2UgKm1hc3RlciwKKwkJCSAgICAgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZXh5 bm9zX2RzaSAqZHNpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNhbXN1bmdfZHNp bSAqZHNpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNv ZGVyID0gJmRzaS0+ZW5jb2RlcjsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiA9IGRhdGE7 CiAJc3RydWN0IGRldmljZV9ub2RlICppbl9icmlkZ2Vfbm9kZTsKQEAgLTE2NTAsMjYgKzE2NTQs MjYgQEAgc3RhdGljIGludCBleHlub3NfZHNpX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1 Y3QgZGV2aWNlICptYXN0ZXIsCiAJcmV0dXJuIG1pcGlfZHNpX2hvc3RfcmVnaXN0ZXIoJmRzaS0+ ZHNpX2hvc3QpOwogfQogCi1zdGF0aWMgdm9pZCBleHlub3NfZHNpX3VuYmluZChzdHJ1Y3QgZGV2 aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKK3N0YXRpYyB2b2lkIHNhbXN1bmdfZHNp bV91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCiAJCQkJ dm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpID0gZGV2X2dldF9kcnZkYXRh KGRldik7CisJc3RydWN0IHNhbXN1bmdfZHNpbSAqZHNpID0gZGV2X2dldF9kcnZkYXRhKGRldik7 CiAKLQlleHlub3NfZHNpX2JyaWRnZV9kaXNhYmxlKCZkc2ktPmJyaWRnZSk7CisJc2Ftc3VuZ19k c2ltX2JyaWRnZV9kaXNhYmxlKCZkc2ktPmJyaWRnZSk7CiAJZHJtX2VuY29kZXJfY2xlYW51cCgm ZHNpLT5lbmNvZGVyKTsKIAltaXBpX2RzaV9ob3N0X3VucmVnaXN0ZXIoJmRzaS0+ZHNpX2hvc3Qp OwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgZXh5bm9zX2RzaV9jb21w b25lbnRfb3BzID0gewotCS5iaW5kCT0gZXh5bm9zX2RzaV9iaW5kLAotCS51bmJpbmQJPSBleHlu b3NfZHNpX3VuYmluZCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X29wcyBzYW1zdW5n X2RzaW1fY29tcG9uZW50X29wcyA9IHsKKwkuYmluZAk9IHNhbXN1bmdfZHNpbV9iaW5kLAorCS51 bmJpbmQJPSBzYW1zdW5nX2RzaW1fdW5iaW5kLAogfTsKIAotc3RhdGljIGludCBleHlub3NfZHNp X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IHNhbXN1bmdf ZHNpbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZp Y2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IHJlc291cmNlICpyZXM7Ci0Jc3RydWN0IGV4 eW5vc19kc2kgKmRzaTsKKwlzdHJ1Y3Qgc2Ftc3VuZ19kc2ltICpkc2k7CiAJaW50IHJldCwgaTsK IAogCWRzaSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZHNpKSwgR0ZQX0tFUk5FTCk7CkBA IC0xNjgzLDcgKzE2ODcsNyBAQCBzdGF0aWMgaW50IGV4eW5vc19kc2lfcHJvYmUoc3RydWN0IHBs YXRmb3JtX2RldmljZSAqcGRldikKIAlzcGluX2xvY2tfaW5pdCgmZHNpLT50cmFuc2Zlcl9sb2Nr KTsKIAlJTklUX0xJU1RfSEVBRCgmZHNpLT50cmFuc2Zlcl9saXN0KTsKIAotCWRzaS0+ZHNpX2hv c3Qub3BzID0gJmV4eW5vc19kc2lfb3BzOworCWRzaS0+ZHNpX2hvc3Qub3BzID0gJnNhbXN1bmdf ZHNpbV9vcHM7CiAJZHNpLT5kc2lfaG9zdC5kZXYgPSBkZXY7CiAKIAlkc2ktPmRldiA9IGRldjsK QEAgLTE3MzQsNyArMTczOCw3IEBAIHN0YXRpYyBpbnQgZXh5bm9zX2RzaV9wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQogCQlyZXR1cm4gZHNpLT5pcnE7CiAKIAlyZXQgPSBkZXZt X3JlcXVlc3RfdGhyZWFkZWRfaXJxKGRldiwgZHNpLT5pcnEsIE5VTEwsCi0JCQkJCWV4eW5vc19k c2lfaXJxLAorCQkJCQlzYW1zdW5nX2RzaW1faXJxLAogCQkJCQlJUlFGX09ORVNIT1QgfCBJUlFG X05PX0FVVE9FTiwKIAkJCQkJZGV2X25hbWUoZGV2KSwgZHNpKTsKIAlpZiAocmV0KSB7CkBAIC0x NzQyLDcgKzE3NDYsNyBAQCBzdGF0aWMgaW50IGV4eW5vc19kc2lfcHJvYmUoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldikKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBleHlub3NfZHNp X3BhcnNlX2R0KGRzaSk7CisJcmV0ID0gc2Ftc3VuZ19kc2ltX3BhcnNlX2R0KGRzaSk7CiAJaWYg KHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTc1OSwxNCArMTc2MywxNCBAQCBzdGF0aWMgaW50 IGV4eW5vc19kc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAogCXBtX3J1 bnRpbWVfZW5hYmxlKGRldik7CiAKLQlkc2ktPmJyaWRnZS5mdW5jcyA9ICZleHlub3NfZHNpX2Jy aWRnZV9mdW5jczsKKwlkc2ktPmJyaWRnZS5mdW5jcyA9ICZzYW1zdW5nX2RzaW1fYnJpZGdlX2Z1 bmNzOwogCWRzaS0+YnJpZGdlLm9mX25vZGUgPSBkZXYtPm9mX25vZGU7CiAJZHNpLT5icmlkZ2Uu dHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9EU0k7CiAKIAlkcm1fYnJpZGdlX2FkZCgmZHNpLT5i cmlkZ2UpOwogCiAJaWYgKGRzaS0+ZHJpdmVyX2RhdGEtPmV4eW5vc19zcGVjaWZpYykgewotCQly ZXQgPSBjb21wb25lbnRfYWRkKGRldiwgJmV4eW5vc19kc2lfY29tcG9uZW50X29wcyk7CisJCXJl dCA9IGNvbXBvbmVudF9hZGQoZGV2LCAmc2Ftc3VuZ19kc2ltX2NvbXBvbmVudF9vcHMpOwogCQlp ZiAocmV0KQogCQkJZ290byBlcnJfZGlzYWJsZV9ydW50aW1lOwogCX0KQEAgLTE3NzksMjQgKzE3 ODMsMjQgQEAgc3RhdGljIGludCBleHlub3NfZHNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXYpCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBleHlub3NfZHNpX3JlbW92 ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBzYW1zdW5nX2RzaW1f cmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGV4eW5vc19k c2kgKmRzaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzYW1zdW5nX2Rz aW0gKmRzaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJZHJtX2JyaWRnZV9yZW1v dmUoJmRzaS0+YnJpZGdlKTsKIAogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAog CWlmIChkc2ktPmRyaXZlcl9kYXRhLT5leHlub3Nfc3BlY2lmaWMpCi0JCWNvbXBvbmVudF9kZWwo JnBkZXYtPmRldiwgJmV4eW5vc19kc2lfY29tcG9uZW50X29wcyk7CisJCWNvbXBvbmVudF9kZWwo JnBkZXYtPmRldiwgJnNhbXN1bmdfZHNpbV9jb21wb25lbnRfb3BzKTsKIAogCXJldHVybiAwOwog fQogCi1zdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGV4eW5vc19kc2lfc3VzcGVuZChzdHJ1Y3Qg ZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHNhbXN1bmdfZHNpbV9zdXNw ZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpID0gZGV2 X2dldF9kcnZkYXRhKGRldik7Ci0JY29uc3Qgc3RydWN0IGV4eW5vc19kc2lfZHJpdmVyX2RhdGEg KmRyaXZlcl9kYXRhID0gZHNpLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3Qgc2Ftc3VuZ19kc2ltICpk c2kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19kc2ltX2Ry aXZlcl9kYXRhICpkcml2ZXJfZGF0YSA9IGRzaS0+ZHJpdmVyX2RhdGE7CiAJaW50IHJldCwgaTsK IAogCXVzbGVlcF9yYW5nZSgxMDAwMCwgMjAwMDApOwpAQCAtMTgwNCw5ICsxODA4LDkgQEAgc3Rh dGljIGludCBfX21heWJlX3VudXNlZCBleHlub3NfZHNpX3N1c3BlbmQoc3RydWN0IGRldmljZSAq ZGV2KQogCWlmIChkc2ktPnN0YXRlICYgRFNJTV9TVEFURV9JTklUSUFMSVpFRCkgewogCQlkc2kt PnN0YXRlICY9IH5EU0lNX1NUQVRFX0lOSVRJQUxJWkVEOwogCi0JCWV4eW5vc19kc2lfZGlzYWJs ZV9jbG9jayhkc2kpOworCQlzYW1zdW5nX2RzaW1fZGlzYWJsZV9jbG9jayhkc2kpOwogCi0JCWV4 eW5vc19kc2lfZGlzYWJsZV9pcnEoZHNpKTsKKwkJc2Ftc3VuZ19kc2ltX2Rpc2FibGVfaXJxKGRz aSk7CiAJfQogCiAJZHNpLT5zdGF0ZSAmPSB+RFNJTV9TVEFURV9DTURfTFBNOwpAQCAtMTgyMywx MCArMTgyNywxMCBAQCBzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGV4eW5vc19kc2lfc3VzcGVu ZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19tYXli ZV91bnVzZWQgZXh5bm9zX2RzaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGlu dCBfX21heWJlX3VudXNlZCBzYW1zdW5nX2RzaW1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikK IHsKLQlzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JY29u c3Qgc3RydWN0IGV4eW5vc19kc2lfZHJpdmVyX2RhdGEgKmRyaXZlcl9kYXRhID0gZHNpLT5kcml2 ZXJfZGF0YTsKKwlzdHJ1Y3Qgc2Ftc3VuZ19kc2ltICpkc2kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2 KTsKKwljb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19kc2ltX2RyaXZlcl9kYXRhICpkcml2ZXJfZGF0YSA9 IGRzaS0+ZHJpdmVyX2RhdGE7CiAJaW50IHJldCwgaTsKIAogCXJldCA9IHJlZ3VsYXRvcl9idWxr X2VuYWJsZShBUlJBWV9TSVpFKGRzaS0+c3VwcGxpZXMpLCBkc2ktPnN1cHBsaWVzKTsKQEAgLTE4 NTcsMjQgKzE4NjEsMjUgQEAgc3RhdGljIGludCBfX21heWJlX3VudXNlZCBleHlub3NfZHNpX3Jl c3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGNvbnN0 IHN0cnVjdCBkZXZfcG1fb3BzIGV4eW5vc19kc2lfcG1fb3BzID0gewotCVNFVF9SVU5USU1FX1BN X09QUyhleHlub3NfZHNpX3N1c3BlbmQsIGV4eW5vc19kc2lfcmVzdW1lLCBOVUxMKQorc3RhdGlj IGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNhbXN1bmdfZHNpbV9wbV9vcHMgPSB7CisJU0VUX1JV TlRJTUVfUE1fT1BTKHNhbXN1bmdfZHNpbV9zdXNwZW5kLCBzYW1zdW5nX2RzaW1fcmVzdW1lLCBO VUxMKQogCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBtX3J1bnRpbWVfZm9yY2Vfc3VzcGVuZCwK IAkJCQlwbV9ydW50aW1lX2ZvcmNlX3Jlc3VtZSkKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kcml2 ZXIgZHNpX2RyaXZlciA9IHsKLQkucHJvYmUgPSBleHlub3NfZHNpX3Byb2JlLAotCS5yZW1vdmUg PSBleHlub3NfZHNpX3JlbW92ZSwKKwkucHJvYmUgPSBzYW1zdW5nX2RzaW1fcHJvYmUsCisJLnJl bW92ZSA9IHNhbXN1bmdfZHNpbV9yZW1vdmUsCiAJLmRyaXZlciA9IHsKLQkJICAgLm5hbWUgPSAi ZXh5bm9zLWRzaSIsCisJCSAgIC5uYW1lID0gInNhbXN1bmctZHNpbSIsCiAJCSAgIC5vd25lciA9 IFRISVNfTU9EVUxFLAotCQkgICAucG0gPSAmZXh5bm9zX2RzaV9wbV9vcHMsCi0JCSAgIC5vZl9t YXRjaF90YWJsZSA9IGV4eW5vc19kc2lfb2ZfbWF0Y2gsCisJCSAgIC5wbSA9ICZzYW1zdW5nX2Rz aW1fcG1fb3BzLAorCQkgICAub2ZfbWF0Y2hfdGFibGUgPSBzYW1zdW5nX2RzaW1fb2ZfbWF0Y2gs CiAJfSwKIH07CiAKIE1PRFVMRV9BVVRIT1IoIlRvbWFzeiBGaWdhIDx0LmZpZ2FAc2Ftc3VuZy5j b20+Iik7CiBNT0RVTEVfQVVUSE9SKCJBbmRyemVqIEhhamRhIDxhLmhhamRhQHNhbXN1bmcuY29t PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIFNvQyBNSVBJIERTSSBNYXN0ZXIiKTsK K01PRFVMRV9BVVRIT1IoIkphZ2FuIFRla2kgPGphZ2FuQGFtYXJ1bGFzb2x1dGlvbnMuY29tPiIp OworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIE1JUEkgRFNJTSBicmlkZ2UiKTsKIE1PRFVM RV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3Mv S2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvS2NvbmZpZwppbmRleCA2YTI1MWUzYWE3 NzkuLjZiY2QwZmUwM2M3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9LY29u ZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvS2NvbmZpZwpAQCAtNTMsMTUgKzUzLDYg QEAgY29uZmlnIERSTV9FWFlOT1NfRFBJCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQg Zm9yIEV4eW5vcyBwYXJhbGxlbCBvdXRwdXQuCiAKLWNvbmZpZyBEUk1fRVhZTk9TX0RTSQotCWJv b2wgIk1JUEktRFNJIGhvc3QiCi0JZGVwZW5kcyBvbiBEUk1fRVhZTk9TX0ZJTUQgfHwgRFJNX0VY WU5PUzU0MzNfREVDT04gfHwgRFJNX0VYWU5PUzdfREVDT04KLQlzZWxlY3QgRFJNX01JUElfRFNJ Ci0Jc2VsZWN0IERSTV9QQU5FTAotCWRlZmF1bHQgbgotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBz dXBwb3J0IGZvciBFeHlub3MgTUlQSS1EU0kgZGV2aWNlLgotCiBjb25maWcgRFJNX0VYWU5PU19E UAogCWJvb2wgIkV4eW5vcyBzcGVjaWZpYyBleHRlbnNpb25zIGZvciBBbmFsb2dpeCBEUCBkcml2 ZXIiCiAJZGVwZW5kcyBvbiBEUk1fRVhZTk9TX0ZJTUQgfHwgRFJNX0VYWU5PUzdfREVDT04KZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9k cm0vZXh5bm9zL01ha2VmaWxlCmluZGV4IDJmZDJmM2VlNGZjZi4uMDQ4MzJmOTIwNTFkIDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9leHlub3MvTWFrZWZpbGUKQEAgLTExLDcgKzExLDYgQEAgZXh5bm9zZHJtLSQoQ09ORklH X0RSTV9FWFlOT1NfRklNRCkJKz0gZXh5bm9zX2RybV9maW1kLm8KIGV4eW5vc2RybS0kKENPTkZJ R19EUk1fRVhZTk9TNTQzM19ERUNPTikJKz0gZXh5bm9zNTQzM19kcm1fZGVjb24ubwogZXh5bm9z ZHJtLSQoQ09ORklHX0RSTV9FWFlOT1M3X0RFQ09OKQkrPSBleHlub3M3X2RybV9kZWNvbi5vCiBl eHlub3Nkcm0tJChDT05GSUdfRFJNX0VYWU5PU19EUEkpCSs9IGV4eW5vc19kcm1fZHBpLm8KLWV4 eW5vc2RybS0kKENPTkZJR19EUk1fRVhZTk9TX0RTSSkJKz0gZXh5bm9zX2RybV9kc2kubwogZXh5 bm9zZHJtLSQoQ09ORklHX0RSTV9FWFlOT1NfRFApCSs9IGV4eW5vc19kcC5vCiBleHlub3Nkcm0t JChDT05GSUdfRFJNX0VYWU5PU19NSVhFUikJKz0gZXh5bm9zX21peGVyLm8KIGV4eW5vc2RybS0k KENPTkZJR19EUk1fRVhZTk9TX0hETUkpCSs9IGV4eW5vc19oZG1pLm8KLS0gCjIuMjUuMQoKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1r ZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpo dHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJu ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-21.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7DA8FC07E96 for ; Sun, 4 Jul 2021 09:04:55 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 50D3960241 for ; Sun, 4 Jul 2021 09:04:55 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 50D3960241 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=amarulasolutions.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id CFD0E89D66; Sun, 4 Jul 2021 09:04:54 +0000 (UTC) Received: from mail-pj1-x1035.google.com (mail-pj1-x1035.google.com [IPv6:2607:f8b0:4864:20::1035]) by gabe.freedesktop.org (Postfix) with ESMTPS id D14EA89D5E for ; Sun, 4 Jul 2021 09:04:53 +0000 (UTC) Received: by mail-pj1-x1035.google.com with SMTP id kt19so9579126pjb.2 for ; Sun, 04 Jul 2021 02:04:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=x8DbojDoEb5uY2A25IR0p63F/P/5IlsfDnb3J5qKSYc=; b=rEorpVedLG1oQSRSSrGYnCBfnLDbabcwXssx1B6hMLIqKt69o4ff788l87rMdxf/pp pwDtiBvQJtdNdVn/k8VG9HVHce/GFm8U/2ylCENloi5gRCYHqPLAN42Ji5H/paBAAaMr LXScI9ZNQLzeSwjkN8Sxf64eJQtK5noK3fuu0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=x8DbojDoEb5uY2A25IR0p63F/P/5IlsfDnb3J5qKSYc=; b=m7kf26/OjYjRAGFBTuEpekoE1Ii1jgL+zP6suowPeAL9NulshbOqdqOGTjQkAWWI6H nZRWMvPhNbKIH7FnnDk1S6nrGKP5+Zz1S2LgnHNYMAO6ut7Oyr7+X34ELHGqrPGZY6Fg tHq2JlAmiMVr+J1Y5nd/wAZzS+r590pul/cLUDzCS15jqWFxWBqLJVD6jGr2XzE0bh6d 4QQJZ8kMOZaAbxjGuar7TWXNB1QXpD+gCBtjcvFqJL+g6B1RL72T0TNekwWkjR6oAUiu kiIj/ujRDiKZnqtBfcNbT+EobqmFUwIiFs8P4DCRJPjsQ2eEeBM5X2/XPtFMI+qeMo8+ 1rHA== X-Gm-Message-State: AOAM531IfOE8j5pX6dquwrmUUNR3Q2N/DGYbXFjb7LH/UZjn488+1lEt W0sbx+Od1sCBCZzONMLNigwv8A== X-Google-Smtp-Source: ABdhPJzYYBARwzR5yMlFsILzXaBPaBOK0zUuORaq+uVPg1s53a5rVb2Ko/Qi+cQQksrJdZ+L3SbLmA== X-Received: by 2002:a17:90a:1d43:: with SMTP id u3mr8833730pju.121.1625389493174; Sun, 04 Jul 2021 02:04:53 -0700 (PDT) Received: from localhost.localdomain ([2405:201:c00a:a884:1ae9:772f:6f0f:3e24]) by smtp.gmail.com with ESMTPSA id m24sm3360793pgd.60.2021.07.04.02.04.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 04 Jul 2021 02:04:52 -0700 (PDT) From: Jagan Teki To: Inki Dae , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Frieder Schrempf , Daniel Vetter , Marek Vasut , Krzysztof Kozlowski , Fabio Estevam Subject: [RFC PATCH 07/17] drm: bridge: Move exynos_drm_dsi into bridges Date: Sun, 4 Jul 2021 14:32:20 +0530 Message-Id: <20210704090230.26489-8-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210704090230.26489-1-jagan@amarulasolutions.com> References: <20210704090230.26489-1-jagan@amarulasolutions.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, linux-samsung-soc@vger.kernel.org, dri-devel@lists.freedesktop.org, NXP Linux Team , linux-amarula , linux-arm-kernel@lists.infradead.org, Jagan Teki Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" The MIPI DSI IP used in Exynos and i.MX8MM are based Samsung MIPI DSIM bridge.     In order to access the common bridge between platforms the ideal way to push the driver into the bridge area.     So, this patch will move the exynos_drm_dsi.c driver into samsung-dsim.c and do the necessary function name changes.     This would help to improve the bridge driver in future patches in order to make use of different SoC families and platforms. The bridge now support two implementations, A. With component_ops and exynos specific code exclusively for exynos dsi drivers and it's legacy bindings. B. Without componenet_ops for newly implemented bridges and its users like i.MX8MM. The future plan is to fix the implementation A) by dropping component_ops and fixing exynos specific code in order to make the bridge more mature to use. Updated MAINTAINERS file for this bridge with exynos drm maintainers along with Andrzej as he is the original author. Tomasz Figa has been not included in MAINTAINERS as he is not available via samsung.com. Signed-off-by: Jagan Teki --- MAINTAINERS | 11 + drivers/gpu/drm/bridge/Kconfig | 15 + drivers/gpu/drm/bridge/Makefile | 1 + .../samsung-dsim.c} | 433 +++++++++--------- drivers/gpu/drm/exynos/Kconfig | 9 - drivers/gpu/drm/exynos/Makefile | 1 - 6 files changed, 246 insertions(+), 224 deletions(-) rename drivers/gpu/drm/{exynos/exynos_drm_dsi.c => bridge/samsung-dsim.c} (77%) diff --git a/MAINTAINERS b/MAINTAINERS index cae0c6148590..733c2ebc0393 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -5864,6 +5864,17 @@ T: git git://anongit.freedesktop.org/drm/drm-misc F: Documentation/devicetree/bindings/display/panel/samsung,lms397kf04.yaml F: drivers/gpu/drm/panel/panel-samsung-db7430.c +DRM DRIVER FOR SAMSUNG MIPI DSIM BRIDGE +M: Inki Dae +M: Joonyoung Shim +M: Seung-Woo Kim +M: Kyungmin Park +M: Andrzej Hajda +M: Jagan Teki +S: Maintained +T: git git://anongit.freedesktop.org/drm/drm-misc +F: drivers/gpu/drm/bridge/samsung-dsim.c + DRM DRIVER FOR SITRONIX ST7703 PANELS M: Guido Günther R: Purism Kernel Team diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index 4de6dbb8821b..c8a3b13f730b 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -190,6 +190,21 @@ config DRM_PARADE_PS8640 The PS8640 is a high-performance and low-power MIPI DSI to eDP converter +config DRM_SAMSUNG_DSIM + tristate "Samsung MIPI DSIM bridge driver" + depends on DRM + depends on COMMON_CLK + depends on OF && HAS_IOMEM + depends on DRM_EXYNOS_FIMD || DRM_EXYNOS5433_DECON || DRM_EXYNOS7_DECON + select DRM_KMS_HELPER + select DRM_MIPI_DSI + select DRM_PANEL_BRIDGE + select REGMAP_MMIO + help + This enables the Samsung MIPI DSIM bridge controller driver. + This MIPI DSIM bridge can be found it on Exynos and NXP's + i.MX8M Mini and Nano SoC's. + config DRM_SIL_SII8620 tristate "Silicon Image SII8620 HDMI/MHL bridge" depends on OF diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile index ec2b9fa2699e..1eb04e4857e5 100644 --- a/drivers/gpu/drm/bridge/Makefile +++ b/drivers/gpu/drm/bridge/Makefile @@ -12,6 +12,7 @@ obj-$(CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW) += megachips-stdpxxxx-ge-b850v obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o obj-$(CONFIG_DRM_PARADE_PS8622) += parade-ps8622.o obj-$(CONFIG_DRM_PARADE_PS8640) += parade-ps8640.o +obj-$(CONFIG_DRM_SAMSUNG_DSIM) += samsung-dsim.o obj-$(CONFIG_DRM_SIL_SII8620) += sil-sii8620.o obj-$(CONFIG_DRM_SII902X) += sii902x.o obj-$(CONFIG_DRM_SII9234) += sii9234.o diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/bridge/samsung-dsim.c similarity index 77% rename from drivers/gpu/drm/exynos/exynos_drm_dsi.c rename to drivers/gpu/drm/bridge/samsung-dsim.c index 53d878d4d2d7..eed6b3ffdea7 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c +++ b/drivers/gpu/drm/bridge/samsung-dsim.c @@ -1,11 +1,15 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Samsung SoC MIPI DSI Master driver. + * Samsung MIPI DSIM bridge driver. * + * Copyright (C) 2021 Amarula Solutions(India) * Copyright (c) 2014 Samsung Electronics Co., Ltd * - * Contacts: Tomasz Figa -*/ + * TODO: + * - Move or handle exynos specifics in exynos drm drivers stack. + * - Try to drop component_ops, but it indeed require to change + * exynos drm drivers stack. + */ #include #include @@ -33,8 +37,8 @@ #include #include -#include "exynos_drm_crtc.h" -#include "exynos_drm_drv.h" +#include "../exynos/exynos_drm_crtc.h" +#include "../exynos/exynos_drm_drv.h" /* returns true iff both arguments logically differs */ #define NEQV(a, b) (!(a) ^ !(b)) @@ -217,12 +221,12 @@ static const char *const clk_names[5] = { "bus_clk", "sclk_mipi", "phyclk_mipidphy0_bitclkdiv8", "phyclk_mipidphy0_rxclkesc0", "sclk_rgb_vclk_to_dsim0" }; -enum exynos_dsi_transfer_type { +enum samsung_dsim_transfer_type { EXYNOS_DSI_TX, EXYNOS_DSI_RX, }; -struct exynos_dsi_transfer { +struct samsung_dsim_transfer { struct list_head list; struct completion completed; int result; @@ -240,7 +244,7 @@ struct exynos_dsi_transfer { #define DSIM_STATE_CMD_LPM BIT(2) #define DSIM_STATE_VIDOUT_AVAILABLE BIT(3) -struct exynos_dsi_driver_data { +struct samsung_dsim_driver_data { const unsigned int *reg_ofs; unsigned int plltmr_reg; unsigned int has_freqband:1; @@ -253,7 +257,7 @@ struct exynos_dsi_driver_data { bool exynos_specific; }; -struct exynos_dsi { +struct samsung_dsim { struct drm_encoder encoder; struct mipi_dsi_host dsi_host; struct drm_bridge bridge; @@ -283,14 +287,14 @@ struct exynos_dsi { spinlock_t transfer_lock; /* protects transfer_list */ struct list_head transfer_list; - const struct exynos_dsi_driver_data *driver_data; + const struct samsung_dsim_driver_data *driver_data; }; -#define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host) +#define host_to_dsi(host) container_of(host, struct samsung_dsim, dsi_host) -static inline struct exynos_dsi *bridge_to_dsi(struct drm_bridge *b) +static inline struct samsung_dsim *bridge_to_dsi(struct drm_bridge *b) { - return container_of(b, struct exynos_dsi, bridge); + return container_of(b, struct samsung_dsim, bridge); } enum reg_idx { @@ -318,14 +322,14 @@ enum reg_idx { NUM_REGS }; -static inline void exynos_dsi_write(struct exynos_dsi *dsi, enum reg_idx idx, - u32 val) +static inline void samsung_dsim_write(struct samsung_dsim *dsi, enum reg_idx idx, + u32 val) { writel(val, dsi->reg_base + dsi->driver_data->reg_ofs[idx]); } -static inline u32 exynos_dsi_read(struct exynos_dsi *dsi, enum reg_idx idx) +static inline u32 samsung_dsim_read(struct samsung_dsim *dsi, enum reg_idx idx) { return readl(dsi->reg_base + dsi->driver_data->reg_ofs[idx]); } @@ -450,7 +454,7 @@ static const unsigned int exynos5433_reg_values[] = { [PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0c), }; -static const struct exynos_dsi_driver_data exynos3_dsi_driver_data = { +static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = { .reg_ofs = exynos_reg_ofs, .plltmr_reg = 0x50, .has_freqband = 1, @@ -463,7 +467,7 @@ static const struct exynos_dsi_driver_data exynos3_dsi_driver_data = { .exynos_specific = true, }; -static const struct exynos_dsi_driver_data exynos4_dsi_driver_data = { +static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = { .reg_ofs = exynos_reg_ofs, .plltmr_reg = 0x50, .has_freqband = 1, @@ -476,7 +480,7 @@ static const struct exynos_dsi_driver_data exynos4_dsi_driver_data = { .exynos_specific = true, }; -static const struct exynos_dsi_driver_data exynos5_dsi_driver_data = { +static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = { .reg_ofs = exynos_reg_ofs, .plltmr_reg = 0x58, .num_clks = 2, @@ -487,7 +491,7 @@ static const struct exynos_dsi_driver_data exynos5_dsi_driver_data = { .exynos_specific = true, }; -static const struct exynos_dsi_driver_data exynos5433_dsi_driver_data = { +static const struct samsung_dsim_driver_data exynos5433_dsi_driver_data = { .reg_ofs = exynos5433_reg_ofs, .plltmr_reg = 0xa0, .has_clklane_stop = 1, @@ -499,7 +503,7 @@ static const struct exynos_dsi_driver_data exynos5433_dsi_driver_data = { .exynos_specific = true, }; -static const struct exynos_dsi_driver_data exynos5422_dsi_driver_data = { +static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = { .reg_ofs = exynos5433_reg_ofs, .plltmr_reg = 0xa0, .has_clklane_stop = 1, @@ -511,7 +515,7 @@ static const struct exynos_dsi_driver_data exynos5422_dsi_driver_data = { .exynos_specific = true, }; -static const struct of_device_id exynos_dsi_of_match[] = { +static const struct of_device_id samsung_dsim_of_match[] = { { .compatible = "samsung,exynos3250-mipi-dsi", .data = &exynos3_dsi_driver_data }, { .compatible = "samsung,exynos4210-mipi-dsi", @@ -525,7 +529,7 @@ static const struct of_device_id exynos_dsi_of_match[] = { { } }; -static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi) +static void samsung_dsim_wait_for_reset(struct samsung_dsim *dsi) { if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300))) return; @@ -533,22 +537,22 @@ static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi) dev_err(dsi->dev, "timeout waiting for reset\n"); } -static void exynos_dsi_reset(struct exynos_dsi *dsi) +static void samsung_dsim_reset(struct samsung_dsim *dsi) { u32 reset_val = dsi->driver_data->reg_values[RESET_TYPE]; reinit_completion(&dsi->completed); - exynos_dsi_write(dsi, DSIM_SWRST_REG, reset_val); + samsung_dsim_write(dsi, DSIM_SWRST_REG, reset_val); } #ifndef MHZ #define MHZ (1000*1000) #endif -static unsigned long exynos_dsi_pll_find_pms(struct exynos_dsi *dsi, +static unsigned long samsung_dsim_pll_find_pms(struct samsung_dsim *dsi, unsigned long fin, unsigned long fout, u8 *p, u16 *m, u8 *s) { - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; unsigned long best_freq = 0; u32 min_delta = 0xffffffff; u8 p_min, p_max; @@ -599,10 +603,10 @@ static unsigned long exynos_dsi_pll_find_pms(struct exynos_dsi *dsi, return best_freq; } -static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi, - unsigned long freq) +static unsigned long samsung_dsim_set_pll(struct samsung_dsim *dsi, + unsigned long freq) { - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; unsigned long fin, fout; int timeout; u8 p, s; @@ -610,7 +614,7 @@ static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi, u32 reg; fin = dsi->pll_clk_rate; - fout = exynos_dsi_pll_find_pms(dsi, fin, freq, &p, &m, &s); + fout = samsung_dsim_pll_find_pms(dsi, fin, freq, &p, &m, &s); if (!fout) { dev_err(dsi->dev, "failed to find PLL PMS for requested frequency\n"); @@ -641,7 +645,7 @@ static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi, reg |= DSIM_FREQ_BAND(band); } - exynos_dsi_write(dsi, DSIM_PLLCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_PLLCTRL_REG, reg); timeout = 1000; do { @@ -649,19 +653,19 @@ static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi, dev_err(dsi->dev, "PLL failed to stabilize\n"); return 0; } - reg = exynos_dsi_read(dsi, DSIM_STATUS_REG); + reg = samsung_dsim_read(dsi, DSIM_STATUS_REG); } while ((reg & DSIM_PLL_STABLE) == 0); return fout; } -static int exynos_dsi_enable_clock(struct exynos_dsi *dsi) +static int samsung_dsim_enable_clock(struct samsung_dsim *dsi) { unsigned long hs_clk, byte_clk, esc_clk; unsigned long esc_div; u32 reg; - hs_clk = exynos_dsi_set_pll(dsi, dsi->burst_clk_rate); + hs_clk = samsung_dsim_set_pll(dsi, dsi->burst_clk_rate); if (!hs_clk) { dev_err(dsi->dev, "failed to configure DSI PLL\n"); return -EFAULT; @@ -679,7 +683,7 @@ static int exynos_dsi_enable_clock(struct exynos_dsi *dsi) dev_dbg(dsi->dev, "hs_clk = %lu, byte_clk = %lu, esc_clk = %lu\n", hs_clk, byte_clk, esc_clk); - reg = exynos_dsi_read(dsi, DSIM_CLKCTRL_REG); + reg = samsung_dsim_read(dsi, DSIM_CLKCTRL_REG); reg &= ~(DSIM_ESC_PRESCALER_MASK | DSIM_LANE_ESC_CLK_EN_CLK | DSIM_LANE_ESC_CLK_EN_DATA_MASK | DSIM_PLL_BYPASS | DSIM_BYTE_CLK_SRC_MASK); @@ -689,14 +693,14 @@ static int exynos_dsi_enable_clock(struct exynos_dsi *dsi) | DSIM_LANE_ESC_CLK_EN_DATA(BIT(dsi->lanes) - 1) | DSIM_BYTE_CLK_SRC(0) | DSIM_TX_REQUEST_HSCLK; - exynos_dsi_write(dsi, DSIM_CLKCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_CLKCTRL_REG, reg); return 0; } -static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) +static void samsung_dsim_set_phy_ctrl(struct samsung_dsim *dsi) { - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; const unsigned int *reg_values = driver_data->reg_values; u32 reg; @@ -706,7 +710,7 @@ static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) /* B D-PHY: D-PHY Master & Slave Analog Block control */ reg = reg_values[PHYCTRL_ULPS_EXIT] | reg_values[PHYCTRL_VREG_LP] | reg_values[PHYCTRL_SLEW_UP]; - exynos_dsi_write(dsi, DSIM_PHYCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_PHYCTRL_REG, reg); /* * T LPX: Transmitted length of any Low-Power state period @@ -714,7 +718,7 @@ static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) * burst */ reg = reg_values[PHYTIMING_LPX] | reg_values[PHYTIMING_HS_EXIT]; - exynos_dsi_write(dsi, DSIM_PHYTIMING_REG, reg); + samsung_dsim_write(dsi, DSIM_PHYTIMING_REG, reg); /* * T CLK-PREPARE: Time that the transmitter drives the Clock Lane LP-00 @@ -734,7 +738,7 @@ static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) reg_values[PHYTIMING_CLK_POST] | reg_values[PHYTIMING_CLK_TRAIL]; - exynos_dsi_write(dsi, DSIM_PHYTIMING1_REG, reg); + samsung_dsim_write(dsi, DSIM_PHYTIMING1_REG, reg); /* * T HS-PREPARE: Time that the transmitter drives the Data Lane LP-00 @@ -747,47 +751,47 @@ static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) */ reg = reg_values[PHYTIMING_HS_PREPARE] | reg_values[PHYTIMING_HS_ZERO] | reg_values[PHYTIMING_HS_TRAIL]; - exynos_dsi_write(dsi, DSIM_PHYTIMING2_REG, reg); + samsung_dsim_write(dsi, DSIM_PHYTIMING2_REG, reg); } -static void exynos_dsi_disable_clock(struct exynos_dsi *dsi) +static void samsung_dsim_disable_clock(struct samsung_dsim *dsi) { u32 reg; - reg = exynos_dsi_read(dsi, DSIM_CLKCTRL_REG); + reg = samsung_dsim_read(dsi, DSIM_CLKCTRL_REG); reg &= ~(DSIM_LANE_ESC_CLK_EN_CLK | DSIM_LANE_ESC_CLK_EN_DATA_MASK | DSIM_ESC_CLKEN | DSIM_BYTE_CLKEN); - exynos_dsi_write(dsi, DSIM_CLKCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_CLKCTRL_REG, reg); - reg = exynos_dsi_read(dsi, DSIM_PLLCTRL_REG); + reg = samsung_dsim_read(dsi, DSIM_PLLCTRL_REG); reg &= ~DSIM_PLL_EN; - exynos_dsi_write(dsi, DSIM_PLLCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_PLLCTRL_REG, reg); } -static void exynos_dsi_enable_lane(struct exynos_dsi *dsi, u32 lane) +static void samsung_dsim_enable_lane(struct samsung_dsim *dsi, u32 lane) { - u32 reg = exynos_dsi_read(dsi, DSIM_CONFIG_REG); + u32 reg = samsung_dsim_read(dsi, DSIM_CONFIG_REG); reg |= (DSIM_NUM_OF_DATA_LANE(dsi->lanes - 1) | DSIM_LANE_EN_CLK | DSIM_LANE_EN(lane)); - exynos_dsi_write(dsi, DSIM_CONFIG_REG, reg); + samsung_dsim_write(dsi, DSIM_CONFIG_REG, reg); } -static int exynos_dsi_init_link(struct exynos_dsi *dsi) +static int samsung_dsim_init_link(struct samsung_dsim *dsi) { - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; int timeout; u32 reg; u32 lanes_mask; /* Initialize FIFO pointers */ - reg = exynos_dsi_read(dsi, DSIM_FIFOCTRL_REG); + reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG); reg &= ~0x1f; - exynos_dsi_write(dsi, DSIM_FIFOCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_FIFOCTRL_REG, reg); usleep_range(9000, 11000); reg |= 0x1f; - exynos_dsi_write(dsi, DSIM_FIFOCTRL_REG, reg); + samsung_dsim_write(dsi, DSIM_FIFOCTRL_REG, reg); usleep_range(9000, 11000); /* DSI configuration */ @@ -856,10 +860,10 @@ static int exynos_dsi_init_link(struct exynos_dsi *dsi) dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) { reg |= DSIM_CLKLANE_STOP; } - exynos_dsi_write(dsi, DSIM_CONFIG_REG, reg); + samsung_dsim_write(dsi, DSIM_CONFIG_REG, reg); lanes_mask = BIT(dsi->lanes) - 1; - exynos_dsi_enable_lane(dsi, lanes_mask); + samsung_dsim_enable_lane(dsi, lanes_mask); /* Check clock and data lane state are stop state */ timeout = 100; @@ -869,24 +873,24 @@ static int exynos_dsi_init_link(struct exynos_dsi *dsi) return -EFAULT; } - reg = exynos_dsi_read(dsi, DSIM_STATUS_REG); + reg = samsung_dsim_read(dsi, DSIM_STATUS_REG); if ((reg & DSIM_STOP_STATE_DAT(lanes_mask)) != DSIM_STOP_STATE_DAT(lanes_mask)) continue; } while (!(reg & (DSIM_STOP_STATE_CLK | DSIM_TX_READY_HS_CLK))); - reg = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); + reg = samsung_dsim_read(dsi, DSIM_ESCMODE_REG); reg &= ~DSIM_STOP_STATE_CNT_MASK; reg |= DSIM_STOP_STATE_CNT(driver_data->reg_values[STOP_STATE_CNT]); - exynos_dsi_write(dsi, DSIM_ESCMODE_REG, reg); + samsung_dsim_write(dsi, DSIM_ESCMODE_REG, reg); reg = DSIM_BTA_TIMEOUT(0xff) | DSIM_LPDR_TIMEOUT(0xffff); - exynos_dsi_write(dsi, DSIM_TIMEOUT_REG, reg); + samsung_dsim_write(dsi, DSIM_TIMEOUT_REG, reg); return 0; } -static void exynos_dsi_set_display_mode(struct exynos_dsi *dsi) +static void samsung_dsim_set_display_mode(struct samsung_dsim *dsi) { struct drm_display_mode *m = &dsi->mode; unsigned int num_bits_resol = dsi->driver_data->num_bits_resol; @@ -896,42 +900,42 @@ static void exynos_dsi_set_display_mode(struct exynos_dsi *dsi) reg = DSIM_CMD_ALLOW(0xf) | DSIM_STABLE_VFP(m->vsync_start - m->vdisplay) | DSIM_MAIN_VBP(m->vtotal - m->vsync_end); - exynos_dsi_write(dsi, DSIM_MVPORCH_REG, reg); + samsung_dsim_write(dsi, DSIM_MVPORCH_REG, reg); reg = DSIM_MAIN_HFP(m->hsync_start - m->hdisplay) | DSIM_MAIN_HBP(m->htotal - m->hsync_end); - exynos_dsi_write(dsi, DSIM_MHPORCH_REG, reg); + samsung_dsim_write(dsi, DSIM_MHPORCH_REG, reg); reg = DSIM_MAIN_VSA(m->vsync_end - m->vsync_start) | DSIM_MAIN_HSA(m->hsync_end - m->hsync_start); - exynos_dsi_write(dsi, DSIM_MSYNC_REG, reg); + samsung_dsim_write(dsi, DSIM_MSYNC_REG, reg); } reg = DSIM_MAIN_HRESOL(m->hdisplay, num_bits_resol) | DSIM_MAIN_VRESOL(m->vdisplay, num_bits_resol); - exynos_dsi_write(dsi, DSIM_MDRESOL_REG, reg); + samsung_dsim_write(dsi, DSIM_MDRESOL_REG, reg); dev_dbg(dsi->dev, "LCD size = %dx%d\n", m->hdisplay, m->vdisplay); } -static void exynos_dsi_set_display_enable(struct exynos_dsi *dsi, bool enable) +static void samsung_dsim_set_display_enable(struct samsung_dsim *dsi, bool enable) { u32 reg; - reg = exynos_dsi_read(dsi, DSIM_MDRESOL_REG); + reg = samsung_dsim_read(dsi, DSIM_MDRESOL_REG); if (enable) reg |= DSIM_MAIN_STAND_BY; else reg &= ~DSIM_MAIN_STAND_BY; - exynos_dsi_write(dsi, DSIM_MDRESOL_REG, reg); + samsung_dsim_write(dsi, DSIM_MDRESOL_REG, reg); } -static int exynos_dsi_wait_for_hdr_fifo(struct exynos_dsi *dsi) +static int samsung_dsim_wait_for_hdr_fifo(struct samsung_dsim *dsi) { int timeout = 2000; do { - u32 reg = exynos_dsi_read(dsi, DSIM_FIFOCTRL_REG); + u32 reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG); if (!(reg & DSIM_SFR_HEADER_FULL)) return 0; @@ -943,27 +947,27 @@ static int exynos_dsi_wait_for_hdr_fifo(struct exynos_dsi *dsi) return -ETIMEDOUT; } -static void exynos_dsi_set_cmd_lpm(struct exynos_dsi *dsi, bool lpm) +static void samsung_dsim_set_cmd_lpm(struct samsung_dsim *dsi, bool lpm) { - u32 v = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); + u32 v = samsung_dsim_read(dsi, DSIM_ESCMODE_REG); if (lpm) v |= DSIM_CMD_LPDT_LP; else v &= ~DSIM_CMD_LPDT_LP; - exynos_dsi_write(dsi, DSIM_ESCMODE_REG, v); + samsung_dsim_write(dsi, DSIM_ESCMODE_REG, v); } -static void exynos_dsi_force_bta(struct exynos_dsi *dsi) +static void samsung_dsim_force_bta(struct samsung_dsim *dsi) { - u32 v = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); + u32 v = samsung_dsim_read(dsi, DSIM_ESCMODE_REG); v |= DSIM_FORCE_BTA; - exynos_dsi_write(dsi, DSIM_ESCMODE_REG, v); + samsung_dsim_write(dsi, DSIM_ESCMODE_REG, v); } -static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi, - struct exynos_dsi_transfer *xfer) +static void samsung_dsim_send_to_fifo(struct samsung_dsim *dsi, + struct samsung_dsim_transfer *xfer) { struct device *dev = dsi->dev; struct mipi_dsi_packet *pkt = &xfer->packet; @@ -983,7 +987,7 @@ static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi, /* Send payload */ while (length >= 4) { reg = get_unaligned_le32(payload); - exynos_dsi_write(dsi, DSIM_PAYLOAD_REG, reg); + samsung_dsim_write(dsi, DSIM_PAYLOAD_REG, reg); payload += 4; length -= 4; } @@ -998,7 +1002,7 @@ static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi, fallthrough; case 1: reg |= payload[0]; - exynos_dsi_write(dsi, DSIM_PAYLOAD_REG, reg); + samsung_dsim_write(dsi, DSIM_PAYLOAD_REG, reg); break; } @@ -1007,25 +1011,25 @@ static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi, return; reg = get_unaligned_le32(pkt->header); - if (exynos_dsi_wait_for_hdr_fifo(dsi)) { + if (samsung_dsim_wait_for_hdr_fifo(dsi)) { dev_err(dev, "waiting for header FIFO timed out\n"); return; } if (NEQV(xfer->flags & MIPI_DSI_MSG_USE_LPM, dsi->state & DSIM_STATE_CMD_LPM)) { - exynos_dsi_set_cmd_lpm(dsi, xfer->flags & MIPI_DSI_MSG_USE_LPM); + samsung_dsim_set_cmd_lpm(dsi, xfer->flags & MIPI_DSI_MSG_USE_LPM); dsi->state ^= DSIM_STATE_CMD_LPM; } - exynos_dsi_write(dsi, DSIM_PKTHDR_REG, reg); + samsung_dsim_write(dsi, DSIM_PKTHDR_REG, reg); if (xfer->flags & MIPI_DSI_MSG_REQ_ACK) - exynos_dsi_force_bta(dsi); + samsung_dsim_force_bta(dsi); } -static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, - struct exynos_dsi_transfer *xfer) +static void samsung_dsim_read_from_fifo(struct samsung_dsim *dsi, + struct samsung_dsim_transfer *xfer) { u8 *payload = xfer->rx_payload + xfer->rx_done; bool first = !xfer->rx_done; @@ -1034,7 +1038,7 @@ static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, u32 reg; if (first) { - reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); + reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); switch (reg & 0x3f) { case MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_2BYTE: @@ -1073,7 +1077,7 @@ static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, /* Receive payload */ while (length >= 4) { - reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); + reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); payload[0] = (reg >> 0) & 0xff; payload[1] = (reg >> 8) & 0xff; payload[2] = (reg >> 16) & 0xff; @@ -1083,7 +1087,7 @@ static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, } if (length) { - reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); + reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); switch (length) { case 3: payload[2] = (reg >> 16) & 0xff; @@ -1102,16 +1106,16 @@ static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, clear_fifo: length = DSI_RX_FIFO_SIZE / 4; do { - reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); + reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); if (reg == DSI_RX_FIFO_EMPTY) break; } while (--length); } -static void exynos_dsi_transfer_start(struct exynos_dsi *dsi) +static void samsung_dsim_transfer_start(struct samsung_dsim *dsi) { unsigned long flags; - struct exynos_dsi_transfer *xfer; + struct samsung_dsim_transfer *xfer; bool start = false; again: @@ -1123,7 +1127,7 @@ static void exynos_dsi_transfer_start(struct exynos_dsi *dsi) } xfer = list_first_entry(&dsi->transfer_list, - struct exynos_dsi_transfer, list); + struct samsung_dsim_transfer, list); spin_unlock_irqrestore(&dsi->transfer_lock, flags); @@ -1132,7 +1136,7 @@ static void exynos_dsi_transfer_start(struct exynos_dsi *dsi) /* waiting for RX */ return; - exynos_dsi_send_to_fifo(dsi, xfer); + samsung_dsim_send_to_fifo(dsi, xfer); if (xfer->packet.payload_length || xfer->rx_len) return; @@ -1151,9 +1155,9 @@ static void exynos_dsi_transfer_start(struct exynos_dsi *dsi) goto again; } -static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi) +static bool samsung_dsim_transfer_finish(struct samsung_dsim *dsi) { - struct exynos_dsi_transfer *xfer; + struct samsung_dsim_transfer *xfer; unsigned long flags; bool start = true; @@ -1165,7 +1169,7 @@ static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi) } xfer = list_first_entry(&dsi->transfer_list, - struct exynos_dsi_transfer, list); + struct samsung_dsim_transfer, list); spin_unlock_irqrestore(&dsi->transfer_lock, flags); @@ -1178,7 +1182,7 @@ static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi) return true; if (xfer->rx_done != xfer->rx_len) - exynos_dsi_read_from_fifo(dsi, xfer); + samsung_dsim_read_from_fifo(dsi, xfer); if (xfer->rx_done != xfer->rx_len) return true; @@ -1197,8 +1201,8 @@ static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi) return start; } -static void exynos_dsi_remove_transfer(struct exynos_dsi *dsi, - struct exynos_dsi_transfer *xfer) +static void samsung_dsim_remove_transfer(struct samsung_dsim *dsi, + struct samsung_dsim_transfer *xfer) { unsigned long flags; bool start; @@ -1207,12 +1211,12 @@ static void exynos_dsi_remove_transfer(struct exynos_dsi *dsi, if (!list_empty(&dsi->transfer_list) && xfer == list_first_entry(&dsi->transfer_list, - struct exynos_dsi_transfer, list)) { + struct samsung_dsim_transfer, list)) { list_del_init(&xfer->list); start = !list_empty(&dsi->transfer_list); spin_unlock_irqrestore(&dsi->transfer_lock, flags); if (start) - exynos_dsi_transfer_start(dsi); + samsung_dsim_transfer_start(dsi); return; } @@ -1221,8 +1225,8 @@ static void exynos_dsi_remove_transfer(struct exynos_dsi *dsi, spin_unlock_irqrestore(&dsi->transfer_lock, flags); } -static int exynos_dsi_transfer(struct exynos_dsi *dsi, - struct exynos_dsi_transfer *xfer) +static int samsung_dsim_transfer(struct samsung_dsim *dsi, + struct samsung_dsim_transfer *xfer) { unsigned long flags; bool stopped; @@ -1240,13 +1244,13 @@ static int exynos_dsi_transfer(struct exynos_dsi *dsi, spin_unlock_irqrestore(&dsi->transfer_lock, flags); if (stopped) - exynos_dsi_transfer_start(dsi); + samsung_dsim_transfer_start(dsi); wait_for_completion_timeout(&xfer->completed, msecs_to_jiffies(DSI_XFER_TIMEOUT_MS)); if (xfer->result == -ETIMEDOUT) { struct mipi_dsi_packet *pkt = &xfer->packet; - exynos_dsi_remove_transfer(dsi, xfer); + samsung_dsim_remove_transfer(dsi, xfer); dev_err(dsi->dev, "xfer timed out: %*ph %*ph\n", 4, pkt->header, (int)pkt->payload_length, pkt->payload); return -ETIMEDOUT; @@ -1256,25 +1260,25 @@ static int exynos_dsi_transfer(struct exynos_dsi *dsi, return xfer->result; } -static irqreturn_t exynos_dsi_irq(int irq, void *dev_id) +static irqreturn_t samsung_dsim_irq(int irq, void *dev_id) { - struct exynos_dsi *dsi = dev_id; + struct samsung_dsim *dsi = dev_id; u32 status; - status = exynos_dsi_read(dsi, DSIM_INTSRC_REG); + status = samsung_dsim_read(dsi, DSIM_INTSRC_REG); if (!status) { static unsigned long int j; if (printk_timed_ratelimit(&j, 500)) dev_warn(dsi->dev, "spurious interrupt\n"); return IRQ_HANDLED; } - exynos_dsi_write(dsi, DSIM_INTSRC_REG, status); + samsung_dsim_write(dsi, DSIM_INTSRC_REG, status); if (status & DSIM_INT_SW_RST_RELEASE) { u32 mask = ~(DSIM_INT_RX_DONE | DSIM_INT_SFR_FIFO_EMPTY | DSIM_INT_SFR_HDR_FIFO_EMPTY | DSIM_INT_RX_ECC_ERR | DSIM_INT_SW_RST_RELEASE); - exynos_dsi_write(dsi, DSIM_INTMSK_REG, mask); + samsung_dsim_write(dsi, DSIM_INTMSK_REG, mask); complete(&dsi->completed); return IRQ_HANDLED; } @@ -1283,15 +1287,15 @@ static irqreturn_t exynos_dsi_irq(int irq, void *dev_id) DSIM_INT_PLL_STABLE))) return IRQ_HANDLED; - if (exynos_dsi_transfer_finish(dsi)) - exynos_dsi_transfer_start(dsi); + if (samsung_dsim_transfer_finish(dsi)) + samsung_dsim_transfer_start(dsi); return IRQ_HANDLED; } -static irqreturn_t exynos_dsi_te_irq_handler(int irq, void *dev_id) +static irqreturn_t samsung_dsim_te_irq_handler(int irq, void *dev_id) { - struct exynos_dsi *dsi = (struct exynos_dsi *)dev_id; + struct samsung_dsim *dsi = (struct samsung_dsim *)dev_id; struct drm_encoder *encoder = &dsi->encoder; if (dsi->state & DSIM_STATE_VIDOUT_AVAILABLE) @@ -1300,7 +1304,7 @@ static irqreturn_t exynos_dsi_te_irq_handler(int irq, void *dev_id) return IRQ_HANDLED; } -static void exynos_dsi_enable_irq(struct exynos_dsi *dsi) +static void samsung_dsim_enable_irq(struct samsung_dsim *dsi) { enable_irq(dsi->irq); @@ -1308,7 +1312,7 @@ static void exynos_dsi_enable_irq(struct exynos_dsi *dsi) enable_irq(gpio_to_irq(dsi->te_gpio)); } -static void exynos_dsi_disable_irq(struct exynos_dsi *dsi) +static void samsung_dsim_disable_irq(struct samsung_dsim *dsi) { if (gpio_is_valid(dsi->te_gpio)) disable_irq(gpio_to_irq(dsi->te_gpio)); @@ -1316,27 +1320,27 @@ static void exynos_dsi_disable_irq(struct exynos_dsi *dsi) disable_irq(dsi->irq); } -static int exynos_dsi_init(struct exynos_dsi *dsi) +static int samsung_dsim_init(struct samsung_dsim *dsi) { - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; - exynos_dsi_reset(dsi); - exynos_dsi_enable_irq(dsi); + samsung_dsim_reset(dsi); + samsung_dsim_enable_irq(dsi); if (driver_data->reg_values[RESET_TYPE] == DSIM_FUNCRST) - exynos_dsi_enable_lane(dsi, BIT(dsi->lanes) - 1); + samsung_dsim_enable_lane(dsi, BIT(dsi->lanes) - 1); - exynos_dsi_enable_clock(dsi); + samsung_dsim_enable_clock(dsi); if (driver_data->wait_for_reset) - exynos_dsi_wait_for_reset(dsi); - exynos_dsi_set_phy_ctrl(dsi); - exynos_dsi_init_link(dsi); + samsung_dsim_wait_for_reset(dsi); + samsung_dsim_set_phy_ctrl(dsi); + samsung_dsim_init_link(dsi); return 0; } -static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi, - struct device *panel) +static int samsung_dsim_register_te_irq(struct samsung_dsim *dsi, + struct device *panel) { int ret; int te_gpio_irq; @@ -1359,7 +1363,7 @@ static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi, te_gpio_irq = gpio_to_irq(dsi->te_gpio); - ret = request_threaded_irq(te_gpio_irq, exynos_dsi_te_irq_handler, NULL, + ret = request_threaded_irq(te_gpio_irq, samsung_dsim_te_irq_handler, NULL, IRQF_TRIGGER_RISING | IRQF_NO_AUTOEN, "TE", dsi); if (ret) { dev_err(dsi->dev, "request interrupt failed with %d\n", ret); @@ -1371,7 +1375,7 @@ static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi, return ret; } -static void exynos_dsi_unregister_te_irq(struct exynos_dsi *dsi) +static void samsung_dsim_unregister_te_irq(struct samsung_dsim *dsi) { if (gpio_is_valid(dsi->te_gpio)) { free_irq(gpio_to_irq(dsi->te_gpio), dsi); @@ -1380,9 +1384,9 @@ static void exynos_dsi_unregister_te_irq(struct exynos_dsi *dsi) } } -static void exynos_dsi_bridge_enable(struct drm_bridge *bridge) +static void samsung_dsim_bridge_enable(struct drm_bridge *bridge) { - struct exynos_dsi *dsi = bridge_to_dsi(bridge); + struct samsung_dsim *dsi = bridge_to_dsi(bridge); int ret; if (dsi->state & DSIM_STATE_ENABLED) @@ -1396,39 +1400,39 @@ static void exynos_dsi_bridge_enable(struct drm_bridge *bridge) dsi->state |= DSIM_STATE_ENABLED; - exynos_dsi_set_display_mode(dsi); - exynos_dsi_set_display_enable(dsi, true); + samsung_dsim_set_display_mode(dsi); + samsung_dsim_set_display_enable(dsi, true); dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE; return; } -static void exynos_dsi_bridge_disable(struct drm_bridge *bridge) +static void samsung_dsim_bridge_disable(struct drm_bridge *bridge) { - struct exynos_dsi *dsi = bridge_to_dsi(bridge); + struct samsung_dsim *dsi = bridge_to_dsi(bridge); if (!(dsi->state & DSIM_STATE_ENABLED)) return; dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE; - exynos_dsi_set_display_enable(dsi, false); + samsung_dsim_set_display_enable(dsi, false); dsi->state &= ~DSIM_STATE_ENABLED; pm_runtime_put_sync(dsi->dev); } -static void exynos_dsi_bridge_mode_set(struct drm_bridge *bridge, - const struct drm_display_mode *mode, - const struct drm_display_mode *adjusted_mode) +static void samsung_dsim_bridge_mode_set(struct drm_bridge *bridge, + const struct drm_display_mode *mode, + const struct drm_display_mode *adjusted_mode) { - struct exynos_dsi *dsi = bridge_to_dsi(bridge); + struct samsung_dsim *dsi = bridge_to_dsi(bridge); drm_mode_copy(&dsi->mode, adjusted_mode); } -static int exynos_dsi_panel_or_bridge(struct exynos_dsi *dsi, - struct device_node *node) +static int samsung_dsim_panel_or_bridge(struct samsung_dsim *dsi, + struct device_node *node) { struct drm_bridge *panel_bridge; struct drm_panel *panel; @@ -1453,10 +1457,10 @@ static int exynos_dsi_panel_or_bridge(struct exynos_dsi *dsi, return 0; } -static int exynos_dsi_bridge_attach(struct drm_bridge *bridge, - enum drm_bridge_attach_flags flags) +static int samsung_dsim_bridge_attach(struct drm_bridge *bridge, + enum drm_bridge_attach_flags flags) { - struct exynos_dsi *dsi = bridge_to_dsi(bridge); + struct samsung_dsim *dsi = bridge_to_dsi(bridge); dsi->drm = bridge->dev; @@ -1464,23 +1468,23 @@ static int exynos_dsi_bridge_attach(struct drm_bridge *bridge, flags); } -static const struct drm_bridge_funcs exynos_dsi_bridge_funcs = { - .enable = exynos_dsi_bridge_enable, - .disable = exynos_dsi_bridge_disable, - .mode_set = exynos_dsi_bridge_mode_set, - .attach = exynos_dsi_bridge_attach, +static const struct drm_bridge_funcs samsung_dsim_bridge_funcs = { + .enable = samsung_dsim_bridge_enable, + .disable = samsung_dsim_bridge_disable, + .mode_set = samsung_dsim_bridge_mode_set, + .attach = samsung_dsim_bridge_attach, }; -MODULE_DEVICE_TABLE(of, exynos_dsi_of_match); +MODULE_DEVICE_TABLE(of, samsung_dsim_of_match); -static int exynos_dsi_host_attach(struct mipi_dsi_host *host, - struct mipi_dsi_device *device) +static int samsung_dsim_host_attach(struct mipi_dsi_host *host, + struct mipi_dsi_device *device) { - struct exynos_dsi *dsi = host_to_dsi(host); + struct samsung_dsim *dsi = host_to_dsi(host); struct drm_device *drm = dsi->drm; int ret; - ret = exynos_dsi_panel_or_bridge(dsi, device->dev.of_node); + ret = samsung_dsim_panel_or_bridge(dsi, device->dev.of_node); if (ret) return ret; @@ -1492,7 +1496,7 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host, */ if (dsi->driver_data->exynos_specific && !(device->mode_flags & MIPI_DSI_MODE_VIDEO)) { - int ret = exynos_dsi_register_te_irq(dsi, &device->dev); + int ret = samsung_dsim_register_te_irq(dsi, &device->dev); if (ret) return ret; } @@ -1514,33 +1518,33 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host, return 0; } -static int exynos_dsi_host_detach(struct mipi_dsi_host *host, - struct mipi_dsi_device *device) +static int samsung_dsim_host_detach(struct mipi_dsi_host *host, + struct mipi_dsi_device *device) { - struct exynos_dsi *dsi = host_to_dsi(host); + struct samsung_dsim *dsi = host_to_dsi(host); struct drm_device *drm = dsi->drm; if (drm->mode_config.poll_enabled) drm_kms_helper_hotplug_event(drm); if (dsi->driver_data->exynos_specific) - exynos_dsi_unregister_te_irq(dsi); + samsung_dsim_unregister_te_irq(dsi); return 0; } -static ssize_t exynos_dsi_host_transfer(struct mipi_dsi_host *host, - const struct mipi_dsi_msg *msg) +static ssize_t samsung_dsim_host_transfer(struct mipi_dsi_host *host, + const struct mipi_dsi_msg *msg) { - struct exynos_dsi *dsi = host_to_dsi(host); - struct exynos_dsi_transfer xfer; + struct samsung_dsim *dsi = host_to_dsi(host); + struct samsung_dsim_transfer xfer; int ret; if (!(dsi->state & DSIM_STATE_ENABLED)) return -EINVAL; if (!(dsi->state & DSIM_STATE_INITIALIZED)) { - ret = exynos_dsi_init(dsi); + ret = samsung_dsim_init(dsi); if (ret) return ret; dsi->state |= DSIM_STATE_INITIALIZED; @@ -1554,18 +1558,18 @@ static ssize_t exynos_dsi_host_transfer(struct mipi_dsi_host *host, xfer.rx_payload = msg->rx_buf; xfer.flags = msg->flags; - ret = exynos_dsi_transfer(dsi, &xfer); + ret = samsung_dsim_transfer(dsi, &xfer); return (ret < 0) ? ret : xfer.rx_done; } -static const struct mipi_dsi_host_ops exynos_dsi_ops = { - .attach = exynos_dsi_host_attach, - .detach = exynos_dsi_host_detach, - .transfer = exynos_dsi_host_transfer, +static const struct mipi_dsi_host_ops samsung_dsim_ops = { + .attach = samsung_dsim_host_attach, + .detach = samsung_dsim_host_detach, + .transfer = samsung_dsim_host_transfer, }; -static int exynos_dsi_of_read_u32(const struct device_node *np, - const char *propname, u32 *out_value) +static int samsung_dsim_of_read_u32(const struct device_node *np, + const char *propname, u32 *out_value) { int ret = of_property_read_u32(np, propname, out_value); @@ -1580,23 +1584,23 @@ enum { DSI_PORT_OUT }; -static int exynos_dsi_parse_dt(struct exynos_dsi *dsi) +static int samsung_dsim_parse_dt(struct samsung_dsim *dsi) { struct device *dev = dsi->dev; struct device_node *node = dev->of_node; int ret; - ret = exynos_dsi_of_read_u32(node, "samsung,pll-clock-frequency", + ret = samsung_dsim_of_read_u32(node, "samsung,pll-clock-frequency", &dsi->pll_clk_rate); if (ret < 0) return ret; - ret = exynos_dsi_of_read_u32(node, "samsung,burst-clock-frequency", + ret = samsung_dsim_of_read_u32(node, "samsung,burst-clock-frequency", &dsi->burst_clk_rate); if (ret < 0) return ret; - ret = exynos_dsi_of_read_u32(node, "samsung,esc-clock-frequency", + ret = samsung_dsim_of_read_u32(node, "samsung,esc-clock-frequency", &dsi->esc_clk_rate); if (ret < 0) return ret; @@ -1604,10 +1608,10 @@ static int exynos_dsi_parse_dt(struct exynos_dsi *dsi) return 0; } -static int exynos_dsi_bind(struct device *dev, struct device *master, - void *data) +static int samsung_dsim_bind(struct device *dev, struct device *master, + void *data) { - struct exynos_dsi *dsi = dev_get_drvdata(dev); + struct samsung_dsim *dsi = dev_get_drvdata(dev); struct drm_encoder *encoder = &dsi->encoder; struct drm_device *drm_dev = data; struct device_node *in_bridge_node; @@ -1650,26 +1654,26 @@ static int exynos_dsi_bind(struct device *dev, struct device *master, return mipi_dsi_host_register(&dsi->dsi_host); } -static void exynos_dsi_unbind(struct device *dev, struct device *master, +static void samsung_dsim_unbind(struct device *dev, struct device *master, void *data) { - struct exynos_dsi *dsi = dev_get_drvdata(dev); + struct samsung_dsim *dsi = dev_get_drvdata(dev); - exynos_dsi_bridge_disable(&dsi->bridge); + samsung_dsim_bridge_disable(&dsi->bridge); drm_encoder_cleanup(&dsi->encoder); mipi_dsi_host_unregister(&dsi->dsi_host); } -static const struct component_ops exynos_dsi_component_ops = { - .bind = exynos_dsi_bind, - .unbind = exynos_dsi_unbind, +static const struct component_ops samsung_dsim_component_ops = { + .bind = samsung_dsim_bind, + .unbind = samsung_dsim_unbind, }; -static int exynos_dsi_probe(struct platform_device *pdev) +static int samsung_dsim_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct resource *res; - struct exynos_dsi *dsi; + struct samsung_dsim *dsi; int ret, i; dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); @@ -1683,7 +1687,7 @@ static int exynos_dsi_probe(struct platform_device *pdev) spin_lock_init(&dsi->transfer_lock); INIT_LIST_HEAD(&dsi->transfer_list); - dsi->dsi_host.ops = &exynos_dsi_ops; + dsi->dsi_host.ops = &samsung_dsim_ops; dsi->dsi_host.dev = dev; dsi->dev = dev; @@ -1734,7 +1738,7 @@ static int exynos_dsi_probe(struct platform_device *pdev) return dsi->irq; ret = devm_request_threaded_irq(dev, dsi->irq, NULL, - exynos_dsi_irq, + samsung_dsim_irq, IRQF_ONESHOT | IRQF_NO_AUTOEN, dev_name(dev), dsi); if (ret) { @@ -1742,7 +1746,7 @@ static int exynos_dsi_probe(struct platform_device *pdev) return ret; } - ret = exynos_dsi_parse_dt(dsi); + ret = samsung_dsim_parse_dt(dsi); if (ret) return ret; @@ -1759,14 +1763,14 @@ static int exynos_dsi_probe(struct platform_device *pdev) pm_runtime_enable(dev); - dsi->bridge.funcs = &exynos_dsi_bridge_funcs; + dsi->bridge.funcs = &samsung_dsim_bridge_funcs; dsi->bridge.of_node = dev->of_node; dsi->bridge.type = DRM_MODE_CONNECTOR_DSI; drm_bridge_add(&dsi->bridge); if (dsi->driver_data->exynos_specific) { - ret = component_add(dev, &exynos_dsi_component_ops); + ret = component_add(dev, &samsung_dsim_component_ops); if (ret) goto err_disable_runtime; } @@ -1779,24 +1783,24 @@ static int exynos_dsi_probe(struct platform_device *pdev) return ret; } -static int exynos_dsi_remove(struct platform_device *pdev) +static int samsung_dsim_remove(struct platform_device *pdev) { - struct exynos_dsi *dsi = platform_get_drvdata(pdev); + struct samsung_dsim *dsi = platform_get_drvdata(pdev); drm_bridge_remove(&dsi->bridge); pm_runtime_disable(&pdev->dev); if (dsi->driver_data->exynos_specific) - component_del(&pdev->dev, &exynos_dsi_component_ops); + component_del(&pdev->dev, &samsung_dsim_component_ops); return 0; } -static int __maybe_unused exynos_dsi_suspend(struct device *dev) +static int __maybe_unused samsung_dsim_suspend(struct device *dev) { - struct exynos_dsi *dsi = dev_get_drvdata(dev); - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + struct samsung_dsim *dsi = dev_get_drvdata(dev); + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; int ret, i; usleep_range(10000, 20000); @@ -1804,9 +1808,9 @@ static int __maybe_unused exynos_dsi_suspend(struct device *dev) if (dsi->state & DSIM_STATE_INITIALIZED) { dsi->state &= ~DSIM_STATE_INITIALIZED; - exynos_dsi_disable_clock(dsi); + samsung_dsim_disable_clock(dsi); - exynos_dsi_disable_irq(dsi); + samsung_dsim_disable_irq(dsi); } dsi->state &= ~DSIM_STATE_CMD_LPM; @@ -1823,10 +1827,10 @@ static int __maybe_unused exynos_dsi_suspend(struct device *dev) return 0; } -static int __maybe_unused exynos_dsi_resume(struct device *dev) +static int __maybe_unused samsung_dsim_resume(struct device *dev) { - struct exynos_dsi *dsi = dev_get_drvdata(dev); - const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; + struct samsung_dsim *dsi = dev_get_drvdata(dev); + const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; int ret, i; ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies); @@ -1857,24 +1861,25 @@ static int __maybe_unused exynos_dsi_resume(struct device *dev) return ret; } -static const struct dev_pm_ops exynos_dsi_pm_ops = { - SET_RUNTIME_PM_OPS(exynos_dsi_suspend, exynos_dsi_resume, NULL) +static const struct dev_pm_ops samsung_dsim_pm_ops = { + SET_RUNTIME_PM_OPS(samsung_dsim_suspend, samsung_dsim_resume, NULL) SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume) }; struct platform_driver dsi_driver = { - .probe = exynos_dsi_probe, - .remove = exynos_dsi_remove, + .probe = samsung_dsim_probe, + .remove = samsung_dsim_remove, .driver = { - .name = "exynos-dsi", + .name = "samsung-dsim", .owner = THIS_MODULE, - .pm = &exynos_dsi_pm_ops, - .of_match_table = exynos_dsi_of_match, + .pm = &samsung_dsim_pm_ops, + .of_match_table = samsung_dsim_of_match, }, }; MODULE_AUTHOR("Tomasz Figa "); MODULE_AUTHOR("Andrzej Hajda "); -MODULE_DESCRIPTION("Samsung SoC MIPI DSI Master"); +MODULE_AUTHOR("Jagan Teki "); +MODULE_DESCRIPTION("Samsung MIPI DSIM bridge"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig index 6a251e3aa779..6bcd0fe03c70 100644 --- a/drivers/gpu/drm/exynos/Kconfig +++ b/drivers/gpu/drm/exynos/Kconfig @@ -53,15 +53,6 @@ config DRM_EXYNOS_DPI help This enables support for Exynos parallel output. -config DRM_EXYNOS_DSI - bool "MIPI-DSI host" - depends on DRM_EXYNOS_FIMD || DRM_EXYNOS5433_DECON || DRM_EXYNOS7_DECON - select DRM_MIPI_DSI - select DRM_PANEL - default n - help - This enables support for Exynos MIPI-DSI device. - config DRM_EXYNOS_DP bool "Exynos specific extensions for Analogix DP driver" depends on DRM_EXYNOS_FIMD || DRM_EXYNOS7_DECON diff --git a/drivers/gpu/drm/exynos/Makefile b/drivers/gpu/drm/exynos/Makefile index 2fd2f3ee4fcf..04832f92051d 100644 --- a/drivers/gpu/drm/exynos/Makefile +++ b/drivers/gpu/drm/exynos/Makefile @@ -11,7 +11,6 @@ exynosdrm-$(CONFIG_DRM_EXYNOS_FIMD) += exynos_drm_fimd.o exynosdrm-$(CONFIG_DRM_EXYNOS5433_DECON) += exynos5433_drm_decon.o exynosdrm-$(CONFIG_DRM_EXYNOS7_DECON) += exynos7_drm_decon.o exynosdrm-$(CONFIG_DRM_EXYNOS_DPI) += exynos_drm_dpi.o -exynosdrm-$(CONFIG_DRM_EXYNOS_DSI) += exynos_drm_dsi.o exynosdrm-$(CONFIG_DRM_EXYNOS_DP) += exynos_dp.o exynosdrm-$(CONFIG_DRM_EXYNOS_MIXER) += exynos_mixer.o exynosdrm-$(CONFIG_DRM_EXYNOS_HDMI) += exynos_hdmi.o -- 2.25.1