aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Crispin <blogic@openwrt.org>2015-02-19 09:06:56 +0000
committerJohn Crispin <blogic@openwrt.org>2015-02-19 09:06:56 +0000
commit8c120014c194429122aa94fc0e9e59eff44ce296 (patch)
tree36e91178a649cdcebf3b6b86e3ddbf64ff65a6b7
parent7f98a7666baeef20a2fec42abfa105a12f54ca17 (diff)
downloadupstream-8c120014c194429122aa94fc0e9e59eff44ce296.tar.gz
upstream-8c120014c194429122aa94fc0e9e59eff44ce296.tar.bz2
upstream-8c120014c194429122aa94fc0e9e59eff44ce296.zip
at91: USB gadget subsystem cleanup and driver fix.
Signed-off-by: Owen Kirby <osk@exegin.com> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@44491 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r--target/linux/at91/Makefile4
-rw-r--r--target/linux/at91/config-default8
-rw-r--r--target/linux/at91/modules.mk18
-rw-r--r--target/linux/at91/patches/100-ARM-at91-build-dtb-for-LMU5000.patch2
-rw-r--r--target/linux/at91/patches/200-ARM-at91-udc-clockfix-backport.patch82
5 files changed, 103 insertions, 11 deletions
diff --git a/target/linux/at91/Makefile b/target/linux/at91/Makefile
index 040df33300..e1c771adbc 100644
--- a/target/linux/at91/Makefile
+++ b/target/linux/at91/Makefile
@@ -10,13 +10,13 @@ ARCH:=arm
BOARD:=at91
MAINTAINER:=Claudio Mignanti <c.mignanti@gmail.com>
BOARDNAME:=Atmel AT91
-FEATURES:=squashfs targz ext2 usb
+FEATURES:=squashfs targz ext2 usb usbgadget ubifs
SUBTARGETS:=legacy sama5d3
KERNEL_PATCHVER:=3.18
include $(INCLUDE_DIR)/target.mk
-DEFAULT_PACKAGES += kmod-usb-ohci
+DEFAULT_PACKAGES += kmod-usb-ohci kmod-at91-udc kmod-usb-eth-gadget
$(eval $(call BuildTarget))
diff --git a/target/linux/at91/config-default b/target/linux/at91/config-default
index 6972e806b5..85cacd8331 100644
--- a/target/linux/at91/config-default
+++ b/target/linux/at91/config-default
@@ -215,15 +215,7 @@ CONFIG_UID16=y
CONFIG_UIDGID_CONVERTED=y
CONFIG_UNCOMPRESS_INCLUDE="mach/uncompress.h"
# CONFIG_USB_ARCH_HAS_XHCI is not set
-CONFIG_USB_AT91=y
# CONFIG_USB_ATMEL_USBA is not set
-CONFIG_USB_COMMON=y
-CONFIG_USB_ETH=y
-# CONFIG_USB_ETH_EEM is not set
-CONFIG_USB_ETH_RNDIS=y
-CONFIG_USB_GADGET=y
-# CONFIG_USB_GADGET_XILINX is not set
-CONFIG_USB_LIBCOMPOSITE=y
CONFIG_USB_SUPPORT=y
CONFIG_USE_OF=y
CONFIG_VECTORS_BASE=0xffff0000
diff --git a/target/linux/at91/modules.mk b/target/linux/at91/modules.mk
index 7f98233eb5..6cfc3e4074 100644
--- a/target/linux/at91/modules.mk
+++ b/target/linux/at91/modules.mk
@@ -50,6 +50,24 @@ endef
$(eval $(call KernelPackage,at91-adc))
+define KernelPackage/at91-udc
+ SUBMENU:=$(USB_MENU)
+ TITLE:=USB Device Controller on atmel SoC
+ DEPENDS:=@TARGET_at91 +kmod-usb-gadget
+ KCONFIG:=CONFIG_USB_AT91
+ifneq ($(wildcard $(LINUX_DIR)/drivers/usb/gadget/udc/at91_udc.ko),)
+ FILES:=$(LINUX_DIR)/drivers/usb/gadget/udc/at91_udc.ko
+else
+ FILES:=$(LINUX_DIR)/drivers/usb/gadget/at91_udc.ko
+endif
+ AUTOLOAD:=$(call AutoLoad,51,at91_udc)
+endef
+
+define KernelPackage/at91-adc/description
+ Kernel module to use the USB Device controller for Atmel AT91
+endef
+
+$(eval $(call KernelPackage,at91-udc))
I2C_AT91_MODULES:=\
CONFIG_I2C_AT91:drivers/i2c/busses/i2c-at91
diff --git a/target/linux/at91/patches/100-ARM-at91-build-dtb-for-LMU5000.patch b/target/linux/at91/patches/100-ARM-at91-build-dtb-for-LMU5000.patch
index e8cc68d13d..8852b6a4f0 100644
--- a/target/linux/at91/patches/100-ARM-at91-build-dtb-for-LMU5000.patch
+++ b/target/linux/at91/patches/100-ARM-at91-build-dtb-for-LMU5000.patch
@@ -1,6 +1,6 @@
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
-@@ -26,6 +26,7 @@ dtb-$(CONFIG_ARCH_AT91) += usb_a9g20.dtb
+@@ -28,6 +28,7 @@ dtb-$(CONFIG_ARCH_AT91) += usb_a9g20.dtb
dtb-$(CONFIG_ARCH_AT91) += usb_a9g20_lpw.dtb
# sam9g45
dtb-$(CONFIG_ARCH_AT91) += at91sam9m10g45ek.dtb
diff --git a/target/linux/at91/patches/200-ARM-at91-udc-clockfix-backport.patch b/target/linux/at91/patches/200-ARM-at91-udc-clockfix-backport.patch
new file mode 100644
index 0000000000..1aec3d00b8
--- /dev/null
+++ b/target/linux/at91/patches/200-ARM-at91-udc-clockfix-backport.patch
@@ -0,0 +1,82 @@
+--- a/drivers/usb/gadget/udc/at91_udc.c
++++ b/drivers/usb/gadget/udc/at91_udc.c
+@@ -870,8 +870,6 @@
+ return;
+ udc->clocked = 1;
+
+- if (IS_ENABLED(CONFIG_COMMON_CLK))
+- clk_enable(udc->uclk);
+ clk_enable(udc->iclk);
+ clk_enable(udc->fclk);
+ }
+@@ -884,8 +882,6 @@
+ udc->gadget.speed = USB_SPEED_UNKNOWN;
+ clk_disable(udc->fclk);
+ clk_disable(udc->iclk);
+- if (IS_ENABLED(CONFIG_COMMON_CLK))
+- clk_disable(udc->uclk);
+ }
+
+ /*
+@@ -1766,27 +1762,18 @@
+ udc_reinit(udc);
+
+ /* get interface and function clocks */
+- udc->iclk = clk_get(dev, "udc_clk");
+- udc->fclk = clk_get(dev, "udpck");
+- if (IS_ENABLED(CONFIG_COMMON_CLK))
+- udc->uclk = clk_get(dev, "usb_clk");
+- if (IS_ERR(udc->iclk) || IS_ERR(udc->fclk) ||
+- (IS_ENABLED(CONFIG_COMMON_CLK) && IS_ERR(udc->uclk))) {
++ udc->iclk = clk_get(dev, "pclk");
++ udc->fclk = clk_get(dev, "hclk");
++ if (IS_ERR(udc->iclk) || IS_ERR(udc->fclk)) {
+ DBG("clocks missing\n");
+ retval = -ENODEV;
+ goto fail1;
+ }
+
+- /* don't do anything until we have both gadget driver and VBUS */
+- if (IS_ENABLED(CONFIG_COMMON_CLK)) {
+- clk_set_rate(udc->uclk, 48000000);
+- retval = clk_prepare(udc->uclk);
+- if (retval)
+- goto fail1;
+- }
++ clk_set_rate(udc->fclk, 48000000);
+ retval = clk_prepare(udc->fclk);
+ if (retval)
+- goto fail1a;
++ goto fail1;
+
+ retval = clk_prepare_enable(udc->iclk);
+ if (retval)
+@@ -1860,12 +1847,7 @@
+ clk_unprepare(udc->iclk);
+ fail1b:
+ clk_unprepare(udc->fclk);
+-fail1a:
+- if (IS_ENABLED(CONFIG_COMMON_CLK))
+- clk_unprepare(udc->uclk);
+ fail1:
+- if (IS_ENABLED(CONFIG_COMMON_CLK) && !IS_ERR(udc->uclk))
+- clk_put(udc->uclk);
+ if (!IS_ERR(udc->fclk))
+ clk_put(udc->fclk);
+ if (!IS_ERR(udc->iclk))
+@@ -1911,15 +1893,11 @@
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ release_mem_region(res->start, resource_size(res));
+
+- if (IS_ENABLED(CONFIG_COMMON_CLK))
+- clk_unprepare(udc->uclk);
+ clk_unprepare(udc->fclk);
+ clk_unprepare(udc->iclk);
+
+ clk_put(udc->iclk);
+ clk_put(udc->fclk);
+- if (IS_ENABLED(CONFIG_COMMON_CLK))
+- clk_put(udc->uclk);
+
+ return 0;
+ }