aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-27 09:38:32 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-27 09:38:32 -0400
commit4c3032d8a4d6c97bd6e02bcab524ef2428d89561 (patch)
tree4528851a9b04282f602cebb6b2ab4bc677b63259 /include
parent387750c3bf49c22f6189436032145e2131985076 (diff)
ide: add struct ide_io_ports (take 3)
* Add struct ide_io_ports and use it instead of `unsigned long io_ports[]` in ide_hwif_t. * Rename io_ports[] in hw_regs_t to io_ports_array[]. * Use un-named union for 'unsigned long io_ports_array[]' and 'struct ide_io_ports io_ports' in hw_regs_t. * Remove IDE_*_OFFSET defines. v2: * scc_pata.c build fix from Stephen Rothwell. v3: * Fix ctl_adrr typo in Sparc-specific part of ns87415.c. (Noticed by Andrew Morton) Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'include')
-rw-r--r--include/asm-arm/arch-sa1100/ide.h6
-rw-r--r--include/asm-cris/arch-v10/ide.h11
-rw-r--r--include/linux/ide.h70
3 files changed, 47 insertions, 40 deletions
diff --git a/include/asm-arm/arch-sa1100/ide.h b/include/asm-arm/arch-sa1100/ide.h
index 98b10bcf9f1b..b14cbda01dc3 100644
--- a/include/asm-arm/arch-sa1100/ide.h
+++ b/include/asm-arm/arch-sa1100/ide.h
@@ -37,12 +37,12 @@ static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
37 37
38 memset(hw, 0, sizeof(*hw)); 38 memset(hw, 0, sizeof(*hw));
39 39
40 for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) { 40 for (i = 0; i <= 7; i++) {
41 hw->io_ports[i] = reg; 41 hw->io_ports_array[i] = reg;
42 reg += regincr; 42 reg += regincr;
43 } 43 }
44 44
45 hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port; 45 hw->io_ports.ctl_addr = ctrl_port;
46 46
47 if (irq) 47 if (irq)
48 *irq = 0; 48 *irq = 0;
diff --git a/include/asm-cris/arch-v10/ide.h b/include/asm-cris/arch-v10/ide.h
index ea34e0d0a388..5366e6239328 100644
--- a/include/asm-cris/arch-v10/ide.h
+++ b/include/asm-cris/arch-v10/ide.h
@@ -59,22 +59,19 @@ static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port, u
59 int i; 59 int i;
60 60
61 /* fill in ports for ATA addresses 0 to 7 */ 61 /* fill in ports for ATA addresses 0 to 7 */
62 62 for (i = 0; i <= 7; i++) {
63 for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) { 63 hw->io_ports_array[i] = data_port |
64 hw->io_ports[i] = data_port |
65 IO_FIELD(R_ATA_CTRL_DATA, addr, i) | 64 IO_FIELD(R_ATA_CTRL_DATA, addr, i) |
66 IO_STATE(R_ATA_CTRL_DATA, cs0, active); 65 IO_STATE(R_ATA_CTRL_DATA, cs0, active);
67 } 66 }
68 67
69 /* the IDE control register is at ATA address 6, with CS1 active instead of CS0 */ 68 /* the IDE control register is at ATA address 6, with CS1 active instead of CS0 */
70 69 hw->io_ports.ctl_addr = data_port |
71 hw->io_ports[IDE_CONTROL_OFFSET] = data_port |
72 IO_FIELD(R_ATA_CTRL_DATA, addr, 6) | 70 IO_FIELD(R_ATA_CTRL_DATA, addr, 6) |
73 IO_STATE(R_ATA_CTRL_DATA, cs1, active); 71 IO_STATE(R_ATA_CTRL_DATA, cs1, active);
74 72
75 /* whats this for ? */ 73 /* whats this for ? */
76 74 hw->io_ports.irq_addr = 0;
77 hw->io_ports[IDE_IRQ_OFFSET] = 0;
78} 75}
79 76
80static inline void ide_init_default_hwifs(void) 77static inline void ide_init_default_hwifs(void)
diff --git a/include/linux/ide.h b/include/linux/ide.h
index f4c7ec25f614..772228cf7115 100644
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -61,23 +61,30 @@ typedef unsigned char byte; /* used everywhere */
61 */ 61 */
62#define IDE_NR_PORTS (10) 62#define IDE_NR_PORTS (10)
63 63
64#define IDE_DATA_OFFSET (0) 64struct ide_io_ports {
65#define IDE_ERROR_OFFSET (1) 65 unsigned long data_addr;
66#define IDE_NSECTOR_OFFSET (2) 66
67#define IDE_SECTOR_OFFSET (3) 67 union {
68#define IDE_LCYL_OFFSET (4) 68 unsigned long error_addr; /* read: error */
69#define IDE_HCYL_OFFSET (5) 69 unsigned long feature_addr; /* write: feature */
70#define IDE_SELECT_OFFSET (6) 70 };
71#define IDE_STATUS_OFFSET (7) 71
72#define IDE_CONTROL_OFFSET (8) 72 unsigned long nsect_addr;
73#define IDE_IRQ_OFFSET (9) 73 unsigned long lbal_addr;
74 74 unsigned long lbam_addr;
75#define IDE_FEATURE_OFFSET IDE_ERROR_OFFSET 75 unsigned long lbah_addr;
76#define IDE_COMMAND_OFFSET IDE_STATUS_OFFSET 76
77#define IDE_ALTSTATUS_OFFSET IDE_CONTROL_OFFSET 77 unsigned long device_addr;
78#define IDE_IREASON_OFFSET IDE_NSECTOR_OFFSET 78
79#define IDE_BCOUNTL_OFFSET IDE_LCYL_OFFSET 79 union {
80#define IDE_BCOUNTH_OFFSET IDE_HCYL_OFFSET 80 unsigned long status_addr; /*  read: status  */
81 unsigned long command_addr; /* write: command */
82 };
83
84 unsigned long ctl_addr;
85
86 unsigned long irq_addr;
87};
81 88
82#define OK_STAT(stat,good,bad) (((stat)&((good)|(bad)))==(good)) 89#define OK_STAT(stat,good,bad) (((stat)&((good)|(bad)))==(good))
83#define BAD_R_STAT (BUSY_STAT | ERR_STAT) 90#define BAD_R_STAT (BUSY_STAT | ERR_STAT)
@@ -156,7 +163,11 @@ typedef u8 hwif_chipset_t;
156 * Structure to hold all information about the location of this port 163 * Structure to hold all information about the location of this port
157 */ 164 */
158typedef struct hw_regs_s { 165typedef struct hw_regs_s {
159 unsigned long io_ports[IDE_NR_PORTS]; /* task file registers */ 166 union {
167 struct ide_io_ports io_ports;
168 unsigned long io_ports_array[IDE_NR_PORTS];
169 };
170
160 int irq; /* our irq number */ 171 int irq; /* our irq number */
161 ide_ack_intr_t *ack_intr; /* acknowledge interrupt */ 172 ide_ack_intr_t *ack_intr; /* acknowledge interrupt */
162 hwif_chipset_t chipset; 173 hwif_chipset_t chipset;
@@ -172,10 +183,10 @@ static inline void ide_std_init_ports(hw_regs_t *hw,
172{ 183{
173 unsigned int i; 184 unsigned int i;
174 185
175 for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) 186 for (i = 0; i <= 7; i++)
176 hw->io_ports[i] = io_addr++; 187 hw->io_ports_array[i] = io_addr++;
177 188
178 hw->io_ports[IDE_CONTROL_OFFSET] = ctl_addr; 189 hw->io_ports.ctl_addr = ctl_addr;
179} 190}
180 191
181#include <asm/ide.h> 192#include <asm/ide.h>
@@ -424,8 +435,8 @@ typedef struct hwif_s {
424 435
425 char name[6]; /* name of interface, eg. "ide0" */ 436 char name[6]; /* name of interface, eg. "ide0" */
426 437
427 /* task file registers for pata and sata */ 438 struct ide_io_ports io_ports;
428 unsigned long io_ports[IDE_NR_PORTS]; 439
429 unsigned long sata_scr[SATA_NR_PORTS]; 440 unsigned long sata_scr[SATA_NR_PORTS];
430 441
431 ide_drive_t drives[MAX_DRIVES]; /* drive info */ 442 ide_drive_t drives[MAX_DRIVES]; /* drive info */
@@ -1330,29 +1341,28 @@ static inline void ide_set_irq(ide_drive_t *drive, int on)
1330{ 1341{
1331 ide_hwif_t *hwif = drive->hwif; 1342 ide_hwif_t *hwif = drive->hwif;
1332 1343
1333 hwif->OUTB(drive->ctl | (on ? 0 : 2), 1344 hwif->OUTB(drive->ctl | (on ? 0 : 2), hwif->io_ports.ctl_addr);
1334 hwif->io_ports[IDE_CONTROL_OFFSET]);
1335} 1345}
1336 1346
1337static inline u8 ide_read_status(ide_drive_t *drive) 1347static inline u8 ide_read_status(ide_drive_t *drive)
1338{ 1348{
1339 ide_hwif_t *hwif = drive->hwif; 1349 ide_hwif_t *hwif = drive->hwif;
1340 1350
1341 return hwif->INB(hwif->io_ports[IDE_STATUS_OFFSET]); 1351 return hwif->INB(hwif->io_ports.status_addr);
1342} 1352}
1343 1353
1344static inline u8 ide_read_altstatus(ide_drive_t *drive) 1354static inline u8 ide_read_altstatus(ide_drive_t *drive)
1345{ 1355{
1346 ide_hwif_t *hwif = drive->hwif; 1356 ide_hwif_t *hwif = drive->hwif;
1347 1357
1348 return hwif->INB(hwif->io_ports[IDE_CONTROL_OFFSET]); 1358 return hwif->INB(hwif->io_ports.ctl_addr);
1349} 1359}
1350 1360
1351static inline u8 ide_read_error(ide_drive_t *drive) 1361static inline u8 ide_read_error(ide_drive_t *drive)
1352{ 1362{
1353 ide_hwif_t *hwif = drive->hwif; 1363 ide_hwif_t *hwif = drive->hwif;
1354 1364
1355 return hwif->INB(hwif->io_ports[IDE_ERROR_OFFSET]); 1365 return hwif->INB(hwif->io_ports.error_addr);
1356} 1366}
1357 1367
1358/* 1368/*
@@ -1365,7 +1375,7 @@ static inline void ide_atapi_discard_data(ide_drive_t *drive, unsigned bcount)
1365 1375
1366 /* FIXME: use ->atapi_input_bytes */ 1376 /* FIXME: use ->atapi_input_bytes */
1367 while (bcount--) 1377 while (bcount--)
1368 (void)hwif->INB(hwif->io_ports[IDE_DATA_OFFSET]); 1378 (void)hwif->INB(hwif->io_ports.data_addr);
1369} 1379}
1370 1380
1371static inline void ide_atapi_write_zeros(ide_drive_t *drive, unsigned bcount) 1381static inline void ide_atapi_write_zeros(ide_drive_t *drive, unsigned bcount)
@@ -1374,7 +1384,7 @@ static inline void ide_atapi_write_zeros(ide_drive_t *drive, unsigned bcount)
1374 1384
1375 /* FIXME: use ->atapi_output_bytes */ 1385 /* FIXME: use ->atapi_output_bytes */
1376 while (bcount--) 1386 while (bcount--)
1377 hwif->OUTB(0, hwif->io_ports[IDE_DATA_OFFSET]); 1387 hwif->OUTB(0, hwif->io_ports.data_addr);
1378} 1388}
1379 1389
1380#endif /* _IDE_H */ 1390#endif /* _IDE_H */