// SPDX-License-Identifier: GPL-2.0
/*
 * Cadence USBSS DRD Driver - host side
 *
 * Copyright (C) 2018-2019 Cadence Design Systems.
 * Copyright (C) 2017-2018 NXP
 *
 * Authors: Peter Chen <peter.chen@nxp.com>
 *          Pawel Laszczak <pawell@cadence.com>
 */
#include <dm.h>
#include <dm/devres.h>
#include <linux/compat.h>
#include <usb.h>
#include <usb/xhci.h>

#include "core.h"
#include "drd.h"

static int __cdns3_host_init(struct cdns3 *cdns)
{
	struct xhci_hcor *hcor;
	struct xhci_hccr *hccr;

	cdns3_drd_switch_host(cdns, 1);

	hccr = (struct xhci_hccr *)cdns->xhci_regs;
	hcor = (struct xhci_hcor *)(cdns->xhci_regs +
			HC_LENGTH(xhci_readl(&(hccr)->cr_capbase)));

	return xhci_register(cdns->dev, hccr, hcor);
}

static void cdns3_host_exit(struct cdns3 *cdns)
{
	xhci_deregister(cdns->dev);
	cdns3_drd_switch_host(cdns, 0);
}

int cdns3_host_init(struct cdns3 *cdns)
{
	struct cdns3_role_driver *rdrv;

	rdrv = devm_kzalloc(cdns->dev, sizeof(*rdrv), GFP_KERNEL);
	if (!rdrv)
		return -ENOMEM;

	rdrv->start	= __cdns3_host_init;
	rdrv->stop	= cdns3_host_exit;
	rdrv->state	= CDNS3_ROLE_STATE_INACTIVE;
	rdrv->name	= "host";

	cdns->roles[USB_ROLE_HOST] = rdrv;

	return 0;
}
