/*
 * 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)
 */
#ifndef _USB_OTG_H_
#define _USB_OTG_H_

#include <usb/usb.h>

struct usb_otg_dev;
typedef struct usb_otg_dev* usb_otg_t;

/** Return the default OTG device ID for the running platform
 * @return the default OTG device ID for the running platform.
 */
int usb_default_otg_id(void);

/** Return the number of OTG devices on the running platform
 * @return the number of OTG devices on the running platform
 */
int usb_notgs(void);

int usb_otg_init(int id, usb_otg_t* otg, ps_io_ops_t ioops);

/** Pass control to the devices IRQ handler
 * @param[in] host    The USB host that triggered
 *                    the interrupt event.
 */
void otg_handle_irq(usb_otg_t otg);



typedef void (*otg_setup_cb)(usb_otg_t otg,
                             void* token, struct usbreq* req);
/* NOTE: the "set address" request will be intercepted */
int otg_ep0_setup(usb_otg_t otg, otg_setup_cb cb, void* token);

typedef void (*otg_prime_cb)(usb_otg_t otg, void* token,
                             enum usb_xact_status stat);
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);

#endif /* _USB_OTG_H_ */


