xref: /rk3399_rockchip-uboot/drivers/usb/cdns3/host.c (revision f6ce6072be71a99f76b5c32d3c202f9330d66da6)
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