static void ep_enable(int num, int in)
{
struct ept_queue_head *head;
- struct mv_udc *udc = controller.udc;
+ struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
unsigned n;
head = epts + 2*num + in;
struct usb_request *req, gfp_t gfp_flags)
{
struct mv_ep *mv_ep = container_of(ep, struct mv_ep, ep);
- struct mv_udc *udc = controller.udc;
+ struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
struct ept_queue_item *item;
struct ept_queue_head *head;
unsigned phys;
static void handle_setup(void)
{
struct usb_request *req = &controller.ep[0].req;
- struct mv_udc *udc = controller.udc;
+ struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
struct ept_queue_head *head;
struct usb_ctrlrequest r;
int status = 0;
{
int i, num, in;
struct ept_queue_head *head;
- struct mv_udc *udc = controller.udc;
+ struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
writel(readl(&udc->epcomp), &udc->epcomp);
writel(readl(&udc->epstat), &udc->epstat);
writel(0xffffffff, &udc->epflush);
void udc_irq(void)
{
- struct mv_udc *udc = controller.udc;
+ struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
unsigned n = readl(&udc->usbsts);
writel(n, &udc->usbsts);
int bit, i, num, in;
int usb_gadget_handle_interrupts(void)
{
u32 value;
- struct mv_udc *udc = controller.udc;
+ struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
value = readl(&udc->usbsts);
if (value)
static int mv_pullup(struct usb_gadget *gadget, int is_on)
{
- struct mv_udc *udc = controller.udc;
+ struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
if (is_on) {
/* RESET */
writel(USBCMD_ITC(MICRO_8FRAME) | USBCMD_RST, &udc->usbcmd);
void udc_disconnect(void)
{
- struct mv_udc *udc = controller.udc;
+ struct mv_udc *udc = (struct mv_udc *)controller.ctrl->hcor;
/* disable pullup */
stop_activity();
writel(USBCMD_FS2, &udc->usbcmd);
int i;
controller.gadget.ops = &mv_udc_ops;
- controller.udc = (struct mv_udc *)CONFIG_USB_REG_BASE;
epts = memalign(PAGE_SIZE, QH_MAXNUM * sizeof(struct ept_queue_head));
memset(epts, 0, QH_MAXNUM * sizeof(struct ept_queue_head));
for (i = 0; i < 2 * NUM_ENDPOINTS; i++) {
int usb_gadget_register_driver(struct usb_gadget_driver *driver)
{
- struct mv_udc *udc = controller.udc;
- int retval;
- void *ctrl;
+ struct mv_udc *udc;
+ int ret;
if (!driver
|| driver->speed < USB_SPEED_FULL
return -EINVAL;
}
- if (!mvudc_probe()) {
- usb_lowlevel_init(0, &ctrl);
+ ret = usb_lowlevel_init(0, (void **)&controller.ctrl);
+ if (ret)
+ return ret;
+
+ ret = mvudc_probe();
+ if (!ret) {
+ udc = (struct mv_udc *)controller.ctrl->hcor;
+
/* select ULPI phy */
writel(PTS(PTS_ENABLE) | PFSC, &udc->portsc);
}
- retval = driver->bind(&controller.gadget);
- if (retval) {
- DBG("driver->bind() returned %d\n", retval);
- return retval;
+
+ ret = driver->bind(&controller.gadget);
+ if (ret) {
+ DBG("driver->bind() returned %d\n", ret);
+ return ret;
}
controller.driver = driver;
#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
+#include "../../drivers/usb/host/ehci.h"
+
#define NUM_ENDPOINTS 6
/* Endpoint parameters */
#define EP0_MAX_PACKET_SIZE 64
struct mv_udc {
- u32 pad0[80];
#define MICRO_8FRAME 0x8
#define USBCMD_ITC(x) ((((x) > 0xff) ? 0xff : x) << 16)
#define USBCMD_FS2 (1 << 15)
struct mv_drv {
struct usb_gadget gadget;
struct usb_gadget_driver *driver;
- struct mv_udc *udc;
+ struct ehci_ctrl *ctrl;
struct mv_ep ep[NUM_ENDPOINTS];
};
#define INFO_BUFFER_ERROR (1 << 5)
#define INFO_TX_ERROR (1 << 3)
-extern int usb_lowlevel_init(int index, void **controller);
#endif /* __MV_UDC_H__ */