diff options
Diffstat (limited to 'drivers/ata/sata_sx4.c')
-rw-r--r-- | drivers/ata/sata_sx4.c | 115 |
1 files changed, 63 insertions, 52 deletions
diff --git a/drivers/ata/sata_sx4.c b/drivers/ata/sata_sx4.c index 2d14f3d56d92..ff0a78dc8b86 100644 --- a/drivers/ata/sata_sx4.c +++ b/drivers/ata/sata_sx4.c | |||
@@ -87,48 +87,59 @@ enum { | |||
87 | 87 | ||
88 | board_20621 = 0, /* FastTrak S150 SX4 */ | 88 | board_20621 = 0, /* FastTrak S150 SX4 */ |
89 | 89 | ||
90 | PDC_RESET = (1 << 11), /* HDMA reset */ | 90 | PDC_MASK_INT = (1 << 10), /* HDMA/ATA mask int */ |
91 | PDC_RESET = (1 << 11), /* HDMA/ATA reset */ | ||
91 | 92 | ||
92 | PDC_MAX_HDMA = 32, | 93 | PDC_MAX_HDMA = 32, |
93 | PDC_HDMA_Q_MASK = (PDC_MAX_HDMA - 1), | 94 | PDC_HDMA_Q_MASK = (PDC_MAX_HDMA - 1), |
94 | 95 | ||
95 | PDC_DIMM0_SPD_DEV_ADDRESS = 0x50, | 96 | PDC_DIMM0_SPD_DEV_ADDRESS = 0x50, |
96 | PDC_DIMM1_SPD_DEV_ADDRESS = 0x51, | 97 | PDC_DIMM1_SPD_DEV_ADDRESS = 0x51, |
97 | PDC_MAX_DIMM_MODULE = 0x02, | 98 | PDC_I2C_CONTROL = 0x48, |
98 | PDC_I2C_CONTROL_OFFSET = 0x48, | 99 | PDC_I2C_ADDR_DATA = 0x4C, |
99 | PDC_I2C_ADDR_DATA_OFFSET = 0x4C, | 100 | PDC_DIMM0_CONTROL = 0x80, |
100 | PDC_DIMM0_CONTROL_OFFSET = 0x80, | 101 | PDC_DIMM1_CONTROL = 0x84, |
101 | PDC_DIMM1_CONTROL_OFFSET = 0x84, | 102 | PDC_SDRAM_CONTROL = 0x88, |
102 | PDC_SDRAM_CONTROL_OFFSET = 0x88, | 103 | PDC_I2C_WRITE = 0, /* master -> slave */ |
103 | PDC_I2C_WRITE = 0x00000000, | 104 | PDC_I2C_READ = (1 << 6), /* master <- slave */ |
104 | PDC_I2C_READ = 0x00000040, | 105 | PDC_I2C_START = (1 << 7), /* start I2C proto */ |
105 | PDC_I2C_START = 0x00000080, | 106 | PDC_I2C_MASK_INT = (1 << 5), /* mask I2C interrupt */ |
106 | PDC_I2C_MASK_INT = 0x00000020, | 107 | PDC_I2C_COMPLETE = (1 << 16), /* I2C normal compl. */ |
107 | PDC_I2C_COMPLETE = 0x00010000, | 108 | PDC_I2C_NO_ACK = (1 << 20), /* slave no-ack addr */ |
108 | PDC_I2C_NO_ACK = 0x00100000, | 109 | PDC_DIMM_SPD_SUBADDRESS_START = 0x00, |
109 | PDC_DIMM_SPD_SUBADDRESS_START = 0x00, | 110 | PDC_DIMM_SPD_SUBADDRESS_END = 0x7F, |
110 | PDC_DIMM_SPD_SUBADDRESS_END = 0x7F, | 111 | PDC_DIMM_SPD_ROW_NUM = 3, |
111 | PDC_DIMM_SPD_ROW_NUM = 3, | 112 | PDC_DIMM_SPD_COLUMN_NUM = 4, |
112 | PDC_DIMM_SPD_COLUMN_NUM = 4, | 113 | PDC_DIMM_SPD_MODULE_ROW = 5, |
113 | PDC_DIMM_SPD_MODULE_ROW = 5, | 114 | PDC_DIMM_SPD_TYPE = 11, |
114 | PDC_DIMM_SPD_TYPE = 11, | 115 | PDC_DIMM_SPD_FRESH_RATE = 12, |
115 | PDC_DIMM_SPD_FRESH_RATE = 12, | 116 | PDC_DIMM_SPD_BANK_NUM = 17, |
116 | PDC_DIMM_SPD_BANK_NUM = 17, | 117 | PDC_DIMM_SPD_CAS_LATENCY = 18, |
117 | PDC_DIMM_SPD_CAS_LATENCY = 18, | 118 | PDC_DIMM_SPD_ATTRIBUTE = 21, |
118 | PDC_DIMM_SPD_ATTRIBUTE = 21, | 119 | PDC_DIMM_SPD_ROW_PRE_CHARGE = 27, |
119 | PDC_DIMM_SPD_ROW_PRE_CHARGE = 27, | 120 | PDC_DIMM_SPD_ROW_ACTIVE_DELAY = 28, |
120 | PDC_DIMM_SPD_ROW_ACTIVE_DELAY = 28, | 121 | PDC_DIMM_SPD_RAS_CAS_DELAY = 29, |
121 | PDC_DIMM_SPD_RAS_CAS_DELAY = 29, | 122 | PDC_DIMM_SPD_ACTIVE_PRECHARGE = 30, |
122 | PDC_DIMM_SPD_ACTIVE_PRECHARGE = 30, | 123 | PDC_DIMM_SPD_SYSTEM_FREQ = 126, |
123 | PDC_DIMM_SPD_SYSTEM_FREQ = 126, | 124 | PDC_CTL_STATUS = 0x08, |
124 | PDC_CTL_STATUS = 0x08, | 125 | PDC_DIMM_WINDOW_CTLR = 0x0C, |
125 | PDC_DIMM_WINDOW_CTLR = 0x0C, | 126 | PDC_TIME_CONTROL = 0x3C, |
126 | PDC_TIME_CONTROL = 0x3C, | 127 | PDC_TIME_PERIOD = 0x40, |
127 | PDC_TIME_PERIOD = 0x40, | 128 | PDC_TIME_COUNTER = 0x44, |
128 | PDC_TIME_COUNTER = 0x44, | 129 | PDC_GENERAL_CTLR = 0x484, |
129 | PDC_GENERAL_CTLR = 0x484, | 130 | PCI_PLL_INIT = 0x8A531824, |
130 | PCI_PLL_INIT = 0x8A531824, | 131 | PCI_X_TCOUNT = 0xEE1E5CFF, |
131 | PCI_X_TCOUNT = 0xEE1E5CFF | 132 | |
133 | /* PDC_TIME_CONTROL bits */ | ||
134 | PDC_TIMER_BUZZER = (1 << 10), | ||
135 | PDC_TIMER_MODE_PERIODIC = 0, /* bits 9:8 == 00 */ | ||
136 | PDC_TIMER_MODE_ONCE = (1 << 8), /* bits 9:8 == 01 */ | ||
137 | PDC_TIMER_ENABLE = (1 << 7), | ||
138 | PDC_TIMER_MASK_INT = (1 << 5), | ||
139 | PDC_TIMER_SEQ_MASK = 0x1f, /* SEQ ID for timer */ | ||
140 | PDC_TIMER_DEFAULT = PDC_TIMER_MODE_ONCE | | ||
141 | PDC_TIMER_ENABLE | | ||
142 | PDC_TIMER_MASK_INT, | ||
132 | }; | 143 | }; |
133 | 144 | ||
134 | 145 | ||
@@ -999,17 +1010,17 @@ static unsigned int pdc20621_i2c_read(struct ata_host *host, u32 device, | |||
999 | i2creg |= subaddr << 16; | 1010 | i2creg |= subaddr << 16; |
1000 | 1011 | ||
1001 | /* Set the device and subaddress */ | 1012 | /* Set the device and subaddress */ |
1002 | writel(i2creg, mmio + PDC_I2C_ADDR_DATA_OFFSET); | 1013 | writel(i2creg, mmio + PDC_I2C_ADDR_DATA); |
1003 | readl(mmio + PDC_I2C_ADDR_DATA_OFFSET); | 1014 | readl(mmio + PDC_I2C_ADDR_DATA); |
1004 | 1015 | ||
1005 | /* Write Control to perform read operation, mask int */ | 1016 | /* Write Control to perform read operation, mask int */ |
1006 | writel(PDC_I2C_READ | PDC_I2C_START | PDC_I2C_MASK_INT, | 1017 | writel(PDC_I2C_READ | PDC_I2C_START | PDC_I2C_MASK_INT, |
1007 | mmio + PDC_I2C_CONTROL_OFFSET); | 1018 | mmio + PDC_I2C_CONTROL); |
1008 | 1019 | ||
1009 | for (count = 0; count <= 1000; count ++) { | 1020 | for (count = 0; count <= 1000; count ++) { |
1010 | status = readl(mmio + PDC_I2C_CONTROL_OFFSET); | 1021 | status = readl(mmio + PDC_I2C_CONTROL); |
1011 | if (status & PDC_I2C_COMPLETE) { | 1022 | if (status & PDC_I2C_COMPLETE) { |
1012 | status = readl(mmio + PDC_I2C_ADDR_DATA_OFFSET); | 1023 | status = readl(mmio + PDC_I2C_ADDR_DATA); |
1013 | break; | 1024 | break; |
1014 | } else if (count == 1000) | 1025 | } else if (count == 1000) |
1015 | return 0; | 1026 | return 0; |
@@ -1099,8 +1110,8 @@ static int pdc20621_prog_dimm0(struct ata_host *host) | |||
1099 | data |= (((size / 16) - 1) << 16); | 1110 | data |= (((size / 16) - 1) << 16); |
1100 | data |= (0 << 23); | 1111 | data |= (0 << 23); |
1101 | data |= 8; | 1112 | data |= 8; |
1102 | writel(data, mmio + PDC_DIMM0_CONTROL_OFFSET); | 1113 | writel(data, mmio + PDC_DIMM0_CONTROL); |
1103 | readl(mmio + PDC_DIMM0_CONTROL_OFFSET); | 1114 | readl(mmio + PDC_DIMM0_CONTROL); |
1104 | return size; | 1115 | return size; |
1105 | } | 1116 | } |
1106 | 1117 | ||
@@ -1122,27 +1133,27 @@ static unsigned int pdc20621_prog_dimm_global(struct ata_host *host) | |||
1122 | */ | 1133 | */ |
1123 | 1134 | ||
1124 | data = 0x022259F1; | 1135 | data = 0x022259F1; |
1125 | writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET); | 1136 | writel(data, mmio + PDC_SDRAM_CONTROL); |
1126 | readl(mmio + PDC_SDRAM_CONTROL_OFFSET); | 1137 | readl(mmio + PDC_SDRAM_CONTROL); |
1127 | 1138 | ||
1128 | /* Turn on for ECC */ | 1139 | /* Turn on for ECC */ |
1129 | pdc20621_i2c_read(host, PDC_DIMM0_SPD_DEV_ADDRESS, | 1140 | pdc20621_i2c_read(host, PDC_DIMM0_SPD_DEV_ADDRESS, |
1130 | PDC_DIMM_SPD_TYPE, &spd0); | 1141 | PDC_DIMM_SPD_TYPE, &spd0); |
1131 | if (spd0 == 0x02) { | 1142 | if (spd0 == 0x02) { |
1132 | data |= (0x01 << 16); | 1143 | data |= (0x01 << 16); |
1133 | writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET); | 1144 | writel(data, mmio + PDC_SDRAM_CONTROL); |
1134 | readl(mmio + PDC_SDRAM_CONTROL_OFFSET); | 1145 | readl(mmio + PDC_SDRAM_CONTROL); |
1135 | printk(KERN_ERR "Local DIMM ECC Enabled\n"); | 1146 | printk(KERN_ERR "Local DIMM ECC Enabled\n"); |
1136 | } | 1147 | } |
1137 | 1148 | ||
1138 | /* DIMM Initialization Select/Enable (bit 18/19) */ | 1149 | /* DIMM Initialization Select/Enable (bit 18/19) */ |
1139 | data &= (~(1<<18)); | 1150 | data &= (~(1<<18)); |
1140 | data |= (1<<19); | 1151 | data |= (1<<19); |
1141 | writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET); | 1152 | writel(data, mmio + PDC_SDRAM_CONTROL); |
1142 | 1153 | ||
1143 | error = 1; | 1154 | error = 1; |
1144 | for (i = 1; i <= 10; i++) { /* polling ~5 secs */ | 1155 | for (i = 1; i <= 10; i++) { /* polling ~5 secs */ |
1145 | data = readl(mmio + PDC_SDRAM_CONTROL_OFFSET); | 1156 | data = readl(mmio + PDC_SDRAM_CONTROL); |
1146 | if (!(data & (1<<19))) { | 1157 | if (!(data & (1<<19))) { |
1147 | error = 0; | 1158 | error = 0; |
1148 | break; | 1159 | break; |
@@ -1176,7 +1187,7 @@ static unsigned int pdc20621_dimm_init(struct ata_host *host) | |||
1176 | VPRINTK("Time Period Register (0x40): 0x%x\n", time_period); | 1187 | VPRINTK("Time Period Register (0x40): 0x%x\n", time_period); |
1177 | 1188 | ||
1178 | /* Enable timer */ | 1189 | /* Enable timer */ |
1179 | writel(0x00001a0, mmio + PDC_TIME_CONTROL); | 1190 | writel(PDC_TIMER_DEFAULT, mmio + PDC_TIME_CONTROL); |
1180 | readl(mmio + PDC_TIME_CONTROL); | 1191 | readl(mmio + PDC_TIME_CONTROL); |
1181 | 1192 | ||
1182 | /* Wait 3 seconds */ | 1193 | /* Wait 3 seconds */ |