1 /* 2 * (C) Copyright 2008 Stefan Roese <sr@denx.de>, DENX Software Engineering 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License as 6 * published by the Free Software Foundation; either version 2 of 7 * the License, or (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 17 * MA 02111-1307 USA 18 */ 19 20 #include <common.h> 21 #include <netdev.h> 22 #include <asm/io.h> 23 #include "vct.h" 24 25 /* 26 * EBI initialization for SMC911x access 27 */ 28 int ebi_init_smc911x(void) 29 { 30 reg_write(EBI_DEV1_CONFIG1(EBI_BASE), 0x00003020); 31 reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004F); 32 33 reg_write(EBI_DEV1_TIM1_RD1(EBI_BASE), 0x00501100); 34 reg_write(EBI_DEV1_TIM1_RD2(EBI_BASE), 0x0FF02111); 35 36 reg_write(EBI_DEV1_TIM_EXT(EBI_BASE), 0xFFF00000); 37 reg_write(EBI_DEV1_EXT_ACC(EBI_BASE), 0x0FFFFFFF); 38 39 reg_write(EBI_DEV1_TIM1_WR1(EBI_BASE), 0x05001100); 40 reg_write(EBI_DEV1_TIM1_WR2(EBI_BASE), 0x3FC21110); 41 42 return 0; 43 } 44 45 /* 46 * Accessor functions replacing the "weak" functions in 47 * drivers/net/smc911x.c 48 */ 49 u32 smc911x_reg_read(struct eth_device *dev, u32 addr) 50 { 51 volatile u32 data; 52 53 addr += dev->iobase; 54 reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004F); 55 ebi_wait(); 56 reg_write(EBI_CPU_IO_ACCS(EBI_BASE), (EXT_DEVICE_CHANNEL_1 | addr)); 57 ebi_wait(); 58 data = reg_read(EBI_IO_ACCS_DATA(EBI_BASE)); 59 60 return (data); 61 } 62 63 void smc911x_reg_write(struct eth_device *dev, u32 addr, u32 data) 64 { 65 addr += dev->iobase; 66 reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004F); 67 ebi_wait(); 68 reg_write(EBI_IO_ACCS_DATA(EBI_BASE), data); 69 reg_write(EBI_CPU_IO_ACCS(EBI_BASE), 70 EXT_DEVICE_CHANNEL_1 | EBI_CPU_WRITE | addr); 71 ebi_wait(); 72 } 73 74 void pkt_data_push(struct eth_device *dev, u32 addr, u32 data) 75 { 76 addr += dev->iobase; 77 reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004A); 78 ebi_wait(); 79 reg_write(EBI_IO_ACCS_DATA(EBI_BASE), data); 80 reg_write(EBI_CPU_IO_ACCS(EBI_BASE), 81 EXT_DEVICE_CHANNEL_1 | EBI_CPU_WRITE | addr); 82 ebi_wait(); 83 84 return; 85 } 86 87 u32 pkt_data_pull(struct eth_device *dev, u32 addr) 88 { 89 volatile u32 data; 90 91 addr += dev->iobase; 92 reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004A); 93 ebi_wait(); 94 reg_write(EBI_CPU_IO_ACCS(EBI_BASE), (EXT_DEVICE_CHANNEL_1 | addr)); 95 ebi_wait(); 96 data = reg_read(EBI_IO_ACCS_DATA(EBI_BASE)); 97 98 return data; 99 } 100 101 int board_eth_init(bd_t *bis) 102 { 103 int rc = 0; 104 #ifdef CONFIG_SMC911X 105 rc = smc911x_initialize(0, CONFIG_DRIVER_SMC911X_BASE); 106 #endif 107 return rc; 108 } 109