From 8c120014c194429122aa94fc0e9e59eff44ce296 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Thu, 19 Feb 2015 09:06:56 +0000 Subject: at91: USB gadget subsystem cleanup and driver fix. Signed-off-by: Owen Kirby git-svn-id: svn://svn.openwrt.org/openwrt/trunk@44491 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/at91/Makefile | 4 +- target/linux/at91/config-default | 8 --- target/linux/at91/modules.mk | 18 +++++ .../100-ARM-at91-build-dtb-for-LMU5000.patch | 2 +- .../200-ARM-at91-udc-clockfix-backport.patch | 82 ++++++++++++++++++++++ 5 files changed, 103 insertions(+), 11 deletions(-) create mode 100644 target/linux/at91/patches/200-ARM-at91-udc-clockfix-backport.patch 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 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; + } -- cgit v1.2.3