aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/acpica/hwxface.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/drivers/acpi/acpica/hwxface.c b/drivers/acpi/acpica/hwxface.c
index 5ee7a814cd92..f81fb068d20e 100644
--- a/drivers/acpi/acpica/hwxface.c
+++ b/drivers/acpi/acpica/hwxface.c
@@ -119,7 +119,8 @@ ACPI_EXPORT_SYMBOL(acpi_reset)
119 ******************************************************************************/ 119 ******************************************************************************/
120acpi_status acpi_read(u64 *return_value, struct acpi_generic_address *reg) 120acpi_status acpi_read(u64 *return_value, struct acpi_generic_address *reg)
121{ 121{
122 u32 value; 122 u32 value_lo;
123 u32 value_hi;
123 u32 width; 124 u32 width;
124 u64 address; 125 u64 address;
125 acpi_status status; 126 acpi_status status;
@@ -137,13 +138,8 @@ acpi_status acpi_read(u64 *return_value, struct acpi_generic_address *reg)
137 return (status); 138 return (status);
138 } 139 }
139 140
140 /* Initialize entire 64-bit return value to zero */
141
142 *return_value = 0;
143 value = 0;
144
145 /* 141 /*
146 * Two address spaces supported: Memory or IO. PCI_Config is 142 * Two address spaces supported: Memory or I/O. PCI_Config is
147 * not supported here because the GAS structure is insufficient 143 * not supported here because the GAS structure is insufficient
148 */ 144 */
149 if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { 145 if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
@@ -155,29 +151,35 @@ acpi_status acpi_read(u64 *return_value, struct acpi_generic_address *reg)
155 } 151 }
156 } else { /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */ 152 } else { /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
157 153
154 value_lo = 0;
155 value_hi = 0;
156
158 width = reg->bit_width; 157 width = reg->bit_width;
159 if (width == 64) { 158 if (width == 64) {
160 width = 32; /* Break into two 32-bit transfers */ 159 width = 32; /* Break into two 32-bit transfers */
161 } 160 }
162 161
163 status = acpi_hw_read_port((acpi_io_address) 162 status = acpi_hw_read_port((acpi_io_address)
164 address, &value, width); 163 address, &value_lo, width);
165 if (ACPI_FAILURE(status)) { 164 if (ACPI_FAILURE(status)) {
166 return (status); 165 return (status);
167 } 166 }
168 *return_value = value;
169 167
170 if (reg->bit_width == 64) { 168 if (reg->bit_width == 64) {
171 169
172 /* Read the top 32 bits */ 170 /* Read the top 32 bits */
173 171
174 status = acpi_hw_read_port((acpi_io_address) 172 status = acpi_hw_read_port((acpi_io_address)
175 (address + 4), &value, 32); 173 (address + 4), &value_hi,
174 32);
176 if (ACPI_FAILURE(status)) { 175 if (ACPI_FAILURE(status)) {
177 return (status); 176 return (status);
178 } 177 }
179 *return_value |= ((u64)value << 32);
180 } 178 }
179
180 /* Set the return value only if status is AE_OK */
181
182 *return_value = (value_lo | ((u64)value_hi << 32));
181 } 183 }
182 184
183 ACPI_DEBUG_PRINT((ACPI_DB_IO, 185 ACPI_DEBUG_PRINT((ACPI_DB_IO,
@@ -186,7 +188,7 @@ acpi_status acpi_read(u64 *return_value, struct acpi_generic_address *reg)
186 ACPI_FORMAT_UINT64(address), 188 ACPI_FORMAT_UINT64(address),
187 acpi_ut_get_region_name(reg->space_id))); 189 acpi_ut_get_region_name(reg->space_id)));
188 190
189 return (status); 191 return (AE_OK);
190} 192}
191 193
192ACPI_EXPORT_SYMBOL(acpi_read) 194ACPI_EXPORT_SYMBOL(acpi_read)