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=-7.0 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS 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 BCE22C43381 for ; Thu, 7 Mar 2019 15:58:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6880D20652 for ; Thu, 7 Mar 2019 15:58:12 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=renesasgroup.onmicrosoft.com header.i=@renesasgroup.onmicrosoft.com header.b="N+vNyFcX" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726393AbfCGP6L (ORCPT ); Thu, 7 Mar 2019 10:58:11 -0500 Received: from mail-eopbgr1400134.outbound.protection.outlook.com ([40.107.140.134]:7207 "EHLO JPN01-TY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726378AbfCGP6L (ORCPT ); Thu, 7 Mar 2019 10:58:11 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=renesasgroup.onmicrosoft.com; s=selector1-bp-renesas-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6ddidTyaHiynZvoGsXUrDpo5CugcYZjiuVUZVBxMW8A=; b=N+vNyFcX73lHfd51WyHURe5RIQwMToXNLJv9dOc1VZzt7nkvDqs2F7fd/W+uJGMu5jVmMM1AqMxhIj5ofgDKH8+1pqBtfdy7lN0Gym95QFM7+B+1iEUK3DJ6VkJXe/pWJW6JzJveC8ZncQXxH8lYwkcGwrX7eNh/Q/au0USI0Dg= Received: from OSBPR01MB2103.jpnprd01.prod.outlook.com (52.134.242.17) by OSBPR01MB3078.jpnprd01.prod.outlook.com (52.134.254.149) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1686.18; Thu, 7 Mar 2019 15:57:51 +0000 Received: from OSBPR01MB2103.jpnprd01.prod.outlook.com ([fe80::d5b0:ac4:6d54:6285]) by OSBPR01MB2103.jpnprd01.prod.outlook.com ([fe80::d5b0:ac4:6d54:6285%5]) with mapi id 15.20.1686.018; Thu, 7 Mar 2019 15:57:51 +0000 From: Biju Das To: Heikki Krogerus CC: Greg Kroah-Hartman , Felipe Balbi , "linux-usb@vger.kernel.org" , Simon Horman , Yoshihiro Shimoda , Geert Uytterhoeven , Chris Paterson , Fabrizio Castro , "linux-renesas-soc@vger.kernel.org" Subject: RE: [PATCH 3/9] usb: typec: driver for TI HD3SS3220 USB Type-C DRP port controller Thread-Topic: [PATCH 3/9] usb: typec: driver for TI HD3SS3220 USB Type-C DRP port controller Thread-Index: AQHU0/zc4UuUzITJV02M2P1g0bIgC6X+eSMAgAHT6kA= Date: Thu, 7 Mar 2019 15:57:51 +0000 Message-ID: References: <1551863246-11656-1-git-send-email-biju.das@bp.renesas.com> <1551863246-11656-4-git-send-email-biju.das@bp.renesas.com> <20190306113428.GA28103@kuha.fi.intel.com> In-Reply-To: <20190306113428.GA28103@kuha.fi.intel.com> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=biju.das@bp.renesas.com; x-originating-ip: [193.141.220.21] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 0c01d995-fafd-42a4-1d77-08d6a315a77e x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(5600127)(711020)(4605104)(4618075)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020);SRVR:OSBPR01MB3078; x-ms-traffictypediagnostic: OSBPR01MB3078: x-ms-exchange-purlcount: 1 x-microsoft-exchange-diagnostics: 1;OSBPR01MB3078;20:+XpiqHQozT6Fm4WCQAUHQdb0CP6WWfwqDNL5L/C8OtPRwchJoxz5LEH++KgRs1MfDFqfzu50Ds5f2v3ZURuA74tcrPpPVK5gb04qzHolbUA7X1HXlFHi6hA28oMS2kBoqYCvTbekEMUBJAh7eB4RGWd2z2vicGGtwfXn7f1MGEQ= x-microsoft-antispam-prvs: x-forefront-prvs: 096943F07A x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(346002)(376002)(366004)(39860400002)(396003)(136003)(189003)(199004)(51914003)(97736004)(54906003)(33656002)(99286004)(66066001)(81166006)(8676002)(5024004)(14444005)(81156014)(68736007)(256004)(9686003)(6116002)(3846002)(478600001)(6306002)(55016002)(53936002)(229853002)(6246003)(316002)(106356001)(105586002)(6436002)(52536013)(2906002)(30864003)(5660300002)(8936002)(446003)(76176011)(74316002)(14454004)(44832011)(7696005)(7736002)(476003)(4326008)(86362001)(486006)(966005)(305945005)(11346002)(25786009)(26005)(186003)(102836004)(6916009)(6506007)(71200400001)(71190400001);DIR:OUT;SFP:1102;SCL:1;SRVR:OSBPR01MB3078;H:OSBPR01MB2103.jpnprd01.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:0; received-spf: None (protection.outlook.com: bp.renesas.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: HQGD4ZMXN/PrvaUJUKjVcyc7fCzbIgW02Jsh1q6T0r3GdUTv59W/tjjUMdI68qBOEVya+CsjizFZsynLI5WEPa0vNdL75d1JUoW8F4kF/1LoXZ9SsBNFhUCVIPbEHuhpU5+vHjv2IyMGH20s88Pw1USrfOR5WhpZcwlnzfDhDciWQKuVebiey5MAu18GS+D5oJjChRRx3/aKw101wpkr9FkUTFemumreWk+E5NPYkhIof505SsnyNFPLjrpFbZhAqkxnj48KelfzLQYRALaVqdUQzY8G9PPI/NPoSca/kXfL2WxgvFN82sWTkoOBNZdqr82BbbRJ1j3AJ7sdl1Wc+o3zDXQLFk8sXv04ZJSoiCLfApLm5+0kcx4gZmoZ4rfoq/N0Qym+4eH/F+Ew3IXbSZiMF0CegColcv2tkpyTCp4= Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: bp.renesas.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0c01d995-fafd-42a4-1d77-08d6a315a77e X-MS-Exchange-CrossTenant-originalarrivaltime: 07 Mar 2019 15:57:51.7453 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 53d82571-da19-47e4-9cb4-625a166a4a2a X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSBPR01MB3078 Sender: linux-renesas-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-renesas-soc@vger.kernel.org Hi Heikki, Thanks for the feedback. > Subject: Re: [PATCH 3/9] usb: typec: driver for TI HD3SS3220 USB Type-C D= RP > port controller >=20 > On Wed, Mar 06, 2019 at 09:07:20AM +0000, Biju Das wrote: > > Driver for TI HD3SS3220 USB Type-C DRP port controller. > > > > The driver currently registers the port and supports data role swapping= . > > > > Signed-off-by: Biju Das > > --- > > drivers/usb/typec/Kconfig | 10 ++ > > drivers/usb/typec/Makefile | 1 + > > drivers/usb/typec/hd3ss3220.c | 284 > > ++++++++++++++++++++++++++++++++++++++++++ > > 3 files changed, 295 insertions(+) > > create mode 100644 drivers/usb/typec/hd3ss3220.c > > > > diff --git a/drivers/usb/typec/Kconfig b/drivers/usb/typec/Kconfig > > index 30a847c..91696d2 100644 > > --- a/drivers/usb/typec/Kconfig > > +++ b/drivers/usb/typec/Kconfig > > @@ -49,6 +49,16 @@ source "drivers/usb/typec/tcpm/Kconfig" > > > > source "drivers/usb/typec/ucsi/Kconfig" > > > > +config TYPEC_HD3SS3220 > > + tristate "TI HD3SS3220 Type-C DRP Port controller driver" > > + depends on I2C > > + help > > + Say Y or M here if your system has TI HD3SS3220 Type-C DRP Port > > + controller driver. > > + > > + If you choose to build this driver as a dynamically linked module, = the > > + module will be called hd3ss3220.ko. > > + > > config TYPEC_TPS6598X > > tristate "TI TPS6598x USB Power Delivery controller driver" > > depends on I2C > > diff --git a/drivers/usb/typec/Makefile b/drivers/usb/typec/Makefile > > index 6696b72..7753a5c3 100644 > > --- a/drivers/usb/typec/Makefile > > +++ b/drivers/usb/typec/Makefile > > @@ -4,5 +4,6 @@ typec-y :=3D class.o mux.o bus.o > > obj-$(CONFIG_TYPEC) +=3D altmodes/ > > obj-$(CONFIG_TYPEC_TCPM) +=3D tcpm/ > > obj-$(CONFIG_TYPEC_UCSI) +=3D ucsi/ > > +obj-$(CONFIG_TYPEC_HD3SS3220) +=3D hd3ss3220.o > > obj-$(CONFIG_TYPEC_TPS6598X) +=3D tps6598x.o > > obj-$(CONFIG_TYPEC) +=3D mux/ > > diff --git a/drivers/usb/typec/hd3ss3220.c > > b/drivers/usb/typec/hd3ss3220.c new file mode 100644 index > > 0000000..bd3e1ec > > --- /dev/null > > +++ b/drivers/usb/typec/hd3ss3220.c > > @@ -0,0 +1,284 @@ > > +// SPDX-License-Identifier: GPL-2.0+ > > +/* > > + * TI HD3SS3220 Type-C DRP Port Controller Driver > > + * > > + * Copyright (C) 2019 Renesas Electronics Corp. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#define HD3SS3220_REG_CN_STAT_CTRL 0x09 > > +#define HD3SS3220_REG_GEN_CTRL 0x0A > > +#define HD3SS3220_REG_DEV_REV 0xA0 > > + > > +/* Register HD3SS3220_REG_CN_STAT_CTRL*/ > > +#define HD3SS3220_REG_CN_STAT_CTRL_ATTACHED_STATE_MASK > (BIT(7) | BIT(6)) > > +#define HD3SS3220_REG_CN_STAT_CTRL_AS_DFP BIT(6) > > +#define HD3SS3220_REG_CN_STAT_CTRL_AS_UFP BIT(7) > > +#define HD3SS3220_REG_CN_STAT_CTRL_TO_ACCESSORY > (BIT(7) | BIT(6)) > > +#define HD3SS3220_REG_CN_STAT_CTRL_INT_STATUS BIT(4) > > + > > +/* Register HD3SS3220_REG_GEN_CTRL*/ > > +#define HD3SS3220_REG_GEN_CTRL_SRC_PREF_MASK > (BIT(2) | BIT(1)) > > +#define HD3SS3220_REG_GEN_CTRL_SRC_PREF_DRP_DEFAULT 0x00 > > +#define HD3SS3220_REG_GEN_CTRL_SRC_PREF_DRP_TRY_SNK BIT(1) > > +#define HD3SS3220_REG_GEN_CTRL_SRC_PREF_DRP_TRY_SRC > (BIT(2) | BIT(1)) > > + > > +struct hd3ss3220 { > > + struct device *dev; > > + struct regmap *regmap; > > + struct extcon_dev *extcon; > > + struct typec_port *port; > > + struct typec_capability typec_cap; > > +}; > > + > > +static const unsigned int hd3ss3220_cable[] =3D { > > + EXTCON_USB, > > + EXTCON_USB_HOST, > > + EXTCON_NONE > > +}; >=20 > You need to use the USB role class instead of extcon. Check > drivers/usb/roles/class/ and include/linux/usb/role.h >=20 > You may also want to check the updates Yu Chen is introducing to that > class: > https://lkml.org/lkml/2019/3/2/42 Ok. Will use USB role class. Basically this driver need to get role_sw hand= le from usb3 driver. Based on the cable attach status/role switch it need to call= =20 "usb_role_switch_set_role" function and driver will get notified after setting the role. > > +static int hd3ss3220_set_source_pref(struct hd3ss3220 *hd3ss3220, int > > +src_pref) { > > + unsigned int reg_val; > > + int ret; > > + > > + ret =3D regmap_read(hd3ss3220->regmap, > HD3SS3220_REG_GEN_CTRL, ®_val); > > + if (ret < 0) > > + return ret; > > + > > + reg_val &=3D ~HD3SS3220_REG_GEN_CTRL_SRC_PREF_MASK; > > + reg_val |=3D src_pref; > > + > > + return regmap_write(hd3ss3220->regmap, > > + HD3SS3220_REG_GEN_CTRL, > reg_val); >=20 > Please fix the alignment: OK. Will fix it. > return regmap_write(hd3ss3220->regmap, HD3SS3220_REG_GEN_CTRL, > reg_val); >=20 > > +} > > + > > +static int hd3ss3220_attached_state_detect(struct hd3ss3220 > > +*hd3ss3220) { > > + unsigned int reg_val; > > + int ret, attached_state; > > + > > + ret =3D regmap_read(hd3ss3220->regmap, > > + HD3SS3220_REG_CN_STAT_CTRL, ®_val); >=20 > ditto: OK. Will fix it. > ret =3D regmap_read(hd3ss3220->regmap, > HD3SS3220_REG_CN_STAT_CTRL, > ®_val); >=20 > > + if (ret < 0) > > + return ret; > > + > > + reg_val &=3D > HD3SS3220_REG_CN_STAT_CTRL_ATTACHED_STATE_MASK; > > + switch (reg_val) { >=20 > switch (reg_val & > HD3SS3220_REG_CN_STAT_CTRL_ATTACHED_STATE_MASK) >=20 > > + case HD3SS3220_REG_CN_STAT_CTRL_AS_DFP: > > + attached_state =3D EXTCON_USB_HOST; > > + break; > > + case HD3SS3220_REG_CN_STAT_CTRL_AS_UFP: > > + attached_state =3D EXTCON_USB; > > + break; > > + default: > > + attached_state =3D EXTCON_NONE; > > + } > > + > > + return attached_state; > > +} > > + > > +static int hd3ss3220_dr_set(const struct typec_capability *cap, > > + enum typec_data_role role) > > +{ > > + struct hd3ss3220 *hd3ss3220 =3D > > + container_of(cap, struct hd3ss3220, > typec_cap); >=20 > I think scripts/checkpatch.pl would find all these alignment issues: I have ran check patch and it didn't complained about any alignment issues. Any way will fix all the alignment issues. > struct hd3ss3220 *hd3ss3220 =3D container_of(cap, struct hd3ss3220, > typec_cap); >=20 > There are a lot more of those in this patch. Please fix all of them. OK. Will fix. > > + int ret =3D 0; > > + > > + if (role =3D=3D TYPEC_HOST) { > > + extcon_set_state_sync(hd3ss3220->extcon, EXTCON_USB, > false); > > + ret =3D hd3ss3220_set_source_pref(hd3ss3220, > > + > HD3SS3220_REG_GEN_CTRL_SRC_PREF_DRP_TRY_SRC); > > + mdelay(100); >=20 > Whoa! That's a long delay. A bit too long. You should sleep if you really= need > to wait that long, but 100 ms? OK. Will check this again and put appropriate delay/sleep. > > + extcon_set_state_sync(hd3ss3220->extcon, > EXTCON_USB_HOST, true); > > + } else { > > + extcon_set_state_sync(hd3ss3220->extcon, > > + EXTCON_USB_HOST, false); > > + ret =3D hd3ss3220_set_source_pref(hd3ss3220, > > + > HD3SS3220_REG_GEN_CTRL_SRC_PREF_DRP_TRY_SNK); > > + mdelay(100); > > + extcon_set_state_sync(hd3ss3220->extcon, EXTCON_USB, > true); > > + } >=20 > I think you could just call hd3ss3220_set_source_pref() ones here. > Just store the value to a variable in those conditions: OK. Will do. > if (role =3D=3D TYPEC_HOST) > pref =3D HD3SS3220_REG_GEN_CTRL_SRC_PREF_DRP_TRY_SRC; > else > pref =3D HD3SS3220_REG_GEN_CTRL_SRC_PREF_DRP_TRY_SNK; >=20 > ret =3D hd3ss3220_set_source_pref(hd3ss3220, pref); > ... >=20 > > + typec_set_data_role(hd3ss3220->port, role); > > + > > + return ret; > > +} > > + > > +static void hd3ss3220_set_extcon_state(struct hd3ss3220 *hd3ss3220) { > > + int attached_state =3D hd3ss3220_attached_state_detect(hd3ss3220); > > + > > + if (attached_state =3D=3D EXTCON_USB_HOST) { > > + extcon_set_state_sync(hd3ss3220->extcon, EXTCON_USB, > false); > > + extcon_set_state_sync(hd3ss3220->extcon, > EXTCON_USB_HOST, true); > > + typec_set_data_role(hd3ss3220->port, TYPEC_HOST); > > + } else if (attached_state =3D=3D EXTCON_USB) { > > + extcon_set_state_sync(hd3ss3220->extcon, > > + EXTCON_USB_HOST, false); > > + extcon_set_state_sync(hd3ss3220->extcon, EXTCON_USB, > true); > > + typec_set_data_role(hd3ss3220->port, TYPEC_DEVICE); > > + } else { > > + hd3ss3220_set_source_pref(hd3ss3220, > > + > HD3SS3220_REG_GEN_CTRL_SRC_PREF_DRP_DEFAULT); > > + extcon_set_state_sync(hd3ss3220->extcon, > > + EXTCON_USB_HOST, false); > > + extcon_set_state_sync(hd3ss3220->extcon, EXTCON_USB, > false); > > + } > > +} > > + > > +irqreturn_t hd3ss3220_irq(struct hd3ss3220 *hd3ss3220) { > > + int err; > > + unsigned int data; > > + > > + hd3ss3220_set_extcon_state(hd3ss3220); > > + > > + err =3D regmap_read(hd3ss3220->regmap, > HD3SS3220_REG_CN_STAT_CTRL, &data); > > + if (err < 0) > > + return IRQ_NONE; > > + > > + err =3D regmap_write(hd3ss3220->regmap, > > + HD3SS3220_REG_CN_STAT_CTRL, > > + data | > HD3SS3220_REG_CN_STAT_CTRL_INT_STATUS); > > + if (err < 0) > > + return IRQ_NONE; > > + > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t hd3ss3220_irq_handler(int irq, void *data) { > > + struct i2c_client *client =3D to_i2c_client(data); > > + struct hd3ss3220 *hd3ss3220 =3D i2c_get_clientdata(client); > > + > > + return hd3ss3220_irq(hd3ss3220); > > +} > > + > > +static int hd3ss3220_probe(struct i2c_client *client, > > + const struct i2c_device_id *id) > > +{ > > + struct hd3ss3220 *hd3ss3220; > > + int ret; > > + unsigned int data; > > + static const struct regmap_config config =3D { > > + .reg_bits =3D 8, > > + .val_bits =3D 8, > > + .max_register =3D 0x0A, > > + }; >=20 > Move that outside of the function. OK. Will do. > > + hd3ss3220 =3D devm_kzalloc(&client->dev, sizeof(struct hd3ss3220), > > + GFP_KERNEL); > > + if (!hd3ss3220) > > + return -ENOMEM; > > + > > + i2c_set_clientdata(client, hd3ss3220); > > + > > + hd3ss3220->regmap =3D devm_regmap_init_i2c(client, &config); > > + if (IS_ERR(hd3ss3220->regmap)) > > + return PTR_ERR(hd3ss3220->regmap); > > + > > + hd3ss3220_set_source_pref(hd3ss3220, > > + > HD3SS3220_REG_GEN_CTRL_SRC_PREF_DRP_DEFAULT); > > + > > + hd3ss3220->extcon =3D devm_extcon_dev_allocate(&client->dev, > > + hd3ss3220_cable); > > + if (IS_ERR(hd3ss3220->extcon)) { > > + dev_err(&client->dev, "failed to allocate extcon device\n"); > > + return PTR_ERR(hd3ss3220->extcon); > > + } > > + > > + ret =3D devm_extcon_dev_register(&client->dev, hd3ss3220->extcon); > > + if (ret < 0) { > > + dev_err(&client->dev, "failed to register extcon device\n"); > > + return ret; > > + } > > + > > + hd3ss3220->dev =3D &client->dev; > > + hd3ss3220->typec_cap.prefer_role =3D TYPEC_NO_PREFERRED_ROLE; > > + hd3ss3220->typec_cap.dr_set =3D hd3ss3220_dr_set; > > + hd3ss3220->typec_cap.type =3D TYPEC_PORT_DRP; > > + hd3ss3220->typec_cap.data =3D TYPEC_PORT_DRD; > > + > > + hd3ss3220->port =3D typec_register_port(&client->dev, > > + &hd3ss3220->typec_cap); > > + if (IS_ERR(hd3ss3220->port)) > > + return PTR_ERR(hd3ss3220->port); > > + > > + hd3ss3220_set_extcon_state(hd3ss3220); > > + if (client->irq > 0) { > > + ret =3D regmap_read(hd3ss3220->regmap, > > + HD3SS3220_REG_CN_STAT_CTRL, &data); > > + if (ret < 0) > > + goto error; > > + > > + if (data & HD3SS3220_REG_CN_STAT_CTRL_INT_STATUS) { > > + ret =3D regmap_write(hd3ss3220->regmap, > > + HD3SS3220_REG_CN_STAT_CTRL, > > + data | > HD3SS3220_REG_CN_STAT_CTRL_INT_STATUS); > > + if (ret < 0) > > + goto error; > > + } > > + > > + ret =3D devm_request_threaded_irq(&client->dev, client->irq, > > + NULL, hd3ss3220_irq_handler, > > + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, > > + "hd3ss3220", &client->dev); > > + if (ret) > > + goto error; > > + } > > + > > + ret =3D i2c_smbus_read_byte_data(client, HD3SS3220_REG_DEV_REV); > > + if (ret < 0) > > + goto error; > > + > > + dev_info(&client->dev, "probed revision=3D0x%x\n", ret); > > + > > + return 0; > > +error: > > + typec_unregister_port(hd3ss3220->port); > > + > > + return ret; > > +} > > + > > +static int hd3ss3220_remove(struct i2c_client *client) { > > + struct hd3ss3220 *hd3ss3220 =3D i2c_get_clientdata(client); > > + > > + typec_unregister_port(hd3ss3220->port); > > + > > + return 0; > > +} > > + > > +static const struct of_device_id dev_ids[] =3D { > > + { .compatible =3D "ti,hd3ss3220"}, > > + {} > > +}; > > +MODULE_DEVICE_TABLE(of, dev_ids); > > + > > +static struct i2c_driver hd3ss3220_driver =3D { > > + .driver =3D { > > + .name =3D "hd3ss3220", > > + .owner =3D THIS_MODULE, > > + .of_match_table =3D of_match_ptr(dev_ids), > > + }, > > + .probe =3D hd3ss3220_probe, > > + .remove =3D hd3ss3220_remove, > > +}; > > + > > +module_i2c_driver(hd3ss3220_driver); > > + > > +MODULE_AUTHOR("Biju Das "); > > +MODULE_DESCRIPTION("TI HD3SS3220 DRP Port Controller Driver"); > > +MODULE_LICENSE("GPL"); >=20 > You will need to use the USB role class instead of extcon. Otherwise this > looks OK to me, assuming you fix the style issues ;-). Regards, Biju From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [3/9] usb: typec: driver for TI HD3SS3220 USB Type-C DRP port controller From: Biju Das Message-Id: Date: Thu, 7 Mar 2019 15:57:51 +0000 To: Heikki Krogerus Cc: Greg Kroah-Hartman , Felipe Balbi , "linux-usb@vger.kernel.org" , Simon Horman , Yoshihiro Shimoda , Geert Uytterhoeven , Chris Paterson , Fabrizio Castro , "linux-renesas-soc@vger.kernel.org" List-ID: SGkgSGVpa2tpLAoKVGhhbmtzIGZvciB0aGUgZmVlZGJhY2suCgo+IFN1YmplY3Q6IFJlOiBbUEFU Q0ggMy85XSB1c2I6IHR5cGVjOiBkcml2ZXIgZm9yIFRJIEhEM1NTMzIyMCBVU0IgVHlwZS1DIERS UAo+IHBvcnQgY29udHJvbGxlcgo+IAo+IE9uIFdlZCwgTWFyIDA2LCAyMDE5IGF0IDA5OjA3OjIw QU0gKzAwMDAsIEJpanUgRGFzIHdyb3RlOgo+ID4gRHJpdmVyIGZvciBUSSBIRDNTUzMyMjAgVVNC IFR5cGUtQyBEUlAgcG9ydCBjb250cm9sbGVyLgo+ID4KPiA+IFRoZSBkcml2ZXIgY3VycmVudGx5 IHJlZ2lzdGVycyB0aGUgcG9ydCBhbmQgc3VwcG9ydHMgZGF0YSByb2xlIHN3YXBwaW5nLgo+ID4K PiA+IFNpZ25lZC1vZmYtYnk6IEJpanUgRGFzIDxiaWp1LmRhc0BicC5yZW5lc2FzLmNvbT4KPiA+ IC0tLQo+ID4gIGRyaXZlcnMvdXNiL3R5cGVjL0tjb25maWcgICAgIHwgIDEwICsrCj4gPiAgZHJp dmVycy91c2IvdHlwZWMvTWFrZWZpbGUgICAgfCAgIDEgKwo+ID4gIGRyaXZlcnMvdXNiL3R5cGVj L2hkM3NzMzIyMC5jIHwgMjg0Cj4gPiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysKPiA+ICAzIGZpbGVzIGNoYW5nZWQsIDI5NSBpbnNlcnRpb25zKCspCj4gPiAgY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL3R5cGVjL2hkM3NzMzIyMC5jCj4gPgo+ID4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3R5cGVjL0tjb25maWcgYi9kcml2ZXJzL3VzYi90eXBlYy9L Y29uZmlnCj4gPiBpbmRleCAzMGE4NDdjLi45MTY5NmQyIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVy cy91c2IvdHlwZWMvS2NvbmZpZwo+ID4gKysrIGIvZHJpdmVycy91c2IvdHlwZWMvS2NvbmZpZwo+ ID4gQEAgLTQ5LDYgKzQ5LDE2IEBAIHNvdXJjZSAiZHJpdmVycy91c2IvdHlwZWMvdGNwbS9LY29u ZmlnIgo+ID4KPiA+ICBzb3VyY2UgImRyaXZlcnMvdXNiL3R5cGVjL3Vjc2kvS2NvbmZpZyIKPiA+ Cj4gPiArY29uZmlnIFRZUEVDX0hEM1NTMzIyMAo+ID4gKwl0cmlzdGF0ZSAiVEkgSEQzU1MzMjIw IFR5cGUtQyBEUlAgUG9ydCBjb250cm9sbGVyIGRyaXZlciIKPiA+ICsJZGVwZW5kcyBvbiBJMkMK PiA+ICsJaGVscAo+ID4gKwkgIFNheSBZIG9yIE0gaGVyZSBpZiB5b3VyIHN5c3RlbSBoYXMgVEkg SEQzU1MzMjIwIFR5cGUtQyBEUlAgUG9ydAo+ID4gKwkgIGNvbnRyb2xsZXIgZHJpdmVyLgo+ID4g Kwo+ID4gKwkgIElmIHlvdSBjaG9vc2UgdG8gYnVpbGQgdGhpcyBkcml2ZXIgYXMgYSBkeW5hbWlj YWxseSBsaW5rZWQgbW9kdWxlLCB0aGUKPiA+ICsJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaGQz c3MzMjIwLmtvLgo+ID4gKwo+ID4gIGNvbmZpZyBUWVBFQ19UUFM2NTk4WAo+ID4gIAl0cmlzdGF0 ZSAiVEkgVFBTNjU5OHggVVNCIFBvd2VyIERlbGl2ZXJ5IGNvbnRyb2xsZXIgZHJpdmVyIgo+ID4g IAlkZXBlbmRzIG9uIEkyQwo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3R5cGVjL01ha2Vm aWxlIGIvZHJpdmVycy91c2IvdHlwZWMvTWFrZWZpbGUKPiA+IGluZGV4IDY2OTZiNzIuLjc3NTNh NWMzIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy91c2IvdHlwZWMvTWFrZWZpbGUKPiA+ICsrKyBi L2RyaXZlcnMvdXNiL3R5cGVjL01ha2VmaWxlCj4gPiBAQCAtNCw1ICs0LDYgQEAgdHlwZWMteQkJ CQk6PSBjbGFzcy5vIG11eC5vIGJ1cy5vCj4gPiAgb2JqLSQoQ09ORklHX1RZUEVDKQkJKz0gYWx0 bW9kZXMvCj4gPiAgb2JqLSQoQ09ORklHX1RZUEVDX1RDUE0pCSs9IHRjcG0vCj4gPiAgb2JqLSQo Q09ORklHX1RZUEVDX1VDU0kpCSs9IHVjc2kvCj4gPiArb2JqLSQoQ09ORklHX1RZUEVDX0hEM1NT MzIyMCkJKz0gaGQzc3MzMjIwLm8KPiA+ICBvYmotJChDT05GSUdfVFlQRUNfVFBTNjU5OFgpCSs9 IHRwczY1OTh4Lm8KPiA+ICBvYmotJChDT05GSUdfVFlQRUMpCQkrPSBtdXgvCj4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy91c2IvdHlwZWMvaGQzc3MzMjIwLmMKPiA+IGIvZHJpdmVycy91c2IvdHlw ZWMvaGQzc3MzMjIwLmMgbmV3IGZpbGUgbW9kZSAxMDA2NDQgaW5kZXgKPiA+IDAwMDAwMDAuLmJk M2UxZWMKPiA+IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2RyaXZlcnMvdXNiL3R5cGVjL2hkM3Nz MzIyMC5jCj4gPiBAQCAtMCwwICsxLDI4NCBAQAo+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlm aWVyOiBHUEwtMi4wKwo+ID4gKy8qCj4gPiArICogVEkgSEQzU1MzMjIwIFR5cGUtQyBEUlAgUG9y dCBDb250cm9sbGVyIERyaXZlcgo+ID4gKyAqCj4gPiArICogQ29weXJpZ2h0IChDKSAyMDE5IFJl bmVzYXMgRWxlY3Ryb25pY3MgQ29ycC4KPiA+ICsgKi8KPiA+ICsKPiA+ICsjaW5jbHVkZSA8bGlu dXgvbW9kdWxlLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgo+ID4gKyNpbmNsdWRlIDxs aW51eC9leHRjb24tcHJvdmlkZXIuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+ Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9t b2R1bGUuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgv cmVnbWFwLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPiA+ICsjaW5jbHVkZSA8bGlu dXgvdXNiL3R5cGVjLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gPiArCj4gPiAr I2RlZmluZSBIRDNTUzMyMjBfUkVHX0NOX1NUQVRfQ1RSTAkweDA5Cj4gPiArI2RlZmluZSBIRDNT UzMyMjBfUkVHX0dFTl9DVFJMCQkweDBBCj4gPiArI2RlZmluZSBIRDNTUzMyMjBfUkVHX0RFVl9S RVYJCTB4QTAKPiA+ICsKPiA+ICsvKiBSZWdpc3RlciBIRDNTUzMyMjBfUkVHX0NOX1NUQVRfQ1RS TCovCj4gPiArI2RlZmluZSBIRDNTUzMyMjBfUkVHX0NOX1NUQVRfQ1RSTF9BVFRBQ0hFRF9TVEFU RV9NQVNLCj4gCShCSVQoNykgfCBCSVQoNikpCj4gPiArI2RlZmluZSBIRDNTUzMyMjBfUkVHX0NO X1NUQVRfQ1RSTF9BU19ERlAJCUJJVCg2KQo+ID4gKyNkZWZpbmUgSEQzU1MzMjIwX1JFR19DTl9T VEFUX0NUUkxfQVNfVUZQCQlCSVQoNykKPiA+ICsjZGVmaW5lIEhEM1NTMzIyMF9SRUdfQ05fU1RB VF9DVFJMX1RPX0FDQ0VTU09SWQo+IAkoQklUKDcpIHwgQklUKDYpKQo+ID4gKyNkZWZpbmUgSEQz U1MzMjIwX1JFR19DTl9TVEFUX0NUUkxfSU5UX1NUQVRVUwkJQklUKDQpCj4gPiArCj4gPiArLyog UmVnaXN0ZXIgSEQzU1MzMjIwX1JFR19HRU5fQ1RSTCovCj4gPiArI2RlZmluZSBIRDNTUzMyMjBf UkVHX0dFTl9DVFJMX1NSQ19QUkVGX01BU0sKPiAJKEJJVCgyKSB8IEJJVCgxKSkKPiA+ICsjZGVm aW5lIEhEM1NTMzIyMF9SRUdfR0VOX0NUUkxfU1JDX1BSRUZfRFJQX0RFRkFVTFQJMHgwMAo+ID4g KyNkZWZpbmUgSEQzU1MzMjIwX1JFR19HRU5fQ1RSTF9TUkNfUFJFRl9EUlBfVFJZX1NOSwlCSVQo MSkKPiA+ICsjZGVmaW5lIEhEM1NTMzIyMF9SRUdfR0VOX0NUUkxfU1JDX1BSRUZfRFJQX1RSWV9T UkMKPiAJKEJJVCgyKSB8IEJJVCgxKSkKPiA+ICsKPiA+ICtzdHJ1Y3QgaGQzc3MzMjIwIHsKPiA+ ICsJc3RydWN0IGRldmljZSAqZGV2Owo+ID4gKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7Cj4gPiAr CXN0cnVjdCBleHRjb25fZGV2ICpleHRjb247Cj4gPiArCXN0cnVjdCB0eXBlY19wb3J0ICpwb3J0 Owo+ID4gKwlzdHJ1Y3QgdHlwZWNfY2FwYWJpbGl0eSB0eXBlY19jYXA7Cj4gPiArfTsKPiA+ICsK PiA+ICtzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGhkM3NzMzIyMF9jYWJsZVtdID0gewo+ID4g KwlFWFRDT05fVVNCLAo+ID4gKwlFWFRDT05fVVNCX0hPU1QsCj4gPiArCUVYVENPTl9OT05FCj4g PiArfTsKPiAKPiBZb3UgbmVlZCB0byB1c2UgdGhlIFVTQiByb2xlIGNsYXNzIGluc3RlYWQgb2Yg ZXh0Y29uLiBDaGVjawo+IGRyaXZlcnMvdXNiL3JvbGVzL2NsYXNzLyBhbmQgaW5jbHVkZS9saW51 eC91c2Ivcm9sZS5oCj4gCj4gWW91IG1heSBhbHNvIHdhbnQgdG8gY2hlY2sgdGhlIHVwZGF0ZXMg WXUgQ2hlbiBpcyBpbnRyb2R1Y2luZyB0byB0aGF0Cj4gY2xhc3M6Cj4gaHR0cHM6Ly9sa21sLm9y Zy9sa21sLzIwMTkvMy8yLzQyCgpPay4gV2lsbCB1c2UgVVNCIHJvbGUgY2xhc3MuIEJhc2ljYWxs eSB0aGlzIGRyaXZlciBuZWVkIHRvIGdldCByb2xlX3N3IGhhbmRsZSBmcm9tCnVzYjMgZHJpdmVy LiBCYXNlZCBvbiB0aGUgIGNhYmxlIGF0dGFjaCBzdGF0dXMvcm9sZSBzd2l0Y2ggaXQgbmVlZCB0 byBjYWxsIAoidXNiX3JvbGVfc3dpdGNoX3NldF9yb2xlIiAgZnVuY3Rpb24gYW5kICBkcml2ZXIg d2lsbCBnZXQgIG5vdGlmaWVkIGFmdGVyCnNldHRpbmcgdGhlIHJvbGUuCgo+ID4gK3N0YXRpYyBp bnQgaGQzc3MzMjIwX3NldF9zb3VyY2VfcHJlZihzdHJ1Y3QgaGQzc3MzMjIwICpoZDNzczMyMjAs IGludAo+ID4gK3NyY19wcmVmKSB7Cj4gPiArCXVuc2lnbmVkIGludCByZWdfdmFsOwo+ID4gKwlp bnQgcmV0Owo+ID4gKwo+ID4gKwlyZXQgPSByZWdtYXBfcmVhZChoZDNzczMyMjAtPnJlZ21hcCwK PiBIRDNTUzMyMjBfUkVHX0dFTl9DVFJMLCAmcmVnX3ZhbCk7Cj4gPiArCWlmIChyZXQgPCAwKQo+ ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJcmVnX3ZhbCAmPSB+SEQzU1MzMjIwX1JFR19H RU5fQ1RSTF9TUkNfUFJFRl9NQVNLOwo+ID4gKwlyZWdfdmFsIHw9IHNyY19wcmVmOwo+ID4gKwo+ ID4gKwlyZXR1cm4gcmVnbWFwX3dyaXRlKGhkM3NzMzIyMC0+cmVnbWFwLAo+ID4gKwkJCQkJSEQz U1MzMjIwX1JFR19HRU5fQ1RSTCwKPiByZWdfdmFsKTsKPiAKPiBQbGVhc2UgZml4IHRoZSBhbGln bm1lbnQ6CgpPSy4gV2lsbCBmaXggaXQuCgo+ICAgICAgICAgcmV0dXJuIHJlZ21hcF93cml0ZSho ZDNzczMyMjAtPnJlZ21hcCwgSEQzU1MzMjIwX1JFR19HRU5fQ1RSTCwKPiByZWdfdmFsKTsKPiAK PiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBoZDNzczMyMjBfYXR0YWNoZWRfc3RhdGVfZGV0 ZWN0KHN0cnVjdCBoZDNzczMyMjAKPiA+ICsqaGQzc3MzMjIwKSB7Cj4gPiArCXVuc2lnbmVkIGlu dCByZWdfdmFsOwo+ID4gKwlpbnQgcmV0LCBhdHRhY2hlZF9zdGF0ZTsKPiA+ICsKPiA+ICsJcmV0 ID0gcmVnbWFwX3JlYWQoaGQzc3MzMjIwLT5yZWdtYXAsCj4gPiArCQkJCUhEM1NTMzIyMF9SRUdf Q05fU1RBVF9DVFJMLCAmcmVnX3ZhbCk7Cj4gCj4gZGl0dG86Ck9LLiBXaWxsIGZpeCBpdC4KCj4g CXJldCA9IHJlZ21hcF9yZWFkKGhkM3NzMzIyMC0+cmVnbWFwLAo+IEhEM1NTMzIyMF9SRUdfQ05f U1RBVF9DVFJMLAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ192YWwpOwo+IAo+ID4g KwlpZiAocmV0IDwgMCkKPiA+ICsJCXJldHVybiByZXQ7Cj4gPiArCj4gPiArCXJlZ192YWwgJj0K PiBIRDNTUzMyMjBfUkVHX0NOX1NUQVRfQ1RSTF9BVFRBQ0hFRF9TVEFURV9NQVNLOwo+ID4gKwlz d2l0Y2ggKHJlZ192YWwpIHsKPiAKPiAgICAgICAgIHN3aXRjaCAocmVnX3ZhbCAmCj4gSEQzU1Mz MjIwX1JFR19DTl9TVEFUX0NUUkxfQVRUQUNIRURfU1RBVEVfTUFTSykKPiAKPiA+ICsJY2FzZSBI RDNTUzMyMjBfUkVHX0NOX1NUQVRfQ1RSTF9BU19ERlA6Cj4gPiArCQlhdHRhY2hlZF9zdGF0ZSA9 IEVYVENPTl9VU0JfSE9TVDsKPiA+ICsJYnJlYWs7Cj4gPiArCWNhc2UgSEQzU1MzMjIwX1JFR19D Tl9TVEFUX0NUUkxfQVNfVUZQOgo+ID4gKwkJYXR0YWNoZWRfc3RhdGUgPSBFWFRDT05fVVNCOwo+ ID4gKwlicmVhazsKPiA+ICsJZGVmYXVsdDoKPiA+ICsJCWF0dGFjaGVkX3N0YXRlID0gRVhUQ09O X05PTkU7Cj4gPiArCX0KPiA+ICsKPiA+ICsJcmV0dXJuIGF0dGFjaGVkX3N0YXRlOwo+ID4gK30K PiA+ICsKPiA+ICtzdGF0aWMgaW50IGhkM3NzMzIyMF9kcl9zZXQoY29uc3Qgc3RydWN0IHR5cGVj X2NhcGFiaWxpdHkgKmNhcCwKPiA+ICsJCQkJCWVudW0gdHlwZWNfZGF0YV9yb2xlIHJvbGUpCj4g PiArewo+ID4gKwlzdHJ1Y3QgaGQzc3MzMjIwICpoZDNzczMyMjAgPQo+ID4gKwkJCQljb250YWlu ZXJfb2YoY2FwLCBzdHJ1Y3QgaGQzc3MzMjIwLAo+IHR5cGVjX2NhcCk7Cj4gCj4gSSB0aGluayBz Y3JpcHRzL2NoZWNrcGF0Y2gucGwgd291bGQgZmluZCBhbGwgdGhlc2UgYWxpZ25tZW50IGlzc3Vl czoKCkkgaGF2ZSByYW4gY2hlY2sgcGF0Y2ggYW5kIGl0IGRpZG4ndCBjb21wbGFpbmVkIGFib3V0 IGFueSBhbGlnbm1lbnQgaXNzdWVzLgpBbnkgd2F5IHdpbGwgZml4IGFsbCB0aGUgYWxpZ25tZW50 IGlzc3Vlcy4KCj4gCXN0cnVjdCBoZDNzczMyMjAgKmhkM3NzMzIyMCA9IGNvbnRhaW5lcl9vZihj YXAsIHN0cnVjdCBoZDNzczMyMjAsCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdHlwZWNfY2FwKTsKPiAKPiBUaGVyZSBhcmUgYSBsb3QgbW9yZSBv ZiB0aG9zZSBpbiB0aGlzIHBhdGNoLiBQbGVhc2UgZml4IGFsbCBvZiB0aGVtLgoKT0suIFdpbGwg Zml4LgoKPiA+ICsJaW50IHJldCA9IDA7Cj4gPiArCj4gPiArCWlmIChyb2xlID09IFRZUEVDX0hP U1QpIHsKPiA+ICsJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhoZDNzczMyMjAtPmV4dGNvbiwgRVhU Q09OX1VTQiwKPiBmYWxzZSk7Cj4gPiArCQlyZXQgPSBoZDNzczMyMjBfc2V0X3NvdXJjZV9wcmVm KGhkM3NzMzIyMCwKPiA+ICsKPiAJSEQzU1MzMjIwX1JFR19HRU5fQ1RSTF9TUkNfUFJFRl9EUlBf VFJZX1NSQyk7Cj4gPiArCQltZGVsYXkoMTAwKTsKPiAKPiBXaG9hISBUaGF0J3MgYSBsb25nIGRl bGF5LiBBIGJpdCB0b28gbG9uZy4gWW91IHNob3VsZCBzbGVlcCBpZiB5b3UgcmVhbGx5IG5lZWQK PiB0byB3YWl0IHRoYXQgbG9uZywgYnV0IDEwMCBtcz8KCk9LLiBXaWxsIGNoZWNrIHRoaXMgYWdh aW4gYW5kIHB1dCBhcHByb3ByaWF0ZSBkZWxheS9zbGVlcC4KCj4gPiArCQlleHRjb25fc2V0X3N0 YXRlX3N5bmMoaGQzc3MzMjIwLT5leHRjb24sCj4gRVhUQ09OX1VTQl9IT1NULCB0cnVlKTsKPiA+ ICsJfSBlbHNlIHsKPiA+ICsJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhoZDNzczMyMjAtPmV4dGNv biwKPiA+ICsJCQkJCQlFWFRDT05fVVNCX0hPU1QsIGZhbHNlKTsKPiA+ICsJCXJldCA9IGhkM3Nz MzIyMF9zZXRfc291cmNlX3ByZWYoaGQzc3MzMjIwLAo+ID4gKwo+IAlIRDNTUzMyMjBfUkVHX0dF Tl9DVFJMX1NSQ19QUkVGX0RSUF9UUllfU05LKTsKPiA+ICsJCW1kZWxheSgxMDApOwo+ID4gKwkJ ZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGhkM3NzMzIyMC0+ZXh0Y29uLCBFWFRDT05fVVNCLAo+IHRy dWUpOwo+ID4gKwl9Cj4gCj4gSSB0aGluayB5b3UgY291bGQganVzdCBjYWxsIGhkM3NzMzIyMF9z ZXRfc291cmNlX3ByZWYoKSBvbmVzIGhlcmUuCj4gSnVzdCBzdG9yZSB0aGUgdmFsdWUgdG8gYSB2 YXJpYWJsZSBpbiB0aG9zZSBjb25kaXRpb25zOgoKT0suIFdpbGwgZG8uCgo+ICAgICAgICAgaWYg KHJvbGUgPT0gVFlQRUNfSE9TVCkKPiAgICAgICAgICAgICAgICAgcHJlZiA9IEhEM1NTMzIyMF9S RUdfR0VOX0NUUkxfU1JDX1BSRUZfRFJQX1RSWV9TUkM7Cj4gICAgICAgICBlbHNlCj4gICAgICAg ICAgICAgICAgIHByZWYgPSBIRDNTUzMyMjBfUkVHX0dFTl9DVFJMX1NSQ19QUkVGX0RSUF9UUllf U05LOwo+IAo+ICAgICAgICAgcmV0ID0gaGQzc3MzMjIwX3NldF9zb3VyY2VfcHJlZihoZDNzczMy MjAsIHByZWYpOwo+ICAgICAgICAgLi4uCj4gCj4gPiArCXR5cGVjX3NldF9kYXRhX3JvbGUoaGQz c3MzMjIwLT5wb3J0LCByb2xlKTsKPiA+ICsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIHZvaWQgaGQzc3MzMjIwX3NldF9leHRjb25fc3RhdGUoc3RydWN0IGhkM3Nz MzIyMCAqaGQzc3MzMjIwKSB7Cj4gPiArCWludCBhdHRhY2hlZF9zdGF0ZSA9IGhkM3NzMzIyMF9h dHRhY2hlZF9zdGF0ZV9kZXRlY3QoaGQzc3MzMjIwKTsKPiA+ICsKPiA+ICsJaWYgKGF0dGFjaGVk X3N0YXRlID09IEVYVENPTl9VU0JfSE9TVCkgewo+ID4gKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5j KGhkM3NzMzIyMC0+ZXh0Y29uLCBFWFRDT05fVVNCLAo+IGZhbHNlKTsKPiA+ICsJCWV4dGNvbl9z ZXRfc3RhdGVfc3luYyhoZDNzczMyMjAtPmV4dGNvbiwKPiBFWFRDT05fVVNCX0hPU1QsIHRydWUp Owo+ID4gKwkJdHlwZWNfc2V0X2RhdGFfcm9sZShoZDNzczMyMjAtPnBvcnQsIFRZUEVDX0hPU1Qp Owo+ID4gKwl9IGVsc2UgaWYgKGF0dGFjaGVkX3N0YXRlID09IEVYVENPTl9VU0IpIHsKPiA+ICsJ CWV4dGNvbl9zZXRfc3RhdGVfc3luYyhoZDNzczMyMjAtPmV4dGNvbiwKPiA+ICsJCQkJCQkgRVhU Q09OX1VTQl9IT1NULCBmYWxzZSk7Cj4gPiArCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaGQzc3Mz MjIwLT5leHRjb24sIEVYVENPTl9VU0IsCj4gdHJ1ZSk7Cj4gPiArCQl0eXBlY19zZXRfZGF0YV9y b2xlKGhkM3NzMzIyMC0+cG9ydCwgVFlQRUNfREVWSUNFKTsKPiA+ICsJfSBlbHNlIHsKPiA+ICsJ CWhkM3NzMzIyMF9zZXRfc291cmNlX3ByZWYoaGQzc3MzMjIwLAo+ID4gKwo+IAlIRDNTUzMyMjBf UkVHX0dFTl9DVFJMX1NSQ19QUkVGX0RSUF9ERUZBVUxUKTsKPiA+ICsJCWV4dGNvbl9zZXRfc3Rh dGVfc3luYyhoZDNzczMyMjAtPmV4dGNvbiwKPiA+ICsJCQkJCQlFWFRDT05fVVNCX0hPU1QsIGZh bHNlKTsKPiA+ICsJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhoZDNzczMyMjAtPmV4dGNvbiwgRVhU Q09OX1VTQiwKPiBmYWxzZSk7Cj4gPiArCX0KPiA+ICt9Cj4gPiArCj4gPiAraXJxcmV0dXJuX3Qg aGQzc3MzMjIwX2lycShzdHJ1Y3QgaGQzc3MzMjIwICpoZDNzczMyMjApIHsKPiA+ICsJaW50IGVy cjsKPiA+ICsJdW5zaWduZWQgaW50IGRhdGE7Cj4gPiArCj4gPiArCWhkM3NzMzIyMF9zZXRfZXh0 Y29uX3N0YXRlKGhkM3NzMzIyMCk7Cj4gPiArCj4gPiArCWVyciA9IHJlZ21hcF9yZWFkKGhkM3Nz MzIyMC0+cmVnbWFwLAo+IEhEM1NTMzIyMF9SRUdfQ05fU1RBVF9DVFJMLCAmZGF0YSk7Cj4gPiAr CWlmIChlcnIgPCAwKQo+ID4gKwkJcmV0dXJuIElSUV9OT05FOwo+ID4gKwo+ID4gKwllcnIgPSBy ZWdtYXBfd3JpdGUoaGQzc3MzMjIwLT5yZWdtYXAsCj4gPiArCQkJSEQzU1MzMjIwX1JFR19DTl9T VEFUX0NUUkwsCj4gPiArCQkJZGF0YSB8Cj4gSEQzU1MzMjIwX1JFR19DTl9TVEFUX0NUUkxfSU5U X1NUQVRVUyk7Cj4gPiArCWlmIChlcnIgPCAwKQo+ID4gKwkJcmV0dXJuIElSUV9OT05FOwo+ID4g Kwo+ID4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFy ZXR1cm5fdCBoZDNzczMyMjBfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkgewo+ID4g KwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkYXRhKTsKPiA+ICsJ c3RydWN0IGhkM3NzMzIyMCAqaGQzc3MzMjIwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7 Cj4gPiArCj4gPiArCXJldHVybiBoZDNzczMyMjBfaXJxKGhkM3NzMzIyMCk7Cj4gPiArfQo+ID4g Kwo+ID4gK3N0YXRpYyBpbnQgaGQzc3MzMjIwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGll bnQsCj4gPiArCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCj4gPiArewo+ID4gKwlz dHJ1Y3QgaGQzc3MzMjIwICpoZDNzczMyMjA7Cj4gPiArCWludCByZXQ7Cj4gPiArCXVuc2lnbmVk IGludCBkYXRhOwo+ID4gKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgY29uZmln ID0gewo+ID4gKwkJLnJlZ19iaXRzID0gOCwKPiA+ICsJCS52YWxfYml0cyA9IDgsCj4gPiArCQku bWF4X3JlZ2lzdGVyID0gMHgwQSwKPiA+ICsJfTsKPiAKPiBNb3ZlIHRoYXQgb3V0c2lkZSBvZiB0 aGUgZnVuY3Rpb24uCiBPSy4gV2lsbCBkby4KPiA+ICsJaGQzc3MzMjIwID0gZGV2bV9remFsbG9j KCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBoZDNzczMyMjApLAo+ID4gKwkJCQlHRlBfS0VS TkVMKTsKPiA+ICsJaWYgKCFoZDNzczMyMjApCj4gPiArCQlyZXR1cm4gLUVOT01FTTsKPiA+ICsK PiA+ICsJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaGQzc3MzMjIwKTsKPiA+ICsKPiA+ICsJ aGQzc3MzMjIwLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZjb25maWcp Owo+ID4gKwlpZiAoSVNfRVJSKGhkM3NzMzIyMC0+cmVnbWFwKSkKPiA+ICsJCXJldHVybiBQVFJf RVJSKGhkM3NzMzIyMC0+cmVnbWFwKTsKPiA+ICsKPiA+ICsJaGQzc3MzMjIwX3NldF9zb3VyY2Vf cHJlZihoZDNzczMyMjAsCj4gPiArCj4gCUhEM1NTMzIyMF9SRUdfR0VOX0NUUkxfU1JDX1BSRUZf RFJQX0RFRkFVTFQpOwo+ID4gKwo+ID4gKwloZDNzczMyMjAtPmV4dGNvbiA9IGRldm1fZXh0Y29u X2Rldl9hbGxvY2F0ZSgmY2xpZW50LT5kZXYsCj4gPiArCQkJCQkJaGQzc3MzMjIwX2NhYmxlKTsK PiA+ICsJaWYgKElTX0VSUihoZDNzczMyMjAtPmV4dGNvbikpIHsKPiA+ICsJCWRldl9lcnIoJmNs aWVudC0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGV4dGNvbiBkZXZpY2VcbiIpOwo+ID4gKwkJ cmV0dXJuIFBUUl9FUlIoaGQzc3MzMjIwLT5leHRjb24pOwo+ID4gKwl9Cj4gPiArCj4gPiArCXJl dCA9IGRldm1fZXh0Y29uX2Rldl9yZWdpc3RlcigmY2xpZW50LT5kZXYsIGhkM3NzMzIyMC0+ZXh0 Y29uKTsKPiA+ICsJaWYgKHJldCA8IDApIHsKPiA+ICsJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAi ZmFpbGVkIHRvIHJlZ2lzdGVyIGV4dGNvbiBkZXZpY2VcbiIpOwo+ID4gKwkJcmV0dXJuIHJldDsK PiA+ICsJfQo+ID4gKwo+ID4gKwloZDNzczMyMjAtPmRldiA9ICZjbGllbnQtPmRldjsKPiA+ICsJ aGQzc3MzMjIwLT50eXBlY19jYXAucHJlZmVyX3JvbGUgPSBUWVBFQ19OT19QUkVGRVJSRURfUk9M RTsKPiA+ICsJaGQzc3MzMjIwLT50eXBlY19jYXAuZHJfc2V0ID0gaGQzc3MzMjIwX2RyX3NldDsK PiA+ICsJaGQzc3MzMjIwLT50eXBlY19jYXAudHlwZSA9IFRZUEVDX1BPUlRfRFJQOwo+ID4gKwlo ZDNzczMyMjAtPnR5cGVjX2NhcC5kYXRhID0gVFlQRUNfUE9SVF9EUkQ7Cj4gPiArCj4gPiArCWhk M3NzMzIyMC0+cG9ydCA9IHR5cGVjX3JlZ2lzdGVyX3BvcnQoJmNsaWVudC0+ZGV2LAo+ID4gKwkJ CQkJCSZoZDNzczMyMjAtPnR5cGVjX2NhcCk7Cj4gPiArCWlmIChJU19FUlIoaGQzc3MzMjIwLT5w b3J0KSkKPiA+ICsJCXJldHVybiBQVFJfRVJSKGhkM3NzMzIyMC0+cG9ydCk7Cj4gPiArCj4gPiAr CWhkM3NzMzIyMF9zZXRfZXh0Y29uX3N0YXRlKGhkM3NzMzIyMCk7Cj4gPiArCWlmIChjbGllbnQt PmlycSA+IDApIHsKPiA+ICsJCXJldCA9IHJlZ21hcF9yZWFkKGhkM3NzMzIyMC0+cmVnbWFwLAo+ ID4gKwkJCUhEM1NTMzIyMF9SRUdfQ05fU1RBVF9DVFJMLCAmZGF0YSk7Cj4gPiArCQlpZiAocmV0 IDwgMCkKPiA+ICsJCQlnb3RvIGVycm9yOwo+ID4gKwo+ID4gKwkJaWYgKGRhdGEgJiBIRDNTUzMy MjBfUkVHX0NOX1NUQVRfQ1RSTF9JTlRfU1RBVFVTKSB7Cj4gPiArCQkJcmV0ID0gcmVnbWFwX3dy aXRlKGhkM3NzMzIyMC0+cmVnbWFwLAo+ID4gKwkJCQlIRDNTUzMyMjBfUkVHX0NOX1NUQVRfQ1RS TCwKPiA+ICsJCQkJZGF0YSB8Cj4gSEQzU1MzMjIwX1JFR19DTl9TVEFUX0NUUkxfSU5UX1NUQVRV Uyk7Cj4gPiArCQkJaWYgKHJldCA8IDApCj4gPiArCQkJCWdvdG8gZXJyb3I7Cj4gPiArCQl9Cj4g PiArCj4gPiArCQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZjbGllbnQtPmRldiwg Y2xpZW50LT5pcnEsCj4gPiArCQkJTlVMTCwgaGQzc3MzMjIwX2lycV9oYW5kbGVyLAo+ID4gKwkJ CUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9PTkVTSE9ULAo+ID4gKwkJCSJoZDNzczMyMjAi LCAmY2xpZW50LT5kZXYpOwo+ID4gKwkJaWYgKHJldCkKPiA+ICsJCQlnb3RvIGVycm9yOwo+ID4g Kwl9Cj4gPiArCj4gPiArCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEhE M1NTMzIyMF9SRUdfREVWX1JFVik7Cj4gPiArCWlmIChyZXQgPCAwKQo+ID4gKwkJZ290byBlcnJv cjsKPiA+ICsKPiA+ICsJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAicHJvYmVkIHJldmlzaW9uPTB4 JXhcbiIsIHJldCk7Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4gK2Vycm9yOgo+ID4gKwl0eXBl Y191bnJlZ2lzdGVyX3BvcnQoaGQzc3MzMjIwLT5wb3J0KTsKPiA+ICsKPiA+ICsJcmV0dXJuIHJl dDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBoZDNzczMyMjBfcmVtb3ZlKHN0cnVjdCBp MmNfY2xpZW50ICpjbGllbnQpIHsKPiA+ICsJc3RydWN0IGhkM3NzMzIyMCAqaGQzc3MzMjIwID0g aTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Cj4gPiArCj4gPiArCXR5cGVjX3VucmVnaXN0ZXJf cG9ydChoZDNzczMyMjAtPnBvcnQpOwo+ID4gKwo+ID4gKwlyZXR1cm4gMDsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZGV2X2lkc1tdID0gewo+ID4g Kwl7IC5jb21wYXRpYmxlID0gInRpLGhkM3NzMzIyMCJ9LAo+ID4gKwl7fQo+ID4gK307Cj4gPiAr TU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZGV2X2lkcyk7Cj4gPiArCj4gPiArc3RhdGljIHN0cnVj dCBpMmNfZHJpdmVyIGhkM3NzMzIyMF9kcml2ZXIgPSB7Cj4gPiArCS5kcml2ZXIgPSB7Cj4gPiAr CQkubmFtZSA9ICJoZDNzczMyMjAiLAo+ID4gKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCj4gPiAr CQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoZGV2X2lkcyksCj4gPiArCX0sCj4gPiAr CS5wcm9iZSA9IGhkM3NzMzIyMF9wcm9iZSwKPiA+ICsJLnJlbW92ZSA9ICBoZDNzczMyMjBfcmVt b3ZlLAo+ID4gK307Cj4gPiArCj4gPiArbW9kdWxlX2kyY19kcml2ZXIoaGQzc3MzMjIwX2RyaXZl cik7Cj4gPiArCj4gPiArTU9EVUxFX0FVVEhPUigiQmlqdSBEYXMgPGJpanUuZGFzQGJwLnJlbmVz YXMuY29tPiIpOwo+ID4gK01PRFVMRV9ERVNDUklQVElPTigiVEkgSEQzU1MzMjIwIERSUCBQb3J0 IENvbnRyb2xsZXIgRHJpdmVyIik7Cj4gPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo+IAo+IFlv dSB3aWxsIG5lZWQgdG8gdXNlIHRoZSBVU0Igcm9sZSBjbGFzcyBpbnN0ZWFkIG9mIGV4dGNvbi4g T3RoZXJ3aXNlIHRoaXMKPiBsb29rcyBPSyB0byBtZSwgYXNzdW1pbmcgeW91IGZpeCB0aGUgc3R5 bGUgaXNzdWVzIDstKS4KClJlZ2FyZHMsCkJpanUK