diff options
author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2011-09-19 14:15:47 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2011-09-20 21:12:46 +0200 |
commit | 413c5a9f07635e06902c8c7aa153fa90ce35e015 (patch) | |
tree | e3eec2e34a142fbea7065ed905eb5c94031a89f1 /drivers | |
parent | 6a245790002c1945d850093ec3f13375386dfa97 (diff) | |
download | barebox-413c5a9f07635e06902c8c7aa153fa90ce35e015.tar.gz barebox-413c5a9f07635e06902c8c7aa153fa90ce35e015.tar.xz |
at91: add ohci support
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/host/Makefile | 1 | ||||
-rw-r--r-- | drivers/usb/host/ohci-at91.c | 98 |
2 files changed, 99 insertions, 0 deletions
diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index f1b13445a7..1c7e18f75f 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile @@ -1,3 +1,4 @@ obj-$(CONFIG_USB_EHCI) += ehci-hcd.o obj-$(CONFIG_USB_EHCI_OMAP) += ehci-omap.o obj-$(CONFIG_USB_OHCI) += ohci-hcd.o +obj-$(CONFIG_ARCH_AT91) += ohci-at91.o diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c new file mode 100644 index 0000000000..cae049add8 --- /dev/null +++ b/drivers/usb/host/ohci-at91.c @@ -0,0 +1,98 @@ +/* + * (C) Copyright 2010 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; version 2 of + * the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <linux/clk.h> +#include <driver.h> +#include <init.h> +#include <usb/usb.h> +#include <usb/usb_defs.h> +#include <errno.h> +#include <asm/io.h> + +#include "ohci.h" + +/* interface and function clocks; sometimes also an AHB clock */ +static struct clk *iclk, *fclk; + +static void at91_start_clock(void) +{ + clk_enable(iclk); + clk_enable(fclk); +} + +static void at91_stop_clock(void) +{ + clk_disable(fclk); + clk_disable(iclk); +} + +static int at91_ohci_probe(struct device_d *dev) +{ + struct ohci_regs __iomem *regs = (struct ohci_regs __iomem *)dev->resource[0].start; + + iclk = clk_get(NULL, "ohci_clk"); + fclk = clk_get(NULL, "uhpck"); + + /* + * Start the USB clocks. + */ + at91_start_clock(); + + /* + * The USB host controller must remain in reset. + */ + writel(0, ®s->control); + + add_generic_device("ohci", -1, NULL, dev->resource[0].start, + dev->resource[0].size, IORESOURCE_MEM, NULL); + + return 0; +} + +static void at91_ohci_remove(struct device_d *dev) +{ + struct ohci_regs __iomem *regs = (struct ohci_regs __iomem *)dev->resource[0].start; + + /* + * Put the USB host controller into reset. + */ + writel(0, ®s->control); + + /* + * Stop the USB clocks. + */ + at91_stop_clock(); +} + +static struct driver_d at91_ohci_driver = { + .name = "at91_ohci", + .probe = at91_ohci_probe, + .remove = at91_ohci_remove, +}; + +static int at91_ohci_init(void) +{ + register_driver(&at91_ohci_driver); + return 0; +} +device_initcall(at91_ohci_init); |