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 B50D1C4332B for ; Mon, 15 Mar 2021 11:43:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8BFED64E61 for ; Mon, 15 Mar 2021 11:43:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231160AbhCOLnO (ORCPT ); Mon, 15 Mar 2021 07:43:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43252 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230171AbhCOLme (ORCPT ); Mon, 15 Mar 2021 07:42:34 -0400 Received: from mail-wm1-x332.google.com (mail-wm1-x332.google.com [IPv6:2a00:1450:4864:20::332]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7E609C061574; Mon, 15 Mar 2021 04:42:34 -0700 (PDT) Received: by mail-wm1-x332.google.com with SMTP id c76-20020a1c9a4f0000b029010c94499aedso20059801wme.0; Mon, 15 Mar 2021 04:42:34 -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=dOYoxINTfJSWe6E+B99ZLAkTbRDqTK3CwKHMIBKB1Nk=; b=BMkHzUvITdH0ViJhy22yv07ETC20r7IDoSjhoOotQDtEoapM5PLTtJJXJmqj7uBE43 3NGZfqLoSHZkxRbubrVJdf5NOtgLmmoVwSpnILjN3aeWTaAeaEHewIo3gY3af3Hx1g6o rwHrvuZbp159NMZNlAyLeuIxFvrY4ab6c8N4Ic6/PpCMvNU/rbXg26du6vQ4q4XD9O8q vjbZwMqxvAGpGTvGF9WJR5Ec+RonVUJ+2+q+PF2D969ZxJOE0fR3saJ0UBhbW8We6r3o BtM16NRS2Ppw5FAzi1CRUDMSipF+TUkyHoaOf9QwpgZTx1Q/TUFyfninPrh7A4VmlDIj OgWA== 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=dOYoxINTfJSWe6E+B99ZLAkTbRDqTK3CwKHMIBKB1Nk=; b=VelSSqnd50DfOpHHriSauZkYPqABxHsgXR7WV14UZ7cb0F2BNbgRpeUUSI5nyXMsi4 p8HV2lN3aCKqH/zjuE5/K2b1Twgk5ImSmUn6zSS66CRTaQAfNtkcurFSPwnJSAxtCP4G HUoy4Vj4RIosfyNTgelTSUvlc3LY6tvh9IM3RljqiBKzDY3Gxuu+ARksf8R2dld/WL9u D1BaiVhzZ+tk2c82LzQcknYaI3S2DAAXzoCKo8aFwSDXbg0Xwe+7zgfkYMlcxTQzrRQv 86zPE01LbMUIucDWvnR7rO7DRgQelhdasYz49WheY9XFlRxw18Cn7tWAf7Gu3m0u9z53 m7Bg== X-Gm-Message-State: AOAM5313IUDaUj4kE5YvJ0J4AqWHQgOkYLs+M1NiD2uyvqAtC468RR81 hasUiGaW6wOXU3/6z5mgspI= X-Google-Smtp-Source: ABdhPJypJ3WUVOKjJa9bP3b2OJVh74nVqXDXma3NA3lgxHEtdKIT9WF4YryvfChm+cSwVmLvkiVrpw== X-Received: by 2002:a05:600c:2282:: with SMTP id 2mr25658780wmf.93.1615808553087; Mon, 15 Mar 2021 04:42:33 -0700 (PDT) Received: from skynet.lan ([80.31.204.166]) by smtp.gmail.com with ESMTPSA id v189sm12648187wme.39.2021.03.15.04.42.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Mar 2021 04:42:32 -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 16/22] pinctrl: add a pincontrol driver for BCM6368 Date: Mon, 15 Mar 2021 12:42:08 +0100 Message-Id: <20210315114214.3096-17-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 BCM6368. BCM6368 allows muxing the first 32 GPIOs onto alternative functions. Not all are documented. 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-bcm6368.c | 523 ++++++++++++++++++++++++++ 3 files changed, 532 insertions(+) create mode 100644 drivers/pinctrl/bcm/pinctrl-bcm6368.c diff --git a/drivers/pinctrl/bcm/Kconfig b/drivers/pinctrl/bcm/Kconfig index d3101d5e750f..aabd4b762aed 100644 --- a/drivers/pinctrl/bcm/Kconfig +++ b/drivers/pinctrl/bcm/Kconfig @@ -60,6 +60,14 @@ config PINCTRL_BCM6362 help Say Y here to enable the Broadcom BCM6362 GPIO driver. +config PINCTRL_BCM6368 + bool "Broadcom BCM6368 GPIO driver" + depends on (BMIPS_GENERIC || COMPILE_TEST) + select PINCTRL_BCM63XX + default BMIPS_GENERIC + help + Say Y here to enable the Broadcom BCM6368 GPIO driver. + config PINCTRL_IPROC_GPIO bool "Broadcom iProc GPIO (with PINCONF) driver" depends on OF_GPIO && (ARCH_BCM_IPROC || COMPILE_TEST) diff --git a/drivers/pinctrl/bcm/Makefile b/drivers/pinctrl/bcm/Makefile index b9b09e5b914c..a1331bb9680e 100644 --- a/drivers/pinctrl/bcm/Makefile +++ b/drivers/pinctrl/bcm/Makefile @@ -7,6 +7,7 @@ obj-$(CONFIG_PINCTRL_BCM63XX) += pinctrl-bcm63xx.o obj-$(CONFIG_PINCTRL_BCM6328) += pinctrl-bcm6328.o obj-$(CONFIG_PINCTRL_BCM6358) += pinctrl-bcm6358.o obj-$(CONFIG_PINCTRL_BCM6362) += pinctrl-bcm6362.o +obj-$(CONFIG_PINCTRL_BCM6368) += pinctrl-bcm6368.o obj-$(CONFIG_PINCTRL_IPROC_GPIO) += pinctrl-iproc-gpio.o obj-$(CONFIG_PINCTRL_CYGNUS_MUX) += pinctrl-cygnus-mux.o obj-$(CONFIG_PINCTRL_NS) += pinctrl-ns.o diff --git a/drivers/pinctrl/bcm/pinctrl-bcm6368.c b/drivers/pinctrl/bcm/pinctrl-bcm6368.c new file mode 100644 index 000000000000..838095f9e890 --- /dev/null +++ b/drivers/pinctrl/bcm/pinctrl-bcm6368.c @@ -0,0 +1,523 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Driver for BCM6368 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 BCM6368_NUM_GPIOS 38 + +#define BCM6368_MODE_REG 0x18 +#define BCM6368_BASEMODE_REG 0x38 +#define BCM6368_BASEMODE_MASK 0x7 +#define BCM6368_BASEMODE_GPIO 0x0 +#define BCM6368_BASEMODE_UART1 0x1 + +struct bcm6368_pingroup { + const char *name; + const unsigned * const pins; + const unsigned num_pins; +}; + +struct bcm6368_function { + const char *name; + const char * const *groups; + const unsigned num_groups; + + unsigned dir_out:16; + unsigned basemode:3; +}; + +struct bcm6368_priv { + struct regmap_field *overlays; +}; + +#define BCM6368_BASEMODE_PIN(a, b) \ + { \ + .number = a, \ + .name = b, \ + .drv_data = (void *)true \ + } + +static const struct pinctrl_pin_desc bcm6368_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"), + BCM6368_BASEMODE_PIN(30, "gpio30"), + BCM6368_BASEMODE_PIN(31, "gpio31"), + BCM6368_BASEMODE_PIN(32, "gpio32"), + BCM6368_BASEMODE_PIN(33, "gpio33"), + PINCTRL_PIN(34, "gpio34"), + PINCTRL_PIN(35, "gpio35"), + PINCTRL_PIN(36, "gpio36"), + PINCTRL_PIN(37, "gpio37"), +}; + +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 uart1_grp_pins[] = { 30, 31, 32, 33 }; + +#define BCM6368_GROUP(n) \ + { \ + .name = #n, \ + .pins = n##_pins, \ + .num_pins = ARRAY_SIZE(n##_pins), \ + } + +static struct bcm6368_pingroup bcm6368_groups[] = { + BCM6368_GROUP(gpio0), + BCM6368_GROUP(gpio1), + BCM6368_GROUP(gpio2), + BCM6368_GROUP(gpio3), + BCM6368_GROUP(gpio4), + BCM6368_GROUP(gpio5), + BCM6368_GROUP(gpio6), + BCM6368_GROUP(gpio7), + BCM6368_GROUP(gpio8), + BCM6368_GROUP(gpio9), + BCM6368_GROUP(gpio10), + BCM6368_GROUP(gpio11), + BCM6368_GROUP(gpio12), + BCM6368_GROUP(gpio13), + BCM6368_GROUP(gpio14), + BCM6368_GROUP(gpio15), + BCM6368_GROUP(gpio16), + BCM6368_GROUP(gpio17), + BCM6368_GROUP(gpio18), + BCM6368_GROUP(gpio19), + BCM6368_GROUP(gpio20), + BCM6368_GROUP(gpio21), + BCM6368_GROUP(gpio22), + BCM6368_GROUP(gpio23), + BCM6368_GROUP(gpio24), + BCM6368_GROUP(gpio25), + BCM6368_GROUP(gpio26), + BCM6368_GROUP(gpio27), + BCM6368_GROUP(gpio28), + BCM6368_GROUP(gpio29), + BCM6368_GROUP(gpio30), + BCM6368_GROUP(gpio31), + BCM6368_GROUP(uart1_grp), +}; + +static const char * const analog_afe_0_groups[] = { + "gpio0", +}; + +static const char * const analog_afe_1_groups[] = { + "gpio1", +}; + +static const char * const sys_irq_groups[] = { + "gpio2", +}; + +static const char * const serial_led_data_groups[] = { + "gpio3", +}; + +static const char * const serial_led_clk_groups[] = { + "gpio4", +}; + +static const char * const inet_led_groups[] = { + "gpio5", +}; + +static const char * const ephy0_led_groups[] = { + "gpio6", +}; + +static const char * const ephy1_led_groups[] = { + "gpio7", +}; + +static const char * const ephy2_led_groups[] = { + "gpio8", +}; + +static const char * const ephy3_led_groups[] = { + "gpio9", +}; + +static const char * const robosw_led_data_groups[] = { + "gpio10", +}; + +static const char * const robosw_led_clk_groups[] = { + "gpio11", +}; + +static const char * const robosw_led0_groups[] = { + "gpio12", +}; + +static const char * const robosw_led1_groups[] = { + "gpio13", +}; + +static const char * const usb_device_led_groups[] = { + "gpio14", +}; + +static const char * const pci_req1_groups[] = { + "gpio16", +}; + +static const char * const pci_gnt1_groups[] = { + "gpio17", +}; + +static const char * const pci_intb_groups[] = { + "gpio18", +}; + +static const char * const pci_req0_groups[] = { + "gpio19", +}; + +static const char * const pci_gnt0_groups[] = { + "gpio20", +}; + +static const char * const pcmcia_cd1_groups[] = { + "gpio22", +}; + +static const char * const pcmcia_cd2_groups[] = { + "gpio23", +}; + +static const char * const pcmcia_vs1_groups[] = { + "gpio24", +}; + +static const char * const pcmcia_vs2_groups[] = { + "gpio25", +}; + +static const char * const ebi_cs2_groups[] = { + "gpio26", +}; + +static const char * const ebi_cs3_groups[] = { + "gpio27", +}; + +static const char * const spi_cs2_groups[] = { + "gpio28", +}; + +static const char * const spi_cs3_groups[] = { + "gpio29", +}; + +static const char * const spi_cs4_groups[] = { + "gpio30", +}; + +static const char * const spi_cs5_groups[] = { + "gpio31", +}; + +static const char * const uart1_groups[] = { + "uart1_grp", +}; + +#define BCM6368_FUN(n, out) \ + { \ + .name = #n, \ + .groups = n##_groups, \ + .num_groups = ARRAY_SIZE(n##_groups), \ + .dir_out = out, \ + } + +#define BCM6368_BASEMODE_FUN(n, val, out) \ + { \ + .name = #n, \ + .groups = n##_groups, \ + .num_groups = ARRAY_SIZE(n##_groups), \ + .basemode = BCM6368_BASEMODE_##val, \ + .dir_out = out, \ + } + +static const struct bcm6368_function bcm6368_funcs[] = { + BCM6368_FUN(analog_afe_0, 1), + BCM6368_FUN(analog_afe_1, 1), + BCM6368_FUN(sys_irq, 1), + BCM6368_FUN(serial_led_data, 1), + BCM6368_FUN(serial_led_clk, 1), + BCM6368_FUN(inet_led, 1), + BCM6368_FUN(ephy0_led, 1), + BCM6368_FUN(ephy1_led, 1), + BCM6368_FUN(ephy2_led, 1), + BCM6368_FUN(ephy3_led, 1), + BCM6368_FUN(robosw_led_data, 1), + BCM6368_FUN(robosw_led_clk, 1), + BCM6368_FUN(robosw_led0, 1), + BCM6368_FUN(robosw_led1, 1), + BCM6368_FUN(usb_device_led, 1), + BCM6368_FUN(pci_req1, 0), + BCM6368_FUN(pci_gnt1, 0), + BCM6368_FUN(pci_intb, 0), + BCM6368_FUN(pci_req0, 0), + BCM6368_FUN(pci_gnt0, 0), + BCM6368_FUN(pcmcia_cd1, 0), + BCM6368_FUN(pcmcia_cd2, 0), + BCM6368_FUN(pcmcia_vs1, 0), + BCM6368_FUN(pcmcia_vs2, 0), + BCM6368_FUN(ebi_cs2, 1), + BCM6368_FUN(ebi_cs3, 1), + BCM6368_FUN(spi_cs2, 1), + BCM6368_FUN(spi_cs3, 1), + BCM6368_FUN(spi_cs4, 1), + BCM6368_FUN(spi_cs5, 1), + BCM6368_BASEMODE_FUN(uart1, UART1, 0x6), +}; + +static int bcm6368_pinctrl_get_group_count(struct pinctrl_dev *pctldev) +{ + return ARRAY_SIZE(bcm6368_groups); +} + +static const char *bcm6368_pinctrl_get_group_name(struct pinctrl_dev *pctldev, + unsigned group) +{ + return bcm6368_groups[group].name; +} + +static int bcm6368_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, + unsigned group, const unsigned **pins, + unsigned *num_pins) +{ + *pins = bcm6368_groups[group].pins; + *num_pins = bcm6368_groups[group].num_pins; + + return 0; +} + +static int bcm6368_pinctrl_get_func_count(struct pinctrl_dev *pctldev) +{ + return ARRAY_SIZE(bcm6368_funcs); +} + +static const char *bcm6368_pinctrl_get_func_name(struct pinctrl_dev *pctldev, + unsigned selector) +{ + return bcm6368_funcs[selector].name; +} + +static int bcm6368_pinctrl_get_groups(struct pinctrl_dev *pctldev, + unsigned selector, + const char * const **groups, + unsigned * const num_groups) +{ + *groups = bcm6368_funcs[selector].groups; + *num_groups = bcm6368_funcs[selector].num_groups; + + return 0; +} + +static int bcm6368_pinctrl_set_mux(struct pinctrl_dev *pctldev, + unsigned selector, unsigned group) +{ + struct bcm63xx_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev); + struct bcm6368_priv *priv = pc->driver_data; + const struct bcm6368_pingroup *pg = &bcm6368_groups[group]; + const struct bcm6368_function *fun = &bcm6368_funcs[selector]; + int i, pin; + + if (fun->basemode) { + unsigned int mask = 0; + + for (i = 0; i < pg->num_pins; i++) { + pin = pg->pins[i]; + if (pin < BCM63XX_BANK_GPIOS) + mask |= BIT(pin); + } + + regmap_update_bits(pc->regs, BCM6368_MODE_REG, mask, 0); + regmap_field_write(priv->overlays, fun->basemode); + } else { + pin = pg->pins[0]; + + if (bcm6368_pins[pin].drv_data) + regmap_field_write(priv->overlays, + BCM6368_BASEMODE_GPIO); + + regmap_update_bits(pc->regs, BCM6368_MODE_REG, BIT(pin), + BIT(pin)); + } + + for (pin = 0; pin < pg->num_pins; pin++) { + struct pinctrl_gpio_range *range; + int hw_gpio = bcm6368_pins[pin].number; + + range = pinctrl_find_gpio_range_from_pin(pctldev, hw_gpio); + if (range) { + struct gpio_chip *gc = range->gc; + + if (fun->dir_out & BIT(pin)) + gc->direction_output(gc, hw_gpio, 0); + else + gc->direction_input(gc, hw_gpio); + } + } + + return 0; +} + +static int bcm6368_gpio_request_enable(struct pinctrl_dev *pctldev, + struct pinctrl_gpio_range *range, + unsigned offset) +{ + struct bcm63xx_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev); + struct bcm6368_priv *priv = pc->driver_data; + + if (offset >= BCM63XX_BANK_GPIOS && !bcm6368_pins[offset].drv_data) + return 0; + + /* disable all functions using this pin */ + if (offset < BCM63XX_BANK_GPIOS) + regmap_update_bits(pc->regs, BCM6368_MODE_REG, BIT(offset), 0); + + if (bcm6368_pins[offset].drv_data) + regmap_field_write(priv->overlays, BCM6368_BASEMODE_GPIO); + + return 0; +} + +static struct pinctrl_ops bcm6368_pctl_ops = { + .dt_free_map = pinctrl_utils_free_map, + .dt_node_to_map = pinconf_generic_dt_node_to_map_pin, + .get_group_name = bcm6368_pinctrl_get_group_name, + .get_group_pins = bcm6368_pinctrl_get_group_pins, + .get_groups_count = bcm6368_pinctrl_get_group_count, +}; + +static struct pinmux_ops bcm6368_pmx_ops = { + .get_function_groups = bcm6368_pinctrl_get_groups, + .get_function_name = bcm6368_pinctrl_get_func_name, + .get_functions_count = bcm6368_pinctrl_get_func_count, + .gpio_request_enable = bcm6368_gpio_request_enable, + .set_mux = bcm6368_pinctrl_set_mux, + .strict = true, +}; + +static const struct bcm63xx_pinctrl_soc bcm6368_soc = { + .ngpios = BCM6368_NUM_GPIOS, + .npins = ARRAY_SIZE(bcm6368_pins), + .pctl_ops = &bcm6368_pctl_ops, + .pins = bcm6368_pins, + .pmx_ops = &bcm6368_pmx_ops, +}; + +static int bcm6368_pinctrl_probe(struct platform_device *pdev) +{ + struct reg_field overlays = REG_FIELD(BCM6368_BASEMODE_REG, 0, 15); + struct device *dev = &pdev->dev; + struct bcm63xx_pinctrl *pc; + struct bcm6368_priv *priv; + int err; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + err = bcm63xx_pinctrl_probe(pdev, &bcm6368_soc, (void *) priv); + if (err) + return err; + + pc = platform_get_drvdata(pdev); + + priv->overlays = devm_regmap_field_alloc(dev, pc->regs, overlays); + if (IS_ERR(priv->overlays)) + return PTR_ERR(priv->overlays); + + return 0; +} + +static const struct of_device_id bcm6368_pinctrl_match[] = { + { .compatible = "brcm,bcm6368-pinctrl", }, + { /* sentinel */ } +}; + +static struct platform_driver bcm6368_pinctrl_driver = { + .probe = bcm6368_pinctrl_probe, + .driver = { + .name = "bcm6368-pinctrl", + .of_match_table = bcm6368_pinctrl_match, + }, +}; + +builtin_platform_driver(bcm6368_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 B1950C433E0 for ; Mon, 15 Mar 2021 12:04:01 +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 781BA64E90 for ; Mon, 15 Mar 2021 12:04:00 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 781BA64E90 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=BehBE18Hw+R7GISuRkK2XPl8Ld8HTWmHUFVsVgfssiU=; b=a9dEak7966KxFe5nqJf0uGuB6 xfDG7fqWIwwLxYuDIdne3Mi7VMq8BtNjVNQoxFz8Dpf20yiBwwicnuX80IppBt3OW+1+nYS8i9l5G beDpsi+4KOiZ5capWT0hfpa8T//Fz9lwx8b1yjyv793Pe5yfGhbPZTdCNx2LtSza+qFi+Rfc9juWG ZDqi84upfL9p8Y7TWtqRsKRotdV1GSdMJNfaXnt+uzv7rKJG13q7f1Y442uMuFypLvZ2F55tIBP6e 7tBvjSroOKgPUNw1PrCJocJwhfIbMak98eTRufV8DDBFm6CRA1UGHIjCgh33lPuLfK8NMhY5go6eH z0yIymsIw==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lLlt6-00Fjlz-Tf; Mon, 15 Mar 2021 12:00:28 +0000 Received: from mail-wm1-x331.google.com ([2a00:1450:4864:20::331]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lLlcH-00FguC-GC for linux-arm-kernel@lists.infradead.org; Mon, 15 Mar 2021 11:43:05 +0000 Received: by mail-wm1-x331.google.com with SMTP id y124-20020a1c32820000b029010c93864955so20057266wmy.5 for ; Mon, 15 Mar 2021 04:42:33 -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=dOYoxINTfJSWe6E+B99ZLAkTbRDqTK3CwKHMIBKB1Nk=; b=BMkHzUvITdH0ViJhy22yv07ETC20r7IDoSjhoOotQDtEoapM5PLTtJJXJmqj7uBE43 3NGZfqLoSHZkxRbubrVJdf5NOtgLmmoVwSpnILjN3aeWTaAeaEHewIo3gY3af3Hx1g6o rwHrvuZbp159NMZNlAyLeuIxFvrY4ab6c8N4Ic6/PpCMvNU/rbXg26du6vQ4q4XD9O8q vjbZwMqxvAGpGTvGF9WJR5Ec+RonVUJ+2+q+PF2D969ZxJOE0fR3saJ0UBhbW8We6r3o BtM16NRS2Ppw5FAzi1CRUDMSipF+TUkyHoaOf9QwpgZTx1Q/TUFyfninPrh7A4VmlDIj OgWA== 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=dOYoxINTfJSWe6E+B99ZLAkTbRDqTK3CwKHMIBKB1Nk=; b=BPpj2aLfM86PKDQ3vsY8JSn2yLQanD1jFbTemyzp6KyhV0K+QxJFI49epvHirqLWfZ 8kJ0cQBlyItO0tLqRwBwGYEtP4mfQuinBtk5lCBKdAw52s3rw+j4Gk1xnM5M9OxU0bJC aV4/IRcj/YFtDOv7OhBkLkRbwftYWDYEes3qglOZICUxHEJLqmTEl/DOMkRVXfxO/jxp R0LEa0F5CL3EIELote+Y0n3vrpInBLrafniFSyPqvUm8tlrXJCArQy7mKBcBZhbo12D6 FXeRf4un3vIIGJ72+/FjzoHtc1bkL2zQzqSsgCQntC+4/9qlEFqsFbbZ2ZwFqB9WteJU nwug== X-Gm-Message-State: AOAM533n9b7yLDaugIszKU5dAUV45Gkfz7iw2QL5yD+w3/r2dS2yxB2L Wz1qi5NMO2KIZfLyrxCd2sU= X-Google-Smtp-Source: ABdhPJypJ3WUVOKjJa9bP3b2OJVh74nVqXDXma3NA3lgxHEtdKIT9WF4YryvfChm+cSwVmLvkiVrpw== X-Received: by 2002:a05:600c:2282:: with SMTP id 2mr25658780wmf.93.1615808553087; Mon, 15 Mar 2021 04:42:33 -0700 (PDT) Received: from skynet.lan ([80.31.204.166]) by smtp.gmail.com with ESMTPSA id v189sm12648187wme.39.2021.03.15.04.42.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Mar 2021 04:42:32 -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 16/22] pinctrl: add a pincontrol driver for BCM6368 Date: Mon, 15 Mar 2021 12:42:08 +0100 Message-Id: <20210315114214.3096-17-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_114300_920708_6BFA117B X-CRM114-Status: GOOD ( 22.13 ) 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 QWRkIGEgcGluY29udHJvbCBkcml2ZXIgZm9yIEJDTTYzNjguIEJDTTYzNjggYWxsb3dzIG11eGlu ZyB0aGUgZmlyc3QgMzIKR1BJT3Mgb250byBhbHRlcm5hdGl2ZSBmdW5jdGlvbnMuIE5vdCBhbGwg YXJlIGRvY3VtZW50ZWQuCgpDby1kZXZlbG9wZWQtYnk6IEpvbmFzIEdvcnNraSA8am9uYXMuZ29y c2tpQGdtYWlsLmNvbT4KU2lnbmVkLW9mZi1ieTogSm9uYXMgR29yc2tpIDxqb25hcy5nb3Jza2lA Z21haWwuY29tPgpTaWduZWQtb2ZmLWJ5OiDDgWx2YXJvIEZlcm7DoW5kZXogUm9qYXMgPG5vbHRh cmlAZ21haWwuY29tPgotLS0KIHY3OiBubyBjaGFuZ2VzCiB2Njogbm8gY2hhbmdlcwogdjU6IGFk ZCBjaGFuZ2VzIHN1Z2dlc3RlZCBieSBBbmR5IFNoZXZjaGVua28KIHY0OiBubyBjaGFuZ2VzCiB2 MzogdXNlIG5ldyBzaGFyZWQgY29kZQogdjI6IHN3aXRjaCB0byBHUElPX1JFR01BUAoKIGRyaXZl cnMvcGluY3RybC9iY20vS2NvbmZpZyAgICAgICAgICAgfCAgIDggKwogZHJpdmVycy9waW5jdHJs L2JjbS9NYWtlZmlsZSAgICAgICAgICB8ICAgMSArCiBkcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0 cmwtYmNtNjM2OC5jIHwgNTIzICsrKysrKysrKysrKysrKysrKysrKysrKysrCiAzIGZpbGVzIGNo YW5nZWQsIDUzMiBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9waW5j dHJsL2JjbS9waW5jdHJsLWJjbTYzNjguYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9i Y20vS2NvbmZpZyBiL2RyaXZlcnMvcGluY3RybC9iY20vS2NvbmZpZwppbmRleCBkMzEwMWQ1ZTc1 MGYuLmFhYmQ0Yjc2MmFlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL2JjbS9LY29uZmln CisrKyBiL2RyaXZlcnMvcGluY3RybC9iY20vS2NvbmZpZwpAQCAtNjAsNiArNjAsMTQgQEAgY29u ZmlnIFBJTkNUUkxfQkNNNjM2MgogCWhlbHAKIAkgICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUg QnJvYWRjb20gQkNNNjM2MiBHUElPIGRyaXZlci4KIAorY29uZmlnIFBJTkNUUkxfQkNNNjM2OAor CWJvb2wgIkJyb2FkY29tIEJDTTYzNjggR1BJTyBkcml2ZXIiCisJZGVwZW5kcyBvbiAoQk1JUFNf R0VORVJJQyB8fCBDT01QSUxFX1RFU1QpCisJc2VsZWN0IFBJTkNUUkxfQkNNNjNYWAorCWRlZmF1 bHQgQk1JUFNfR0VORVJJQworCWhlbHAKKwkgICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgQnJv YWRjb20gQkNNNjM2OCBHUElPIGRyaXZlci4KKwogY29uZmlnIFBJTkNUUkxfSVBST0NfR1BJTwog CWJvb2wgIkJyb2FkY29tIGlQcm9jIEdQSU8gKHdpdGggUElOQ09ORikgZHJpdmVyIgogCWRlcGVu ZHMgb24gT0ZfR1BJTyAmJiAoQVJDSF9CQ01fSVBST0MgfHwgQ09NUElMRV9URVNUKQpkaWZmIC0t Z2l0IGEvZHJpdmVycy9waW5jdHJsL2JjbS9NYWtlZmlsZSBiL2RyaXZlcnMvcGluY3RybC9iY20v TWFrZWZpbGUKaW5kZXggYjliMDllNWI5MTRjLi5hMTMzMWJiOTY4MGUgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvcGluY3RybC9iY20vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9waW5jdHJsL2JjbS9NYWtl ZmlsZQpAQCAtNyw2ICs3LDcgQEAgb2JqLSQoQ09ORklHX1BJTkNUUkxfQkNNNjNYWCkJCSs9IHBp bmN0cmwtYmNtNjN4eC5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9CQ002MzI4KQkJKz0gcGluY3Ry bC1iY202MzI4Lm8KIG9iai0kKENPTkZJR19QSU5DVFJMX0JDTTYzNTgpCQkrPSBwaW5jdHJsLWJj bTYzNTgubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfQkNNNjM2MikJCSs9IHBpbmN0cmwtYmNtNjM2 Mi5vCitvYmotJChDT05GSUdfUElOQ1RSTF9CQ002MzY4KQkJKz0gcGluY3RybC1iY202MzY4Lm8K IG9iai0kKENPTkZJR19QSU5DVFJMX0lQUk9DX0dQSU8pCSs9IHBpbmN0cmwtaXByb2MtZ3Bpby5v CiBvYmotJChDT05GSUdfUElOQ1RSTF9DWUdOVVNfTVVYKQkrPSBwaW5jdHJsLWN5Z251cy1tdXgu bwogb2JqLSQoQ09ORklHX1BJTkNUUkxfTlMpCQkrPSBwaW5jdHJsLW5zLm8KZGlmZiAtLWdpdCBh L2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1iY202MzY4LmMgYi9kcml2ZXJzL3BpbmN0cmwv YmNtL3BpbmN0cmwtYmNtNjM2OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwMC4uODM4MDk1ZjllODkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL2Jj bS9waW5jdHJsLWJjbTYzNjguYwpAQCAtMCwwICsxLDUyMyBAQAorLy8gU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjArCisvKgorICogRHJpdmVyIGZvciBCQ002MzY4IEdQSU8gdW5pdCAo cGluY3RybCArIEdQSU8pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIxIMOBbHZhcm8gRmVybsOh bmRleiBSb2phcyA8bm9sdGFyaUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSm9u YXMgR29yc2tpIDxqb25hcy5nb3Jza2lAZ21haWwuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51 eC9iaXRzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51 eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0 cmwvcGlubXV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVk ZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlICIuLi9waW5jdHJsLXV0aWxzLmgiCisKKyNp bmNsdWRlICJwaW5jdHJsLWJjbTYzeHguaCIKKworI2RlZmluZSBCQ002MzY4X05VTV9HUElPUwkz OAorCisjZGVmaW5lIEJDTTYzNjhfTU9ERV9SRUcJMHgxOAorI2RlZmluZSBCQ002MzY4X0JBU0VN T0RFX1JFRwkweDM4CisjZGVmaW5lICBCQ002MzY4X0JBU0VNT0RFX01BU0sJMHg3CisjZGVmaW5l ICBCQ002MzY4X0JBU0VNT0RFX0dQSU8JMHgwCisjZGVmaW5lICBCQ002MzY4X0JBU0VNT0RFX1VB UlQxCTB4MQorCitzdHJ1Y3QgYmNtNjM2OF9waW5ncm91cCB7CisJY29uc3QgY2hhciAqbmFtZTsK Kwljb25zdCB1bnNpZ25lZCAqIGNvbnN0IHBpbnM7CisJY29uc3QgdW5zaWduZWQgbnVtX3BpbnM7 Cit9OworCitzdHJ1Y3QgYmNtNjM2OF9mdW5jdGlvbiB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlj b25zdCBjaGFyICogY29uc3QgKmdyb3VwczsKKwljb25zdCB1bnNpZ25lZCBudW1fZ3JvdXBzOwor CisJdW5zaWduZWQgZGlyX291dDoxNjsKKwl1bnNpZ25lZCBiYXNlbW9kZTozOworfTsKKworc3Ry dWN0IGJjbTYzNjhfcHJpdiB7CisJc3RydWN0IHJlZ21hcF9maWVsZCAqb3ZlcmxheXM7Cit9Owor CisjZGVmaW5lIEJDTTYzNjhfQkFTRU1PREVfUElOKGEsIGIpCQlcCisJewkJCQkJXAorCQkubnVt YmVyID0gYSwJCQlcCisJCS5uYW1lID0gYiwJCQlcCisJCS5kcnZfZGF0YSA9ICh2b2lkICopdHJ1 ZQlcCisJfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgYmNtNjM2OF9w aW5zW10gPSB7CisJUElOQ1RSTF9QSU4oMCwgImdwaW8wIiksCisJUElOQ1RSTF9QSU4oMSwgImdw aW8xIiksCisJUElOQ1RSTF9QSU4oMiwgImdwaW8yIiksCisJUElOQ1RSTF9QSU4oMywgImdwaW8z IiksCisJUElOQ1RSTF9QSU4oNCwgImdwaW80IiksCisJUElOQ1RSTF9QSU4oNSwgImdwaW81Iiks CisJUElOQ1RSTF9QSU4oNiwgImdwaW82IiksCisJUElOQ1RSTF9QSU4oNywgImdwaW83IiksCisJ UElOQ1RSTF9QSU4oOCwgImdwaW84IiksCisJUElOQ1RSTF9QSU4oOSwgImdwaW85IiksCisJUElO Q1RSTF9QSU4oMTAsICJncGlvMTAiKSwKKwlQSU5DVFJMX1BJTigxMSwgImdwaW8xMSIpLAorCVBJ TkNUUkxfUElOKDEyLCAiZ3BpbzEyIiksCisJUElOQ1RSTF9QSU4oMTMsICJncGlvMTMiKSwKKwlQ SU5DVFJMX1BJTigxNCwgImdwaW8xNCIpLAorCVBJTkNUUkxfUElOKDE1LCAiZ3BpbzE1IiksCisJ UElOQ1RSTF9QSU4oMTYsICJncGlvMTYiKSwKKwlQSU5DVFJMX1BJTigxNywgImdwaW8xNyIpLAor CVBJTkNUUkxfUElOKDE4LCAiZ3BpbzE4IiksCisJUElOQ1RSTF9QSU4oMTksICJncGlvMTkiKSwK KwlQSU5DVFJMX1BJTigyMCwgImdwaW8yMCIpLAorCVBJTkNUUkxfUElOKDIxLCAiZ3BpbzIxIiks CisJUElOQ1RSTF9QSU4oMjIsICJncGlvMjIiKSwKKwlQSU5DVFJMX1BJTigyMywgImdwaW8yMyIp LAorCVBJTkNUUkxfUElOKDI0LCAiZ3BpbzI0IiksCisJUElOQ1RSTF9QSU4oMjUsICJncGlvMjUi KSwKKwlQSU5DVFJMX1BJTigyNiwgImdwaW8yNiIpLAorCVBJTkNUUkxfUElOKDI3LCAiZ3BpbzI3 IiksCisJUElOQ1RSTF9QSU4oMjgsICJncGlvMjgiKSwKKwlQSU5DVFJMX1BJTigyOSwgImdwaW8y OSIpLAorCUJDTTYzNjhfQkFTRU1PREVfUElOKDMwLCAiZ3BpbzMwIiksCisJQkNNNjM2OF9CQVNF TU9ERV9QSU4oMzEsICJncGlvMzEiKSwKKwlCQ002MzY4X0JBU0VNT0RFX1BJTigzMiwgImdwaW8z MiIpLAorCUJDTTYzNjhfQkFTRU1PREVfUElOKDMzLCAiZ3BpbzMzIiksCisJUElOQ1RSTF9QSU4o MzQsICJncGlvMzQiKSwKKwlQSU5DVFJMX1BJTigzNSwgImdwaW8zNSIpLAorCVBJTkNUUkxfUElO KDM2LCAiZ3BpbzM2IiksCisJUElOQ1RSTF9QSU4oMzcsICJncGlvMzciKSwKK307CisKK3N0YXRp YyB1bnNpZ25lZCBncGlvMF9waW5zW10gPSB7IDAgfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvMV9w aW5zW10gPSB7IDEgfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvMl9waW5zW10gPSB7IDIgfTsKK3N0 YXRpYyB1bnNpZ25lZCBncGlvM19waW5zW10gPSB7IDMgfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlv NF9waW5zW10gPSB7IDQgfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvNV9waW5zW10gPSB7IDUgfTsK K3N0YXRpYyB1bnNpZ25lZCBncGlvNl9waW5zW10gPSB7IDYgfTsKK3N0YXRpYyB1bnNpZ25lZCBn cGlvN19waW5zW10gPSB7IDcgfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvOF9waW5zW10gPSB7IDgg fTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvOV9waW5zW10gPSB7IDkgfTsKK3N0YXRpYyB1bnNpZ25l ZCBncGlvMTBfcGluc1tdID0geyAxMCB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW8xMV9waW5zW10g PSB7IDExIH07CitzdGF0aWMgdW5zaWduZWQgZ3BpbzEyX3BpbnNbXSA9IHsgMTIgfTsKK3N0YXRp YyB1bnNpZ25lZCBncGlvMTNfcGluc1tdID0geyAxMyB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW8x NF9waW5zW10gPSB7IDE0IH07CitzdGF0aWMgdW5zaWduZWQgZ3BpbzE1X3BpbnNbXSA9IHsgMTUg fTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvMTZfcGluc1tdID0geyAxNiB9Oworc3RhdGljIHVuc2ln bmVkIGdwaW8xN19waW5zW10gPSB7IDE3IH07CitzdGF0aWMgdW5zaWduZWQgZ3BpbzE4X3BpbnNb XSA9IHsgMTggfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvMTlfcGluc1tdID0geyAxOSB9Oworc3Rh dGljIHVuc2lnbmVkIGdwaW8yMF9waW5zW10gPSB7IDIwIH07CitzdGF0aWMgdW5zaWduZWQgZ3Bp bzIxX3BpbnNbXSA9IHsgMjEgfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvMjJfcGluc1tdID0geyAy MiB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW8yM19waW5zW10gPSB7IDIzIH07CitzdGF0aWMgdW5z aWduZWQgZ3BpbzI0X3BpbnNbXSA9IHsgMjQgfTsKK3N0YXRpYyB1bnNpZ25lZCBncGlvMjVfcGlu c1tdID0geyAyNSB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW8yNl9waW5zW10gPSB7IDI2IH07Citz dGF0aWMgdW5zaWduZWQgZ3BpbzI3X3BpbnNbXSA9IHsgMjcgfTsKK3N0YXRpYyB1bnNpZ25lZCBn cGlvMjhfcGluc1tdID0geyAyOCB9Oworc3RhdGljIHVuc2lnbmVkIGdwaW8yOV9waW5zW10gPSB7 IDI5IH07CitzdGF0aWMgdW5zaWduZWQgZ3BpbzMwX3BpbnNbXSA9IHsgMzAgfTsKK3N0YXRpYyB1 bnNpZ25lZCBncGlvMzFfcGluc1tdID0geyAzMSB9Oworc3RhdGljIHVuc2lnbmVkIHVhcnQxX2dy cF9waW5zW10gPSB7IDMwLCAzMSwgMzIsIDMzIH07CisKKyNkZWZpbmUgQkNNNjM2OF9HUk9VUChu KQkJCQlcCisJewkJCQkJCVwKKwkJLm5hbWUgPSAjbiwJCQkJXAorCQkucGlucyA9IG4jI19waW5z LAkJCVwKKwkJLm51bV9waW5zID0gQVJSQVlfU0laRShuIyNfcGlucyksCVwKKwl9CisKK3N0YXRp YyBzdHJ1Y3QgYmNtNjM2OF9waW5ncm91cCBiY202MzY4X2dyb3Vwc1tdID0geworCUJDTTYzNjhf R1JPVVAoZ3BpbzApLAorCUJDTTYzNjhfR1JPVVAoZ3BpbzEpLAorCUJDTTYzNjhfR1JPVVAoZ3Bp bzIpLAorCUJDTTYzNjhfR1JPVVAoZ3BpbzMpLAorCUJDTTYzNjhfR1JPVVAoZ3BpbzQpLAorCUJD TTYzNjhfR1JPVVAoZ3BpbzUpLAorCUJDTTYzNjhfR1JPVVAoZ3BpbzYpLAorCUJDTTYzNjhfR1JP VVAoZ3BpbzcpLAorCUJDTTYzNjhfR1JPVVAoZ3BpbzgpLAorCUJDTTYzNjhfR1JPVVAoZ3Bpbzkp LAorCUJDTTYzNjhfR1JPVVAoZ3BpbzEwKSwKKwlCQ002MzY4X0dST1VQKGdwaW8xMSksCisJQkNN NjM2OF9HUk9VUChncGlvMTIpLAorCUJDTTYzNjhfR1JPVVAoZ3BpbzEzKSwKKwlCQ002MzY4X0dS T1VQKGdwaW8xNCksCisJQkNNNjM2OF9HUk9VUChncGlvMTUpLAorCUJDTTYzNjhfR1JPVVAoZ3Bp bzE2KSwKKwlCQ002MzY4X0dST1VQKGdwaW8xNyksCisJQkNNNjM2OF9HUk9VUChncGlvMTgpLAor CUJDTTYzNjhfR1JPVVAoZ3BpbzE5KSwKKwlCQ002MzY4X0dST1VQKGdwaW8yMCksCisJQkNNNjM2 OF9HUk9VUChncGlvMjEpLAorCUJDTTYzNjhfR1JPVVAoZ3BpbzIyKSwKKwlCQ002MzY4X0dST1VQ KGdwaW8yMyksCisJQkNNNjM2OF9HUk9VUChncGlvMjQpLAorCUJDTTYzNjhfR1JPVVAoZ3BpbzI1 KSwKKwlCQ002MzY4X0dST1VQKGdwaW8yNiksCisJQkNNNjM2OF9HUk9VUChncGlvMjcpLAorCUJD TTYzNjhfR1JPVVAoZ3BpbzI4KSwKKwlCQ002MzY4X0dST1VQKGdwaW8yOSksCisJQkNNNjM2OF9H Uk9VUChncGlvMzApLAorCUJDTTYzNjhfR1JPVVAoZ3BpbzMxKSwKKwlCQ002MzY4X0dST1VQKHVh cnQxX2dycCksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFuYWxvZ19hZmVfMF9n cm91cHNbXSA9IHsKKwkiZ3BpbzAiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBh bmFsb2dfYWZlXzFfZ3JvdXBzW10gPSB7CisJImdwaW8xIiwKK307CisKK3N0YXRpYyBjb25zdCBj aGFyICogY29uc3Qgc3lzX2lycV9ncm91cHNbXSA9IHsKKwkiZ3BpbzIiLAorfTsKKworc3RhdGlj IGNvbnN0IGNoYXIgKiBjb25zdCBzZXJpYWxfbGVkX2RhdGFfZ3JvdXBzW10gPSB7CisJImdwaW8z IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2VyaWFsX2xlZF9jbGtfZ3JvdXBz W10gPSB7CisJImdwaW80IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW5ldF9s ZWRfZ3JvdXBzW10gPSB7CisJImdwaW81IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29u c3QgZXBoeTBfbGVkX2dyb3Vwc1tdID0geworCSJncGlvNiIsCit9OworCitzdGF0aWMgY29uc3Qg Y2hhciAqIGNvbnN0IGVwaHkxX2xlZF9ncm91cHNbXSA9IHsKKwkiZ3BpbzciLAorfTsKKworc3Rh dGljIGNvbnN0IGNoYXIgKiBjb25zdCBlcGh5Ml9sZWRfZ3JvdXBzW10gPSB7CisJImdwaW84IiwK K307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXBoeTNfbGVkX2dyb3Vwc1tdID0gewor CSJncGlvOSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJvYm9zd19sZWRfZGF0 YV9ncm91cHNbXSA9IHsKKwkiZ3BpbzEwIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29u c3Qgcm9ib3N3X2xlZF9jbGtfZ3JvdXBzW10gPSB7CisJImdwaW8xMSIsCit9OworCitzdGF0aWMg Y29uc3QgY2hhciAqIGNvbnN0IHJvYm9zd19sZWQwX2dyb3Vwc1tdID0geworCSJncGlvMTIiLAor fTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByb2Jvc3dfbGVkMV9ncm91cHNbXSA9IHsK KwkiZ3BpbzEzIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNiX2RldmljZV9s ZWRfZ3JvdXBzW10gPSB7CisJImdwaW8xNCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNv bnN0IHBjaV9yZXExX2dyb3Vwc1tdID0geworCSJncGlvMTYiLAorfTsKKworc3RhdGljIGNvbnN0 IGNoYXIgKiBjb25zdCBwY2lfZ250MV9ncm91cHNbXSA9IHsKKwkiZ3BpbzE3IiwKK307CisKK3N0 YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNpX2ludGJfZ3JvdXBzW10gPSB7CisJImdwaW8xOCIs Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBjaV9yZXEwX2dyb3Vwc1tdID0gewor CSJncGlvMTkiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwY2lfZ250MF9ncm91 cHNbXSA9IHsKKwkiZ3BpbzIwIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNt Y2lhX2NkMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzIyIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFy ICogY29uc3QgcGNtY2lhX2NkMl9ncm91cHNbXSA9IHsKKwkiZ3BpbzIzIiwKK307CisKK3N0YXRp YyBjb25zdCBjaGFyICogY29uc3QgcGNtY2lhX3ZzMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzI0IiwK K307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNtY2lhX3ZzMl9ncm91cHNbXSA9IHsK KwkiZ3BpbzI1IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZWJpX2NzMl9ncm91 cHNbXSA9IHsKKwkiZ3BpbzI2IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZWJp X2NzM19ncm91cHNbXSA9IHsKKwkiZ3BpbzI3IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICog Y29uc3Qgc3BpX2NzMl9ncm91cHNbXSA9IHsKKwkiZ3BpbzI4IiwKK307CisKK3N0YXRpYyBjb25z dCBjaGFyICogY29uc3Qgc3BpX2NzM19ncm91cHNbXSA9IHsKKwkiZ3BpbzI5IiwKK307CisKK3N0 YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpX2NzNF9ncm91cHNbXSA9IHsKKwkiZ3BpbzMwIiwK K307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpX2NzNV9ncm91cHNbXSA9IHsKKwki Z3BpbzMxIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydDFfZ3JvdXBzW10g PSB7CisJInVhcnQxX2dycCIsCit9OworCisjZGVmaW5lIEJDTTYzNjhfRlVOKG4sIG91dCkJCQkJ XAorCXsJCQkJCQlcCisJCS5uYW1lID0gI24sCQkJCVwKKwkJLmdyb3VwcyA9IG4jI19ncm91cHMs CQkJXAorCQkubnVtX2dyb3VwcyA9IEFSUkFZX1NJWkUobiMjX2dyb3VwcyksCVwKKwkJLmRpcl9v dXQgPSBvdXQsCQkJCVwKKwl9CisKKyNkZWZpbmUgQkNNNjM2OF9CQVNFTU9ERV9GVU4obiwgdmFs LCBvdXQpCQlcCisJewkJCQkJCVwKKwkJLm5hbWUgPSAjbiwJCQkJXAorCQkuZ3JvdXBzID0gbiMj X2dyb3VwcywJCQlcCisJCS5udW1fZ3JvdXBzID0gQVJSQVlfU0laRShuIyNfZ3JvdXBzKSwJXAor CQkuYmFzZW1vZGUgPSBCQ002MzY4X0JBU0VNT0RFXyMjdmFsLAlcCisJCS5kaXJfb3V0ID0gb3V0 LAkJCQlcCisJfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJjbTYzNjhfZnVuY3Rpb24gYmNtNjM2 OF9mdW5jc1tdID0geworCUJDTTYzNjhfRlVOKGFuYWxvZ19hZmVfMCwgMSksCisJQkNNNjM2OF9G VU4oYW5hbG9nX2FmZV8xLCAxKSwKKwlCQ002MzY4X0ZVTihzeXNfaXJxLCAxKSwKKwlCQ002MzY4 X0ZVTihzZXJpYWxfbGVkX2RhdGEsIDEpLAorCUJDTTYzNjhfRlVOKHNlcmlhbF9sZWRfY2xrLCAx KSwKKwlCQ002MzY4X0ZVTihpbmV0X2xlZCwgMSksCisJQkNNNjM2OF9GVU4oZXBoeTBfbGVkLCAx KSwKKwlCQ002MzY4X0ZVTihlcGh5MV9sZWQsIDEpLAorCUJDTTYzNjhfRlVOKGVwaHkyX2xlZCwg MSksCisJQkNNNjM2OF9GVU4oZXBoeTNfbGVkLCAxKSwKKwlCQ002MzY4X0ZVTihyb2Jvc3dfbGVk X2RhdGEsIDEpLAorCUJDTTYzNjhfRlVOKHJvYm9zd19sZWRfY2xrLCAxKSwKKwlCQ002MzY4X0ZV Tihyb2Jvc3dfbGVkMCwgMSksCisJQkNNNjM2OF9GVU4ocm9ib3N3X2xlZDEsIDEpLAorCUJDTTYz NjhfRlVOKHVzYl9kZXZpY2VfbGVkLCAxKSwKKwlCQ002MzY4X0ZVTihwY2lfcmVxMSwgMCksCisJ QkNNNjM2OF9GVU4ocGNpX2dudDEsIDApLAorCUJDTTYzNjhfRlVOKHBjaV9pbnRiLCAwKSwKKwlC Q002MzY4X0ZVTihwY2lfcmVxMCwgMCksCisJQkNNNjM2OF9GVU4ocGNpX2dudDAsIDApLAorCUJD TTYzNjhfRlVOKHBjbWNpYV9jZDEsIDApLAorCUJDTTYzNjhfRlVOKHBjbWNpYV9jZDIsIDApLAor CUJDTTYzNjhfRlVOKHBjbWNpYV92czEsIDApLAorCUJDTTYzNjhfRlVOKHBjbWNpYV92czIsIDAp LAorCUJDTTYzNjhfRlVOKGViaV9jczIsIDEpLAorCUJDTTYzNjhfRlVOKGViaV9jczMsIDEpLAor CUJDTTYzNjhfRlVOKHNwaV9jczIsIDEpLAorCUJDTTYzNjhfRlVOKHNwaV9jczMsIDEpLAorCUJD TTYzNjhfRlVOKHNwaV9jczQsIDEpLAorCUJDTTYzNjhfRlVOKHNwaV9jczUsIDEpLAorCUJDTTYz NjhfQkFTRU1PREVfRlVOKHVhcnQxLCBVQVJUMSwgMHg2KSwKK307CisKK3N0YXRpYyBpbnQgYmNt NjM2OF9waW5jdHJsX2dldF9ncm91cF9jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYp Cit7CisJcmV0dXJuIEFSUkFZX1NJWkUoYmNtNjM2OF9ncm91cHMpOworfQorCitzdGF0aWMgY29u c3QgY2hhciAqYmNtNjM2OF9waW5jdHJsX2dldF9ncm91cF9uYW1lKHN0cnVjdCBwaW5jdHJsX2Rl diAqcGN0bGRldiwKKwkJCQkJCSAgdW5zaWduZWQgZ3JvdXApCit7CisJcmV0dXJuIGJjbTYzNjhf Z3JvdXBzW2dyb3VwXS5uYW1lOworfQorCitzdGF0aWMgaW50IGJjbTYzNjhfcGluY3RybF9nZXRf Z3JvdXBfcGlucyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJCSAgdW5zaWduZWQg Z3JvdXAsIGNvbnN0IHVuc2lnbmVkICoqcGlucywKKwkJCQkJICB1bnNpZ25lZCAqbnVtX3BpbnMp Cit7CisJKnBpbnMgPSBiY202MzY4X2dyb3Vwc1tncm91cF0ucGluczsKKwkqbnVtX3BpbnMgPSBi Y202MzY4X2dyb3Vwc1tncm91cF0ubnVtX3BpbnM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBiY202MzY4X3BpbmN0cmxfZ2V0X2Z1bmNfY291bnQoc3RydWN0IHBpbmN0cmxfZGV2ICpw Y3RsZGV2KQoreworCXJldHVybiBBUlJBWV9TSVpFKGJjbTYzNjhfZnVuY3MpOworfQorCitzdGF0 aWMgY29uc3QgY2hhciAqYmNtNjM2OF9waW5jdHJsX2dldF9mdW5jX25hbWUoc3RydWN0IHBpbmN0 cmxfZGV2ICpwY3RsZGV2LAorCQkJCQkJIHVuc2lnbmVkIHNlbGVjdG9yKQoreworCXJldHVybiBi Y202MzY4X2Z1bmNzW3NlbGVjdG9yXS5uYW1lOworfQorCitzdGF0aWMgaW50IGJjbTYzNjhfcGlu Y3RybF9nZXRfZ3JvdXBzKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCQkgICAgICB1 bnNpZ25lZCBzZWxlY3RvciwKKwkJCQkgICAgICBjb25zdCBjaGFyICogY29uc3QgKipncm91cHMs CisJCQkJICAgICAgdW5zaWduZWQgKiBjb25zdCBudW1fZ3JvdXBzKQoreworCSpncm91cHMgPSBi Y202MzY4X2Z1bmNzW3NlbGVjdG9yXS5ncm91cHM7CisJKm51bV9ncm91cHMgPSBiY202MzY4X2Z1 bmNzW3NlbGVjdG9yXS5udW1fZ3JvdXBzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg YmNtNjM2OF9waW5jdHJsX3NldF9tdXgoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJ CSAgIHVuc2lnbmVkIHNlbGVjdG9yLCB1bnNpZ25lZCBncm91cCkKK3sKKwlzdHJ1Y3QgYmNtNjN4 eF9waW5jdHJsICpwYyA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCXN0cnVj dCBiY202MzY4X3ByaXYgKnByaXYgPSBwYy0+ZHJpdmVyX2RhdGE7CisJY29uc3Qgc3RydWN0IGJj bTYzNjhfcGluZ3JvdXAgKnBnID0gJmJjbTYzNjhfZ3JvdXBzW2dyb3VwXTsKKwljb25zdCBzdHJ1 Y3QgYmNtNjM2OF9mdW5jdGlvbiAqZnVuID0gJmJjbTYzNjhfZnVuY3Nbc2VsZWN0b3JdOworCWlu dCBpLCBwaW47CisKKwlpZiAoZnVuLT5iYXNlbW9kZSkgeworCQl1bnNpZ25lZCBpbnQgbWFzayA9 IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IHBnLT5udW1fcGluczsgaSsrKSB7CisJCQlwaW4gPSBw Zy0+cGluc1tpXTsKKwkJCWlmIChwaW4gPCBCQ002M1hYX0JBTktfR1BJT1MpCisJCQkJbWFzayB8 PSBCSVQocGluKTsKKwkJfQorCisJCXJlZ21hcF91cGRhdGVfYml0cyhwYy0+cmVncywgQkNNNjM2 OF9NT0RFX1JFRywgbWFzaywgMCk7CisJCXJlZ21hcF9maWVsZF93cml0ZShwcml2LT5vdmVybGF5 cywgZnVuLT5iYXNlbW9kZSk7CisJfSBlbHNlIHsKKwkJcGluID0gcGctPnBpbnNbMF07CisKKwkJ aWYgKGJjbTYzNjhfcGluc1twaW5dLmRydl9kYXRhKQorCQkJcmVnbWFwX2ZpZWxkX3dyaXRlKHBy aXYtPm92ZXJsYXlzLAorCQkJCQkgICBCQ002MzY4X0JBU0VNT0RFX0dQSU8pOworCisJCXJlZ21h cF91cGRhdGVfYml0cyhwYy0+cmVncywgQkNNNjM2OF9NT0RFX1JFRywgQklUKHBpbiksCisJCQkJ ICAgQklUKHBpbikpOworCX0KKworCWZvciAocGluID0gMDsgcGluIDwgcGctPm51bV9waW5zOyBw aW4rKykgeworCQlzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlICpyYW5nZTsKKwkJaW50IGh3X2dw aW8gPSBiY202MzY4X3BpbnNbcGluXS5udW1iZXI7CisKKwkJcmFuZ2UgPSBwaW5jdHJsX2ZpbmRf Z3Bpb19yYW5nZV9mcm9tX3BpbihwY3RsZGV2LCBod19ncGlvKTsKKwkJaWYgKHJhbmdlKSB7CisJ CQlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IHJhbmdlLT5nYzsKKworCQkJaWYgKGZ1bi0+ZGlyX291 dCAmIEJJVChwaW4pKQorCQkJCWdjLT5kaXJlY3Rpb25fb3V0cHV0KGdjLCBod19ncGlvLCAwKTsK KwkJCWVsc2UKKwkJCQlnYy0+ZGlyZWN0aW9uX2lucHV0KGdjLCBod19ncGlvKTsKKwkJfQorCX0K KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTYzNjhfZ3Bpb19yZXF1ZXN0X2VuYWJs ZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJICAgICAgIHN0cnVjdCBwaW5jdHJs X2dwaW9fcmFuZ2UgKnJhbmdlLAorCQkJCSAgICAgICB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3Ry dWN0IGJjbTYzeHhfcGluY3RybCAqcGMgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2 KTsKKwlzdHJ1Y3QgYmNtNjM2OF9wcml2ICpwcml2ID0gcGMtPmRyaXZlcl9kYXRhOworCisJaWYg KG9mZnNldCA+PSBCQ002M1hYX0JBTktfR1BJT1MgJiYgIWJjbTYzNjhfcGluc1tvZmZzZXRdLmRy dl9kYXRhKQorCQlyZXR1cm4gMDsKKworCS8qIGRpc2FibGUgYWxsIGZ1bmN0aW9ucyB1c2luZyB0 aGlzIHBpbiAqLworCWlmIChvZmZzZXQgPCBCQ002M1hYX0JBTktfR1BJT1MpCisJCXJlZ21hcF91 cGRhdGVfYml0cyhwYy0+cmVncywgQkNNNjM2OF9NT0RFX1JFRywgQklUKG9mZnNldCksIDApOwor CisJaWYgKGJjbTYzNjhfcGluc1tvZmZzZXRdLmRydl9kYXRhKQorCQlyZWdtYXBfZmllbGRfd3Jp dGUocHJpdi0+b3ZlcmxheXMsIEJDTTYzNjhfQkFTRU1PREVfR1BJTyk7CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX29wcyBiY202MzY4X3BjdGxfb3BzID0geworCS5k dF9mcmVlX21hcCA9IHBpbmN0cmxfdXRpbHNfZnJlZV9tYXAsCisJLmR0X25vZGVfdG9fbWFwID0g cGluY29uZl9nZW5lcmljX2R0X25vZGVfdG9fbWFwX3BpbiwKKwkuZ2V0X2dyb3VwX25hbWUgPSBi Y202MzY4X3BpbmN0cmxfZ2V0X2dyb3VwX25hbWUsCisJLmdldF9ncm91cF9waW5zID0gYmNtNjM2 OF9waW5jdHJsX2dldF9ncm91cF9waW5zLAorCS5nZXRfZ3JvdXBzX2NvdW50ID0gYmNtNjM2OF9w aW5jdHJsX2dldF9ncm91cF9jb3VudCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGlubXV4X29wcyBi Y202MzY4X3BteF9vcHMgPSB7CisJLmdldF9mdW5jdGlvbl9ncm91cHMgPSBiY202MzY4X3BpbmN0 cmxfZ2V0X2dyb3VwcywKKwkuZ2V0X2Z1bmN0aW9uX25hbWUgPSBiY202MzY4X3BpbmN0cmxfZ2V0 X2Z1bmNfbmFtZSwKKwkuZ2V0X2Z1bmN0aW9uc19jb3VudCA9IGJjbTYzNjhfcGluY3RybF9nZXRf ZnVuY19jb3VudCwKKwkuZ3Bpb19yZXF1ZXN0X2VuYWJsZSA9IGJjbTYzNjhfZ3Bpb19yZXF1ZXN0 X2VuYWJsZSwKKwkuc2V0X211eCA9IGJjbTYzNjhfcGluY3RybF9zZXRfbXV4LAorCS5zdHJpY3Qg PSB0cnVlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBiY202M3h4X3BpbmN0cmxfc29jIGJj bTYzNjhfc29jID0geworCS5uZ3Bpb3MgPSBCQ002MzY4X05VTV9HUElPUywKKwkubnBpbnMgPSBB UlJBWV9TSVpFKGJjbTYzNjhfcGlucyksCisJLnBjdGxfb3BzID0gJmJjbTYzNjhfcGN0bF9vcHMs CisJLnBpbnMgPSBiY202MzY4X3BpbnMsCisJLnBteF9vcHMgPSAmYmNtNjM2OF9wbXhfb3BzLAor fTsKKworc3RhdGljIGludCBiY202MzY4X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVnX2ZpZWxkIG92ZXJsYXlzID0gUkVHX0ZJRUxEKEJD TTYzNjhfQkFTRU1PREVfUkVHLCAwLCAxNSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYt PmRldjsKKwlzdHJ1Y3QgYmNtNjN4eF9waW5jdHJsICpwYzsKKwlzdHJ1Y3QgYmNtNjM2OF9wcml2 ICpwcml2OworCWludCBlcnI7CisKKwlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpw cml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVy ciA9IGJjbTYzeHhfcGluY3RybF9wcm9iZShwZGV2LCAmYmNtNjM2OF9zb2MsICh2b2lkICopIHBy aXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwYyA9IHBsYXRmb3JtX2dldF9kcnZk YXRhKHBkZXYpOworCisJcHJpdi0+b3ZlcmxheXMgPSBkZXZtX3JlZ21hcF9maWVsZF9hbGxvYyhk ZXYsIHBjLT5yZWdzLCBvdmVybGF5cyk7CisJaWYgKElTX0VSUihwcml2LT5vdmVybGF5cykpCisJ CXJldHVybiBQVFJfRVJSKHByaXYtPm92ZXJsYXlzKTsKKworCXJldHVybiAwOworfQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBiY202MzY4X3BpbmN0cmxfbWF0Y2hbXSA9IHsK Kwl7IC5jb21wYXRpYmxlID0gImJyY20sYmNtNjM2OC1waW5jdHJsIiwgfSwKKwl7IC8qIHNlbnRp bmVsICovIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJjbTYzNjhfcGlu Y3RybF9kcml2ZXIgPSB7CisJLnByb2JlID0gYmNtNjM2OF9waW5jdHJsX3Byb2JlLAorCS5kcml2 ZXIgPSB7CisJCS5uYW1lID0gImJjbTYzNjgtcGluY3RybCIsCisJCS5vZl9tYXRjaF90YWJsZSA9 IGJjbTYzNjhfcGluY3RybF9tYXRjaCwKKwl9LAorfTsKKworYnVpbHRpbl9wbGF0Zm9ybV9kcml2 ZXIoYmNtNjM2OF9waW5jdHJsX2RyaXZlcik7Ci0tIAoyLjIwLjEKCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcg bGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==