1a14bd417SAlbert ARIBAUD /* 2a14bd417SAlbert ARIBAUD * (C) Copyright 2009 3a14bd417SAlbert ARIBAUD * Marvell Semiconductor <www.marvell.com> 4a14bd417SAlbert ARIBAUD * Written-by: Prafulla Wadaskar <prafulla@marvell.com> 5a14bd417SAlbert ARIBAUD * 6a14bd417SAlbert ARIBAUD * See file CREDITS for list of people who contributed to this 7a14bd417SAlbert ARIBAUD * project. 8a14bd417SAlbert ARIBAUD * 9a14bd417SAlbert ARIBAUD * This program is free software; you can redistribute it and/or 10a14bd417SAlbert ARIBAUD * modify it under the terms of the GNU General Public License as 11a14bd417SAlbert ARIBAUD * published by the Free Software Foundation; either version 2 of 12a14bd417SAlbert ARIBAUD * the License, or (at your option) any later version. 13a14bd417SAlbert ARIBAUD * 14a14bd417SAlbert ARIBAUD * This program is distributed in the hope that it will be useful, 15a14bd417SAlbert ARIBAUD * but WITHOUT ANY WARRANTY; without even the implied warranty of 16a14bd417SAlbert ARIBAUD * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17a14bd417SAlbert ARIBAUD * GNU General Public License for more details. 18a14bd417SAlbert ARIBAUD * 19a14bd417SAlbert ARIBAUD * You should have received a copy of the GNU General Public License 20a14bd417SAlbert ARIBAUD * along with this program; if not, write to the Free Software 21a14bd417SAlbert ARIBAUD * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 22a14bd417SAlbert ARIBAUD * MA 02110-1301 USA 23a14bd417SAlbert ARIBAUD */ 24a14bd417SAlbert ARIBAUD 25a14bd417SAlbert ARIBAUD #include <common.h> 26a14bd417SAlbert ARIBAUD #include <asm/io.h> 27a14bd417SAlbert ARIBAUD #include <usb.h> 28a14bd417SAlbert ARIBAUD #include "ehci.h" 29a14bd417SAlbert ARIBAUD #include "ehci-core.h" 30a14bd417SAlbert ARIBAUD #include <asm/arch/cpu.h> 31*805ad7eeSAlbert ARIBAUD 32*805ad7eeSAlbert ARIBAUD #if defined(CONFIG_KIRKWOOD) 33a14bd417SAlbert ARIBAUD #include <asm/arch/kirkwood.h> 34*805ad7eeSAlbert ARIBAUD #elif defined(CONFIG_ORION5X) 35*805ad7eeSAlbert ARIBAUD #include <asm/arch/orion5x.h> 36*805ad7eeSAlbert ARIBAUD #endif 37a14bd417SAlbert ARIBAUD 3874d34421SAlbert ARIBAUD DECLARE_GLOBAL_DATA_PTR; 3974d34421SAlbert ARIBAUD 4074d34421SAlbert ARIBAUD #define rdl(off) readl(MVUSB0_BASE + (off)) 4174d34421SAlbert ARIBAUD #define wrl(off, val) writel((val), MVUSB0_BASE + (off)) 42a14bd417SAlbert ARIBAUD 43a14bd417SAlbert ARIBAUD #define USB_WINDOW_CTRL(i) (0x320 + ((i) << 4)) 44a14bd417SAlbert ARIBAUD #define USB_WINDOW_BASE(i) (0x324 + ((i) << 4)) 45a14bd417SAlbert ARIBAUD #define USB_TARGET_DRAM 0x0 46a14bd417SAlbert ARIBAUD 47a14bd417SAlbert ARIBAUD /* 48a14bd417SAlbert ARIBAUD * USB 2.0 Bridge Address Decoding registers setup 49a14bd417SAlbert ARIBAUD */ 50a14bd417SAlbert ARIBAUD static void usb_brg_adrdec_setup(void) 51a14bd417SAlbert ARIBAUD { 52a14bd417SAlbert ARIBAUD int i; 5374d34421SAlbert ARIBAUD u32 size, base, attrib; 54a14bd417SAlbert ARIBAUD 55a14bd417SAlbert ARIBAUD for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { 56a14bd417SAlbert ARIBAUD 57a14bd417SAlbert ARIBAUD /* Enable DRAM bank */ 58a14bd417SAlbert ARIBAUD switch (i) { 59a14bd417SAlbert ARIBAUD case 0: 6074d34421SAlbert ARIBAUD attrib = MVUSB0_CPU_ATTR_DRAM_CS0; 61a14bd417SAlbert ARIBAUD break; 62a14bd417SAlbert ARIBAUD case 1: 6374d34421SAlbert ARIBAUD attrib = MVUSB0_CPU_ATTR_DRAM_CS1; 64a14bd417SAlbert ARIBAUD break; 65a14bd417SAlbert ARIBAUD case 2: 6674d34421SAlbert ARIBAUD attrib = MVUSB0_CPU_ATTR_DRAM_CS2; 67a14bd417SAlbert ARIBAUD break; 68a14bd417SAlbert ARIBAUD case 3: 6974d34421SAlbert ARIBAUD attrib = MVUSB0_CPU_ATTR_DRAM_CS3; 70a14bd417SAlbert ARIBAUD break; 71a14bd417SAlbert ARIBAUD default: 72a14bd417SAlbert ARIBAUD /* invalide bank, disable access */ 73a14bd417SAlbert ARIBAUD attrib = 0; 74a14bd417SAlbert ARIBAUD break; 75a14bd417SAlbert ARIBAUD } 76a14bd417SAlbert ARIBAUD 7774d34421SAlbert ARIBAUD size = gd->bd->bi_dram[i].size; 7874d34421SAlbert ARIBAUD base = gd->bd->bi_dram[i].start; 79a14bd417SAlbert ARIBAUD if ((size) && (attrib)) 80a14bd417SAlbert ARIBAUD wrl(USB_WINDOW_CTRL(i), 8174d34421SAlbert ARIBAUD MVCPU_WIN_CTRL_DATA(size, USB_TARGET_DRAM, 8274d34421SAlbert ARIBAUD attrib, MVCPU_WIN_ENABLE)); 83a14bd417SAlbert ARIBAUD else 8474d34421SAlbert ARIBAUD wrl(USB_WINDOW_CTRL(i), MVCPU_WIN_DISABLE); 85a14bd417SAlbert ARIBAUD 8674d34421SAlbert ARIBAUD wrl(USB_WINDOW_BASE(i), base); 87a14bd417SAlbert ARIBAUD } 88a14bd417SAlbert ARIBAUD } 89a14bd417SAlbert ARIBAUD 90a14bd417SAlbert ARIBAUD /* 91a14bd417SAlbert ARIBAUD * Create the appropriate control structures to manage 92a14bd417SAlbert ARIBAUD * a new EHCI host controller. 93a14bd417SAlbert ARIBAUD */ 94a14bd417SAlbert ARIBAUD int ehci_hcd_init(void) 95a14bd417SAlbert ARIBAUD { 96a14bd417SAlbert ARIBAUD usb_brg_adrdec_setup(); 97a14bd417SAlbert ARIBAUD 9874d34421SAlbert ARIBAUD hccr = (struct ehci_hccr *)(MVUSB0_BASE + 0x100); 99a14bd417SAlbert ARIBAUD hcor = (struct ehci_hcor *)((uint32_t) hccr 100a14bd417SAlbert ARIBAUD + HC_LENGTH(ehci_readl(&hccr->cr_capbase))); 101a14bd417SAlbert ARIBAUD 10274d34421SAlbert ARIBAUD debug("ehci-marvell: init hccr %x and hcor %x hc_length %d\n", 103a14bd417SAlbert ARIBAUD (uint32_t)hccr, (uint32_t)hcor, 104a14bd417SAlbert ARIBAUD (uint32_t)HC_LENGTH(ehci_readl(&hccr->cr_capbase))); 105a14bd417SAlbert ARIBAUD 106a14bd417SAlbert ARIBAUD return 0; 107a14bd417SAlbert ARIBAUD } 108a14bd417SAlbert ARIBAUD 109a14bd417SAlbert ARIBAUD /* 110a14bd417SAlbert ARIBAUD * Destroy the appropriate control structures corresponding 111a14bd417SAlbert ARIBAUD * the the EHCI host controller. 112a14bd417SAlbert ARIBAUD */ 113a14bd417SAlbert ARIBAUD int ehci_hcd_stop(void) 114a14bd417SAlbert ARIBAUD { 115a14bd417SAlbert ARIBAUD return 0; 116a14bd417SAlbert ARIBAUD } 117