1*f6ce6072SVignesh Raghavendra // SPDX-License-Identifier: GPL-2.0 2*f6ce6072SVignesh Raghavendra /* 3*f6ce6072SVignesh Raghavendra * Cadence USBSS DRD Driver - host side 4*f6ce6072SVignesh Raghavendra * 5*f6ce6072SVignesh Raghavendra * Copyright (C) 2018-2019 Cadence Design Systems. 6*f6ce6072SVignesh Raghavendra * Copyright (C) 2017-2018 NXP 7*f6ce6072SVignesh Raghavendra * 8*f6ce6072SVignesh Raghavendra * Authors: Peter Chen <peter.chen@nxp.com> 9*f6ce6072SVignesh Raghavendra * Pawel Laszczak <pawell@cadence.com> 10*f6ce6072SVignesh Raghavendra */ 11*f6ce6072SVignesh Raghavendra #include <dm.h> 12*f6ce6072SVignesh Raghavendra #include <linux/compat.h> 13*f6ce6072SVignesh Raghavendra #include <usb.h> 14*f6ce6072SVignesh Raghavendra #include "../host/xhci.h" 15*f6ce6072SVignesh Raghavendra 16*f6ce6072SVignesh Raghavendra #include "core.h" 17*f6ce6072SVignesh Raghavendra #include "drd.h" 18*f6ce6072SVignesh Raghavendra 19*f6ce6072SVignesh Raghavendra static int __cdns3_host_init(struct cdns3 *cdns) 20*f6ce6072SVignesh Raghavendra { 21*f6ce6072SVignesh Raghavendra struct xhci_hcor *hcor; 22*f6ce6072SVignesh Raghavendra struct xhci_hccr *hccr; 23*f6ce6072SVignesh Raghavendra 24*f6ce6072SVignesh Raghavendra cdns3_drd_switch_host(cdns, 1); 25*f6ce6072SVignesh Raghavendra 26*f6ce6072SVignesh Raghavendra hccr = (struct xhci_hccr *)cdns->xhci_regs; 27*f6ce6072SVignesh Raghavendra hcor = (struct xhci_hcor *)(cdns->xhci_regs + 28*f6ce6072SVignesh Raghavendra HC_LENGTH(xhci_readl(&(hccr)->cr_capbase))); 29*f6ce6072SVignesh Raghavendra 30*f6ce6072SVignesh Raghavendra return xhci_register(cdns->dev, hccr, hcor); 31*f6ce6072SVignesh Raghavendra } 32*f6ce6072SVignesh Raghavendra 33*f6ce6072SVignesh Raghavendra static void cdns3_host_exit(struct cdns3 *cdns) 34*f6ce6072SVignesh Raghavendra { 35*f6ce6072SVignesh Raghavendra xhci_deregister(cdns->dev); 36*f6ce6072SVignesh Raghavendra cdns3_drd_switch_host(cdns, 0); 37*f6ce6072SVignesh Raghavendra } 38*f6ce6072SVignesh Raghavendra 39*f6ce6072SVignesh Raghavendra int cdns3_host_init(struct cdns3 *cdns) 40*f6ce6072SVignesh Raghavendra { 41*f6ce6072SVignesh Raghavendra struct cdns3_role_driver *rdrv; 42*f6ce6072SVignesh Raghavendra 43*f6ce6072SVignesh Raghavendra rdrv = devm_kzalloc(cdns->dev, sizeof(*rdrv), GFP_KERNEL); 44*f6ce6072SVignesh Raghavendra if (!rdrv) 45*f6ce6072SVignesh Raghavendra return -ENOMEM; 46*f6ce6072SVignesh Raghavendra 47*f6ce6072SVignesh Raghavendra rdrv->start = __cdns3_host_init; 48*f6ce6072SVignesh Raghavendra rdrv->stop = cdns3_host_exit; 49*f6ce6072SVignesh Raghavendra rdrv->state = CDNS3_ROLE_STATE_INACTIVE; 50*f6ce6072SVignesh Raghavendra rdrv->name = "host"; 51*f6ce6072SVignesh Raghavendra 52*f6ce6072SVignesh Raghavendra cdns->roles[USB_ROLE_HOST] = rdrv; 53*f6ce6072SVignesh Raghavendra 54*f6ce6072SVignesh Raghavendra return 0; 55*f6ce6072SVignesh Raghavendra } 56