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 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 07296C433EF for ; Tue, 19 Jul 2022 17:49:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236199AbiGSRtY (ORCPT ); Tue, 19 Jul 2022 13:49:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47438 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238254AbiGSRtN (ORCPT ); Tue, 19 Jul 2022 13:49:13 -0400 Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10on2126.outbound.protection.outlook.com [40.107.92.126]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DA4BB54AC7; Tue, 19 Jul 2022 10:49:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=muANlnVVu1K6OmzgtFBnTS5uSMiK4e1Fi1Acb0f4nSNb9UKoP3tRWTOV1KQ9/RUMbtU9Gcbqhu1o+oJlqkTSruOcHRtOct4vn3kCEJSkkgNhmnDlPFrhFern9/5kE1DUUBkcgPvIPlb/UBXY+Qy+1fuJ1+d3twudn94Dt4FEFUEOFMUe/tOTKnb/697QqpHnG5+DMYHIvYYXpnuL5cAj9CASwjqzKfL5WyOfV0uDbe2YvV69gu6pmtxWf9JVFsOSyg76Lu5Z9+eMZoYDnPfkjwN3CM8/QzNOXtYNpiSH0pIQu0oVDAYdEUPMRwaFLEoGaBPgzZ6CcxSoxQVEZGQ0Ug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=MOOdx8i7OJZEpkAmlQX6dRyv1uptdBTzGeWQSNeBhYA=; b=KgPr6dIj+uOVoTezI9kDMmuIGcv1i332hEW4CYEwyDJMHHNM/bjSNc3Uz1lIWvUfDYU6GRtPr19VPb9Aq0rP+P6xJzWPzzrTPaC+LjTpJV6niHLqt1zI0qiVICMAALCnwR2pRynF+k1c/8hjXpUdPiXT2cjAEz7KZSFqa9nsxi9RMCA2bkqqvRU3mScnGLppgn/ajC9zA9ujfjIe/z0sLIayD64VBnbmMpCSzQF/miDT9KfPRwYgBrHYduqAkjNsCsjew0am0MroA3/3ASNi/s2NMA8ex8oKU589yjo8g+ILysqoKstO4IIDx0TA4cUozDkxKu1DzlFhINS57ChAOg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=in-advantage.com; dmarc=pass action=none header.from=in-advantage.com; dkim=pass header.d=in-advantage.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inadvantage.onmicrosoft.com; s=selector2-inadvantage-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=MOOdx8i7OJZEpkAmlQX6dRyv1uptdBTzGeWQSNeBhYA=; b=BIQGTonxE4uQ2zzpBlmvut6Z6/ajYFbbfwLZJriiNQ2Cs3Gik13qST5eHxHZ4TnMy9VoMRd0pcDpRHbOjowrseeidD9M7S3C4cg5aS0wioMDE/KNCRyta/B1X1YkjJf+WifI83kEM48CNwiE9EKKNynD9CLhmnWKv4f7vcFdsbQ= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=in-advantage.com; Received: from MWHPR1001MB2351.namprd10.prod.outlook.com (2603:10b6:301:35::37) by BN0PR10MB4982.namprd10.prod.outlook.com (2603:10b6:408:12c::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5438.17; Tue, 19 Jul 2022 17:49:08 +0000 Received: from MWHPR1001MB2351.namprd10.prod.outlook.com ([fe80::7451:2903:45de:3912]) by MWHPR1001MB2351.namprd10.prod.outlook.com ([fe80::7451:2903:45de:3912%7]) with mapi id 15.20.5438.023; Tue, 19 Jul 2022 17:49:08 +0000 Date: Tue, 19 Jul 2022 10:49:03 -0700 From: Colin Foster To: Lee Jones Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-gpio@vger.kernel.org, Vladimir Oltean , Rob Herring , Krzysztof Kozlowski , Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Lars Povlsen , Steen Hegelund , UNGLinuxDriver@microchip.com, Linus Walleij , Wolfram Sang , Terry Bowman , Andy Shevchenko , katie.morris@in-advantage.com Subject: Re: [PATCH v13 net-next 9/9] mfd: ocelot: add support for the vsc7512 chip via spi Message-ID: References: <20220705204743.3224692-1-colin.foster@in-advantage.com> <20220705204743.3224692-10-colin.foster@in-advantage.com> Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-ClientProxiedBy: SJ0PR05CA0096.namprd05.prod.outlook.com (2603:10b6:a03:334::11) To MWHPR1001MB2351.namprd10.prod.outlook.com (2603:10b6:301:35::37) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 397b0d79-35bb-4d03-f385-08da69aefad4 X-MS-TrafficTypeDiagnostic: BN0PR10MB4982:EE_ X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: v/cM2ONAVSB+XhsBCSphIyzGHq53YaN6nKpA4fBE3CzlFYrHzFi0s3z0WY+yUGq3pRXozKSFvXMOv90VFCCZOCRGmqZi4xsgfb/HrivJLtxCKWQvq9uCl0ovkz9BxBifEBBTCSkrlgcoNZpm0CNMoBIxn0IukGdC9nd/bseE7dcq8tIsjrtATN3ehfCROmyjk0tiV1qEUoBLV470a37LkLk0R877/LDED1yHEyQKf+s/ZEGPY04KSStP2OZIm5gYjwyIrFSKyUTHFculmCpAnBMPECgiQKk9CL04nVQb43mfzREX17xTVYgCuyioIbrJIePbvZ4Zk7iidBZnaYrVOPhDfcnLux/FK2LJn6nrSXhAA7lrKEToQaA+ghdRfYncoWGQiVyHg5AhHroL8zpZe8rP65fSXfk+cKqfqMerVlkId7JV+ByydFkVLx7vxlD1O429e+n1PucOwCncMgxMWUbQt+guGejZYxwLkghlUJebpFe9NdfC0x0lErEY2XarM8l8LYbJb9aV/ljfwu2wQNy1K6HOqtJwKNpWln9ETln14tsoaybrtblLSJP+Rb08m0RXhrMo5kwvwlKm9abc8JJWSNBt7Y8AIqkD69VOF+2rjWpiKIyxBlgIk1Nc8sTIovBLhsYGK3nZvwoLKlfiEMnE5f8wYqbVIfYBgTxLk/ZRJdAPiK5SDsMGrgkRBMhEE/bf4AgIcmXuDvqxUtz6QlKSmFOugzoOUXn281t6cOjyyq5Ztt5Jtfh+enZGPlcdm4NZAs41teeADXMw0n40WQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MWHPR1001MB2351.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(7916004)(39830400003)(396003)(376002)(366004)(136003)(346002)(86362001)(66476007)(38100700002)(66556008)(54906003)(316002)(66946007)(8676002)(2906002)(4326008)(6916009)(30864003)(8936002)(186003)(107886003)(5660300002)(33716001)(7416002)(9686003)(6486002)(966005)(478600001)(6512007)(83380400001)(26005)(6666004)(41300700001)(6506007)(44832011);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RmhZSk1KTDVxQUpEemxlZEc4bkIraDVCNGJWK1R2MEs3NkRIbVRNQVo2Y25a?= =?utf-8?B?ajZCcm1vNXEyTHkrQmp6dTZrN0F5c1FSVGh4V0I4QlJaUnhjQnNJU2hFckJT?= =?utf-8?B?dHA4SjYrb1lKWS80ZklCWU5XTTIxM0hjM1dzMnNEVmw4LzRaTUNvMVEzRmh3?= =?utf-8?B?Y3N3VWsrNU4vWXhmQVJZVGE3ekhnamRBOUd6ai93TUFuTm1aVjA4UGpwTTg4?= =?utf-8?B?UUNwNFJPWDNIMGdjWjh2aXRQSjlvdjdST2drNDdSWXpTKzIwa0dBQjI4d0dR?= =?utf-8?B?dG5zNUh6YVBCRmk0cXpVR1gyOXlXWUZZRG1Td2pkb0hnRHVKUlAxRlpDdXV4?= =?utf-8?B?R1h0U0VCZkQraEYrY3JzdkhCK1hOL1dOVjZuaWFQZVNjWlRkL0lJRFVBQnYx?= =?utf-8?B?bUZjaEYxRGpzZTVQMjJQUGN3N25xMkRleTlmNzBEOGRJdHJKZEoydHUvaCtv?= =?utf-8?B?TmlqandpeGFxQUhidDFNdVR6ZlMyTWhVRXg2RjQ1OFFsTW1xdTdTV3B3Wkp3?= =?utf-8?B?NktuaHFNeHV1K2ZjWUtMbE5jVXFnVHBkNjB1Z3YzOXFuaWFuSE96YzJqV3Zu?= =?utf-8?B?TUxCUkxGb28vbXhvamQ0STNzVE1mUDc5Z2VyQk5mQmJOdlZ6MTYwcmtPRkJt?= =?utf-8?B?b1Z3OGlhRjdBMk9XZUdXSWE1UkFCb2ZjeUYzbXZYL3BDQmJPTkc4MzBkOVdj?= =?utf-8?B?RnVTM0xOOW0waHd5OE9tYmpTdkUwazJkanhPd1pveFB6WTFvamJEclduVUZE?= =?utf-8?B?eFJwK1VmSHlvbmlmYVZtamN4OXpJTnhrN284Q0lmYXdZMG5jaTl5cU1BYlNs?= =?utf-8?B?UUtPODZYV1FkNS9XMjlYV2pWcy9ON0hLVkQ2KzNVQjlUUVlkeEZuMVVlQStx?= =?utf-8?B?eU5oMkpwK0pCUkZ6VEFnVGc3NUkyVC8zQTZnVFhGTUNLN3JGQ0VYNEN6TnJO?= =?utf-8?B?b2dGbWpRamZibnZJMGZNbGdWeTRTRHlDNGVUeWp6MlpyYmJYc1pUaEdtT2xz?= =?utf-8?B?WWJvVHpqaFY3NzhZbHdvVklrYTVKYXRrajNUNEZIY2hGVURNelFnUUlaOFdh?= =?utf-8?B?c0NmSVJUT05IRVJVYk9zdXUyMTRIOVdoUUwvVHZZaUdxNFZRcFdlUCt0S0pZ?= =?utf-8?B?RXRJcktRaXQ1ZlRUNllRK1h6U3ZWMjVxWmYxZmxOTFFQdnFZb2lUMTV1elhW?= =?utf-8?B?Vjh1eUhWZFhVbmRoMEdTMUN0b2xMTHYwMitjNlozWGxaRXYrUlBsSGNzcUMx?= =?utf-8?B?UGt6bEF2R3p1TnZxMk1aMGhxR2F6dUZhNCs5d08zNVl1S2ZyVi9HUTkra2Jr?= =?utf-8?B?ZldSR2NyV3kvUjFNR2oxbFUxajZMVTZ4SjQxN0tIRVNncDV3WnRMUStMS214?= =?utf-8?B?MXRVbHhXN3V6MjNVYjdDN1czejhmL2ZEYUQ0YzQ2UlgwUmIvQlB5bkFKMGpR?= =?utf-8?B?bitIK0tVTnNYQjlJdUtxWXBGWm5nNitydjhVSmtCYkw1RU9RL2h0MkFLQXNI?= =?utf-8?B?RDBzQkVQN2xuVTEzTnYybVBrWWgzQ1d4V29FSjQwOUUyZzd5MmM5NWtGSkE2?= =?utf-8?B?OHUxNmxEVHdmUFY2NXpEb1pDaDhsYnZFYU5iSUsrbTN1Q012bkVHWlBIZWt5?= =?utf-8?B?NGpwLzdXUzZmQktGcVlWcXRpMU1nRW05eS82MjJhUG9CYmxYdlY2aUFJSVZW?= =?utf-8?B?a25tWEhQcFdHMWpNYnRXNGNxK2ZQUkErSUNxMy9VdkI3OEZWSEhGczRhVWkr?= =?utf-8?B?alg3N0Nxd1pTcGl1OGFMRTJyYjAxSlk2YWlFSHF5T1J5TU1HUUFFSER2dXM3?= =?utf-8?B?UlNjYTcxUnlpdTNXU2N3MGdLQUVwQUc2UFJYUW9EUjVhUER2UUxXc1ZPVXR2?= =?utf-8?B?YnY1S0FDR1ZPYmNGUkRNOGdtV1kvck1nZjFiTVhBdHRkVUlHckFGT3lScWZH?= =?utf-8?B?aEJPR2VrRmNxQmo0bzJKQlhkQlQ4WTRpTWJhb1JaSlVGYkc2NkRxc3BGUHNF?= =?utf-8?B?bW9HbVJ5NXZqMGphVldxSlZwamVocUZuOXBxbzFvb1VienpBNHM4Mi80NUd5?= =?utf-8?B?eXkyckRwNzY4UDRoZ3NBeWJlWUtPY29YRlM2U0VuKzUxQlkrT0lMZzFUbGps?= =?utf-8?B?YmRZTzBxU1M1UHJCMXBYNm5SMHdzTVAxVXRHNWZJejBDMk96dHF0bGNQSlB6?= =?utf-8?B?UVE9PQ==?= X-OriginatorOrg: in-advantage.com X-MS-Exchange-CrossTenant-Network-Message-Id: 397b0d79-35bb-4d03-f385-08da69aefad4 X-MS-Exchange-CrossTenant-AuthSource: MWHPR1001MB2351.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jul 2022 17:49:08.3113 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 48e842ca-fbd8-4633-a79d-0c955a7d3aae X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: FUsaNOn8pBPCGmA1YLbanZ5QeNloMz7lMfSW3wGoW+P0ZJV9+EluY5Kn+WntbPilBeAhq4HBAxGT2utgJeVEraq0upWZGLjkgfJ7AjJh6N4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN0PR10MB4982 Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org On Mon, Jul 18, 2022 at 03:18:28PM +0100, Lee Jones wrote: > On Tue, 05 Jul 2022, Colin Foster wrote: > > > +MODULE_IMPORT_NS(MFD_OCELOT_SPI); > > diff --git a/drivers/mfd/ocelot-spi.c b/drivers/mfd/ocelot-spi.c > > new file mode 100644 > > index 000000000000..0c1c5215c706 > > --- /dev/null > > +++ b/drivers/mfd/ocelot-spi.c > > @@ -0,0 +1,317 @@ > > +// SPDX-License-Identifier: (GPL-2.0 OR MIT) > > +/* > > + * SPI core driver for the Ocelot chip family. > > + * > > + * This driver will handle everything necessary to allow for communication over > > + * SPI to the VSC7511, VSC7512, VSC7513 and VSC7514 chips. The main functions > > + * are to prepare the chip's SPI interface for a specific bus speed, and a host > > + * processor's endianness. This will create and distribute regmaps for any > > + * children. > > + * > > + * Copyright 2021, 2022 Innovative Advantage Inc. > > + * > > + * Author: Colin Foster > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include > > + > > +#include "ocelot.h" > > + > > +#define REG_DEV_CPUORG_IF_CTRL 0x0000 > > +#define REG_DEV_CPUORG_IF_CFGSTAT 0x0004 > > + > > +#define CFGSTAT_IF_NUM_VCORE (0 << 24) > > +#define CFGSTAT_IF_NUM_VRAP (1 << 24) > > +#define CFGSTAT_IF_NUM_SI (2 << 24) > > +#define CFGSTAT_IF_NUM_MIIM (3 << 24) > > + > > +#define VSC7512_DEVCPU_ORG_RES_START 0x71000000 > > +#define VSC7512_DEVCPU_ORG_RES_SIZE 0x38 > > + > > +#define VSC7512_CHIP_REGS_RES_START 0x71070000 > > +#define VSC7512_CHIP_REGS_RES_SIZE 0x14 > > + > > +struct spi_device; > > Why not just #include? I mis-understood this to mean drivers/mfd/ocelot-spi.c when it meant drivers/mfd/ocelot.h. Thanks. https://patchwork.kernel.org/project/netdevbpf/patch/20220701192609.3970317-10-colin.foster@in-advantage.com/#24921057 """ You missed a lot of forward declarations that are used in this file. Like struct spi_device; """ > > +static int ocelot_spi_regmap_bus_read(void *context, > > + const void *reg, size_t reg_size, > > + void *val, size_t val_size) > > +{ > > + struct ocelot_ddata *ddata = context; > > + struct spi_transfer tx, padding, rx; > > + struct spi_device *spi = ddata->spi; > > + struct spi_message msg; > > + > > + spi = ddata->spi; > > Drop this line. Yes - and actually since I'm removing ddata->spi altogether it'll become to_spi_device(ddata->dev) (obviously without the double-assignment that you're pointing out here) > > > + spi_message_init(&msg); > > + > > + memset(&tx, 0, sizeof(tx)); > > + > > + tx.tx_buf = reg; > > + tx.len = reg_size; > > + > > + spi_message_add_tail(&tx, &msg); > > + > > + if (ddata->spi_padding_bytes) { > > + memset(&padding, 0, sizeof(padding)); > > + > > + padding.len = ddata->spi_padding_bytes; > > + padding.tx_buf = ddata->dummy_buf; > > + padding.dummy_data = 1; > > + > > + spi_message_add_tail(&padding, &msg); > > + } > > + > > + memset(&rx, 0, sizeof(rx)); > > + rx.rx_buf = val; > > + rx.len = val_size; > > + > > + spi_message_add_tail(&rx, &msg); > > + > > + return spi_sync(spi, &msg); > > +} > > + > > +static int ocelot_spi_regmap_bus_write(void *context, const void *data, > > + size_t count) > > +{ > > + struct ocelot_ddata *ddata = context; > > + struct spi_device *spi = ddata->spi; As above, I'm changing to to_spi_device(ddata->dev) > > + > > + return spi_write(spi, data, count); > > +} > > + > > +static const struct regmap_bus ocelot_spi_regmap_bus = { > > + .write = ocelot_spi_regmap_bus_write, > > + .read = ocelot_spi_regmap_bus_read, > > +}; > > + > > +struct regmap * > > +ocelot_spi_init_regmap(struct device *dev, const struct resource *res) > > One line, along with all the others. > > > +{ > > + struct ocelot_ddata *ddata = dev_get_drvdata(dev); > > + struct regmap_config regmap_config; > > + > > + memcpy(®map_config, &ocelot_spi_regmap_config, > > + sizeof(regmap_config)); > > + > > + regmap_config.name = res->name; > > + regmap_config.max_register = res->end - res->start; > > + regmap_config.reg_base = res->start; > > + > > + return devm_regmap_init(dev, &ocelot_spi_regmap_bus, ddata, > > + ®map_config); > > +} > > +EXPORT_SYMBOL_NS(ocelot_spi_init_regmap, MFD_OCELOT_SPI); > > + > > +static int ocelot_spi_probe(struct spi_device *spi) > > +{ > > + struct device *dev = &spi->dev; > > + struct ocelot_ddata *ddata; > > + struct regmap *r; > > + int err; > > + > > + ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL); > > + if (!ddata) > > + return -ENOMEM; > > + > > + ddata->dev = dev; > > How are you fetching ddata if you don't already have 'dev'? I don't think I fully understand this question... Are you saying ddata doesn't need a dev instance? So instead of: devm_regmap_init(dev, &bus, ddata, ®map_config); It could be: devm_regmap_init(dev, &bus, dev, ®map_config); In that case, the context into ocelot_spi_regmap_bus_{read,write} would be dev, instead of ddata. Then I get ddata from device via: static int ocelot_spi_regmap_bus_write(void *context,...) { struct device *dev = context; struct ocelot_ddata *ddata = dev_get_drvdata(dev); struct spi_device *spi = to_spi_device(dev); /* ddata isn't actually needed for bus_write, just making a point */ ... } I haven't tested this yet, but I think this is what you're suggesting. So now I've removed both spi and dev from the ddata struct (as I mention below). Cool. > > > + dev_set_drvdata(dev, ddata); > > This should use the spi_* variant. Agreed. > > > + if (spi->max_speed_hz <= 500000) { > > + ddata->spi_padding_bytes = 0; > > + } else { > > + /* > > + * Calculation taken from the manual for IF_CFGSTAT:IF_CFG. > > + * Register access time is 1us, so we need to configure and send > > + * out enough padding bytes between the read request and data > > + * transmission that lasts at least 1 microsecond. > > + */ > > + ddata->spi_padding_bytes = 1 + > > + (spi->max_speed_hz / 1000000 + 2) / 8; > > + > > + ddata->dummy_buf = devm_kzalloc(dev, ddata->spi_padding_bytes, > > + GFP_KERNEL); > > + if (!ddata->dummy_buf) > > + return -ENOMEM; > > + } > > + > > + ddata->spi = spi; > > If you have 'spi' you definitely do not need 'dev'. > > You can derive one from the other. Good point. As I implied above, I'm dropping "spi" from the ddata struct and will recover spi from to_spi_device(dev) That does some nice things like removes "struct spi_device" from drivers/mfd/ocelot.h > > + spi->bits_per_word = 8; > > + > > + err = spi_setup(spi); > > + if (err < 0) > > + return dev_err_probe(&spi->dev, err, > > + "Error performing SPI setup\n"); > > + > > + r = ocelot_spi_init_regmap(dev, &vsc7512_dev_cpuorg_resource); > > + if (IS_ERR(r)) > > + return PTR_ERR(r); > > + > > + ddata->cpuorg_regmap = r; > > + > > + r = ocelot_spi_init_regmap(dev, &vsc7512_gcb_resource); > > + if (IS_ERR(r)) > > + return PTR_ERR(r); > > + > > + ddata->gcb_regmap = r; > > + > > + /* > > + * The chip must be set up for SPI before it gets initialized and reset. > > + * This must be done before calling init, and after a chip reset is > > + * performed. > > + */ > > + err = ocelot_spi_initialize(dev); > > + if (err) > > + return dev_err_probe(dev, err, "Error initializing SPI bus\n"); > > + > > + err = ocelot_chip_reset(dev); > > + if (err) > > + return dev_err_probe(dev, err, "Error resetting device\n"); > > + > > + /* > > + * A chip reset will clear the SPI configuration, so it needs to be done > > + * again before we can access any registers > > + */ > > + err = ocelot_spi_initialize(dev); > > + if (err) > > + return dev_err_probe(dev, err, > > + "Error initializing SPI bus after reset\n"); > > + > > + err = ocelot_core_init(dev); > > + if (err < 0) > > + return dev_err_probe(dev, err, > > + "Error initializing Ocelot core\n"); > > + > > + return 0; > > +} > > + > > +static const struct spi_device_id ocelot_spi_ids[] = { > > + { "vsc7512", 0 }, > > + { } > > +}; > > + > > +static const struct of_device_id ocelot_spi_of_match[] = { > > + { .compatible = "mscc,vsc7512" }, > > + { } > > +}; > > +MODULE_DEVICE_TABLE(of, ocelot_spi_of_match); > > + > > +static struct spi_driver ocelot_spi_driver = { > > + .driver = { > > + .name = "ocelot-soc", > > + .of_match_table = ocelot_spi_of_match, > > + }, > > + .id_table = ocelot_spi_ids, > > + .probe = ocelot_spi_probe, > > +}; > > +module_spi_driver(ocelot_spi_driver); > > + > > +MODULE_DESCRIPTION("SPI Controlled Ocelot Chip Driver"); > > +MODULE_AUTHOR("Colin Foster "); > > +MODULE_LICENSE("Dual MIT/GPL"); > > +MODULE_IMPORT_NS(MFD_OCELOT); > > diff --git a/drivers/mfd/ocelot.h b/drivers/mfd/ocelot.h > > new file mode 100644 > > index 000000000000..c86bd6990a3c > > --- /dev/null > > +++ b/drivers/mfd/ocelot.h > > @@ -0,0 +1,34 @@ > > +/* SPDX-License-Identifier: GPL-2.0 OR MIT */ > > +/* Copyright 2021, 2022 Innovative Advantage Inc. */ > > + > > +#include > > + > > +struct device; > > +struct spi_device; > > +struct regmap; > > +struct resource; > > + > > +struct ocelot_ddata { > > + struct device *dev; > > + struct regmap *gcb_regmap; > > + struct regmap *cpuorg_regmap; > > + int spi_padding_bytes; > > + struct spi_device *spi; > > + void *dummy_buf; > > +}; > > This looks like it deserves a doc header. Will do! > > > +int ocelot_chip_reset(struct device *dev); > > +int ocelot_core_init(struct device *dev); > > + > > +/* SPI-specific routines that won't be necessary for other interfaces */ > > +struct regmap *ocelot_spi_init_regmap(struct device *dev, > > + const struct resource *res); > > + > > +#define OCELOT_SPI_BYTE_ORDER_LE 0x00000000 > > +#define OCELOT_SPI_BYTE_ORDER_BE 0x81818181 > > + > > +#ifdef __LITTLE_ENDIAN > > +#define OCELOT_SPI_BYTE_ORDER OCELOT_SPI_BYTE_ORDER_LE > > +#else > > +#define OCELOT_SPI_BYTE_ORDER OCELOT_SPI_BYTE_ORDER_BE > > +#endif > > -- > Lee Jones [李琼斯] > Principal Technical Lead - Developer Services > Linaro.org │ Open source software for Arm SoCs > Follow Linaro: Facebook | Twitter | Blog 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 6D48CC433EF for ; Tue, 19 Jul 2022 17:50:33 +0000 (UTC) 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:In-Reply-To:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=sRA6JLdKMxt+PNqb78PE2ISMdJlG1nvb0O/w2iy8URI=; b=d48+KLhUZCVKu9 02B3GRdq3N/WlycgZXwlZQgOvIOuSqoGaELQ7jcX56/Cwa6/wG+oYMYhGYauK3n12ifV1dFt98VHk XcKJ0m5fBYjwgPdJctN2fN/zxfONH12aF7hABbc/Aq8YHtC/MQgmeNW1jjBZuIR9ACuLu2siMJZpR iM8OUT8ZlUFIgW26FXVRUENWHEnpQVU6QqM3CzcMV2oaitVIxkkJOo7p/LYjut/kfu2uwRSQUYe4I 7mJZpRKp/WvBncwh15fd7/eOcsOzMAV6xPzjvJro+FFrSVOrSeyS691HYPuZp9Duvl/EwgInrflx5 hBLbfSGf439ZgiXEZFQw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oDrLW-00Axhx-JA; Tue, 19 Jul 2022 17:49:22 +0000 Received: from mail-bn7nam10on2114.outbound.protection.outlook.com ([40.107.92.114] helo=NAM10-BN7-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oDrLS-00Axdk-9n for linux-arm-kernel@lists.infradead.org; Tue, 19 Jul 2022 17:49:20 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=muANlnVVu1K6OmzgtFBnTS5uSMiK4e1Fi1Acb0f4nSNb9UKoP3tRWTOV1KQ9/RUMbtU9Gcbqhu1o+oJlqkTSruOcHRtOct4vn3kCEJSkkgNhmnDlPFrhFern9/5kE1DUUBkcgPvIPlb/UBXY+Qy+1fuJ1+d3twudn94Dt4FEFUEOFMUe/tOTKnb/697QqpHnG5+DMYHIvYYXpnuL5cAj9CASwjqzKfL5WyOfV0uDbe2YvV69gu6pmtxWf9JVFsOSyg76Lu5Z9+eMZoYDnPfkjwN3CM8/QzNOXtYNpiSH0pIQu0oVDAYdEUPMRwaFLEoGaBPgzZ6CcxSoxQVEZGQ0Ug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=MOOdx8i7OJZEpkAmlQX6dRyv1uptdBTzGeWQSNeBhYA=; b=KgPr6dIj+uOVoTezI9kDMmuIGcv1i332hEW4CYEwyDJMHHNM/bjSNc3Uz1lIWvUfDYU6GRtPr19VPb9Aq0rP+P6xJzWPzzrTPaC+LjTpJV6niHLqt1zI0qiVICMAALCnwR2pRynF+k1c/8hjXpUdPiXT2cjAEz7KZSFqa9nsxi9RMCA2bkqqvRU3mScnGLppgn/ajC9zA9ujfjIe/z0sLIayD64VBnbmMpCSzQF/miDT9KfPRwYgBrHYduqAkjNsCsjew0am0MroA3/3ASNi/s2NMA8ex8oKU589yjo8g+ILysqoKstO4IIDx0TA4cUozDkxKu1DzlFhINS57ChAOg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=in-advantage.com; dmarc=pass action=none header.from=in-advantage.com; dkim=pass header.d=in-advantage.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inadvantage.onmicrosoft.com; s=selector2-inadvantage-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=MOOdx8i7OJZEpkAmlQX6dRyv1uptdBTzGeWQSNeBhYA=; b=BIQGTonxE4uQ2zzpBlmvut6Z6/ajYFbbfwLZJriiNQ2Cs3Gik13qST5eHxHZ4TnMy9VoMRd0pcDpRHbOjowrseeidD9M7S3C4cg5aS0wioMDE/KNCRyta/B1X1YkjJf+WifI83kEM48CNwiE9EKKNynD9CLhmnWKv4f7vcFdsbQ= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=in-advantage.com; Received: from MWHPR1001MB2351.namprd10.prod.outlook.com (2603:10b6:301:35::37) by BN0PR10MB4982.namprd10.prod.outlook.com (2603:10b6:408:12c::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5438.17; Tue, 19 Jul 2022 17:49:08 +0000 Received: from MWHPR1001MB2351.namprd10.prod.outlook.com ([fe80::7451:2903:45de:3912]) by MWHPR1001MB2351.namprd10.prod.outlook.com ([fe80::7451:2903:45de:3912%7]) with mapi id 15.20.5438.023; Tue, 19 Jul 2022 17:49:08 +0000 Date: Tue, 19 Jul 2022 10:49:03 -0700 From: Colin Foster To: Lee Jones Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-gpio@vger.kernel.org, Vladimir Oltean , Rob Herring , Krzysztof Kozlowski , Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Lars Povlsen , Steen Hegelund , UNGLinuxDriver@microchip.com, Linus Walleij , Wolfram Sang , Terry Bowman , Andy Shevchenko , katie.morris@in-advantage.com Subject: Re: [PATCH v13 net-next 9/9] mfd: ocelot: add support for the vsc7512 chip via spi Message-ID: References: <20220705204743.3224692-1-colin.foster@in-advantage.com> <20220705204743.3224692-10-colin.foster@in-advantage.com> Content-Disposition: inline In-Reply-To: X-ClientProxiedBy: SJ0PR05CA0096.namprd05.prod.outlook.com (2603:10b6:a03:334::11) To MWHPR1001MB2351.namprd10.prod.outlook.com (2603:10b6:301:35::37) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 397b0d79-35bb-4d03-f385-08da69aefad4 X-MS-TrafficTypeDiagnostic: BN0PR10MB4982:EE_ X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: v/cM2ONAVSB+XhsBCSphIyzGHq53YaN6nKpA4fBE3CzlFYrHzFi0s3z0WY+yUGq3pRXozKSFvXMOv90VFCCZOCRGmqZi4xsgfb/HrivJLtxCKWQvq9uCl0ovkz9BxBifEBBTCSkrlgcoNZpm0CNMoBIxn0IukGdC9nd/bseE7dcq8tIsjrtATN3ehfCROmyjk0tiV1qEUoBLV470a37LkLk0R877/LDED1yHEyQKf+s/ZEGPY04KSStP2OZIm5gYjwyIrFSKyUTHFculmCpAnBMPECgiQKk9CL04nVQb43mfzREX17xTVYgCuyioIbrJIePbvZ4Zk7iidBZnaYrVOPhDfcnLux/FK2LJn6nrSXhAA7lrKEToQaA+ghdRfYncoWGQiVyHg5AhHroL8zpZe8rP65fSXfk+cKqfqMerVlkId7JV+ByydFkVLx7vxlD1O429e+n1PucOwCncMgxMWUbQt+guGejZYxwLkghlUJebpFe9NdfC0x0lErEY2XarM8l8LYbJb9aV/ljfwu2wQNy1K6HOqtJwKNpWln9ETln14tsoaybrtblLSJP+Rb08m0RXhrMo5kwvwlKm9abc8JJWSNBt7Y8AIqkD69VOF+2rjWpiKIyxBlgIk1Nc8sTIovBLhsYGK3nZvwoLKlfiEMnE5f8wYqbVIfYBgTxLk/ZRJdAPiK5SDsMGrgkRBMhEE/bf4AgIcmXuDvqxUtz6QlKSmFOugzoOUXn281t6cOjyyq5Ztt5Jtfh+enZGPlcdm4NZAs41teeADXMw0n40WQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MWHPR1001MB2351.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(7916004)(39830400003)(396003)(376002)(366004)(136003)(346002)(86362001)(66476007)(38100700002)(66556008)(54906003)(316002)(66946007)(8676002)(2906002)(4326008)(6916009)(30864003)(8936002)(186003)(107886003)(5660300002)(33716001)(7416002)(9686003)(6486002)(966005)(478600001)(6512007)(83380400001)(26005)(6666004)(41300700001)(6506007)(44832011);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RmhZSk1KTDVxQUpEemxlZEc4bkIraDVCNGJWK1R2MEs3NkRIbVRNQVo2Y25a?= =?utf-8?B?ajZCcm1vNXEyTHkrQmp6dTZrN0F5c1FSVGh4V0I4QlJaUnhjQnNJU2hFckJT?= =?utf-8?B?dHA4SjYrb1lKWS80ZklCWU5XTTIxM0hjM1dzMnNEVmw4LzRaTUNvMVEzRmh3?= =?utf-8?B?Y3N3VWsrNU4vWXhmQVJZVGE3ekhnamRBOUd6ai93TUFuTm1aVjA4UGpwTTg4?= =?utf-8?B?UUNwNFJPWDNIMGdjWjh2aXRQSjlvdjdST2drNDdSWXpTKzIwa0dBQjI4d0dR?= =?utf-8?B?dG5zNUh6YVBCRmk0cXpVR1gyOXlXWUZZRG1Td2pkb0hnRHVKUlAxRlpDdXV4?= =?utf-8?B?R1h0U0VCZkQraEYrY3JzdkhCK1hOL1dOVjZuaWFQZVNjWlRkL0lJRFVBQnYx?= =?utf-8?B?bUZjaEYxRGpzZTVQMjJQUGN3N25xMkRleTlmNzBEOGRJdHJKZEoydHUvaCtv?= =?utf-8?B?TmlqandpeGFxQUhidDFNdVR6ZlMyTWhVRXg2RjQ1OFFsTW1xdTdTV3B3Wkp3?= =?utf-8?B?NktuaHFNeHV1K2ZjWUtMbE5jVXFnVHBkNjB1Z3YzOXFuaWFuSE96YzJqV3Zu?= =?utf-8?B?TUxCUkxGb28vbXhvamQ0STNzVE1mUDc5Z2VyQk5mQmJOdlZ6MTYwcmtPRkJt?= =?utf-8?B?b1Z3OGlhRjdBMk9XZUdXSWE1UkFCb2ZjeUYzbXZYL3BDQmJPTkc4MzBkOVdj?= =?utf-8?B?RnVTM0xOOW0waHd5OE9tYmpTdkUwazJkanhPd1pveFB6WTFvamJEclduVUZE?= =?utf-8?B?eFJwK1VmSHlvbmlmYVZtamN4OXpJTnhrN284Q0lmYXdZMG5jaTl5cU1BYlNs?= =?utf-8?B?UUtPODZYV1FkNS9XMjlYV2pWcy9ON0hLVkQ2KzNVQjlUUVlkeEZuMVVlQStx?= =?utf-8?B?eU5oMkpwK0pCUkZ6VEFnVGc3NUkyVC8zQTZnVFhGTUNLN3JGQ0VYNEN6TnJO?= =?utf-8?B?b2dGbWpRamZibnZJMGZNbGdWeTRTRHlDNGVUeWp6MlpyYmJYc1pUaEdtT2xz?= =?utf-8?B?WWJvVHpqaFY3NzhZbHdvVklrYTVKYXRrajNUNEZIY2hGVURNelFnUUlaOFdh?= =?utf-8?B?c0NmSVJUT05IRVJVYk9zdXUyMTRIOVdoUUwvVHZZaUdxNFZRcFdlUCt0S0pZ?= =?utf-8?B?RXRJcktRaXQ1ZlRUNllRK1h6U3ZWMjVxWmYxZmxOTFFQdnFZb2lUMTV1elhW?= =?utf-8?B?Vjh1eUhWZFhVbmRoMEdTMUN0b2xMTHYwMitjNlozWGxaRXYrUlBsSGNzcUMx?= =?utf-8?B?UGt6bEF2R3p1TnZxMk1aMGhxR2F6dUZhNCs5d08zNVl1S2ZyVi9HUTkra2Jr?= =?utf-8?B?ZldSR2NyV3kvUjFNR2oxbFUxajZMVTZ4SjQxN0tIRVNncDV3WnRMUStMS214?= =?utf-8?B?MXRVbHhXN3V6MjNVYjdDN1czejhmL2ZEYUQ0YzQ2UlgwUmIvQlB5bkFKMGpR?= =?utf-8?B?bitIK0tVTnNYQjlJdUtxWXBGWm5nNitydjhVSmtCYkw1RU9RL2h0MkFLQXNI?= =?utf-8?B?RDBzQkVQN2xuVTEzTnYybVBrWWgzQ1d4V29FSjQwOUUyZzd5MmM5NWtGSkE2?= =?utf-8?B?OHUxNmxEVHdmUFY2NXpEb1pDaDhsYnZFYU5iSUsrbTN1Q012bkVHWlBIZWt5?= =?utf-8?B?NGpwLzdXUzZmQktGcVlWcXRpMU1nRW05eS82MjJhUG9CYmxYdlY2aUFJSVZW?= =?utf-8?B?a25tWEhQcFdHMWpNYnRXNGNxK2ZQUkErSUNxMy9VdkI3OEZWSEhGczRhVWkr?= =?utf-8?B?alg3N0Nxd1pTcGl1OGFMRTJyYjAxSlk2YWlFSHF5T1J5TU1HUUFFSER2dXM3?= =?utf-8?B?UlNjYTcxUnlpdTNXU2N3MGdLQUVwQUc2UFJYUW9EUjVhUER2UUxXc1ZPVXR2?= =?utf-8?B?YnY1S0FDR1ZPYmNGUkRNOGdtV1kvck1nZjFiTVhBdHRkVUlHckFGT3lScWZH?= =?utf-8?B?aEJPR2VrRmNxQmo0bzJKQlhkQlQ4WTRpTWJhb1JaSlVGYkc2NkRxc3BGUHNF?= =?utf-8?B?bW9HbVJ5NXZqMGphVldxSlZwamVocUZuOXBxbzFvb1VienpBNHM4Mi80NUd5?= =?utf-8?B?eXkyckRwNzY4UDRoZ3NBeWJlWUtPY29YRlM2U0VuKzUxQlkrT0lMZzFUbGps?= =?utf-8?B?YmRZTzBxU1M1UHJCMXBYNm5SMHdzTVAxVXRHNWZJejBDMk96dHF0bGNQSlB6?= =?utf-8?B?UVE9PQ==?= X-OriginatorOrg: in-advantage.com X-MS-Exchange-CrossTenant-Network-Message-Id: 397b0d79-35bb-4d03-f385-08da69aefad4 X-MS-Exchange-CrossTenant-AuthSource: MWHPR1001MB2351.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jul 2022 17:49:08.3113 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 48e842ca-fbd8-4633-a79d-0c955a7d3aae X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: FUsaNOn8pBPCGmA1YLbanZ5QeNloMz7lMfSW3wGoW+P0ZJV9+EluY5Kn+WntbPilBeAhq4HBAxGT2utgJeVEraq0upWZGLjkgfJ7AjJh6N4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN0PR10MB4982 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220719_104918_656863_8BAC22C2 X-CRM114-Status: GOOD ( 36.18 ) 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 T24gTW9uLCBKdWwgMTgsIDIwMjIgYXQgMDM6MTg6MjhQTSArMDEwMCwgTGVlIEpvbmVzIHdyb3Rl Ogo+IE9uIFR1ZSwgMDUgSnVsIDIwMjIsIENvbGluIEZvc3RlciB3cm90ZToKPiAKPiA+ICtNT0RV TEVfSU1QT1JUX05TKE1GRF9PQ0VMT1RfU1BJKTsKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21m ZC9vY2Vsb3Qtc3BpLmMgYi9kcml2ZXJzL21mZC9vY2Vsb3Qtc3BpLmMKPiA+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLjBjMWM1MjE1YzcwNgo+ID4gLS0tIC9k ZXYvbnVsbAo+ID4gKysrIGIvZHJpdmVycy9tZmQvb2NlbG90LXNwaS5jCj4gPiBAQCAtMCwwICsx LDMxNyBAQAo+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiAoR1BMLTIuMCBPUiBNSVQp Cj4gPiArLyoKPiA+ICsgKiBTUEkgY29yZSBkcml2ZXIgZm9yIHRoZSBPY2Vsb3QgY2hpcCBmYW1p bHkuCj4gPiArICoKPiA+ICsgKiBUaGlzIGRyaXZlciB3aWxsIGhhbmRsZSBldmVyeXRoaW5nIG5l Y2Vzc2FyeSB0byBhbGxvdyBmb3IgY29tbXVuaWNhdGlvbiBvdmVyCj4gPiArICogU1BJIHRvIHRo ZSBWU0M3NTExLCBWU0M3NTEyLCBWU0M3NTEzIGFuZCBWU0M3NTE0IGNoaXBzLiBUaGUgbWFpbiBm dW5jdGlvbnMKPiA+ICsgKiBhcmUgdG8gcHJlcGFyZSB0aGUgY2hpcCdzIFNQSSBpbnRlcmZhY2Ug Zm9yIGEgc3BlY2lmaWMgYnVzIHNwZWVkLCBhbmQgYSBob3N0Cj4gPiArICogcHJvY2Vzc29yJ3Mg ZW5kaWFubmVzcy4gVGhpcyB3aWxsIGNyZWF0ZSBhbmQgZGlzdHJpYnV0ZSByZWdtYXBzIGZvciBh bnkKPiA+ICsgKiBjaGlsZHJlbi4KPiA+ICsgKgo+ID4gKyAqIENvcHlyaWdodCAyMDIxLCAyMDIy IElubm92YXRpdmUgQWR2YW50YWdlIEluYy4KPiA+ICsgKgo+ID4gKyAqIEF1dGhvcjogQ29saW4g Rm9zdGVyIDxjb2xpbi5mb3N0ZXJAaW4tYWR2YW50YWdlLmNvbT4KPiA+ICsgKi8KPiA+ICsKPiA+ ICsjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2tjb25maWcu aD4KPiA+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3Jl Z21hcC5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Cj4gPiArCj4gPiArI2luY2x1 ZGUgPGFzbS9ieXRlb3JkZXIuaD4KPiA+ICsKPiA+ICsjaW5jbHVkZSAib2NlbG90LmgiCj4gPiAr Cj4gPiArI2RlZmluZSBSRUdfREVWX0NQVU9SR19JRl9DVFJMCQkweDAwMDAKPiA+ICsjZGVmaW5l IFJFR19ERVZfQ1BVT1JHX0lGX0NGR1NUQVQJMHgwMDA0Cj4gPiArCj4gPiArI2RlZmluZSBDRkdT VEFUX0lGX05VTV9WQ09SRQkJKDAgPDwgMjQpCj4gPiArI2RlZmluZSBDRkdTVEFUX0lGX05VTV9W UkFQCQkoMSA8PCAyNCkKPiA+ICsjZGVmaW5lIENGR1NUQVRfSUZfTlVNX1NJCQkoMiA8PCAyNCkK PiA+ICsjZGVmaW5lIENGR1NUQVRfSUZfTlVNX01JSU0JCSgzIDw8IDI0KQo+ID4gKwo+ID4gKyNk ZWZpbmUgVlNDNzUxMl9ERVZDUFVfT1JHX1JFU19TVEFSVAkweDcxMDAwMDAwCj4gPiArI2RlZmlu ZSBWU0M3NTEyX0RFVkNQVV9PUkdfUkVTX1NJWkUJMHgzOAo+ID4gKwo+ID4gKyNkZWZpbmUgVlND NzUxMl9DSElQX1JFR1NfUkVTX1NUQVJUCTB4NzEwNzAwMDAKPiA+ICsjZGVmaW5lIFZTQzc1MTJf Q0hJUF9SRUdTX1JFU19TSVpFCTB4MTQKPiA+ICsKPiA+ICtzdHJ1Y3Qgc3BpX2RldmljZTsKPiAK PiBXaHkgbm90IGp1c3QgI2luY2x1ZGU/CgpJIG1pcy11bmRlcnN0b29kIHRoaXMgdG8gbWVhbiBk cml2ZXJzL21mZC9vY2Vsb3Qtc3BpLmMgd2hlbiBpdCBtZWFudApkcml2ZXJzL21mZC9vY2Vsb3Qu aC4gVGhhbmtzLgoKaHR0cHM6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9wcm9qZWN0L25ldGRldmJw Zi9wYXRjaC8yMDIyMDcwMTE5MjYwOS4zOTcwMzE3LTEwLWNvbGluLmZvc3RlckBpbi1hZHZhbnRh Z2UuY29tLyMyNDkyMTA1NwoKIiIiCllvdSBtaXNzZWQgYSBsb3Qgb2YgZm9yd2FyZCBkZWNsYXJh dGlvbnMgdGhhdCBhcmUgdXNlZCBpbiB0aGlzIGZpbGUuCgpMaWtlCgpzdHJ1Y3Qgc3BpX2Rldmlj ZTsKIiIiCgoKPiA+ICtzdGF0aWMgaW50IG9jZWxvdF9zcGlfcmVnbWFwX2J1c19yZWFkKHZvaWQg KmNvbnRleHQsCj4gPiArCQkJCSAgICAgIGNvbnN0IHZvaWQgKnJlZywgc2l6ZV90IHJlZ19zaXpl LAo+ID4gKwkJCQkgICAgICB2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKPiA+ICt7Cj4gPiAr CXN0cnVjdCBvY2Vsb3RfZGRhdGEgKmRkYXRhID0gY29udGV4dDsKPiA+ICsJc3RydWN0IHNwaV90 cmFuc2ZlciB0eCwgcGFkZGluZywgcng7Cj4gPiArCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBk ZGF0YS0+c3BpOwo+ID4gKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOwo+ID4gKwo+ID4gKwlzcGkg PSBkZGF0YS0+c3BpOwo+IAo+IERyb3AgdGhpcyBsaW5lLgoKWWVzIC0gYW5kIGFjdHVhbGx5IHNp bmNlIEknbSByZW1vdmluZyBkZGF0YS0+c3BpIGFsdG9nZXRoZXIgaXQnbGwgYmVjb21lCnRvX3Nw aV9kZXZpY2UoZGRhdGEtPmRldikgIChvYnZpb3VzbHkgd2l0aG91dCB0aGUgZG91YmxlLWFzc2ln bm1lbnQgdGhhdAp5b3UncmUgcG9pbnRpbmcgb3V0IGhlcmUpCgo+IAo+ID4gKwlzcGlfbWVzc2Fn ZV9pbml0KCZtc2cpOwo+ID4gKwo+ID4gKwltZW1zZXQoJnR4LCAwLCBzaXplb2YodHgpKTsKPiA+ ICsKPiA+ICsJdHgudHhfYnVmID0gcmVnOwo+ID4gKwl0eC5sZW4gPSByZWdfc2l6ZTsKPiA+ICsK PiA+ICsJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnR4LCAmbXNnKTsKPiA+ICsKPiA+ICsJaWYgKGRk YXRhLT5zcGlfcGFkZGluZ19ieXRlcykgewo+ID4gKwkJbWVtc2V0KCZwYWRkaW5nLCAwLCBzaXpl b2YocGFkZGluZykpOwo+ID4gKwo+ID4gKwkJcGFkZGluZy5sZW4gPSBkZGF0YS0+c3BpX3BhZGRp bmdfYnl0ZXM7Cj4gPiArCQlwYWRkaW5nLnR4X2J1ZiA9IGRkYXRhLT5kdW1teV9idWY7Cj4gPiAr CQlwYWRkaW5nLmR1bW15X2RhdGEgPSAxOwo+ID4gKwo+ID4gKwkJc3BpX21lc3NhZ2VfYWRkX3Rh aWwoJnBhZGRpbmcsICZtc2cpOwo+ID4gKwl9Cj4gPiArCj4gPiArCW1lbXNldCgmcngsIDAsIHNp emVvZihyeCkpOwo+ID4gKwlyeC5yeF9idWYgPSB2YWw7Cj4gPiArCXJ4LmxlbiA9IHZhbF9zaXpl Owo+ID4gKwo+ID4gKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmcngsICZtc2cpOwo+ID4gKwo+ID4g KwlyZXR1cm4gc3BpX3N5bmMoc3BpLCAmbXNnKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGlu dCBvY2Vsb3Rfc3BpX3JlZ21hcF9idXNfd3JpdGUodm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAq ZGF0YSwKPiA+ICsJCQkJICAgICAgIHNpemVfdCBjb3VudCkKPiA+ICt7Cj4gPiArCXN0cnVjdCBv Y2Vsb3RfZGRhdGEgKmRkYXRhID0gY29udGV4dDsKPiA+ICsJc3RydWN0IHNwaV9kZXZpY2UgKnNw aSA9IGRkYXRhLT5zcGk7CgpBcyBhYm92ZSwgSSdtIGNoYW5naW5nIHRvIHRvX3NwaV9kZXZpY2Uo ZGRhdGEtPmRldikKCj4gPiArCj4gPiArCXJldHVybiBzcGlfd3JpdGUoc3BpLCBkYXRhLCBjb3Vu dCk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2J1cyBvY2Vs b3Rfc3BpX3JlZ21hcF9idXMgPSB7Cj4gPiArCS53cml0ZSA9IG9jZWxvdF9zcGlfcmVnbWFwX2J1 c193cml0ZSwKPiA+ICsJLnJlYWQgPSBvY2Vsb3Rfc3BpX3JlZ21hcF9idXNfcmVhZCwKPiA+ICt9 Owo+ID4gKwo+ID4gK3N0cnVjdCByZWdtYXAgKgo+ID4gK29jZWxvdF9zcGlfaW5pdF9yZWdtYXAo c3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKPiAKPiBPbmUg bGluZSwgYWxvbmcgd2l0aCBhbGwgdGhlIG90aGVycy4KPiAKPiA+ICt7Cj4gPiArCXN0cnVjdCBv Y2Vsb3RfZGRhdGEgKmRkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gPiArCXN0cnVjdCBy ZWdtYXBfY29uZmlnIHJlZ21hcF9jb25maWc7Cj4gPiArCj4gPiArCW1lbWNweSgmcmVnbWFwX2Nv bmZpZywgJm9jZWxvdF9zcGlfcmVnbWFwX2NvbmZpZywKPiA+ICsJICAgICAgIHNpemVvZihyZWdt YXBfY29uZmlnKSk7Cj4gPiArCj4gPiArCXJlZ21hcF9jb25maWcubmFtZSA9IHJlcy0+bmFtZTsK PiA+ICsJcmVnbWFwX2NvbmZpZy5tYXhfcmVnaXN0ZXIgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQ7 Cj4gPiArCXJlZ21hcF9jb25maWcucmVnX2Jhc2UgPSByZXMtPnN0YXJ0Owo+ID4gKwo+ID4gKwly ZXR1cm4gZGV2bV9yZWdtYXBfaW5pdChkZXYsICZvY2Vsb3Rfc3BpX3JlZ21hcF9idXMsIGRkYXRh LAo+ID4gKwkJCQkmcmVnbWFwX2NvbmZpZyk7Cj4gPiArfQo+ID4gK0VYUE9SVF9TWU1CT0xfTlMo b2NlbG90X3NwaV9pbml0X3JlZ21hcCwgTUZEX09DRUxPVF9TUEkpOwo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgb2NlbG90X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQo+ID4gK3sKPiA+ ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJnNwaS0+ZGV2Owo+ID4gKwlzdHJ1Y3Qgb2NlbG90X2Rk YXRhICpkZGF0YTsKPiA+ICsJc3RydWN0IHJlZ21hcCAqcjsKPiA+ICsJaW50IGVycjsKPiA+ICsK PiA+ICsJZGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRkYXRhKSwgR0ZQX0tFUk5F TCk7Cj4gPiArCWlmICghZGRhdGEpCj4gPiArCQlyZXR1cm4gLUVOT01FTTsKPiA+ICsKPiA+ICsJ ZGRhdGEtPmRldiA9IGRldjsKPiAKPiBIb3cgYXJlIHlvdSBmZXRjaGluZyBkZGF0YSBpZiB5b3Ug ZG9uJ3QgYWxyZWFkeSBoYXZlICdkZXYnPwoKSSBkb24ndCB0aGluayBJIGZ1bGx5IHVuZGVyc3Rh bmQgdGhpcyBxdWVzdGlvbi4uLgoKCkFyZSB5b3Ugc2F5aW5nIGRkYXRhIGRvZXNuJ3QgbmVlZCBh IGRldiBpbnN0YW5jZT8gU28gaW5zdGVhZCBvZjoKCmRldm1fcmVnbWFwX2luaXQoZGV2LCAmYnVz LCBkZGF0YSwgJnJlZ21hcF9jb25maWcpOwoKSXQgY291bGQgYmU6CgpkZXZtX3JlZ21hcF9pbml0 KGRldiwgJmJ1cywgZGV2LCAmcmVnbWFwX2NvbmZpZyk7CgoKSW4gdGhhdCBjYXNlLCB0aGUgY29u dGV4dCBpbnRvIG9jZWxvdF9zcGlfcmVnbWFwX2J1c197cmVhZCx3cml0ZX0gd291bGQKYmUgZGV2 LCBpbnN0ZWFkIG9mIGRkYXRhLgoKVGhlbiBJIGdldCBkZGF0YSBmcm9tIGRldmljZSB2aWE6Cgpz dGF0aWMgaW50IG9jZWxvdF9zcGlfcmVnbWFwX2J1c193cml0ZSh2b2lkICpjb250ZXh0LC4uLikK ewogICAgc3RydWN0IGRldmljZSAqZGV2ID0gY29udGV4dDsKICAgIHN0cnVjdCBvY2Vsb3RfZGRh dGEgKmRkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAgICBzdHJ1Y3Qgc3BpX2RldmljZSAq c3BpID0gdG9fc3BpX2RldmljZShkZXYpOwoKICAgIC8qIGRkYXRhIGlzbid0IGFjdHVhbGx5IG5l ZWRlZCBmb3IgYnVzX3dyaXRlLCBqdXN0IG1ha2luZyBhIHBvaW50ICovCiAgICAuLi4KfQoKCkkg aGF2ZW4ndCB0ZXN0ZWQgdGhpcyB5ZXQsIGJ1dCBJIHRoaW5rIHRoaXMgaXMgd2hhdCB5b3UncmUg c3VnZ2VzdGluZy4KU28gbm93IEkndmUgcmVtb3ZlZCBib3RoIHNwaSBhbmQgZGV2IGZyb20gdGhl IGRkYXRhIHN0cnVjdCAoYXMgSSBtZW50aW9uCmJlbG93KS4gQ29vbC4KCj4gCj4gPiArCWRldl9z ZXRfZHJ2ZGF0YShkZXYsIGRkYXRhKTsKPiAKPiBUaGlzIHNob3VsZCB1c2UgdGhlIHNwaV8qIHZh cmlhbnQuCgpBZ3JlZWQuCgo+IAo+ID4gKwlpZiAoc3BpLT5tYXhfc3BlZWRfaHogPD0gNTAwMDAw KSB7Cj4gPiArCQlkZGF0YS0+c3BpX3BhZGRpbmdfYnl0ZXMgPSAwOwo+ID4gKwl9IGVsc2Ugewo+ ID4gKwkJLyoKPiA+ICsJCSAqIENhbGN1bGF0aW9uIHRha2VuIGZyb20gdGhlIG1hbnVhbCBmb3Ig SUZfQ0ZHU1RBVDpJRl9DRkcuCj4gPiArCQkgKiBSZWdpc3RlciBhY2Nlc3MgdGltZSBpcyAxdXMs IHNvIHdlIG5lZWQgdG8gY29uZmlndXJlIGFuZCBzZW5kCj4gPiArCQkgKiBvdXQgZW5vdWdoIHBh ZGRpbmcgYnl0ZXMgYmV0d2VlbiB0aGUgcmVhZCByZXF1ZXN0IGFuZCBkYXRhCj4gPiArCQkgKiB0 cmFuc21pc3Npb24gdGhhdCBsYXN0cyBhdCBsZWFzdCAxIG1pY3Jvc2Vjb25kLgo+ID4gKwkJICov Cj4gPiArCQlkZGF0YS0+c3BpX3BhZGRpbmdfYnl0ZXMgPSAxICsKPiA+ICsJCQkoc3BpLT5tYXhf c3BlZWRfaHogLyAxMDAwMDAwICsgMikgLyA4Owo+ID4gKwo+ID4gKwkJZGRhdGEtPmR1bW15X2J1 ZiA9IGRldm1fa3phbGxvYyhkZXYsIGRkYXRhLT5zcGlfcGFkZGluZ19ieXRlcywKPiA+ICsJCQkJ CQlHRlBfS0VSTkVMKTsKPiA+ICsJCWlmICghZGRhdGEtPmR1bW15X2J1ZikKPiA+ICsJCQlyZXR1 cm4gLUVOT01FTTsKPiA+ICsJfQo+ID4gKwo+ID4gKwlkZGF0YS0+c3BpID0gc3BpOwo+IAo+IElm IHlvdSBoYXZlICdzcGknIHlvdSBkZWZpbml0ZWx5IGRvIG5vdCBuZWVkICdkZXYnLgo+IAo+IFlv dSBjYW4gZGVyaXZlIG9uZSBmcm9tIHRoZSBvdGhlci4KCkdvb2QgcG9pbnQuIEFzIEkgaW1wbGll ZCBhYm92ZSwgSSdtIGRyb3BwaW5nICJzcGkiIGZyb20gdGhlIGRkYXRhIHN0cnVjdAphbmQgd2ls bCByZWNvdmVyIHNwaSBmcm9tIHRvX3NwaV9kZXZpY2UoZGV2KQoKVGhhdCBkb2VzIHNvbWUgbmlj ZSB0aGluZ3MgbGlrZSByZW1vdmVzICJzdHJ1Y3Qgc3BpX2RldmljZSIgZnJvbQpkcml2ZXJzL21m ZC9vY2Vsb3QuaAoKPiA+ICsJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKPiA+ICsKPiA+ICsJZXJy ID0gc3BpX3NldHVwKHNwaSk7Cj4gPiArCWlmIChlcnIgPCAwKQo+ID4gKwkJcmV0dXJuIGRldl9l cnJfcHJvYmUoJnNwaS0+ZGV2LCBlcnIsCj4gPiArCQkJCSAgICAgIkVycm9yIHBlcmZvcm1pbmcg U1BJIHNldHVwXG4iKTsKPiA+ICsKPiA+ICsJciA9IG9jZWxvdF9zcGlfaW5pdF9yZWdtYXAoZGV2 LCAmdnNjNzUxMl9kZXZfY3B1b3JnX3Jlc291cmNlKTsKPiA+ICsJaWYgKElTX0VSUihyKSkKPiA+ ICsJCXJldHVybiBQVFJfRVJSKHIpOwo+ID4gKwo+ID4gKwlkZGF0YS0+Y3B1b3JnX3JlZ21hcCA9 IHI7Cj4gPiArCj4gPiArCXIgPSBvY2Vsb3Rfc3BpX2luaXRfcmVnbWFwKGRldiwgJnZzYzc1MTJf Z2NiX3Jlc291cmNlKTsKPiA+ICsJaWYgKElTX0VSUihyKSkKPiA+ICsJCXJldHVybiBQVFJfRVJS KHIpOwo+ID4gKwo+ID4gKwlkZGF0YS0+Z2NiX3JlZ21hcCA9IHI7Cj4gPiArCj4gPiArCS8qCj4g PiArCSAqIFRoZSBjaGlwIG11c3QgYmUgc2V0IHVwIGZvciBTUEkgYmVmb3JlIGl0IGdldHMgaW5p dGlhbGl6ZWQgYW5kIHJlc2V0Lgo+ID4gKwkgKiBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgY2Fs bGluZyBpbml0LCBhbmQgYWZ0ZXIgYSBjaGlwIHJlc2V0IGlzCj4gPiArCSAqIHBlcmZvcm1lZC4K PiA+ICsJICovCj4gPiArCWVyciA9IG9jZWxvdF9zcGlfaW5pdGlhbGl6ZShkZXYpOwo+ID4gKwlp ZiAoZXJyKQo+ID4gKwkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCBlcnIsICJFcnJvciBpbml0 aWFsaXppbmcgU1BJIGJ1c1xuIik7Cj4gPiArCj4gPiArCWVyciA9IG9jZWxvdF9jaGlwX3Jlc2V0 KGRldik7Cj4gPiArCWlmIChlcnIpCj4gPiArCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIGVy ciwgIkVycm9yIHJlc2V0dGluZyBkZXZpY2VcbiIpOwo+ID4gKwo+ID4gKwkvKgo+ID4gKwkgKiBB IGNoaXAgcmVzZXQgd2lsbCBjbGVhciB0aGUgU1BJIGNvbmZpZ3VyYXRpb24sIHNvIGl0IG5lZWRz IHRvIGJlIGRvbmUKPiA+ICsJICogYWdhaW4gYmVmb3JlIHdlIGNhbiBhY2Nlc3MgYW55IHJlZ2lz dGVycwo+ID4gKwkgKi8KPiA+ICsJZXJyID0gb2NlbG90X3NwaV9pbml0aWFsaXplKGRldik7Cj4g PiArCWlmIChlcnIpCj4gPiArCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIGVyciwKPiA+ICsJ CQkJICAgICAiRXJyb3IgaW5pdGlhbGl6aW5nIFNQSSBidXMgYWZ0ZXIgcmVzZXRcbiIpOwo+ID4g Kwo+ID4gKwllcnIgPSBvY2Vsb3RfY29yZV9pbml0KGRldik7Cj4gPiArCWlmIChlcnIgPCAwKQo+ ID4gKwkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCBlcnIsCj4gPiArCQkJCSAgICAgIkVycm9y IGluaXRpYWxpemluZyBPY2Vsb3QgY29yZVxuIik7Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgb2NlbG90X3Nw aV9pZHNbXSA9IHsKPiA+ICsJeyAidnNjNzUxMiIsIDAgfSwKPiA+ICsJeyB9Cj4gPiArfTsKPiA+ ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvY2Vsb3Rfc3BpX29mX21h dGNoW10gPSB7Cj4gPiArCXsgLmNvbXBhdGlibGUgPSAibXNjYyx2c2M3NTEyIiB9LAo+ID4gKwl7 IH0KPiA+ICt9Owo+ID4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9jZWxvdF9zcGlfb2ZfbWF0 Y2gpOwo+ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBvY2Vsb3Rfc3BpX2RyaXZl ciA9IHsKPiA+ICsJLmRyaXZlciA9IHsKPiA+ICsJCS5uYW1lID0gIm9jZWxvdC1zb2MiLAo+ID4g KwkJLm9mX21hdGNoX3RhYmxlID0gb2NlbG90X3NwaV9vZl9tYXRjaCwKPiA+ICsJfSwKPiA+ICsJ LmlkX3RhYmxlID0gb2NlbG90X3NwaV9pZHMsCj4gPiArCS5wcm9iZSA9IG9jZWxvdF9zcGlfcHJv YmUsCj4gPiArfTsKPiA+ICttb2R1bGVfc3BpX2RyaXZlcihvY2Vsb3Rfc3BpX2RyaXZlcik7Cj4g PiArCj4gPiArTU9EVUxFX0RFU0NSSVBUSU9OKCJTUEkgQ29udHJvbGxlZCBPY2Vsb3QgQ2hpcCBE cml2ZXIiKTsKPiA+ICtNT0RVTEVfQVVUSE9SKCJDb2xpbiBGb3N0ZXIgPGNvbGluLmZvc3RlckBp bi1hZHZhbnRhZ2UuY29tPiIpOwo+ID4gK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1JVC9HUEwiKTsK PiA+ICtNT0RVTEVfSU1QT1JUX05TKE1GRF9PQ0VMT1QpOwo+ID4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvbWZkL29jZWxvdC5oIGIvZHJpdmVycy9tZmQvb2NlbG90LmgKPiA+IG5ldyBmaWxlIG1vZGUg MTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLmM4NmJkNjk5MGEzYwo+ID4gLS0tIC9kZXYv bnVsbAo+ID4gKysrIGIvZHJpdmVycy9tZmQvb2NlbG90LmgKPiA+IEBAIC0wLDAgKzEsMzQgQEAK PiA+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCBPUiBNSVQgKi8KPiA+ICsv KiBDb3B5cmlnaHQgMjAyMSwgMjAyMiBJbm5vdmF0aXZlIEFkdmFudGFnZSBJbmMuICovCj4gPiAr Cj4gPiArI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KPiA+ICsKPiA+ICtzdHJ1Y3QgZGV2aWNl Owo+ID4gK3N0cnVjdCBzcGlfZGV2aWNlOwo+ID4gK3N0cnVjdCByZWdtYXA7Cj4gPiArc3RydWN0 IHJlc291cmNlOwo+ID4gKwo+ID4gK3N0cnVjdCBvY2Vsb3RfZGRhdGEgewo+ID4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXY7Cj4gPiArCXN0cnVjdCByZWdtYXAgKmdjYl9yZWdtYXA7Cj4gPiArCXN0cnVj dCByZWdtYXAgKmNwdW9yZ19yZWdtYXA7Cj4gPiArCWludCBzcGlfcGFkZGluZ19ieXRlczsKPiA+ ICsJc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKPiA+ICsJdm9pZCAqZHVtbXlfYnVmOwo+ID4gK307 Cj4gCj4gVGhpcyBsb29rcyBsaWtlIGl0IGRlc2VydmVzIGEgZG9jIGhlYWRlci4KCldpbGwgZG8h Cgo+IAo+ID4gK2ludCBvY2Vsb3RfY2hpcF9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpOwo+ID4g K2ludCBvY2Vsb3RfY29yZV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldik7Cj4gPiArCj4gPiArLyog U1BJLXNwZWNpZmljIHJvdXRpbmVzIHRoYXQgd29uJ3QgYmUgbmVjZXNzYXJ5IGZvciBvdGhlciBp bnRlcmZhY2VzICovCj4gPiArc3RydWN0IHJlZ21hcCAqb2NlbG90X3NwaV9pbml0X3JlZ21hcChz dHJ1Y3QgZGV2aWNlICpkZXYsCj4gPiArCQkJCSAgICAgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAq cmVzKTsKPiA+ICsKPiA+ICsjZGVmaW5lIE9DRUxPVF9TUElfQllURV9PUkRFUl9MRSAweDAwMDAw MDAwCj4gPiArI2RlZmluZSBPQ0VMT1RfU1BJX0JZVEVfT1JERVJfQkUgMHg4MTgxODE4MQo+ID4g Kwo+ID4gKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KPiA+ICsjZGVmaW5lIE9DRUxPVF9TUElfQllU RV9PUkRFUiBPQ0VMT1RfU1BJX0JZVEVfT1JERVJfTEUKPiA+ICsjZWxzZQo+ID4gKyNkZWZpbmUg T0NFTE9UX1NQSV9CWVRFX09SREVSIE9DRUxPVF9TUElfQllURV9PUkRFUl9CRQo+ID4gKyNlbmRp Zgo+IAo+IC0tIAo+IExlZSBKb25lcyBb5p2O55C85pavXQo+IFByaW5jaXBhbCBUZWNobmljYWwg TGVhZCAtIERldmVsb3BlciBTZXJ2aWNlcwo+IExpbmFyby5vcmcg4pSCIE9wZW4gc291cmNlIHNv ZnR3YXJlIGZvciBBcm0gU29Dcwo+IEZvbGxvdyBMaW5hcm86IEZhY2Vib29rIHwgVHdpdHRlciB8 IEJsb2cKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxp bnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFk ZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4 LWFybS1rZXJuZWwK