]> git.karo-electronics.de Git - karo-tx-uboot.git/blob - board/esd/cpci750/ide.c
CPCI750: Add CPCI-HD/2 support
[karo-tx-uboot.git] / board / esd / cpci750 / ide.c
1 /*
2  * (C) Copyright 2000
3  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4  *
5  * See file CREDITS for list of people who contributed to this
6  * project.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of
11  * the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21  * MA 02111-1307 USA
22  *
23  */
24 /* ide.c - ide support functions */
25
26
27 #include <common.h>
28 #if defined(CONFIG_CMD_IDE)
29 #include <ata.h>
30 #include <ide.h>
31 #include <pci.h>
32
33 extern ulong ide_bus_offset[CONFIG_SYS_IDE_MAXBUS];
34 int cpci_hd_type;
35
36 int ata_device(int dev)
37 {
38         int retval;
39
40         retval = (dev & 1) << 4;
41         if (cpci_hd_type == 2)
42                 retval ^= 1 << 4;
43         return retval;
44 }
45
46
47 int ide_preinit (void)
48 {
49         int status;
50         pci_dev_t devbusfn;
51         int l;
52
53         status = 1;
54         cpci_hd_type = 0;
55         if (CPCI750_SLAVE_TEST != 0)
56                 return status;
57         for (l = 0; l < CONFIG_SYS_IDE_MAXBUS; l++) {
58                 ide_bus_offset[l] = -ATA_STATUS;
59         }
60         devbusfn = pci_find_device (0x1103, 0x0004, 0);
61         if (devbusfn != -1) {
62                 cpci_hd_type = 1;
63         } else {
64                 devbusfn = pci_find_device (0x1095, 0x3114, 0);
65                 if (devbusfn != -1) {
66                         cpci_hd_type = 2;
67                 }
68         }
69         if (devbusfn != -1) {
70                 ulong *ide_bus_offset_ptr;
71
72                 status = 0;
73
74                 ide_bus_offset_ptr = &ide_bus_offset[0];
75                 pci_read_config_dword (devbusfn, PCI_BASE_ADDRESS_0,
76                                        (u32 *)ide_bus_offset_ptr);
77                 ide_bus_offset[0] &= 0xfffffffe;
78                 ide_bus_offset[0] += CONFIG_SYS_PCI0_IO_SPACE;
79                 ide_bus_offset_ptr = &ide_bus_offset[1];
80                 pci_read_config_dword (devbusfn, PCI_BASE_ADDRESS_2,
81                                        (u32 *)ide_bus_offset_ptr);
82                 ide_bus_offset[1] &= 0xfffffffe;
83                 ide_bus_offset[1] += CONFIG_SYS_PCI0_IO_SPACE;
84         }
85         return status;
86 }
87
88 void ide_set_reset (int flag) {
89         return;
90 }
91
92 #endif /* of CONFIG_CMDS_IDE */