xref: /OK3568_Linux_fs/u-boot/board/micronas/vct/ebi_smc911x.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * (C) Copyright 2008 Stefan Roese <sr@denx.de>, DENX Software Engineering
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #include <netdev.h>
9*4882a593Smuzhiyun #include <asm/io.h>
10*4882a593Smuzhiyun #include "vct.h"
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun /*
13*4882a593Smuzhiyun  * EBI initialization for SMC911x access
14*4882a593Smuzhiyun  */
ebi_init_smc911x(void)15*4882a593Smuzhiyun int ebi_init_smc911x(void)
16*4882a593Smuzhiyun {
17*4882a593Smuzhiyun 	reg_write(EBI_DEV1_CONFIG1(EBI_BASE), 0x00003020);
18*4882a593Smuzhiyun 	reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004F);
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun 	reg_write(EBI_DEV1_TIM1_RD1(EBI_BASE), 0x00501100);
21*4882a593Smuzhiyun 	reg_write(EBI_DEV1_TIM1_RD2(EBI_BASE), 0x0FF02111);
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun 	reg_write(EBI_DEV1_TIM_EXT(EBI_BASE), 0xFFF00000);
24*4882a593Smuzhiyun 	reg_write(EBI_DEV1_EXT_ACC(EBI_BASE), 0x0FFFFFFF);
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun 	reg_write(EBI_DEV1_TIM1_WR1(EBI_BASE), 0x05001100);
27*4882a593Smuzhiyun 	reg_write(EBI_DEV1_TIM1_WR2(EBI_BASE), 0x3FC21110);
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 	return 0;
30*4882a593Smuzhiyun }
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun /*
33*4882a593Smuzhiyun  * Accessor functions replacing the "weak" functions in
34*4882a593Smuzhiyun  * drivers/net/smc911x.c
35*4882a593Smuzhiyun  */
smc911x_reg_read(struct eth_device * dev,u32 addr)36*4882a593Smuzhiyun u32 smc911x_reg_read(struct eth_device *dev, u32 addr)
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun 	volatile u32 data;
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	addr += dev->iobase;
41*4882a593Smuzhiyun 	reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004F);
42*4882a593Smuzhiyun 	ebi_wait();
43*4882a593Smuzhiyun 	reg_write(EBI_CPU_IO_ACCS(EBI_BASE), (EXT_DEVICE_CHANNEL_1 | addr));
44*4882a593Smuzhiyun 	ebi_wait();
45*4882a593Smuzhiyun 	data = reg_read(EBI_IO_ACCS_DATA(EBI_BASE));
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	return (data);
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun 
smc911x_reg_write(struct eth_device * dev,u32 addr,u32 data)50*4882a593Smuzhiyun void smc911x_reg_write(struct eth_device *dev, u32 addr, u32 data)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun 	addr += dev->iobase;
53*4882a593Smuzhiyun 	reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004F);
54*4882a593Smuzhiyun 	ebi_wait();
55*4882a593Smuzhiyun 	reg_write(EBI_IO_ACCS_DATA(EBI_BASE), data);
56*4882a593Smuzhiyun 	reg_write(EBI_CPU_IO_ACCS(EBI_BASE),
57*4882a593Smuzhiyun 		  EXT_DEVICE_CHANNEL_1 | EBI_CPU_WRITE | addr);
58*4882a593Smuzhiyun 	ebi_wait();
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun 
pkt_data_push(struct eth_device * dev,u32 addr,u32 data)61*4882a593Smuzhiyun void pkt_data_push(struct eth_device *dev, u32 addr, u32 data)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun 	addr += dev->iobase;
64*4882a593Smuzhiyun 	reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004A);
65*4882a593Smuzhiyun 	ebi_wait();
66*4882a593Smuzhiyun 	reg_write(EBI_IO_ACCS_DATA(EBI_BASE), data);
67*4882a593Smuzhiyun 	reg_write(EBI_CPU_IO_ACCS(EBI_BASE),
68*4882a593Smuzhiyun 		  EXT_DEVICE_CHANNEL_1 | EBI_CPU_WRITE | addr);
69*4882a593Smuzhiyun 	ebi_wait();
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	return;
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun 
pkt_data_pull(struct eth_device * dev,u32 addr)74*4882a593Smuzhiyun u32 pkt_data_pull(struct eth_device *dev, u32 addr)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun 	volatile u32 data;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	addr += dev->iobase;
79*4882a593Smuzhiyun 	reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004A);
80*4882a593Smuzhiyun 	ebi_wait();
81*4882a593Smuzhiyun 	reg_write(EBI_CPU_IO_ACCS(EBI_BASE), (EXT_DEVICE_CHANNEL_1 | addr));
82*4882a593Smuzhiyun 	ebi_wait();
83*4882a593Smuzhiyun 	data = reg_read(EBI_IO_ACCS_DATA(EBI_BASE));
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 	return data;
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun 
board_eth_init(bd_t * bis)88*4882a593Smuzhiyun int board_eth_init(bd_t *bis)
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun 	int rc = 0;
91*4882a593Smuzhiyun #ifdef CONFIG_SMC911X
92*4882a593Smuzhiyun 	rc = smc911x_initialize(0, CONFIG_DRIVER_SMC911X_BASE);
93*4882a593Smuzhiyun #endif
94*4882a593Smuzhiyun 	return rc;
95*4882a593Smuzhiyun }
96