Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 31 Mar 2011 02:36:22 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r220180 - head/sys/mips/atheros
Message-ID:  <201103310236.p2V2aMwD088676@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Thu Mar 31 02:36:22 2011
New Revision: 220180
URL: http://svn.freebsd.org/changeset/base/220180

Log:
  Implement AR724x USB initialisation code.
  
  This (again) still requires an offset for the AR913x/AR724x before USB will
  function.
  
  Submitted by: Luiz Otavio O Souzau <loos.br@gmail.com>

Modified:
  head/sys/mips/atheros/ar724x_chip.c
  head/sys/mips/atheros/ar724xreg.h

Modified: head/sys/mips/atheros/ar724x_chip.c
==============================================================================
--- head/sys/mips/atheros/ar724x_chip.c	Thu Mar 31 01:14:06 2011	(r220179)
+++ head/sys/mips/atheros/ar724x_chip.c	Thu Mar 31 02:36:22 2011	(r220180)
@@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$");
 #include <mips/atheros/ar724xreg.h>
 
 #include <mips/atheros/ar71xx_cpudef.h>
+#include <mips/atheros/ar71xx_setup.h>
 #include <mips/atheros/ar724x_chip.h>
 
 static void
@@ -151,6 +152,50 @@ ar724x_chip_get_eth_pll(unsigned int mac
         return 0;
 }
 
+static void
+ar724x_chip_init_usb_peripheral(void)
+{
+
+	switch (ar71xx_soc) {
+		case AR71XX_SOC_AR7240:
+
+			ar71xx_device_stop(AR724X_RESET_MODULE_USB_OHCI_DLL |
+			    AR724X_RESET_USB_HOST);
+			DELAY(1000);
+
+			ar71xx_device_start(AR724X_RESET_MODULE_USB_OHCI_DLL |
+			    AR724X_RESET_USB_HOST);
+			DELAY(1000);
+
+			/*
+			 * WAR for HW bug. Here it adjusts the duration
+			 * between two SOFS.
+			 */
+			ATH_WRITE_REG(AR71XX_USB_CTRL_FLADJ,
+			    (3 << USB_CTRL_FLADJ_A0_SHIFT));
+
+			break;
+
+		case AR71XX_SOC_AR7241:
+		case AR71XX_SOC_AR7242:
+
+			ar71xx_device_start(AR724X_RESET_MODULE_USB_OHCI_DLL);
+			DELAY(100);
+
+			ar71xx_device_start(AR724X_RESET_USB_HOST);
+			DELAY(100);
+
+			ar71xx_device_start(AR724X_RESET_USB_PHY);
+			DELAY(100);
+
+			break;
+
+		default:
+			/* fallthrough */
+			break;
+	}
+}
+
 struct ar71xx_cpu_def ar724x_chip_def = {
         &ar724x_chip_detect_mem_size,
         &ar724x_chip_detect_sys_frequency,
@@ -163,5 +208,5 @@ struct ar71xx_cpu_def ar724x_chip_def = 
         &ar724x_chip_ddr_flush_ge1,
         &ar724x_chip_get_eth_pll,
 	NULL,		/* ar71xx_chip_irq_flush_ip2 */
-	NULL		/* ar71xx_chip_init_usb_peripheral */
+	&ar724x_chip_init_usb_peripheral
 };

Modified: head/sys/mips/atheros/ar724xreg.h
==============================================================================
--- head/sys/mips/atheros/ar724xreg.h	Thu Mar 31 01:14:06 2011	(r220179)
+++ head/sys/mips/atheros/ar724xreg.h	Thu Mar 31 02:36:22 2011	(r220180)
@@ -51,6 +51,8 @@
 #define	AR724X_DDR_REG_FLUSH_GE1	(AR71XX_DDR_CONFIG + 0x80)
 
 #define	AR724X_RESET_REG_RESET_MODULE	AR71XX_RST_BLOCK_BASE + 0x1c
+#define	AR724X_RESET_USB_HOST			(1 << 5)
+#define	AR724X_RESET_USB_PHY			(1 << 4)
 #define	AR724X_RESET_MODULE_USB_OHCI_DLL	(1 << 3)
 
 /* XXX so USB requires different init code? -adrian */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201103310236.p2V2aMwD088676>