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=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,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 7D4D3C433E6 for ; Mon, 15 Mar 2021 11:44:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5924564EB3 for ; Mon, 15 Mar 2021 11:44:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231208AbhCOLnU (ORCPT ); Mon, 15 Mar 2021 07:43:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43280 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230280AbhCOLmk (ORCPT ); Mon, 15 Mar 2021 07:42:40 -0400 Received: from mail-wm1-x333.google.com (mail-wm1-x333.google.com [IPv6:2a00:1450:4864:20::333]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 463B4C061574; Mon, 15 Mar 2021 04:42:40 -0700 (PDT) Received: by mail-wm1-x333.google.com with SMTP id f22-20020a7bc8d60000b029010c024a1407so20067907wml.2; Mon, 15 Mar 2021 04:42:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=X/b7efsHpxhtxZ6y0js2C6UC0UrjwmZFkOqtIvoImWM=; b=u+TnBu0zQSQ/AekRjpiXSc74OVIp3JnAI+8vvnbXB2Lunlw5mPoIdJkpobVPTKQQML LYnwOqPOvj+bIC2RfzwiGrsyLeWKn6suS9jGTlTae+P/2prwKU85qJbOx5zh7NuShYK3 /kMDeM21fYkXMg/kzKM0Mde/Q2tuvUvtkgUMJ6C2vf+ola+Iduy1tlOB45EyHIQt1q21 3dbdD3CS1LXXkB9if6X5QE/sw9y6xrS938h8SGqqJXv0rZTUwu9tIDgQqn1pMQ4hn6gR M2100sL1UPZR3A5+DYECue3BegCW+tnWplWQpLGoUCxzyNCu/+JinDNfeBIWWOHYxVGv TgcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=X/b7efsHpxhtxZ6y0js2C6UC0UrjwmZFkOqtIvoImWM=; b=jkyyg/6PNvZ+UTuY/mUcX81v6RHMrY7MvMTraAThuFR+lYIKfGIQ2BSC05JrLIA6W3 bQRinZXt+SftbXh73VwULwK3FXrSlSlht+RnMUXAcWSdjjf1RR9dbb4UM3d2L78S0s6f Ah9Pkd4sJezaceYTf8/zecYU9auaYPa+gX+Cq5dDDBIjJGrdNN0kxHGVa0tWVrO/cD5L oDfhqc9g6ZsX5ldnC0waIucbPztOPGT0bp5YEHVOJVn38JJfJ0KUfw9xQYNh2s7b4sRJ dUIqby2OKZH7q+mFk0houMN0TyvFE8RE3BI8X5amuabp9NgnzO6sWkPkdCZ54Gs92KiV lwxQ== X-Gm-Message-State: AOAM532PJ/cBRcu0g0Fpt4y6Xojd2100oL4n+CpJzw/Alt04UuKtMLyk 6CrvIhfc73ZX/dcGSUxMaGo= X-Google-Smtp-Source: ABdhPJz6mQYD9oESqlzsd9Rz0lnVpH02qqOSusPXwz25AWQi30lyVdW3xnpSFSwZeTDa63t+HSJ9XA== X-Received: by 2002:a05:600c:2053:: with SMTP id p19mr25642802wmg.87.1615808558912; Mon, 15 Mar 2021 04:42:38 -0700 (PDT) Received: from skynet.lan ([80.31.204.166]) by smtp.gmail.com with ESMTPSA id v189sm12648187wme.39.2021.03.15.04.42.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Mar 2021 04:42:38 -0700 (PDT) From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= To: Linus Walleij , Bartosz Golaszewski , Rob Herring , Florian Fainelli , bcm-kernel-feedback-list@broadcom.com, Lee Jones , Michael Walle , =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= , Jonas Gorski , Necip Fazil Yildiran , Andy Shevchenko , linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v7 22/22] pinctrl: add a pincontrol driver for BCM6318 Date: Mon, 15 Mar 2021 12:42:14 +0100 Message-Id: <20210315114214.3096-23-noltari@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210315114214.3096-1-noltari@gmail.com> References: <20210315114214.3096-1-noltari@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add a pincontrol driver for BCM6318. BCM6318 allows muxing most GPIOs to different functions. BCM6318 is similar to BCM6328 with the addition of a pad register, and the GPIO meaning of the mux register changes based on the GPIO number. Co-developed-by: Jonas Gorski Signed-off-by: Jonas Gorski Signed-off-by: Álvaro Fernández Rojas --- v7: no changes v6: no changes v5: add changes suggested by Andy Shevchenko v4: no changes v3: use new shared code v2: switch to GPIO_REGMAP drivers/pinctrl/bcm/Kconfig | 8 + drivers/pinctrl/bcm/Makefile | 1 + drivers/pinctrl/bcm/pinctrl-bcm6318.c | 498 ++++++++++++++++++++++++++ 3 files changed, 507 insertions(+) create mode 100644 drivers/pinctrl/bcm/pinctrl-bcm6318.c diff --git a/drivers/pinctrl/bcm/Kconfig b/drivers/pinctrl/bcm/Kconfig index 186985846120..33660e8fec05 100644 --- a/drivers/pinctrl/bcm/Kconfig +++ b/drivers/pinctrl/bcm/Kconfig @@ -36,6 +36,14 @@ config PINCTRL_BCM63XX select PINCONF select PINMUX +config PINCTRL_BCM6318 + bool "Broadcom BCM6318 GPIO driver" + depends on (BMIPS_GENERIC || COMPILE_TEST) + select PINCTRL_BCM63XX + default BMIPS_GENERIC + help + Say Y here to enable the Broadcom BCM6318 GPIO driver. + config PINCTRL_BCM6328 bool "Broadcom BCM6328 GPIO driver" depends on (BMIPS_GENERIC || COMPILE_TEST) diff --git a/drivers/pinctrl/bcm/Makefile b/drivers/pinctrl/bcm/Makefile index 4117847fd279..00c7b7775e63 100644 --- a/drivers/pinctrl/bcm/Makefile +++ b/drivers/pinctrl/bcm/Makefile @@ -4,6 +4,7 @@ obj-$(CONFIG_PINCTRL_BCM281XX) += pinctrl-bcm281xx.o obj-$(CONFIG_PINCTRL_BCM2835) += pinctrl-bcm2835.o obj-$(CONFIG_PINCTRL_BCM63XX) += pinctrl-bcm63xx.o +obj-$(CONFIG_PINCTRL_BCM6318) += pinctrl-bcm6318.o obj-$(CONFIG_PINCTRL_BCM6328) += pinctrl-bcm6328.o obj-$(CONFIG_PINCTRL_BCM6358) += pinctrl-bcm6358.o obj-$(CONFIG_PINCTRL_BCM6362) += pinctrl-bcm6362.o diff --git a/drivers/pinctrl/bcm/pinctrl-bcm6318.c b/drivers/pinctrl/bcm/pinctrl-bcm6318.c new file mode 100644 index 000000000000..77fd9b58067d --- /dev/null +++ b/drivers/pinctrl/bcm/pinctrl-bcm6318.c @@ -0,0 +1,498 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Driver for BCM6318 GPIO unit (pinctrl + GPIO) + * + * Copyright (C) 2021 Álvaro Fernández Rojas + * Copyright (C) 2016 Jonas Gorski + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "../pinctrl-utils.h" + +#include "pinctrl-bcm63xx.h" + +#define BCM6318_NUM_GPIOS 50 +#define BCM6318_NUM_MUX 48 + +#define BCM6318_MODE_REG 0x18 +#define BCM6318_MUX_REG 0x1c +#define BCM6328_MUX_MASK GENMASK(1, 0) +#define BCM6318_PAD_REG 0x54 +#define BCM6328_PAD_MASK GENMASK(3, 0) + +struct bcm6318_pingroup { + const char *name; + const unsigned * const pins; + const unsigned num_pins; +}; + +struct bcm6318_function { + const char *name; + const char * const *groups; + const unsigned num_groups; + + unsigned mode_val:1; + unsigned mux_val:2; +}; + +static const struct pinctrl_pin_desc bcm6318_pins[] = { + PINCTRL_PIN(0, "gpio0"), + PINCTRL_PIN(1, "gpio1"), + PINCTRL_PIN(2, "gpio2"), + PINCTRL_PIN(3, "gpio3"), + PINCTRL_PIN(4, "gpio4"), + PINCTRL_PIN(5, "gpio5"), + PINCTRL_PIN(6, "gpio6"), + PINCTRL_PIN(7, "gpio7"), + PINCTRL_PIN(8, "gpio8"), + PINCTRL_PIN(9, "gpio9"), + PINCTRL_PIN(10, "gpio10"), + PINCTRL_PIN(11, "gpio11"), + PINCTRL_PIN(12, "gpio12"), + PINCTRL_PIN(13, "gpio13"), + PINCTRL_PIN(14, "gpio14"), + PINCTRL_PIN(15, "gpio15"), + PINCTRL_PIN(16, "gpio16"), + PINCTRL_PIN(17, "gpio17"), + PINCTRL_PIN(18, "gpio18"), + PINCTRL_PIN(19, "gpio19"), + PINCTRL_PIN(20, "gpio20"), + PINCTRL_PIN(21, "gpio21"), + PINCTRL_PIN(22, "gpio22"), + PINCTRL_PIN(23, "gpio23"), + PINCTRL_PIN(24, "gpio24"), + PINCTRL_PIN(25, "gpio25"), + PINCTRL_PIN(26, "gpio26"), + PINCTRL_PIN(27, "gpio27"), + PINCTRL_PIN(28, "gpio28"), + PINCTRL_PIN(29, "gpio29"), + PINCTRL_PIN(30, "gpio30"), + PINCTRL_PIN(31, "gpio31"), + PINCTRL_PIN(32, "gpio32"), + PINCTRL_PIN(33, "gpio33"), + PINCTRL_PIN(34, "gpio34"), + PINCTRL_PIN(35, "gpio35"), + PINCTRL_PIN(36, "gpio36"), + PINCTRL_PIN(37, "gpio37"), + PINCTRL_PIN(38, "gpio38"), + PINCTRL_PIN(39, "gpio39"), + PINCTRL_PIN(40, "gpio40"), + PINCTRL_PIN(41, "gpio41"), + PINCTRL_PIN(42, "gpio42"), + PINCTRL_PIN(43, "gpio43"), + PINCTRL_PIN(44, "gpio44"), + PINCTRL_PIN(45, "gpio45"), + PINCTRL_PIN(46, "gpio46"), + PINCTRL_PIN(47, "gpio47"), + PINCTRL_PIN(48, "gpio48"), + PINCTRL_PIN(49, "gpio49"), +}; + +static unsigned gpio0_pins[] = { 0 }; +static unsigned gpio1_pins[] = { 1 }; +static unsigned gpio2_pins[] = { 2 }; +static unsigned gpio3_pins[] = { 3 }; +static unsigned gpio4_pins[] = { 4 }; +static unsigned gpio5_pins[] = { 5 }; +static unsigned gpio6_pins[] = { 6 }; +static unsigned gpio7_pins[] = { 7 }; +static unsigned gpio8_pins[] = { 8 }; +static unsigned gpio9_pins[] = { 9 }; +static unsigned gpio10_pins[] = { 10 }; +static unsigned gpio11_pins[] = { 11 }; +static unsigned gpio12_pins[] = { 12 }; +static unsigned gpio13_pins[] = { 13 }; +static unsigned gpio14_pins[] = { 14 }; +static unsigned gpio15_pins[] = { 15 }; +static unsigned gpio16_pins[] = { 16 }; +static unsigned gpio17_pins[] = { 17 }; +static unsigned gpio18_pins[] = { 18 }; +static unsigned gpio19_pins[] = { 19 }; +static unsigned gpio20_pins[] = { 20 }; +static unsigned gpio21_pins[] = { 21 }; +static unsigned gpio22_pins[] = { 22 }; +static unsigned gpio23_pins[] = { 23 }; +static unsigned gpio24_pins[] = { 24 }; +static unsigned gpio25_pins[] = { 25 }; +static unsigned gpio26_pins[] = { 26 }; +static unsigned gpio27_pins[] = { 27 }; +static unsigned gpio28_pins[] = { 28 }; +static unsigned gpio29_pins[] = { 29 }; +static unsigned gpio30_pins[] = { 30 }; +static unsigned gpio31_pins[] = { 31 }; +static unsigned gpio32_pins[] = { 32 }; +static unsigned gpio33_pins[] = { 33 }; +static unsigned gpio34_pins[] = { 34 }; +static unsigned gpio35_pins[] = { 35 }; +static unsigned gpio36_pins[] = { 36 }; +static unsigned gpio37_pins[] = { 37 }; +static unsigned gpio38_pins[] = { 38 }; +static unsigned gpio39_pins[] = { 39 }; +static unsigned gpio40_pins[] = { 40 }; +static unsigned gpio41_pins[] = { 41 }; +static unsigned gpio42_pins[] = { 42 }; +static unsigned gpio43_pins[] = { 43 }; +static unsigned gpio44_pins[] = { 44 }; +static unsigned gpio45_pins[] = { 45 }; +static unsigned gpio46_pins[] = { 46 }; +static unsigned gpio47_pins[] = { 47 }; +static unsigned gpio48_pins[] = { 48 }; +static unsigned gpio49_pins[] = { 49 }; + +#define BCM6318_GROUP(n) \ + { \ + .name = #n, \ + .pins = n##_pins, \ + .num_pins = ARRAY_SIZE(n##_pins), \ + } + +static struct bcm6318_pingroup bcm6318_groups[] = { + BCM6318_GROUP(gpio0), + BCM6318_GROUP(gpio1), + BCM6318_GROUP(gpio2), + BCM6318_GROUP(gpio3), + BCM6318_GROUP(gpio4), + BCM6318_GROUP(gpio5), + BCM6318_GROUP(gpio6), + BCM6318_GROUP(gpio7), + BCM6318_GROUP(gpio8), + BCM6318_GROUP(gpio9), + BCM6318_GROUP(gpio10), + BCM6318_GROUP(gpio11), + BCM6318_GROUP(gpio12), + BCM6318_GROUP(gpio13), + BCM6318_GROUP(gpio14), + BCM6318_GROUP(gpio15), + BCM6318_GROUP(gpio16), + BCM6318_GROUP(gpio17), + BCM6318_GROUP(gpio18), + BCM6318_GROUP(gpio19), + BCM6318_GROUP(gpio20), + BCM6318_GROUP(gpio21), + BCM6318_GROUP(gpio22), + BCM6318_GROUP(gpio23), + BCM6318_GROUP(gpio24), + BCM6318_GROUP(gpio25), + BCM6318_GROUP(gpio26), + BCM6318_GROUP(gpio27), + BCM6318_GROUP(gpio28), + BCM6318_GROUP(gpio29), + BCM6318_GROUP(gpio30), + BCM6318_GROUP(gpio31), + BCM6318_GROUP(gpio32), + BCM6318_GROUP(gpio33), + BCM6318_GROUP(gpio34), + BCM6318_GROUP(gpio35), + BCM6318_GROUP(gpio36), + BCM6318_GROUP(gpio37), + BCM6318_GROUP(gpio38), + BCM6318_GROUP(gpio39), + BCM6318_GROUP(gpio40), + BCM6318_GROUP(gpio41), + BCM6318_GROUP(gpio42), + BCM6318_GROUP(gpio43), + BCM6318_GROUP(gpio44), + BCM6318_GROUP(gpio45), + BCM6318_GROUP(gpio46), + BCM6318_GROUP(gpio47), + BCM6318_GROUP(gpio48), + BCM6318_GROUP(gpio49), +}; + +/* GPIO_MODE */ +static const char * const led_groups[] = { + "gpio0", + "gpio1", + "gpio2", + "gpio3", + "gpio4", + "gpio5", + "gpio6", + "gpio7", + "gpio8", + "gpio9", + "gpio10", + "gpio11", + "gpio12", + "gpio13", + "gpio14", + "gpio15", + "gpio16", + "gpio17", + "gpio18", + "gpio19", + "gpio20", + "gpio21", + "gpio22", + "gpio23", +}; + +/* PINMUX_SEL */ +static const char * const ephy0_spd_led_groups[] = { + "gpio0", +}; + +static const char * const ephy1_spd_led_groups[] = { + "gpio1", +}; + +static const char * const ephy2_spd_led_groups[] = { + "gpio2", +}; + +static const char * const ephy3_spd_led_groups[] = { + "gpio3", +}; + +static const char * const ephy0_act_led_groups[] = { + "gpio4", +}; + +static const char * const ephy1_act_led_groups[] = { + "gpio5", +}; + +static const char * const ephy2_act_led_groups[] = { + "gpio6", +}; + +static const char * const ephy3_act_led_groups[] = { + "gpio7", +}; + +static const char * const serial_led_data_groups[] = { + "gpio6", +}; + +static const char * const serial_led_clk_groups[] = { + "gpio7", +}; + +static const char * const inet_act_led_groups[] = { + "gpio8", +}; + +static const char * const inet_fail_led_groups[] = { + "gpio9", +}; + +static const char * const dsl_led_groups[] = { + "gpio10", +}; + +static const char * const post_fail_led_groups[] = { + "gpio11", +}; + +static const char * const wlan_wps_led_groups[] = { + "gpio12", +}; + +static const char * const usb_pwron_groups[] = { + "gpio13", +}; + +static const char * const usb_device_led_groups[] = { + "gpio13", +}; + +static const char * const usb_active_groups[] = { + "gpio40", +}; + +#define BCM6318_MODE_FUN(n) \ + { \ + .name = #n, \ + .groups = n##_groups, \ + .num_groups = ARRAY_SIZE(n##_groups), \ + .mode_val = 1, \ + } + +#define BCM6318_MUX_FUN(n, mux) \ + { \ + .name = #n, \ + .groups = n##_groups, \ + .num_groups = ARRAY_SIZE(n##_groups), \ + .mux_val = mux, \ + } + +static const struct bcm6318_function bcm6318_funcs[] = { + BCM6318_MODE_FUN(led), + BCM6318_MUX_FUN(ephy0_spd_led, 1), + BCM6318_MUX_FUN(ephy1_spd_led, 1), + BCM6318_MUX_FUN(ephy2_spd_led, 1), + BCM6318_MUX_FUN(ephy3_spd_led, 1), + BCM6318_MUX_FUN(ephy0_act_led, 1), + BCM6318_MUX_FUN(ephy1_act_led, 1), + BCM6318_MUX_FUN(ephy2_act_led, 1), + BCM6318_MUX_FUN(ephy3_act_led, 1), + BCM6318_MUX_FUN(serial_led_data, 3), + BCM6318_MUX_FUN(serial_led_clk, 3), + BCM6318_MUX_FUN(inet_act_led, 1), + BCM6318_MUX_FUN(inet_fail_led, 1), + BCM6318_MUX_FUN(dsl_led, 1), + BCM6318_MUX_FUN(post_fail_led, 1), + BCM6318_MUX_FUN(wlan_wps_led, 1), + BCM6318_MUX_FUN(usb_pwron, 1), + BCM6318_MUX_FUN(usb_device_led, 2), + BCM6318_MUX_FUN(usb_active, 2), +}; + +static inline unsigned int bcm6318_mux_off(unsigned int pin) +{ + return BCM6318_MUX_REG + (pin / 16) * 4; +} + +static inline unsigned int bcm6318_pad_off(unsigned int pin) +{ + return BCM6318_PAD_REG + (pin / 8) * 4; +} + +static int bcm6318_pinctrl_get_group_count(struct pinctrl_dev *pctldev) +{ + return ARRAY_SIZE(bcm6318_groups); +} + +static const char *bcm6318_pinctrl_get_group_name(struct pinctrl_dev *pctldev, + unsigned group) +{ + return bcm6318_groups[group].name; +} + +static int bcm6318_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, + unsigned group, const unsigned **pins, + unsigned *num_pins) +{ + *pins = bcm6318_groups[group].pins; + *num_pins = bcm6318_groups[group].num_pins; + + return 0; +} + +static int bcm6318_pinctrl_get_func_count(struct pinctrl_dev *pctldev) +{ + return ARRAY_SIZE(bcm6318_funcs); +} + +static const char *bcm6318_pinctrl_get_func_name(struct pinctrl_dev *pctldev, + unsigned selector) +{ + return bcm6318_funcs[selector].name; +} + +static int bcm6318_pinctrl_get_groups(struct pinctrl_dev *pctldev, + unsigned selector, + const char * const **groups, + unsigned * const num_groups) +{ + *groups = bcm6318_funcs[selector].groups; + *num_groups = bcm6318_funcs[selector].num_groups; + + return 0; +} + +static inline void bcm6318_rmw_mux(struct bcm63xx_pinctrl *pc, unsigned pin, + unsigned int mode, unsigned int mux) +{ + if (pin < BCM63XX_BANK_GPIOS) + regmap_update_bits(pc->regs, BCM6318_MODE_REG, BIT(pin), + mode ? BIT(pin) : 0); + + if (pin < BCM6318_NUM_MUX) + regmap_update_bits(pc->regs, + bcm6318_mux_off(pin), + BCM6328_MUX_MASK << ((pin % 16) * 2), + mux << ((pin % 16) * 2)); +} + +static inline void bcm6318_set_pad(struct bcm63xx_pinctrl *pc, unsigned pin, + uint8_t val) +{ + regmap_update_bits(pc->regs, bcm6318_pad_off(pin), + BCM6328_PAD_MASK << ((pin % 8) * 4), + val << ((pin % 8) * 4)); +} + +static int bcm6318_pinctrl_set_mux(struct pinctrl_dev *pctldev, + unsigned selector, unsigned group) +{ + struct bcm63xx_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev); + const struct bcm6318_pingroup *pg = &bcm6318_groups[group]; + const struct bcm6318_function *f = &bcm6318_funcs[selector]; + + bcm6318_rmw_mux(pc, pg->pins[0], f->mode_val, f->mux_val); + + return 0; +} + +static int bcm6318_gpio_request_enable(struct pinctrl_dev *pctldev, + struct pinctrl_gpio_range *range, + unsigned offset) +{ + struct bcm63xx_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev); + + /* disable all functions using this pin */ + if (offset < 13) { + /* GPIOs 0-12 use mux 0 as GPIO function */ + bcm6318_rmw_mux(pc, offset, 0, 0); + } else if (offset < 42) { + /* GPIOs 13-41 use mux 3 as GPIO function */ + bcm6318_rmw_mux(pc, offset, 0, 3); + + bcm6318_set_pad(pc, offset, 0); + } + + return 0; +} + +static struct pinctrl_ops bcm6318_pctl_ops = { + .dt_free_map = pinctrl_utils_free_map, + .dt_node_to_map = pinconf_generic_dt_node_to_map_pin, + .get_group_name = bcm6318_pinctrl_get_group_name, + .get_group_pins = bcm6318_pinctrl_get_group_pins, + .get_groups_count = bcm6318_pinctrl_get_group_count, +}; + +static struct pinmux_ops bcm6318_pmx_ops = { + .get_function_groups = bcm6318_pinctrl_get_groups, + .get_function_name = bcm6318_pinctrl_get_func_name, + .get_functions_count = bcm6318_pinctrl_get_func_count, + .gpio_request_enable = bcm6318_gpio_request_enable, + .set_mux = bcm6318_pinctrl_set_mux, + .strict = true, +}; + +static const struct bcm63xx_pinctrl_soc bcm6318_soc = { + .ngpios = BCM6318_NUM_GPIOS, + .npins = ARRAY_SIZE(bcm6318_pins), + .pctl_ops = &bcm6318_pctl_ops, + .pins = bcm6318_pins, + .pmx_ops = &bcm6318_pmx_ops, +}; + +static int bcm6318_pinctrl_probe(struct platform_device *pdev) +{ + return bcm63xx_pinctrl_probe(pdev, &bcm6318_soc, NULL); +} + +static const struct of_device_id bcm6318_pinctrl_match[] = { + { .compatible = "brcm,bcm6318-pinctrl", }, + { /* sentinel */ } +}; + +static struct platform_driver bcm6318_pinctrl_driver = { + .probe = bcm6318_pinctrl_probe, + .driver = { + .name = "bcm6318-pinctrl", + .of_match_table = bcm6318_pinctrl_match, + }, +}; + +builtin_platform_driver(bcm6318_pinctrl_driver); -- 2.20.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=-13.7 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,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 CE501C433DB for ; Mon, 15 Mar 2021 12:07:20 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (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 B67E664E27 for ; Mon, 15 Mar 2021 12:07:19 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B67E664E27 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.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=desiato.20200630; 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:To:From:Reply-To:Cc:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=+y+DAP3GT83nwPfNmVzeo7sQDvZI2ZstFU540DUEaNg=; b=khFhjxcO820lPrFxTystDxOZC V2WqdYPUMuZo1oYxLuFGWzzMVo6QJnZDVJa8s40qngp3z6RmX/JKOeWDeBFibBABEahYZy0DDnncb NR4UHH9CrXd8uyC1aX/I2mTavw49hEn9wewQ/wTP+zigi3a1ju5p0/5upvxeTVyDltrjqIZ2bPf1l 1tuXV7Ni/lFYSPr+J++loISyVtUXveA3eUDqwXH4vym3cjdI4qFNLt5vJOdPcwTlocUz+rabplc01 PmJjn0tECmG4zsxDVEAR5Pya0KrXj3vavmCiTUtVBQ2zhVEAYGAdYW0hVtfc19lMeKiMNHfcwnURW FVanIb5JA==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lLly0-00Fl7H-1i; Mon, 15 Mar 2021 12:05:00 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lLld6-00Fh14-0p for linux-arm-kernel@desiato.infradead.org; Mon, 15 Mar 2021 11:43:34 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:Content-Type: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:To:From:Sender: Reply-To:Cc:Content-ID:Content-Description; bh=X/b7efsHpxhtxZ6y0js2C6UC0UrjwmZFkOqtIvoImWM=; b=q3B5NwG8laPPBBto5yz/DGm1W/ vNxetuIaZUHeiNHVPiBbJJk9FenBY4uPS7gj0rJ8YboLiAA1t7Dc765CInDfipc1n3DYAIPQRcTlQ eYFYpEyGtP37ff2Gxqy+umgABqxZ4iXATC9Zh96Qnu9CoAgG9sokoxSfO/V2YKcuFYPRTuLAVIUQE 8TVn1N+y5FkXblMUbp9BobAPpYk01hIiS2byfEWxQN9Ugo5zowDFXeN8yBoYu7bznBN/lv3XieqkH gJdVZ4Fd/d0BDUI6sCOPtsxAU3FVFdWtZ/AWQHUjcUccjDZQHHsEw86X2NYudSQp8gKQHZ0KI/MxO fqujs4DQ==; Received: from mail-wm1-x331.google.com ([2a00:1450:4864:20::331]) by casper.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lLlcZ-0005T8-WA for linux-arm-kernel@lists.infradead.org; Mon, 15 Mar 2021 11:43:12 +0000 Received: by mail-wm1-x331.google.com with SMTP id r15-20020a05600c35cfb029010e639ca09eso20073205wmq.1 for ; Mon, 15 Mar 2021 04:42:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=X/b7efsHpxhtxZ6y0js2C6UC0UrjwmZFkOqtIvoImWM=; b=u+TnBu0zQSQ/AekRjpiXSc74OVIp3JnAI+8vvnbXB2Lunlw5mPoIdJkpobVPTKQQML LYnwOqPOvj+bIC2RfzwiGrsyLeWKn6suS9jGTlTae+P/2prwKU85qJbOx5zh7NuShYK3 /kMDeM21fYkXMg/kzKM0Mde/Q2tuvUvtkgUMJ6C2vf+ola+Iduy1tlOB45EyHIQt1q21 3dbdD3CS1LXXkB9if6X5QE/sw9y6xrS938h8SGqqJXv0rZTUwu9tIDgQqn1pMQ4hn6gR M2100sL1UPZR3A5+DYECue3BegCW+tnWplWQpLGoUCxzyNCu/+JinDNfeBIWWOHYxVGv TgcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=X/b7efsHpxhtxZ6y0js2C6UC0UrjwmZFkOqtIvoImWM=; b=rM27HfIE5DbEVbFSjv4wJZUqcfElqiutVgC07Et5AI9d9wnA/OERD6gMOniqcNxi6n awEUJoM8TSqOrZ0WhbMCoLpHnz9GN1DhfKogtn8GlXG9GX1T1++dbc8jkJJWoVBNm7Si zb8RskyAc/Zi9kejv99xunQ5xI3bqwKj+LTug7IhNedQehq0S2LNC3n+ji64rvpz9soT zAf6UVsYz05n1wW6E6Hy2HmSLM0RmEPb9Kc0+P0zQkupYWEy4eSFuYRYhobKCek91X4t epP9/qX9xyn0HS1z40qilg1riH75YnwMHaj9ODEYD3QPVT/Wm+OxVnc9qX3PM9z7mBJ2 vieQ== X-Gm-Message-State: AOAM530l8p50Qjuhss3AC8CMvWilC69karLL3i99wIMuBsMIeW2TwDHL odFgxibqhIxEAw5IKLgWGDI= X-Google-Smtp-Source: ABdhPJz6mQYD9oESqlzsd9Rz0lnVpH02qqOSusPXwz25AWQi30lyVdW3xnpSFSwZeTDa63t+HSJ9XA== X-Received: by 2002:a05:600c:2053:: with SMTP id p19mr25642802wmg.87.1615808558912; Mon, 15 Mar 2021 04:42:38 -0700 (PDT) Received: from skynet.lan ([80.31.204.166]) by smtp.gmail.com with ESMTPSA id v189sm12648187wme.39.2021.03.15.04.42.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Mar 2021 04:42:38 -0700 (PDT) From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= To: Linus Walleij , Bartosz Golaszewski , Rob Herring , Florian Fainelli , bcm-kernel-feedback-list@broadcom.com, Lee Jones , Michael Walle , =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= , Jonas Gorski , Necip Fazil Yildiran , Andy Shevchenko , linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v7 22/22] pinctrl: add a pincontrol driver for BCM6318 Date: Mon, 15 Mar 2021 12:42:14 +0100 Message-Id: <20210315114214.3096-23-noltari@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210315114214.3096-1-noltari@gmail.com> References: <20210315114214.3096-1-noltari@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210315_114258_939150_F94EC80D X-CRM114-Status: GOOD ( 19.35 ) 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 QWRkIGEgcGluY29udHJvbCBkcml2ZXIgZm9yIEJDTTYzMTguIEJDTTYzMTggYWxsb3dzIG11eGlu ZyBtb3N0IEdQSU9zCnRvIGRpZmZlcmVudCBmdW5jdGlvbnMuIEJDTTYzMTggaXMgc2ltaWxhciB0 byBCQ002MzI4IHdpdGggdGhlIGFkZGl0aW9uCm9mIGEgcGFkIHJlZ2lzdGVyLCBhbmQgdGhlIEdQ SU8gbWVhbmluZyBvZiB0aGUgbXV4IHJlZ2lzdGVyIGNoYW5nZXMKYmFzZWQgb24gdGhlIEdQSU8g bnVtYmVyLgoKQ28tZGV2ZWxvcGVkLWJ5OiBKb25hcyBHb3Jza2kgPGpvbmFzLmdvcnNraUBnbWFp bC5jb20+ClNpZ25lZC1vZmYtYnk6IEpvbmFzIEdvcnNraSA8am9uYXMuZ29yc2tpQGdtYWlsLmNv bT4KU2lnbmVkLW9mZi1ieTogw4FsdmFybyBGZXJuw6FuZGV6IFJvamFzIDxub2x0YXJpQGdtYWls LmNvbT4KLS0tCiB2Nzogbm8gY2hhbmdlcwogdjY6IG5vIGNoYW5nZXMKIHY1OiBhZGQgY2hhbmdl cyBzdWdnZXN0ZWQgYnkgQW5keSBTaGV2Y2hlbmtvCiB2NDogbm8gY2hhbmdlcwogdjM6IHVzZSBu ZXcgc2hhcmVkIGNvZGUKIHYyOiBzd2l0Y2ggdG8gR1BJT19SRUdNQVAKCiBkcml2ZXJzL3BpbmN0 cmwvYmNtL0tjb25maWcgICAgICAgICAgIHwgICA4ICsKIGRyaXZlcnMvcGluY3RybC9iY20vTWFr ZWZpbGUgICAgICAgICAgfCAgIDEgKwogZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLWJjbTYz MTguYyB8IDQ5OCArKysrKysrKysrKysrKysrKysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCA1 MDcgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcGluY3RybC9iY20v cGluY3RybC1iY202MzE4LmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvYmNtL0tjb25m aWcgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL0tjb25maWcKaW5kZXggMTg2OTg1ODQ2MTIwLi4zMzY2 MGU4ZmVjMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9iY20vS2NvbmZpZworKysgYi9k cml2ZXJzL3BpbmN0cmwvYmNtL0tjb25maWcKQEAgLTM2LDYgKzM2LDE0IEBAIGNvbmZpZyBQSU5D VFJMX0JDTTYzWFgKIAlzZWxlY3QgUElOQ09ORgogCXNlbGVjdCBQSU5NVVgKIAorY29uZmlnIFBJ TkNUUkxfQkNNNjMxOAorCWJvb2wgIkJyb2FkY29tIEJDTTYzMTggR1BJTyBkcml2ZXIiCisJZGVw ZW5kcyBvbiAoQk1JUFNfR0VORVJJQyB8fCBDT01QSUxFX1RFU1QpCisJc2VsZWN0IFBJTkNUUkxf QkNNNjNYWAorCWRlZmF1bHQgQk1JUFNfR0VORVJJQworCWhlbHAKKwkgICBTYXkgWSBoZXJlIHRv IGVuYWJsZSB0aGUgQnJvYWRjb20gQkNNNjMxOCBHUElPIGRyaXZlci4KKwogY29uZmlnIFBJTkNU UkxfQkNNNjMyOAogCWJvb2wgIkJyb2FkY29tIEJDTTYzMjggR1BJTyBkcml2ZXIiCiAJZGVwZW5k cyBvbiAoQk1JUFNfR0VORVJJQyB8fCBDT01QSUxFX1RFU1QpCmRpZmYgLS1naXQgYS9kcml2ZXJz L3BpbmN0cmwvYmNtL01ha2VmaWxlIGIvZHJpdmVycy9waW5jdHJsL2JjbS9NYWtlZmlsZQppbmRl eCA0MTE3ODQ3ZmQyNzkuLjAwYzdiNzc3NWU2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJs L2JjbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL01ha2VmaWxlCkBAIC00LDYg KzQsNyBAQAogb2JqLSQoQ09ORklHX1BJTkNUUkxfQkNNMjgxWFgpCQkrPSBwaW5jdHJsLWJjbTI4 MXh4Lm8KIG9iai0kKENPTkZJR19QSU5DVFJMX0JDTTI4MzUpCQkrPSBwaW5jdHJsLWJjbTI4MzUu bwogb2JqLSQoQ09ORklHX1BJTkNUUkxfQkNNNjNYWCkJCSs9IHBpbmN0cmwtYmNtNjN4eC5vCitv YmotJChDT05GSUdfUElOQ1RSTF9CQ002MzE4KQkJKz0gcGluY3RybC1iY202MzE4Lm8KIG9iai0k KENPTkZJR19QSU5DVFJMX0JDTTYzMjgpCQkrPSBwaW5jdHJsLWJjbTYzMjgubwogb2JqLSQoQ09O RklHX1BJTkNUUkxfQkNNNjM1OCkJCSs9IHBpbmN0cmwtYmNtNjM1OC5vCiBvYmotJChDT05GSUdf UElOQ1RSTF9CQ002MzYyKQkJKz0gcGluY3RybC1iY202MzYyLm8KZGlmZiAtLWdpdCBhL2RyaXZl cnMvcGluY3RybC9iY20vcGluY3RybC1iY202MzE4LmMgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL3Bp bmN0cmwtYmNtNjMxOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4u NzdmZDliNTgwNjdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL2JjbS9waW5j dHJsLWJjbTYzMTguYwpAQCAtMCwwICsxLDQ5OCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IEdQTC0yLjArCisvKgorICogRHJpdmVyIGZvciBCQ002MzE4IEdQSU8gdW5pdCAocGluY3Ry bCArIEdQSU8pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIxIMOBbHZhcm8gRmVybsOhbmRleiBS b2phcyA8bm9sdGFyaUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSm9uYXMgR29y c2tpIDxqb25hcy5nb3Jza2lAZ21haWwuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRz Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJu ZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGlu bXV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGlu dXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlICIuLi9waW5jdHJsLXV0aWxzLmgiCisKKyNpbmNsdWRl ICJwaW5jdHJsLWJjbTYzeHguaCIKKworI2RlZmluZSBCQ002MzE4X05VTV9HUElPUwk1MAorI2Rl ZmluZSBCQ002MzE4X05VTV9NVVgJCTQ4CisKKyNkZWZpbmUgQkNNNjMxOF9NT0RFX1JFRwkweDE4 CisjZGVmaW5lIEJDTTYzMThfTVVYX1JFRwkJMHgxYworI2RlZmluZSAgQkNNNjMyOF9NVVhfTUFT SwlHRU5NQVNLKDEsIDApCisjZGVmaW5lIEJDTTYzMThfUEFEX1JFRwkJMHg1NAorI2RlZmluZSAg QkNNNjMyOF9QQURfTUFTSwlHRU5NQVNLKDMsIDApCisKK3N0cnVjdCBiY202MzE4X3Bpbmdyb3Vw IHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IHVuc2lnbmVkICogY29uc3QgcGluczsKKwlj b25zdCB1bnNpZ25lZCBudW1fcGluczsKK307CisKK3N0cnVjdCBiY202MzE4X2Z1bmN0aW9uIHsK Kwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKiBjb25zdCAqZ3JvdXBzOworCWNvbnN0 IHVuc2lnbmVkIG51bV9ncm91cHM7CisKKwl1bnNpZ25lZCBtb2RlX3ZhbDoxOworCXVuc2lnbmVk IG11eF92YWw6MjsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyBi Y202MzE4X3BpbnNbXSA9IHsKKwlQSU5DVFJMX1BJTigwLCAiZ3BpbzAiKSwKKwlQSU5DVFJMX1BJ TigxLCAiZ3BpbzEiKSwKKwlQSU5DVFJMX1BJTigyLCAiZ3BpbzIiKSwKKwlQSU5DVFJMX1BJTigz LCAiZ3BpbzMiKSwKKwlQSU5DVFJMX1BJTig0LCAiZ3BpbzQiKSwKKwlQSU5DVFJMX1BJTig1LCAi Z3BpbzUiKSwKKwlQSU5DVFJMX1BJTig2LCAiZ3BpbzYiKSwKKwlQSU5DVFJMX1BJTig3LCAiZ3Bp bzciKSwKKwlQSU5DVFJMX1BJTig4LCAiZ3BpbzgiKSwKKwlQSU5DVFJMX1BJTig5LCAiZ3Bpbzki KSwKKwlQSU5DVFJMX1BJTigxMCwgImdwaW8xMCIpLAorCVBJTkNUUkxfUElOKDExLCAiZ3BpbzEx IiksCisJUElOQ1RSTF9QSU4oMTIsICJncGlvMTIiKSwKKwlQSU5DVFJMX1BJTigxMywgImdwaW8x MyIpLAorCVBJTkNUUkxfUElOKDE0LCAiZ3BpbzE0IiksCisJUElOQ1RSTF9QSU4oMTUsICJncGlv MTUiKSwKKwlQSU5DVFJMX1BJTigxNiwgImdwaW8xNiIpLAorCVBJTkNUUkxfUElOKDE3LCAiZ3Bp bzE3IiksCisJUElOQ1RSTF9QSU4oMTgsICJncGlvMTgiKSwKKwlQSU5DVFJMX1BJTigxOSwgImdw aW8xOSIpLAorCVBJTkNUUkxfUElOKDIwLCAiZ3BpbzIwIiksCisJUElOQ1RSTF9QSU4oMjEsICJn cGlvMjEiKSwKKwlQSU5DVFJMX1BJTigyMiwgImdwaW8yMiIpLAorCVBJTkNUUkxfUElOKDIzLCAi Z3BpbzIzIiksCisJUElOQ1RSTF9QSU4oMjQsICJncGlvMjQiKSwKKwlQSU5DVFJMX1BJTigyNSwg ImdwaW8yNSIpLAorCVBJTkNUUkxfUElOKDI2LCAiZ3BpbzI2IiksCisJUElOQ1RSTF9QSU4oMjcs ICJncGlvMjciKSwKKwlQSU5DVFJMX1BJTigyOCwgImdwaW8yOCIpLAorCVBJTkNUUkxfUElOKDI5 LCAiZ3BpbzI5IiksCisJUElOQ1RSTF9QSU4oMzAsICJncGlvMzAiKSwKKwlQSU5DVFJMX1BJTigz MSwgImdwaW8zMSIpLAorCVBJTkNUUkxfUElOKDMyLCAiZ3BpbzMyIiksCisJUElOQ1RSTF9QSU4o MzMsICJncGlvMzMiKSwKKwlQSU5DVFJMX1BJTigzNCwgImdwaW8zNCIpLAorCVBJTkNUUkxfUElO KDM1LCAiZ3BpbzM1IiksCisJUElOQ1RSTF9QSU4oMzYsICJncGlvMzYiKSwKKwlQSU5DVFJMX1BJ TigzNywgImdwaW8zNyIpLAorCVBJTkNUUkxfUElOKDM4LCAiZ3BpbzM4IiksCisJUElOQ1RSTF9Q SU4oMzksICJncGlvMzkiKSwKKwlQSU5DVFJMX1BJTig0MCwgImdwaW80MCIpLAorCVBJTkNUUkxf UElOKDQxLCAiZ3BpbzQxIiksCisJUElOQ1RSTF9QSU4oNDIsICJncGlvNDIiKSwKKwlQSU5DVFJM X1BJTig0MywgImdwaW80MyIpLAorCVBJTkNUUkxfUElOKDQ0LCAiZ3BpbzQ0IiksCisJUElOQ1RS TF9QSU4oNDUsICJncGlvNDUiKSwKKwlQSU5DVFJMX1BJTig0NiwgImdwaW80NiIpLAorCVBJTkNU UkxfUElOKDQ3LCAiZ3BpbzQ3IiksCisJUElOQ1RSTF9QSU4oNDgsICJncGlvNDgiKSwKKwlQSU5D VFJMX1BJTig0OSwgImdwaW80OSIpLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGdwaW8wX3BpbnNb XSA9IHsgMCB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW8xX3BpbnNbXSA9IHsgMSB9Oworc3RhdGlj IHVuc2lnbmVkIGdwaW8yX3BpbnNbXSA9IHsgMiB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW8zX3Bp bnNbXSA9IHsgMyB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW80X3BpbnNbXSA9IHsgNCB9Oworc3Rh dGljIHVuc2lnbmVkIGdwaW81X3BpbnNbXSA9IHsgNSB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW82 X3BpbnNbXSA9IHsgNiB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW83X3BpbnNbXSA9IHsgNyB9Owor c3RhdGljIHVuc2lnbmVkIGdwaW84X3BpbnNbXSA9IHsgOCB9Oworc3RhdGljIHVuc2lnbmVkIGdw aW85X3BpbnNbXSA9IHsgOSB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW8xMF9waW5zW10gPSB7IDEw IH07CitzdGF0aWMgdW5zaWduZWQgZ3BpbzExX3BpbnNbXSA9IHsgMTEgfTsKK3N0YXRpYyB1bnNp Z25lZCBncGlvMTJfcGluc1tdID0geyAxMiB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW8xM19waW5z W10gPSB7IDEzIH07CitzdGF0aWMgdW5zaWduZWQgZ3BpbzE0X3BpbnNbXSA9IHsgMTQgfTsKK3N0 YXRpYyB1bnNpZ25lZCBncGlvMTVfcGluc1tdID0geyAxNSB9Oworc3RhdGljIHVuc2lnbmVkIGdw aW8xNl9waW5zW10gPSB7IDE2IH07CitzdGF0aWMgdW5zaWduZWQgZ3BpbzE3X3BpbnNbXSA9IHsg MTcgfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvMThfcGluc1tdID0geyAxOCB9Oworc3RhdGljIHVu c2lnbmVkIGdwaW8xOV9waW5zW10gPSB7IDE5IH07CitzdGF0aWMgdW5zaWduZWQgZ3BpbzIwX3Bp bnNbXSA9IHsgMjAgfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvMjFfcGluc1tdID0geyAyMSB9Owor c3RhdGljIHVuc2lnbmVkIGdwaW8yMl9waW5zW10gPSB7IDIyIH07CitzdGF0aWMgdW5zaWduZWQg Z3BpbzIzX3BpbnNbXSA9IHsgMjMgfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvMjRfcGluc1tdID0g eyAyNCB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW8yNV9waW5zW10gPSB7IDI1IH07CitzdGF0aWMg dW5zaWduZWQgZ3BpbzI2X3BpbnNbXSA9IHsgMjYgfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvMjdf cGluc1tdID0geyAyNyB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW8yOF9waW5zW10gPSB7IDI4IH07 CitzdGF0aWMgdW5zaWduZWQgZ3BpbzI5X3BpbnNbXSA9IHsgMjkgfTsKK3N0YXRpYyB1bnNpZ25l ZCBncGlvMzBfcGluc1tdID0geyAzMCB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW8zMV9waW5zW10g PSB7IDMxIH07CitzdGF0aWMgdW5zaWduZWQgZ3BpbzMyX3BpbnNbXSA9IHsgMzIgfTsKK3N0YXRp YyB1bnNpZ25lZCBncGlvMzNfcGluc1tdID0geyAzMyB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW8z NF9waW5zW10gPSB7IDM0IH07CitzdGF0aWMgdW5zaWduZWQgZ3BpbzM1X3BpbnNbXSA9IHsgMzUg fTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvMzZfcGluc1tdID0geyAzNiB9Oworc3RhdGljIHVuc2ln bmVkIGdwaW8zN19waW5zW10gPSB7IDM3IH07CitzdGF0aWMgdW5zaWduZWQgZ3BpbzM4X3BpbnNb XSA9IHsgMzggfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvMzlfcGluc1tdID0geyAzOSB9Oworc3Rh dGljIHVuc2lnbmVkIGdwaW80MF9waW5zW10gPSB7IDQwIH07CitzdGF0aWMgdW5zaWduZWQgZ3Bp bzQxX3BpbnNbXSA9IHsgNDEgfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvNDJfcGluc1tdID0geyA0 MiB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW80M19waW5zW10gPSB7IDQzIH07CitzdGF0aWMgdW5z aWduZWQgZ3BpbzQ0X3BpbnNbXSA9IHsgNDQgfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvNDVfcGlu c1tdID0geyA0NSB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW80Nl9waW5zW10gPSB7IDQ2IH07Citz dGF0aWMgdW5zaWduZWQgZ3BpbzQ3X3BpbnNbXSA9IHsgNDcgfTsKK3N0YXRpYyB1bnNpZ25lZCBn cGlvNDhfcGluc1tdID0geyA0OCB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW80OV9waW5zW10gPSB7 IDQ5IH07CisKKyNkZWZpbmUgQkNNNjMxOF9HUk9VUChuKQkJCQkJXAorCXsJCQkJCQkJXAorCQku bmFtZSA9ICNuLAkJCQkJXAorCQkucGlucyA9IG4jI19waW5zLAkJCQlcCisJCS5udW1fcGlucyA9 IEFSUkFZX1NJWkUobiMjX3BpbnMpLAkJXAorCX0KKworc3RhdGljIHN0cnVjdCBiY202MzE4X3Bp bmdyb3VwIGJjbTYzMThfZ3JvdXBzW10gPSB7CisJQkNNNjMxOF9HUk9VUChncGlvMCksCisJQkNN NjMxOF9HUk9VUChncGlvMSksCisJQkNNNjMxOF9HUk9VUChncGlvMiksCisJQkNNNjMxOF9HUk9V UChncGlvMyksCisJQkNNNjMxOF9HUk9VUChncGlvNCksCisJQkNNNjMxOF9HUk9VUChncGlvNSks CisJQkNNNjMxOF9HUk9VUChncGlvNiksCisJQkNNNjMxOF9HUk9VUChncGlvNyksCisJQkNNNjMx OF9HUk9VUChncGlvOCksCisJQkNNNjMxOF9HUk9VUChncGlvOSksCisJQkNNNjMxOF9HUk9VUChn cGlvMTApLAorCUJDTTYzMThfR1JPVVAoZ3BpbzExKSwKKwlCQ002MzE4X0dST1VQKGdwaW8xMiks CisJQkNNNjMxOF9HUk9VUChncGlvMTMpLAorCUJDTTYzMThfR1JPVVAoZ3BpbzE0KSwKKwlCQ002 MzE4X0dST1VQKGdwaW8xNSksCisJQkNNNjMxOF9HUk9VUChncGlvMTYpLAorCUJDTTYzMThfR1JP VVAoZ3BpbzE3KSwKKwlCQ002MzE4X0dST1VQKGdwaW8xOCksCisJQkNNNjMxOF9HUk9VUChncGlv MTkpLAorCUJDTTYzMThfR1JPVVAoZ3BpbzIwKSwKKwlCQ002MzE4X0dST1VQKGdwaW8yMSksCisJ QkNNNjMxOF9HUk9VUChncGlvMjIpLAorCUJDTTYzMThfR1JPVVAoZ3BpbzIzKSwKKwlCQ002MzE4 X0dST1VQKGdwaW8yNCksCisJQkNNNjMxOF9HUk9VUChncGlvMjUpLAorCUJDTTYzMThfR1JPVVAo Z3BpbzI2KSwKKwlCQ002MzE4X0dST1VQKGdwaW8yNyksCisJQkNNNjMxOF9HUk9VUChncGlvMjgp LAorCUJDTTYzMThfR1JPVVAoZ3BpbzI5KSwKKwlCQ002MzE4X0dST1VQKGdwaW8zMCksCisJQkNN NjMxOF9HUk9VUChncGlvMzEpLAorCUJDTTYzMThfR1JPVVAoZ3BpbzMyKSwKKwlCQ002MzE4X0dS T1VQKGdwaW8zMyksCisJQkNNNjMxOF9HUk9VUChncGlvMzQpLAorCUJDTTYzMThfR1JPVVAoZ3Bp bzM1KSwKKwlCQ002MzE4X0dST1VQKGdwaW8zNiksCisJQkNNNjMxOF9HUk9VUChncGlvMzcpLAor CUJDTTYzMThfR1JPVVAoZ3BpbzM4KSwKKwlCQ002MzE4X0dST1VQKGdwaW8zOSksCisJQkNNNjMx OF9HUk9VUChncGlvNDApLAorCUJDTTYzMThfR1JPVVAoZ3BpbzQxKSwKKwlCQ002MzE4X0dST1VQ KGdwaW80MiksCisJQkNNNjMxOF9HUk9VUChncGlvNDMpLAorCUJDTTYzMThfR1JPVVAoZ3BpbzQ0 KSwKKwlCQ002MzE4X0dST1VQKGdwaW80NSksCisJQkNNNjMxOF9HUk9VUChncGlvNDYpLAorCUJD TTYzMThfR1JPVVAoZ3BpbzQ3KSwKKwlCQ002MzE4X0dST1VQKGdwaW80OCksCisJQkNNNjMxOF9H Uk9VUChncGlvNDkpLAorfTsKKworLyogR1BJT19NT0RFICovCitzdGF0aWMgY29uc3QgY2hhciAq IGNvbnN0IGxlZF9ncm91cHNbXSA9IHsKKwkiZ3BpbzAiLAorCSJncGlvMSIsCisJImdwaW8yIiwK KwkiZ3BpbzMiLAorCSJncGlvNCIsCisJImdwaW81IiwKKwkiZ3BpbzYiLAorCSJncGlvNyIsCisJ ImdwaW84IiwKKwkiZ3BpbzkiLAorCSJncGlvMTAiLAorCSJncGlvMTEiLAorCSJncGlvMTIiLAor CSJncGlvMTMiLAorCSJncGlvMTQiLAorCSJncGlvMTUiLAorCSJncGlvMTYiLAorCSJncGlvMTci LAorCSJncGlvMTgiLAorCSJncGlvMTkiLAorCSJncGlvMjAiLAorCSJncGlvMjEiLAorCSJncGlv MjIiLAorCSJncGlvMjMiLAorfTsKKworLyogUElOTVVYX1NFTCAqLworc3RhdGljIGNvbnN0IGNo YXIgKiBjb25zdCBlcGh5MF9zcGRfbGVkX2dyb3Vwc1tdID0geworCSJncGlvMCIsCit9OworCitz dGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVwaHkxX3NwZF9sZWRfZ3JvdXBzW10gPSB7CisJImdw aW8xIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXBoeTJfc3BkX2xlZF9ncm91 cHNbXSA9IHsKKwkiZ3BpbzIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlcGh5 M19zcGRfbGVkX2dyb3Vwc1tdID0geworCSJncGlvMyIsCit9OworCitzdGF0aWMgY29uc3QgY2hh ciAqIGNvbnN0IGVwaHkwX2FjdF9sZWRfZ3JvdXBzW10gPSB7CisJImdwaW80IiwKK307CisKK3N0 YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXBoeTFfYWN0X2xlZF9ncm91cHNbXSA9IHsKKwkiZ3Bp bzUiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlcGh5Ml9hY3RfbGVkX2dyb3Vw c1tdID0geworCSJncGlvNiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVwaHkz X2FjdF9sZWRfZ3JvdXBzW10gPSB7CisJImdwaW83IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFy ICogY29uc3Qgc2VyaWFsX2xlZF9kYXRhX2dyb3Vwc1tdID0geworCSJncGlvNiIsCit9OworCitz dGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNlcmlhbF9sZWRfY2xrX2dyb3Vwc1tdID0geworCSJn cGlvNyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGluZXRfYWN0X2xlZF9ncm91 cHNbXSA9IHsKKwkiZ3BpbzgiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbmV0 X2ZhaWxfbGVkX2dyb3Vwc1tdID0geworCSJncGlvOSIsCit9OworCitzdGF0aWMgY29uc3QgY2hh ciAqIGNvbnN0IGRzbF9sZWRfZ3JvdXBzW10gPSB7CisJImdwaW8xMCIsCit9OworCitzdGF0aWMg Y29uc3QgY2hhciAqIGNvbnN0IHBvc3RfZmFpbF9sZWRfZ3JvdXBzW10gPSB7CisJImdwaW8xMSIs Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdsYW5fd3BzX2xlZF9ncm91cHNbXSA9 IHsKKwkiZ3BpbzEyIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNiX3B3cm9u X2dyb3Vwc1tdID0geworCSJncGlvMTMiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25z dCB1c2JfZGV2aWNlX2xlZF9ncm91cHNbXSA9IHsKKwkiZ3BpbzEzIiwKK307CisKK3N0YXRpYyBj b25zdCBjaGFyICogY29uc3QgdXNiX2FjdGl2ZV9ncm91cHNbXSA9IHsKKwkiZ3BpbzQwIiwKK307 CisKKyNkZWZpbmUgQkNNNjMxOF9NT0RFX0ZVTihuKQkJCQlcCisJewkJCQkJCVwKKwkJLm5hbWUg PSAjbiwJCQkJXAorCQkuZ3JvdXBzID0gbiMjX2dyb3VwcywJCQlcCisJCS5udW1fZ3JvdXBzID0g QVJSQVlfU0laRShuIyNfZ3JvdXBzKSwJXAorCQkubW9kZV92YWwgPSAxLAkJCQlcCisJfQorCisj ZGVmaW5lIEJDTTYzMThfTVVYX0ZVTihuLCBtdXgpCQkJCVwKKwl7CQkJCQkJXAorCQkubmFtZSA9 ICNuLAkJCQlcCisJCS5ncm91cHMgPSBuIyNfZ3JvdXBzLAkJCVwKKwkJLm51bV9ncm91cHMgPSBB UlJBWV9TSVpFKG4jI19ncm91cHMpLAlcCisJCS5tdXhfdmFsID0gbXV4LAkJCQlcCisJfQorCitz dGF0aWMgY29uc3Qgc3RydWN0IGJjbTYzMThfZnVuY3Rpb24gYmNtNjMxOF9mdW5jc1tdID0gewor CUJDTTYzMThfTU9ERV9GVU4obGVkKSwKKwlCQ002MzE4X01VWF9GVU4oZXBoeTBfc3BkX2xlZCwg MSksCisJQkNNNjMxOF9NVVhfRlVOKGVwaHkxX3NwZF9sZWQsIDEpLAorCUJDTTYzMThfTVVYX0ZV TihlcGh5Ml9zcGRfbGVkLCAxKSwKKwlCQ002MzE4X01VWF9GVU4oZXBoeTNfc3BkX2xlZCwgMSks CisJQkNNNjMxOF9NVVhfRlVOKGVwaHkwX2FjdF9sZWQsIDEpLAorCUJDTTYzMThfTVVYX0ZVTihl cGh5MV9hY3RfbGVkLCAxKSwKKwlCQ002MzE4X01VWF9GVU4oZXBoeTJfYWN0X2xlZCwgMSksCisJ QkNNNjMxOF9NVVhfRlVOKGVwaHkzX2FjdF9sZWQsIDEpLAorCUJDTTYzMThfTVVYX0ZVTihzZXJp YWxfbGVkX2RhdGEsIDMpLAorCUJDTTYzMThfTVVYX0ZVTihzZXJpYWxfbGVkX2NsaywgMyksCisJ QkNNNjMxOF9NVVhfRlVOKGluZXRfYWN0X2xlZCwgMSksCisJQkNNNjMxOF9NVVhfRlVOKGluZXRf ZmFpbF9sZWQsIDEpLAorCUJDTTYzMThfTVVYX0ZVTihkc2xfbGVkLCAxKSwKKwlCQ002MzE4X01V WF9GVU4ocG9zdF9mYWlsX2xlZCwgMSksCisJQkNNNjMxOF9NVVhfRlVOKHdsYW5fd3BzX2xlZCwg MSksCisJQkNNNjMxOF9NVVhfRlVOKHVzYl9wd3JvbiwgMSksCisJQkNNNjMxOF9NVVhfRlVOKHVz Yl9kZXZpY2VfbGVkLCAyKSwKKwlCQ002MzE4X01VWF9GVU4odXNiX2FjdGl2ZSwgMiksCit9Owor CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiY202MzE4X211eF9vZmYodW5zaWduZWQgaW50 IHBpbikKK3sKKwlyZXR1cm4gQkNNNjMxOF9NVVhfUkVHICsgKHBpbiAvIDE2KSAqIDQ7Cit9CisK K3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJjbTYzMThfcGFkX29mZih1bnNpZ25lZCBpbnQg cGluKQoreworCXJldHVybiBCQ002MzE4X1BBRF9SRUcgKyAocGluIC8gOCkgKiA0OworfQorCitz dGF0aWMgaW50IGJjbTYzMThfcGluY3RybF9nZXRfZ3JvdXBfY291bnQoc3RydWN0IHBpbmN0cmxf ZGV2ICpwY3RsZGV2KQoreworCXJldHVybiBBUlJBWV9TSVpFKGJjbTYzMThfZ3JvdXBzKTsKK30K Kworc3RhdGljIGNvbnN0IGNoYXIgKmJjbTYzMThfcGluY3RybF9nZXRfZ3JvdXBfbmFtZShzdHJ1 Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJCQkgIHVuc2lnbmVkIGdyb3VwKQoreworCXJl dHVybiBiY202MzE4X2dyb3Vwc1tncm91cF0ubmFtZTsKK30KKworc3RhdGljIGludCBiY202MzE4 X3BpbmN0cmxfZ2V0X2dyb3VwX3BpbnMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJ CQkgIHVuc2lnbmVkIGdyb3VwLCBjb25zdCB1bnNpZ25lZCAqKnBpbnMsCisJCQkJCSAgdW5zaWdu ZWQgKm51bV9waW5zKQoreworCSpwaW5zID0gYmNtNjMxOF9ncm91cHNbZ3JvdXBdLnBpbnM7CisJ Km51bV9waW5zID0gYmNtNjMxOF9ncm91cHNbZ3JvdXBdLm51bV9waW5zOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgYmNtNjMxOF9waW5jdHJsX2dldF9mdW5jX2NvdW50KHN0cnVjdCBw aW5jdHJsX2RldiAqcGN0bGRldikKK3sKKwlyZXR1cm4gQVJSQVlfU0laRShiY202MzE4X2Z1bmNz KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmJjbTYzMThfcGluY3RybF9nZXRfZnVuY19uYW1l KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCQkJCSB1bnNpZ25lZCBzZWxlY3RvcikK K3sKKwlyZXR1cm4gYmNtNjMxOF9mdW5jc1tzZWxlY3Rvcl0ubmFtZTsKK30KKworc3RhdGljIGlu dCBiY202MzE4X3BpbmN0cmxfZ2V0X2dyb3VwcyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYs CisJCQkJICAgICAgdW5zaWduZWQgc2VsZWN0b3IsCisJCQkJICAgICAgY29uc3QgY2hhciAqIGNv bnN0ICoqZ3JvdXBzLAorCQkJCSAgICAgIHVuc2lnbmVkICogY29uc3QgbnVtX2dyb3VwcykKK3sK KwkqZ3JvdXBzID0gYmNtNjMxOF9mdW5jc1tzZWxlY3Rvcl0uZ3JvdXBzOworCSpudW1fZ3JvdXBz ID0gYmNtNjMxOF9mdW5jc1tzZWxlY3Rvcl0ubnVtX2dyb3VwczsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtNjMxOF9ybXdfbXV4KHN0cnVjdCBiY202M3h4X3BpbmN0 cmwgKnBjLCB1bnNpZ25lZCBwaW4sCisJCQkJICAgdW5zaWduZWQgaW50IG1vZGUsIHVuc2lnbmVk IGludCBtdXgpCit7CisJaWYgKHBpbiA8IEJDTTYzWFhfQkFOS19HUElPUykKKwkJcmVnbWFwX3Vw ZGF0ZV9iaXRzKHBjLT5yZWdzLCBCQ002MzE4X01PREVfUkVHLCBCSVQocGluKSwKKwkJCQkgICBt b2RlID8gQklUKHBpbikgOiAwKTsKKworCWlmIChwaW4gPCBCQ002MzE4X05VTV9NVVgpCisJCXJl Z21hcF91cGRhdGVfYml0cyhwYy0+cmVncywKKwkJCQkgICBiY202MzE4X211eF9vZmYocGluKSwK KwkJCQkgICBCQ002MzI4X01VWF9NQVNLIDw8ICgocGluICUgMTYpICogMiksCisJCQkJICAgbXV4 IDw8ICgocGluICUgMTYpICogMikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtNjMxOF9z ZXRfcGFkKHN0cnVjdCBiY202M3h4X3BpbmN0cmwgKnBjLCB1bnNpZ25lZCBwaW4sCisJCQkJICAg dWludDhfdCB2YWwpCit7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHBjLT5yZWdzLCBiY202MzE4X3Bh ZF9vZmYocGluKSwKKwkJCSAgIEJDTTYzMjhfUEFEX01BU0sgPDwgKChwaW4gJSA4KSAqIDQpLAor CQkJICAgdmFsIDw8ICgocGluICUgOCkgKiA0KSk7Cit9CisKK3N0YXRpYyBpbnQgYmNtNjMxOF9w aW5jdHJsX3NldF9tdXgoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJCSAgIHVuc2ln bmVkIHNlbGVjdG9yLCB1bnNpZ25lZCBncm91cCkKK3sKKwlzdHJ1Y3QgYmNtNjN4eF9waW5jdHJs ICpwYyA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCWNvbnN0IHN0cnVjdCBi Y202MzE4X3Bpbmdyb3VwICpwZyA9ICZiY202MzE4X2dyb3Vwc1tncm91cF07CisJY29uc3Qgc3Ry dWN0IGJjbTYzMThfZnVuY3Rpb24gKmYgPSAmYmNtNjMxOF9mdW5jc1tzZWxlY3Rvcl07CisKKwli Y202MzE4X3Jtd19tdXgocGMsIHBnLT5waW5zWzBdLCBmLT5tb2RlX3ZhbCwgZi0+bXV4X3ZhbCk7 CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY202MzE4X2dwaW9fcmVxdWVzdF9lbmFi bGUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgcGluY3Ry bF9ncGlvX3JhbmdlICpyYW5nZSwKKwkJCQkgICAgICAgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0 cnVjdCBiY202M3h4X3BpbmN0cmwgKnBjID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRl dik7CisKKwkvKiBkaXNhYmxlIGFsbCBmdW5jdGlvbnMgdXNpbmcgdGhpcyBwaW4gKi8KKwlpZiAo b2Zmc2V0IDwgMTMpIHsKKwkJLyogR1BJT3MgMC0xMiB1c2UgbXV4IDAgYXMgR1BJTyBmdW5jdGlv biAqLworCQliY202MzE4X3Jtd19tdXgocGMsIG9mZnNldCwgMCwgMCk7CisJfSBlbHNlIGlmIChv ZmZzZXQgPCA0MikgeworCQkvKiBHUElPcyAxMy00MSB1c2UgbXV4IDMgYXMgR1BJTyBmdW5jdGlv biAqLworCQliY202MzE4X3Jtd19tdXgocGMsIG9mZnNldCwgMCwgMyk7CisKKwkJYmNtNjMxOF9z ZXRfcGFkKHBjLCBvZmZzZXQsIDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3Ry dWN0IHBpbmN0cmxfb3BzIGJjbTYzMThfcGN0bF9vcHMgPSB7CisJLmR0X2ZyZWVfbWFwID0gcGlu Y3RybF91dGlsc19mcmVlX21hcCwKKwkuZHRfbm9kZV90b19tYXAgPSBwaW5jb25mX2dlbmVyaWNf ZHRfbm9kZV90b19tYXBfcGluLAorCS5nZXRfZ3JvdXBfbmFtZSA9IGJjbTYzMThfcGluY3RybF9n ZXRfZ3JvdXBfbmFtZSwKKwkuZ2V0X2dyb3VwX3BpbnMgPSBiY202MzE4X3BpbmN0cmxfZ2V0X2dy b3VwX3BpbnMsCisJLmdldF9ncm91cHNfY291bnQgPSBiY202MzE4X3BpbmN0cmxfZ2V0X2dyb3Vw X2NvdW50LAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5tdXhfb3BzIGJjbTYzMThfcG14X29wcyA9 IHsKKwkuZ2V0X2Z1bmN0aW9uX2dyb3VwcyA9IGJjbTYzMThfcGluY3RybF9nZXRfZ3JvdXBzLAor CS5nZXRfZnVuY3Rpb25fbmFtZSA9IGJjbTYzMThfcGluY3RybF9nZXRfZnVuY19uYW1lLAorCS5n ZXRfZnVuY3Rpb25zX2NvdW50ID0gYmNtNjMxOF9waW5jdHJsX2dldF9mdW5jX2NvdW50LAorCS5n cGlvX3JlcXVlc3RfZW5hYmxlID0gYmNtNjMxOF9ncGlvX3JlcXVlc3RfZW5hYmxlLAorCS5zZXRf bXV4ID0gYmNtNjMxOF9waW5jdHJsX3NldF9tdXgsCisJLnN0cmljdCA9IHRydWUsCit9OworCitz dGF0aWMgY29uc3Qgc3RydWN0IGJjbTYzeHhfcGluY3RybF9zb2MgYmNtNjMxOF9zb2MgPSB7CisJ Lm5ncGlvcyA9IEJDTTYzMThfTlVNX0dQSU9TLAorCS5ucGlucyA9IEFSUkFZX1NJWkUoYmNtNjMx OF9waW5zKSwKKwkucGN0bF9vcHMgPSAmYmNtNjMxOF9wY3RsX29wcywKKwkucGlucyA9IGJjbTYz MThfcGlucywKKwkucG14X29wcyA9ICZiY202MzE4X3BteF9vcHMsCit9OworCitzdGF0aWMgaW50 IGJjbTYzMThfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorewor CXJldHVybiBiY202M3h4X3BpbmN0cmxfcHJvYmUocGRldiwgJmJjbTYzMThfc29jLCBOVUxMKTsK K30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYmNtNjMxOF9waW5jdHJsX21h dGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJicmNtLGJjbTYzMTgtcGluY3RybCIsIH0sCisJ eyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBi Y202MzE4X3BpbmN0cmxfZHJpdmVyID0geworCS5wcm9iZSA9IGJjbTYzMThfcGluY3RybF9wcm9i ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJiY202MzE4LXBpbmN0cmwiLAorCQkub2ZfbWF0 Y2hfdGFibGUgPSBiY202MzE4X3BpbmN0cmxfbWF0Y2gsCisJfSwKK307CisKK2J1aWx0aW5fcGxh dGZvcm1fZHJpdmVyKGJjbTYzMThfcGluY3RybF9kcml2ZXIpOwotLSAKMi4yMC4xCgoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5l bCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6 Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=