From 0d730b18792cdbd31ec47bd7b5793b26f884c796 Mon Sep 17 00:00:00 2001
From: Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>
Date: Mon, 9 May 2011 23:04:51 +0200
Subject: [PATCH 33/35] omap4_panda: add support for EHCI

Signed-off-by: Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>
Signed-off-by: Ricardo Salveti de Araujo <ricardo.salveti@canonical.com>
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
---
 board/ti/panda/Makefile     |    4 ++-
 board/ti/panda/ehci-panda.c |   59 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+), 1 deletions(-)
 create mode 100644 board/ti/panda/ehci-panda.c

diff --git a/board/ti/panda/Makefile b/board/ti/panda/Makefile
index 2186403..253567c 100644
--- a/board/ti/panda/Makefile
+++ b/board/ti/panda/Makefile
@@ -25,7 +25,9 @@ include $(TOPDIR)/config.mk
 
 LIB	= $(obj)lib$(BOARD).o
 
-COBJS	:= panda.o
+COBJS-$(CONFIG_USB_EHCI) += ehci-panda.o
+
+COBJS	:= $(COBJS-y) panda.o
 
 SRCS	:= $(COBJS:.o=.c)
 OBJS	:= $(addprefix $(obj),$(COBJS))
diff --git a/board/ti/panda/ehci-panda.c b/board/ti/panda/ehci-panda.c
new file mode 100644
index 0000000..b1e247c
--- /dev/null
+++ b/board/ti/panda/ehci-panda.c
@@ -0,0 +1,59 @@
+/*
+ * OMAP4 EHCI port, copied from linux/drivers/usb/host/ehci-omap.c
+ *
+ * Copyright (C) 2007-2010 Texas Instruments, Inc.
+ *	Author: Vikram Pandita <vikram.pandita@ti.com>
+ *	Author: Anand Gadiyar <gadiyar@ti.com>
+ */
+
+#include <asm/arch/gpio.h>
+#include <asm/arch/ehci.h>
+
+#define GPIO_HUB_POWER		1
+#define GPIO_HUB_NRESET		62
+
+int ehci_hcd_init(void)
+{
+	unsigned long base = get_timer(0);
+	unsigned reg = 0, port = 0;
+	int rc;
+
+	/* disable the power to the usb hub prior to init */
+	rc = omap_request_gpio(GPIO_HUB_POWER);
+	if (rc < 0) {
+		printf("Could not request gpio %d\n", GPIO_HUB_POWER);
+		return rc;
+	}
+
+	rc = omap_request_gpio(GPIO_HUB_NRESET);
+	if (rc < 0) {
+		printf("Could not request gpio %d\n", GPIO_HUB_NRESET);
+		omap_free_gpio(GPIO_HUB_POWER);
+		return rc;
+	}
+
+	omap_set_gpio_direction(GPIO_HUB_POWER, 0);
+	omap_set_gpio_dataout(GPIO_HUB_POWER, 0);
+	omap_set_gpio_direction(GPIO_HUB_NRESET, 0);
+	omap_set_gpio_dataout(GPIO_HUB_NRESET, 0);
+	omap_set_gpio_dataout(GPIO_HUB_NRESET, 1);
+
+	rc = omap4_ehci_hcd_init();
+
+	if (rc < 0)
+		return rc;
+
+	omap_set_gpio_dataout(GPIO_HUB_POWER, 1);
+
+	return 0;
+}
+
+int ehci_hcd_stop(void)
+{
+	omap4_ehci_hcd_stop();
+
+	omap_set_gpio_dataout(GPIO_HUB_POWER, 0);
+	omap_set_gpio_dataout(GPIO_HUB_NRESET, 0);
+	omap_free_gpio(GPIO_HUB_POWER);
+	omap_free_gpio(GPIO_HUB_NRESET);
+}
-- 
1.6.6.1

