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.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED 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 4A15EC32789 for ; Thu, 8 Nov 2018 11:33:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D675621104 for ; Thu, 8 Nov 2018 11:33:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=cadence.com header.i=@cadence.com header.b="InQKw2Dd"; dkim=pass (1024-bit key) header.d=cadence.com header.i=@cadence.com header.b="hdAFBxUd" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D675621104 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=cadence.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727104AbeKHVIg (ORCPT ); Thu, 8 Nov 2018 16:08:36 -0500 Received: from mx0b-0014ca01.pphosted.com ([208.86.201.193]:40914 "EHLO mx0a-0014ca01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726145AbeKHVIg (ORCPT ); Thu, 8 Nov 2018 16:08:36 -0500 Received: from pps.filterd (m0042333.ppops.net [127.0.0.1]) by mx0b-0014ca01.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id wA8BT1dR000600; Thu, 8 Nov 2018 03:33:26 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cadence.com; h=from : to : cc : subject : date : message-id : references : in-reply-to : content-type : content-transfer-encoding : mime-version; s=proofpoint; bh=wZwRqqpxP3GqWsvPrvbpVupddf8BLobH+P1Vn9jisgM=; b=InQKw2DdiN3HiHsZVes1UWk9mWyd2N5+rGMlKgbzidJHwuSmDa0W7BwaTRHH9GzBmg0e 5g0Lk9coqqTYq5I+cfO5om3l1itYFdLy7KLcoon/s8hWHf9IcvMLMTKHIK2r7ZHIeyMR bC1NHgIkxN6jrx2KvmxAloFxpmoPUr7RtcjDp/AXiAk86Q3fgkANp2Sr4hTncVaiR9Ho xvMY+VRbd9kCF950e+XEaL1pTM9CdXyamlGmopkCfvRDNLaXxVY2ymt5SncpaMH5bSrk kbySX/f8WIQAvxk9Ija2VBhve/4PruPUACo+JciNefF0oZv3UxOGeCum87sjl6Ru+Aj6 PA== Authentication-Results: cadence.com; spf=pass smtp.mailfrom=pawell@cadence.com Received: from nam04-sn1-obe.outbound.protection.outlook.com (mail-sn1nam04lp0085.outbound.protection.outlook.com [216.32.180.85]) by mx0b-0014ca01.pphosted.com with ESMTP id 2nm92j330k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Thu, 08 Nov 2018 03:33:25 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cadence.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wZwRqqpxP3GqWsvPrvbpVupddf8BLobH+P1Vn9jisgM=; b=hdAFBxUdeQZpmuZ9K56hke/aFf8IPFv3XUvmN2xwyBfZtZsLc8OZNKQX+OxHH+6b+37uwMHGItaL80cMKItTFKXNEzZ6XT95EV7fM2n/o49mRWepxgufEyRvn6MNTBQN32OIEK4XvF5MB5gz2zGSKWPitCbi8/V1iMzCHfpBTBg= Received: from BYAPR07MB4709.namprd07.prod.outlook.com (52.135.204.159) by BYAPR07MB4215.namprd07.prod.outlook.com (52.135.223.17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1294.21; Thu, 8 Nov 2018 11:33:23 +0000 Received: from BYAPR07MB4709.namprd07.prod.outlook.com ([fe80::8000:536f:b287:710f]) by BYAPR07MB4709.namprd07.prod.outlook.com ([fe80::8000:536f:b287:710f%4]) with mapi id 15.20.1294.034; Thu, 8 Nov 2018 11:33:22 +0000 From: Pawel Laszczak To: Roger Quadros , "gregkh@linuxfoundation.org" CC: "linux-usb@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Alan Douglas , "jbergsagel@ti.com" , "peter.chen@nxp.com" , Pawel Jez , Rahul Kumar Subject: RE: [RFC PATCH v1 04/14] usb:cdns3: Added DRD support Thread-Topic: [RFC PATCH v1 04/14] usb:cdns3: Added DRD support Thread-Index: AQHUc534H8I7jEw3E0KKlz93MFHRJaVC078AgALqBjA= Date: Thu, 8 Nov 2018 11:33:21 +0000 Message-ID: References: <1541267487-3664-1-git-send-email-pawell@cadence.com> <1541267487-3664-5-git-send-email-pawell@cadence.com> <5BE1A5E6.1000703@ti.com> In-Reply-To: <5BE1A5E6.1000703@ti.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-dg-tag-bcast: x-dg-ref: PG1ldGE+PGF0IG5tPSJib2R5LnR4dCIgcD0iYzpcdXNlcnNccGF3ZWxsXGFwcGRhdGFccm9hbWluZ1wwOWQ4NDliNi0zMmQzLTRhNDAtODVlZS02Yjg0YmEyOWUzNWJcbXNnc1xtc2ctMTkxNzhlNTgtZTM0YS0xMWU4LTg3MjUtMWM0ZDcwMWRmYmE0XGFtZS10ZXN0XDE5MTc4ZTU5LWUzNGEtMTFlOC04NzI1LTFjNGQ3MDFkZmJhNGJvZHkudHh0IiBzej0iMTU2MTIiIHQ9IjEzMTg2MTUwNDAzMzI4MzE5NSIgaD0ibGVzUEJpT3MrSWUwaDRiL2VkU1loMUs2MmE4PSIgaWQ9IiIgYmw9IjAiIGJvPSIxIi8+PC9tZXRhPg== x-dg-paste: x-dg-rorf: x-originating-ip: [185.217.253.59] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;BYAPR07MB4215;20:4hu1WCIH4bYikKWwyC7rBLfm0KQDZ8c36glmo+W2gR6959UwR0jaLJBYR+rk7fkO3qva8WRxMwV4tQBqjTkwqpt3TplffSgYsdWFPUc6wwjYSZFsGiEUJZSbyepKuBvPbrIp1yX7ZcoBK0hJjj0JEOr8XgOWy4PzdDaxH48ZmIP9vaS51S+RxZSOMUUoCfyo8xI3Z6WcWkOGB+a7HRPIu/HEQh014ZkiKYz6lVV+4SZHuqQbzMTr/cSm+ZSRnusy x-ms-exchange-antispam-srfa-diagnostics: SOS;SOR; x-forefront-antispam-report: SFV:SKI;SCL:-1;SFV:NSPM;SFS:(10009020)(346002)(376002)(39860400002)(136003)(396003)(366004)(189003)(199004)(36092001)(486006)(74316002)(66066001)(106356001)(478600001)(2906002)(11346002)(446003)(476003)(25786009)(305945005)(2501003)(316002)(33656002)(54906003)(7736002)(110136005)(4326008)(14454004)(68736007)(97736004)(6506007)(9686003)(55016002)(256004)(14444005)(8676002)(53946003)(102836004)(2900100001)(26005)(71200400001)(107886003)(71190400001)(6246003)(53936002)(186003)(229853002)(4744004)(217873002)(5660300001)(6116002)(3846002)(8936002)(81156014)(575784001)(86362001)(81166006)(99286004)(7696005)(76176011)(105586002)(6436002);DIR:OUT;SFP:1101;SCL:1;SRVR:BYAPR07MB4215;H:BYAPR07MB4709.namprd07.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; x-ms-office365-filtering-correlation-id: 88662555-a0e0-49df-2153-08d6456dfd21 x-microsoft-antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989299)(5600074)(711020)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020);SRVR:BYAPR07MB4215; x-ms-traffictypediagnostic: BYAPR07MB4215: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(72806322054110); x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(3002001)(3231382)(944501410)(52105095)(148016)(149066)(150057)(6041310)(20161123564045)(20161123560045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991095);SRVR:BYAPR07MB4215;BCL:0;PCL:0;RULEID:;SRVR:BYAPR07MB4215; x-forefront-prvs: 0850800A29 received-spf: None (protection.outlook.com: cadence.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: VXS1+HvRdA6DLFCdwi+ta9IxCmM/Caxzq6yrl50e9kvpQh4cyrQp06cJ5uJwTc2kRXdkYwJEnx3zWwnT7PtU5sO3PqPJTVgNHO/OVh0Gugi+GXIlNrn/bpuvPIsZEgC478uf6j1ms5DDW5p3v8qljTLHG9mb7rq9HQ55Iat4xof+gaQ7Kuv+BNDkREdqiXkUT6h/0iGospJUEKuGkBO9mqRSUDmk1jtjZs1q5cC6f0Eefbd4KWFJj0FztNonRWS+MeP2y+++6JA0rVp8+2qpevUziRpGnMo6ZGpglhtpUA14W1JITM9et6a//6qirDovP1YG5cJ3QNwWqLK1iHuL9e8UyKpO5lKjQtiTZEbH254= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: cadence.com X-MS-Exchange-CrossTenant-Network-Message-Id: 88662555-a0e0-49df-2153-08d6456dfd21 X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Nov 2018 11:33:21.8831 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: d36035c5-6ce6-4662-a3dc-e762e61ae4c9 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR07MB4215 X-Proofpoint-SPF-Result: pass X-Proofpoint-SPF-Record: v=spf1 a:mx-sanjose2.Cadence.COM a:mx-sanjose4.Cadence.COM a:mx-sanjose5.Cadence.COM include:mktomail.com include:spf-0014ca01.pphosted.com include:spf.protection.outlook.com include:auth.msgapp.com include:spf.mandrillapp.com ~all X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-11-08_06:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_check_notspam policy=outbound_check score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1807170000 definitions=main-1811080101 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Roger, >On 03/11/18 19:51, Pawel Laszczak wrote: >> Patch adds supports for detecting Host/Device mode. >> Controller has additional OTG register that allow >> implement even whole OTG functionality. >> At this moment patch adds support only for detecting >> the appropriate mode based on strap pins and ID pin. >> >> Signed-off-by: Pawel Laszczak >> --- >> drivers/usb/cdns3/Makefile | 2 +- >> drivers/usb/cdns3/core.c | 22 ++-- >> drivers/usb/cdns3/drd.c | 219 +++++++++++++++++++++++++++++++++++++ >> drivers/usb/cdns3/drd.h | 122 +++++++++++++++++++++ >> 4 files changed, 356 insertions(+), 9 deletions(-) >> create mode 100644 drivers/usb/cdns3/drd.c >> create mode 100644 drivers/usb/cdns3/drd.h >> >> diff --git a/drivers/usb/cdns3/Makefile b/drivers/usb/cdns3/Makefile >> index 083676c7748f..d4ccfb49d844 100644 >> --- a/drivers/usb/cdns3/Makefile >> +++ b/drivers/usb/cdns3/Makefile >> @@ -1,7 +1,7 @@ >> obj-$(CONFIG_USB_CDNS3) +=3D cdns3.o >> obj-$(CONFIG_USB_CDNS3_PCI_WRAP) +=3D cdns3-pci.o >> >> -cdns3-y :=3D core.o >> +cdns3-y :=3D core.o drd.o >> cdns3-$(CONFIG_USB_CDNS3_GADGET) +=3D gadget.o >> cdns3-$(CONFIG_USB_CDNS3_HOST) +=3D host.o >> cdns3-pci-y :=3D cdns3-pci-wrap.o >> diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c >> index 727136235957..20ae9e76940e 100644 >> --- a/drivers/usb/cdns3/core.c >> +++ b/drivers/usb/cdns3/core.c >> @@ -18,6 +18,7 @@ >> #include "core.h" >> #include "host-export.h" >> #include "gadget-export.h" >> +#include "drd.h" >> >> static inline struct cdns3_role_driver *cdns3_role(struct cdns3 *cdns) >> { >> @@ -70,8 +71,10 @@ static void cdns3_set_role(struct cdns3 *cdns, enum c= dns3_roles role) >> static enum cdns3_roles cdns3_get_role(struct cdns3 *cdns) >> { >> if (cdns->roles[CDNS3_ROLE_HOST] && cdns->roles[CDNS3_ROLE_GADGET]) { >> - //TODO: implements selecting device/host mode >> - return CDNS3_ROLE_HOST; >> + if (cdns3_is_host(cdns)) >> + return CDNS3_ROLE_HOST; >> + if (cdns3_is_device(cdns)) >> + return CDNS3_ROLE_GADGET; >> } >> return cdns->roles[CDNS3_ROLE_HOST] >> ? CDNS3_ROLE_HOST >> @@ -141,6 +144,12 @@ static irqreturn_t cdns3_irq(int irq, void *data) >> return IRQ_HANDLED; >> } >> >> + if (cdns->dr_mode =3D=3D USB_DR_MODE_OTG) { >> + ret =3D cdns3_drd_irq(cdns); >> + if (ret =3D=3D IRQ_HANDLED) >> + return ret; >> + } >> + >> /* Handle device/host interrupt */ >> if (cdns->role !=3D CDNS3_ROLE_END) >> ret =3D cdns3_role(cdns)->irq(cdns); >> @@ -202,12 +211,8 @@ static void cdns3_role_switch(struct work_struct *w= ork) >> bool device, host; >> >> cdns =3D container_of(work, struct cdns3, role_switch_wq); >> - >> - //TODO: implements this functions. >> - //host =3D cdns3_is_host(cdns); >> - //device =3D cdns3_is_device(cdns); >> - host =3D 1; >> - device =3D 0; >> + host =3D cdns3_is_host(cdns); >> + device =3D cdns3_is_device(cdns); >> >> if (host) { >> if (cdns->roles[CDNS3_ROLE_HOST]) >> @@ -286,6 +291,7 @@ static int cdns3_probe(struct platform_device *pdev) >> if (ret) >> goto err3; >> >> + ret =3D cdns3_drd_probe(cdns); >> if (ret) >> goto err3; >> >> diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c >> new file mode 100644 >> index 000000000000..5d988432edb8 >> --- /dev/null >> +++ b/drivers/usb/cdns3/drd.c >> @@ -0,0 +1,219 @@ >> +// SPDX-License-Identifier: GPL-2.0 >> +/* >> + * Cadence USBSS DRD Driver. >> + * >> + * Copyright (C) 2018 Cadence. >> + * >> + * Author: Pawel Laszczak > + * >> + */ >> +#include >> +#include >> +#include >> +#include >> + >> +#include "gadget.h" >> +#include "drd.h" >> + >> +/** >> + * cdns3_set_mode - change mode of OTG Core >> + * @cdns: pointer to context structure >> + * @mode: selected mode from cdns_role >> + */ >> +void cdns3_set_mode(struct cdns3 *cdns, u32 mode) >> +{ >> + u32 reg; >> + >> + switch (mode) { >> + case CDNS3_ROLE_GADGET: > >I think we need to make a clear distinction between mode and role. > >Mode is the controller mode. (Host-only, Device-only, dual-role[otg]) >Role is the USB controller state (A-Host, B-Device, Idle) I agree with you, In next set patch distinction between mode and role will= be clear. > >cnds->dr_mode should correspond to enum usb_dr_mode which should be the ar= gument >for this function if you want to set mode. > >> + dev_info(cdns->dev, "Set controller to Gadget mode\n"); >> + writel(OTGCMD_DEV_BUS_REQ | OTGCMD_OTG_DIS, >> + &cdns->otg_regs->cmd); >> + break; >> + case CDNS3_ROLE_HOST: >> + dev_info(cdns->dev, "Set controller to Host mode\n"); >> + writel(OTGCMD_HOST_BUS_REQ | OTGCMD_OTG_DIS, >> + &cdns->otg_regs->cmd); >> + break; >> + case CDNS3_ROLE_OTG: >> + dev_info(cdns->dev, "Set controller to OTG mode\n"); >> + reg =3D readl(&cdns->otg_regs->ctrl1); >> + reg |=3D OTGCTRL1_IDPULLUP; >> + writel(reg, &cdns->otg_regs->ctrl1); >> + >> + /* wait until valid ID (ID_VALUE) can be sampled (50ms). */ >> + mdelay(50); >> + break; >> + default: >> + dev_err(cdns->dev, "Unsupported mode of operation %d\n", mode); >> + return; >> + } >> +} >> + >> +static int cdns3_otg_get_id(struct cdns3 *cdns) >> +{ >> + int id; >> + >> + id =3D readl(&cdns->otg_regs->sts) & OTGSTS_ID_VALUE; >> + dev_dbg(cdns->dev, "OTG ID: %d", id); >> + return id; >> +} >> + >> +int cdns3_is_host(struct cdns3 *cdns) >> +{ >> + if (cdns->dr_mode =3D=3D USB_DR_MODE_HOST) >> + return 1; > >Why not just use cdns->dr_mode directly? > >Do you want to check if it is host role here? e.g. if dr_mode =3D USB_DR_M= ODE_OTG. The function will be slightly completed.=20 After corrections: dr_mode holds the hardware configuration. It will be set during initializat= ion and will not be changed.=20 current_dr_mode will hold current mode. This mode can be changed by debugfs= .=20 This function will look: int cdns3_is_host(struct cdns3 *cdns) { if (cdns->current_dr_mode =3D=3D USB_DR_MODE_HOST) return 1; else if (cdns->current_dr_mode =3D=3D USB_DR_MODE_OTG) if (!cdns3_otg_get_id(cdns)) return 1; return 0; } If DRD mode is set to HOST then always return true, elsewhere it will be ba= sed on ID pin.=20 So, for USB_DR_MODE_OTG driver will waiting for appropriate role but when=20 current_dr_mode =3D=3D USB_DR_MODE_HOST then we know that only HOST role ca= n be set=20 and driver can return true immediately.> >> + >> + return 0; >> +} >> + >> +int cdns3_is_device(struct cdns3 *cdns) >> +{ >> + if (cdns->dr_mode =3D=3D USB_DR_MODE_PERIPHERAL) >> + return 1; >> + >> + return 0; >> +} >> + >> +/** >> + * cdns3_otg_disable_irq - Disable all OTG interrupts >> + * @cdns: Pointer to controller context structure >> + */ >> +static void cdns3_otg_disable_irq(struct cdns3 *cdns) >> +{ >> + writel(0, &cdns->otg_regs->ien); >> +} >> + >> +/** >> + * cdns3_otg_enable_irq - enable id and sess_valid interrupts >> + * @cdns: Pointer to controller context structure >> + */ >> +static void cdns3_otg_enable_irq(struct cdns3 *cdns) >> +{ >> + writel(OTGIEN_ID_CHANGE_INT | OTGIEN_VBUSVALID_RISE_INT | >> + OTGIEN_VBUSVALID_FALL_INT, &cdns->otg_regs->ien); >> +} >> + >> +/** >> + * cdns3_drd_init - initialize drd controller >> + * @cdns: Pointer to controller context structure >> + * >> + * Returns 0 on success otherwise negative errno >> + */ >> +static void cdns3_drd_init(struct cdns3 *cdns) >> +{ >> + cdns3_otg_disable_irq(cdns); >> + /* clear all interrupts */ >> + writel(~0, &cdns->otg_regs->ivect); >> + >> + cdns3_set_mode(cdns, CDNS3_ROLE_OTG); >> + >> + cdns3_otg_enable_irq(cdns); >> +} >> + >> +/** >> + * cdns3_core_init_mode - initialize mode of operation >> + * @cdns: Pointer to controller context structure >> + * >> + * Returns 0 on success otherwise negative errno >> + */ >> +static int cdns3_core_init_mode(struct cdns3 *cdns) >> +{ >> + int ret =3D 0; >> + >> + switch (cdns->dr_mode) { >> + case USB_DR_MODE_PERIPHERAL: >> + cdns3_set_mode(cdns, CDNS3_ROLE_GADGET); >> + break; >> + case USB_DR_MODE_HOST: >> + cdns3_set_mode(cdns, CDNS3_ROLE_HOST); >> + break; >> + case USB_DR_MODE_OTG: >> + cdns3_drd_init(cdns); >> + break; >> + default: >> + dev_err(cdns->dev, "Unsupported mode of operation %d\n", >> + cdns->dr_mode); >> + return -EINVAL; >> + } >> + > >Looks like this function should be on core.c? The name will be changed to cdns3_drd_update_mode and will be called during= initialization,=20 or when user change mode by means of debugfs.=20 > >> + return ret; >> +} >> + >> +irqreturn_t cdns3_drd_irq(struct cdns3 *cdns) >> +{ >> + irqreturn_t ret =3D IRQ_NONE; >> + u32 reg; >> + >> + if (cdns->dr_mode !=3D USB_DR_MODE_OTG) >> + return ret; >> + >> + reg =3D readl(&cdns->otg_regs->ivect); >> + if (!reg) >> + return ret; >> + >> + if (reg & OTGIEN_ID_CHANGE_INT) { >> + int id =3D cdns3_otg_get_id(cdns); >> + >> + dev_dbg(cdns->dev, "OTG IRQ: new ID: %d\n", >> + cdns3_otg_get_id(cdns)); >> + >> + if (id) >> + cdns->desired_role =3D CDNS3_ROLE_GADGET; >> + else >> + cdns->desired_role =3D CDNS3_ROLE_GADGET; > >CDNS3_ROLE_HOST. I found it too and was corrected.=20 >> + >> + queue_work(system_freezable_wq, &cdns->role_switch_wq); >> + >> + ret =3D IRQ_HANDLED; >> + } >> + >> + writel(~0, &cdns->otg_regs->ivect); >> + return IRQ_HANDLED; >> +} >> + >> +int cdns3_drd_probe(struct cdns3 *cdns) > >should this be called cdns3_drd_init()? I changed the name cdns3_drd_init(). I call this cdns3_drd_probe, because = I was not sure whether DRD will be part of whole driver or will be separate driver. =20 >> +{ >> + enum usb_dr_mode dr_mode; >> + int ret =3D 0; >> + u32 state; >> + >> + state =3D OTGSTS_STRAP(readl(&cdns->otg_regs->sts)); >> + >> + dr_mode =3D cdns->dr_mode; >> + if (state =3D=3D OTGSTS_STRAP_HOST) { >> + dev_info(cdns->dev, "Controller strapped to HOST\n"); >> + dr_mode =3D USB_DR_MODE_HOST; >> + if (cdns->dr_mode !=3D USB_DR_MODE_HOST && >> + cdns->dr_mode !=3D USB_DR_MODE_OTG) >> + ret =3D -EINVAL; >> + } else if (state =3D=3D OTGSTS_STRAP_GADGET) { >> + dev_info(cdns->dev, "Controller strapped to HOST\n"); > >s/HOST/PERIPHERAL?=20 > >> + dr_mode =3D USB_DR_MODE_PERIPHERAL; >> + if (cdns->dr_mode !=3D USB_DR_MODE_PERIPHERAL && >> + cdns->dr_mode !=3D USB_DR_MODE_OTG) >> + ret =3D -EINVAL; >> + } >> + >> + if (ret) { >> + dev_err(cdns->dev, "Incorrect DRD configuration\n"); >> + return ret; >> + } >> + >> + //Updating DR mode according to strap. >> + cdns->dr_mode =3D dr_mode; >> + >> + dev_info(cdns->dev, "Controller Device ID: %08lx, Revision ID: %08lx\n= ", >> + CDNS_RID(readl(&cdns->otg_regs->rid)), >> + CDNS_DID(readl(&cdns->otg_regs->did))); >> + >> + state =3D readl(&cdns->otg_regs->sts); >> + if (OTGSTS_OTG_NRDY(state) !=3D 0) { >> + dev_err(cdns->dev, "Cadence USB3 OTG device not ready\n"); >> + return -ENODEV; >> + } >> + >> + ret =3D cdns3_core_init_mode(cdns); >> + >> + return ret; >> +} >> diff --git a/drivers/usb/cdns3/drd.h b/drivers/usb/cdns3/drd.h >> new file mode 100644 >> index 000000000000..85731f3b693c >> --- /dev/null >> +++ b/drivers/usb/cdns3/drd.h >> @@ -0,0 +1,122 @@ >> +/* SPDX-License-Identifier: GPL-2.0 */ >> +/* >> + * Cadence USB3 DRD part of USBSS driver >> + * >> + * Copyright (C) 2018 Cadence. >> + * >> + * Author: Pawel Laszczak >> + */ >> +#ifndef __LINUX_CDNS3_DRD >> +#define __LINUX_CDNS3_DRD >> + >> +#include >> +#include >> +#include "core.h" >> + >> +/* DRD register interface. */ >> +struct cdns3_otg_regs { >> + __le32 did; >> + __le32 rid; >> + __le32 capabilities; >> + __le32 reserved1; >> + __le32 cmd; >> + __le32 sts; >> + __le32 state; >> + __le32 reserved2; >> + __le32 ien; >> + __le32 ivect; >> + __le32 refclk; >> + __le32 tmr; >> + __le32 reserved3[4]; >> + __le32 simulate; >> + __le32 override; >> + __le32 susp_ctrl; >> + __le32 reserved4; >> + __le32 anasts; >> + __le32 adp_ramp_time; >> + __le32 ctrl1; >> + __le32 ctrl2; >> +}; >> + >> +/* CDNS_RID - bitmasks */ >> +#define CDNS_RID(p) ((p) & GENMASK(15, 0)) >> + >> +/* CDNS_VID - bitmasks */ >> +#define CDNS_DID(p) ((p) & GENMASK(31, 0)) >> + >> +/* OTGCMD - bitmasks */ >> +/* "Request the bus for Device mode. */ >> +#define OTGCMD_DEV_BUS_REQ BIT(0) >> +/* Request the bus for Host mode */ >> +#define OTGCMD_HOST_BUS_REQ BIT(1) >> +/* Enable OTG mode. */ >> +#define OTGCMD_OTG_EN BIT(2) >> +/* Disable OTG mode */ >> +#define OTGCMD_OTG_DIS BIT(3) >> +/*"Configure OTG as A-Device. */ >> +#define OTGCMD_A_DEV_EN BIT(4) >> +/*"Configure OTG as A-Device. */ >> +#define OTGCMD_A_DEV_DIS BIT(5) >> +/* Drop the bus for Device mod e. */ >> +#define OTGCMD_DEV_BUS_DROP BIT(8) >> +/* Drop the bus for Host mode*/ >> +#define OTGCMD_HOST_BUS_DROP BIT(9) >> +/* Power Down USBSS-DEV. */ >> +#define OTGCMD_DEV_POWER_OFF BIT(11) >> +/* Power Down CDNSXHCI. */ >> +#define OTGCMD_HOST_POWER_OFF BIT(12) >> + >> +/* OTGIEN - bitmasks */ >> +/* ID change interrupt enable */ >> +#define OTGIEN_ID_CHANGE_INT BIT(0) >> +/* Vbusvalid fall detected interrupt enable.*/ >> +#define OTGIEN_VBUSVALID_RISE_INT BIT(4) >> +/* Vbusvalid fall detected interrupt enable */ >> +#define OTGIEN_VBUSVALID_FALL_INT BIT(5) >> + >> +/* OTGSTS - bitmasks */ >> +/* >> + * Current value of the ID pin. It is only valid when idpullup in >> + * OTGCTRL1_TYPE register is set to '1'. >> + */ >> +#define OTGSTS_ID_VALUE BIT(0) >> +/* Current value of the vbus_valid */ >> +#define OTGSTS_VBUS_VALID BIT(1) >> +/* Current value of the b_sess_vld */ >> +#define OTGSTS_SESSION_VALID BIT(2) >> +/*Device mode is active*/ >> +#define OTGSTS_DEV_ACTIVE BIT(3) >> +/* Host mode is active. */ >> +#define OTGSTS_HOST_ACTIVE BIT(4) >> +/* OTG Controller not ready. */ >> +#define OTGSTS_OTG_NRDY_MASK BIT(11) >> +#define OTGSTS_OTG_NRDY(p) ((p) & OTGSTS_OTG_NRDY_MASK) >> +/* >> + * Value of the strap pins. >> + * 000 - no default configuration >> + * 010 - Controller initiall configured as Host >> + * 100 - Controller initially configured as Device >> + */ >> +#define OTGSTS_STRAP(p) (((p) & GENMASK(14, 12)) >> 12) >> +#define OTGSTS_STRAP_NO_DEFAULT_CFG 0x00 >> +#define OTGSTS_STRAP_HOST_OTG 0x01 >> +#define OTGSTS_STRAP_HOST 0x02 >> +#define OTGSTS_STRAP_GADGET 0x04 >> +/* Host mode is turned on. */ >> +#define OTGSTSE_XHCI_READYF BIT(26) >> +/* "Device mode is turned on .*/ >> +#define OTGSTS_DEV_READY BIT(27) >> + >> +/* OTGREFCLK - bitmasks */ >> +#define OTGREFCLK_STB_CLK_SWITCH_EN BIT(31) >> + >> +/* OTGCTRL1 - bitmasks */ >> +#define OTGCTRL1_IDPULLUP BIT(24) >> + >> +int cdns3_is_host(struct cdns3 *cdns); >> +int cdns3_is_device(struct cdns3 *cdns); >> +int cdns3_drd_probe(struct cdns3 *cdns); >> +void cdns3_set_hw_mode(struct cdns3 *cdns, u32 mode); >> +irqreturn_t cdns3_drd_irq(struct cdns3 *cdns); >> + >> +#endif /* __LINUX_CDNS3_DRD */ >> > >cheers, >-roger > >-- >Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. >Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki Thanks for all your comments Cheers, Pawel Laszczak