/*
 * Copyright 2017, Data61
 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
 * ABN 41 687 119 230.
 *
 * This software may be distributed and modified according to the terms of
 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
 * See "LICENSE_BSD2.txt" for details.
 *
 * @TAG(DATA61_BSD)
 */
#include <usb/otg.h>
#include "plat/usb_otg.h"
#include "services.h"
#include <stdio.h>

int usb_otg_init(int id, usb_otg_t * otg_ptr, ps_io_ops_t ioops)
{
	usb_otg_t otg;
	int err;
	/* Validate the id */
	if (id < 0 || id > USB_NOTGS) {
		return -1;
	}
	/* Allocate host memory */
	otg = usb_malloc(sizeof(*otg));
	if (otg == NULL) {
		ZF_LOGE("OTG: Out of memory\n");
		return -1;
	}
	otg->dman = &ioops.dma_manager;
	otg->id = id;
	otg->ep0_setup = NULL;
	otg->prime = NULL;
	err = usb_plat_otg_init(otg, &ioops);
	if (!err) {
		*otg_ptr = otg;
	}
	return err;
}

void otg_handle_irq(usb_otg_t otg)
{
	otg_plat_handle_irq(otg);
}

int otg_ep0_setup(usb_otg_t otg, otg_setup_cb cb, void *token)
{
	if (!otg || !otg->ep0_setup) {
		ZF_LOGF("OTG: Invalid arguments\n");
	}
	return otg->ep0_setup(otg, cb, token);
}

int
otg_prime(usb_otg_t otg, int ep, enum usb_xact_type dir,
	  void *vbuf, uintptr_t pbuf, int len, otg_prime_cb cb, void *token)
{
	return otg->prime(otg, ep, dir, vbuf, pbuf, len, cb, token);
}
