xref: /openbmc/linux/drivers/acpi/acpica/rsserial.c (revision e3d786a3)
1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /*******************************************************************************
3  *
4  * Module Name: rsserial - GPIO/serial_bus resource descriptors
5  *
6  ******************************************************************************/
7 
8 #include <acpi/acpi.h>
9 #include "accommon.h"
10 #include "acresrc.h"
11 
12 #define _COMPONENT          ACPI_RESOURCES
13 ACPI_MODULE_NAME("rsserial")
14 
15 /*******************************************************************************
16  *
17  * acpi_rs_convert_gpio
18  *
19  ******************************************************************************/
20 struct acpi_rsconvert_info acpi_rs_convert_gpio[18] = {
21 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GPIO,
22 	 ACPI_RS_SIZE(struct acpi_resource_gpio),
23 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_gpio)},
24 
25 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_GPIO,
26 	 sizeof(struct aml_resource_gpio),
27 	 0},
28 
29 	/*
30 	 * These fields are contiguous in both the source and destination:
31 	 * revision_id
32 	 * connection_type
33 	 */
34 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.gpio.revision_id),
35 	 AML_OFFSET(gpio.revision_id),
36 	 2},
37 
38 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.gpio.producer_consumer),
39 	 AML_OFFSET(gpio.flags),
40 	 0},
41 
42 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.gpio.sharable),
43 	 AML_OFFSET(gpio.int_flags),
44 	 3},
45 
46 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.gpio.wake_capable),
47 	 AML_OFFSET(gpio.int_flags),
48 	 4},
49 
50 	{ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.gpio.io_restriction),
51 	 AML_OFFSET(gpio.int_flags),
52 	 0},
53 
54 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.gpio.triggering),
55 	 AML_OFFSET(gpio.int_flags),
56 	 0},
57 
58 	{ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.gpio.polarity),
59 	 AML_OFFSET(gpio.int_flags),
60 	 1},
61 
62 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.gpio.pin_config),
63 	 AML_OFFSET(gpio.pin_config),
64 	 1},
65 
66 	/*
67 	 * These fields are contiguous in both the source and destination:
68 	 * drive_strength
69 	 * debounce_timeout
70 	 */
71 	{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.gpio.drive_strength),
72 	 AML_OFFSET(gpio.drive_strength),
73 	 2},
74 
75 	/* Pin Table */
76 
77 	{ACPI_RSC_COUNT_GPIO_PIN, ACPI_RS_OFFSET(data.gpio.pin_table_length),
78 	 AML_OFFSET(gpio.pin_table_offset),
79 	 AML_OFFSET(gpio.res_source_offset)},
80 
81 	{ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET(data.gpio.pin_table),
82 	 AML_OFFSET(gpio.pin_table_offset),
83 	 0},
84 
85 	/* Resource Source */
86 
87 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.gpio.resource_source.index),
88 	 AML_OFFSET(gpio.res_source_index),
89 	 1},
90 
91 	{ACPI_RSC_COUNT_GPIO_RES,
92 	 ACPI_RS_OFFSET(data.gpio.resource_source.string_length),
93 	 AML_OFFSET(gpio.res_source_offset),
94 	 AML_OFFSET(gpio.vendor_offset)},
95 
96 	{ACPI_RSC_MOVE_GPIO_RES,
97 	 ACPI_RS_OFFSET(data.gpio.resource_source.string_ptr),
98 	 AML_OFFSET(gpio.res_source_offset),
99 	 0},
100 
101 	/* Vendor Data */
102 
103 	{ACPI_RSC_COUNT_GPIO_VEN, ACPI_RS_OFFSET(data.gpio.vendor_length),
104 	 AML_OFFSET(gpio.vendor_length),
105 	 1},
106 
107 	{ACPI_RSC_MOVE_GPIO_RES, ACPI_RS_OFFSET(data.gpio.vendor_data),
108 	 AML_OFFSET(gpio.vendor_offset),
109 	 0},
110 };
111 
112 /*******************************************************************************
113  *
114  * acpi_rs_convert_pinfunction
115  *
116  ******************************************************************************/
117 
118 struct acpi_rsconvert_info acpi_rs_convert_pin_function[13] = {
119 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_PIN_FUNCTION,
120 	 ACPI_RS_SIZE(struct acpi_resource_pin_function),
121 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_pin_function)},
122 
123 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_PIN_FUNCTION,
124 	 sizeof(struct aml_resource_pin_function),
125 	 0},
126 
127 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_function.revision_id),
128 	 AML_OFFSET(pin_function.revision_id),
129 	 1},
130 
131 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.pin_function.sharable),
132 	 AML_OFFSET(pin_function.flags),
133 	 0},
134 
135 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_function.pin_config),
136 	 AML_OFFSET(pin_function.pin_config),
137 	 1},
138 
139 	{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.pin_function.function_number),
140 	 AML_OFFSET(pin_function.function_number),
141 	 2},
142 
143 	/* Pin Table */
144 
145 	/*
146 	 * It is OK to use GPIO operations here because none of them refer GPIO
147 	 * structures directly but instead use offsets given here.
148 	 */
149 
150 	{ACPI_RSC_COUNT_GPIO_PIN,
151 	 ACPI_RS_OFFSET(data.pin_function.pin_table_length),
152 	 AML_OFFSET(pin_function.pin_table_offset),
153 	 AML_OFFSET(pin_function.res_source_offset)},
154 
155 	{ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET(data.pin_function.pin_table),
156 	 AML_OFFSET(pin_function.pin_table_offset),
157 	 0},
158 
159 	/* Resource Source */
160 
161 	{ACPI_RSC_MOVE8,
162 	 ACPI_RS_OFFSET(data.pin_function.resource_source.index),
163 	 AML_OFFSET(pin_function.res_source_index),
164 	 1},
165 
166 	{ACPI_RSC_COUNT_GPIO_RES,
167 	 ACPI_RS_OFFSET(data.pin_function.resource_source.string_length),
168 	 AML_OFFSET(pin_function.res_source_offset),
169 	 AML_OFFSET(pin_function.vendor_offset)},
170 
171 	{ACPI_RSC_MOVE_GPIO_RES,
172 	 ACPI_RS_OFFSET(data.pin_function.resource_source.string_ptr),
173 	 AML_OFFSET(pin_function.res_source_offset),
174 	 0},
175 
176 	/* Vendor Data */
177 
178 	{ACPI_RSC_COUNT_GPIO_VEN,
179 	 ACPI_RS_OFFSET(data.pin_function.vendor_length),
180 	 AML_OFFSET(pin_function.vendor_length),
181 	 1},
182 
183 	{ACPI_RSC_MOVE_GPIO_RES, ACPI_RS_OFFSET(data.pin_function.vendor_data),
184 	 AML_OFFSET(pin_function.vendor_offset),
185 	 0},
186 };
187 
188 /*******************************************************************************
189  *
190  * acpi_rs_convert_i2c_serial_bus
191  *
192  ******************************************************************************/
193 
194 struct acpi_rsconvert_info acpi_rs_convert_i2c_serial_bus[17] = {
195 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS,
196 	 ACPI_RS_SIZE(struct acpi_resource_i2c_serialbus),
197 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_i2c_serial_bus)},
198 
199 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS,
200 	 sizeof(struct aml_resource_i2c_serialbus),
201 	 0},
202 
203 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.revision_id),
204 	 AML_OFFSET(common_serial_bus.revision_id),
205 	 1},
206 
207 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.type),
208 	 AML_OFFSET(common_serial_bus.type),
209 	 1},
210 
211 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.common_serial_bus.slave_mode),
212 	 AML_OFFSET(common_serial_bus.flags),
213 	 0},
214 
215 	{ACPI_RSC_1BITFLAG,
216 	 ACPI_RS_OFFSET(data.common_serial_bus.producer_consumer),
217 	 AML_OFFSET(common_serial_bus.flags),
218 	 1},
219 
220 	{ACPI_RSC_1BITFLAG,
221 	 ACPI_RS_OFFSET(data.common_serial_bus.connection_sharing),
222 	 AML_OFFSET(common_serial_bus.flags),
223 	 2},
224 
225 	{ACPI_RSC_MOVE8,
226 	 ACPI_RS_OFFSET(data.common_serial_bus.type_revision_id),
227 	 AML_OFFSET(common_serial_bus.type_revision_id),
228 	 1},
229 
230 	{ACPI_RSC_MOVE16,
231 	 ACPI_RS_OFFSET(data.common_serial_bus.type_data_length),
232 	 AML_OFFSET(common_serial_bus.type_data_length),
233 	 1},
234 
235 	/* Vendor data */
236 
237 	{ACPI_RSC_COUNT_SERIAL_VEN,
238 	 ACPI_RS_OFFSET(data.common_serial_bus.vendor_length),
239 	 AML_OFFSET(common_serial_bus.type_data_length),
240 	 AML_RESOURCE_I2C_MIN_DATA_LEN},
241 
242 	{ACPI_RSC_MOVE_SERIAL_VEN,
243 	 ACPI_RS_OFFSET(data.common_serial_bus.vendor_data),
244 	 0,
245 	 sizeof(struct aml_resource_i2c_serialbus)},
246 
247 	/* Resource Source */
248 
249 	{ACPI_RSC_MOVE8,
250 	 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.index),
251 	 AML_OFFSET(common_serial_bus.res_source_index),
252 	 1},
253 
254 	{ACPI_RSC_COUNT_SERIAL_RES,
255 	 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_length),
256 	 AML_OFFSET(common_serial_bus.type_data_length),
257 	 sizeof(struct aml_resource_common_serialbus)},
258 
259 	{ACPI_RSC_MOVE_SERIAL_RES,
260 	 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_ptr),
261 	 AML_OFFSET(common_serial_bus.type_data_length),
262 	 sizeof(struct aml_resource_common_serialbus)},
263 
264 	/* I2C bus type specific */
265 
266 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.i2c_serial_bus.access_mode),
267 	 AML_OFFSET(i2c_serial_bus.type_specific_flags),
268 	 0},
269 
270 	{ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.i2c_serial_bus.connection_speed),
271 	 AML_OFFSET(i2c_serial_bus.connection_speed),
272 	 1},
273 
274 	{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.i2c_serial_bus.slave_address),
275 	 AML_OFFSET(i2c_serial_bus.slave_address),
276 	 1},
277 };
278 
279 /*******************************************************************************
280  *
281  * acpi_rs_convert_spi_serial_bus
282  *
283  ******************************************************************************/
284 
285 struct acpi_rsconvert_info acpi_rs_convert_spi_serial_bus[21] = {
286 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS,
287 	 ACPI_RS_SIZE(struct acpi_resource_spi_serialbus),
288 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_spi_serial_bus)},
289 
290 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS,
291 	 sizeof(struct aml_resource_spi_serialbus),
292 	 0},
293 
294 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.revision_id),
295 	 AML_OFFSET(common_serial_bus.revision_id),
296 	 1},
297 
298 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.type),
299 	 AML_OFFSET(common_serial_bus.type),
300 	 1},
301 
302 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.common_serial_bus.slave_mode),
303 	 AML_OFFSET(common_serial_bus.flags),
304 	 0},
305 
306 	{ACPI_RSC_1BITFLAG,
307 	 ACPI_RS_OFFSET(data.common_serial_bus.producer_consumer),
308 	 AML_OFFSET(common_serial_bus.flags),
309 	 1},
310 
311 	{ACPI_RSC_1BITFLAG,
312 	 ACPI_RS_OFFSET(data.common_serial_bus.connection_sharing),
313 	 AML_OFFSET(common_serial_bus.flags),
314 	 2},
315 
316 	{ACPI_RSC_MOVE8,
317 	 ACPI_RS_OFFSET(data.common_serial_bus.type_revision_id),
318 	 AML_OFFSET(common_serial_bus.type_revision_id),
319 	 1},
320 
321 	{ACPI_RSC_MOVE16,
322 	 ACPI_RS_OFFSET(data.common_serial_bus.type_data_length),
323 	 AML_OFFSET(common_serial_bus.type_data_length),
324 	 1},
325 
326 	/* Vendor data */
327 
328 	{ACPI_RSC_COUNT_SERIAL_VEN,
329 	 ACPI_RS_OFFSET(data.common_serial_bus.vendor_length),
330 	 AML_OFFSET(common_serial_bus.type_data_length),
331 	 AML_RESOURCE_SPI_MIN_DATA_LEN},
332 
333 	{ACPI_RSC_MOVE_SERIAL_VEN,
334 	 ACPI_RS_OFFSET(data.common_serial_bus.vendor_data),
335 	 0,
336 	 sizeof(struct aml_resource_spi_serialbus)},
337 
338 	/* Resource Source */
339 
340 	{ACPI_RSC_MOVE8,
341 	 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.index),
342 	 AML_OFFSET(common_serial_bus.res_source_index),
343 	 1},
344 
345 	{ACPI_RSC_COUNT_SERIAL_RES,
346 	 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_length),
347 	 AML_OFFSET(common_serial_bus.type_data_length),
348 	 sizeof(struct aml_resource_common_serialbus)},
349 
350 	{ACPI_RSC_MOVE_SERIAL_RES,
351 	 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_ptr),
352 	 AML_OFFSET(common_serial_bus.type_data_length),
353 	 sizeof(struct aml_resource_common_serialbus)},
354 
355 	/* Spi bus type specific  */
356 
357 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.spi_serial_bus.wire_mode),
358 	 AML_OFFSET(spi_serial_bus.type_specific_flags),
359 	 0},
360 
361 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.spi_serial_bus.device_polarity),
362 	 AML_OFFSET(spi_serial_bus.type_specific_flags),
363 	 1},
364 
365 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.spi_serial_bus.data_bit_length),
366 	 AML_OFFSET(spi_serial_bus.data_bit_length),
367 	 1},
368 
369 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.spi_serial_bus.clock_phase),
370 	 AML_OFFSET(spi_serial_bus.clock_phase),
371 	 1},
372 
373 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.spi_serial_bus.clock_polarity),
374 	 AML_OFFSET(spi_serial_bus.clock_polarity),
375 	 1},
376 
377 	{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.spi_serial_bus.device_selection),
378 	 AML_OFFSET(spi_serial_bus.device_selection),
379 	 1},
380 
381 	{ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.spi_serial_bus.connection_speed),
382 	 AML_OFFSET(spi_serial_bus.connection_speed),
383 	 1},
384 };
385 
386 /*******************************************************************************
387  *
388  * acpi_rs_convert_uart_serial_bus
389  *
390  ******************************************************************************/
391 
392 struct acpi_rsconvert_info acpi_rs_convert_uart_serial_bus[23] = {
393 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS,
394 	 ACPI_RS_SIZE(struct acpi_resource_uart_serialbus),
395 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_uart_serial_bus)},
396 
397 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS,
398 	 sizeof(struct aml_resource_uart_serialbus),
399 	 0},
400 
401 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.revision_id),
402 	 AML_OFFSET(common_serial_bus.revision_id),
403 	 1},
404 
405 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.common_serial_bus.type),
406 	 AML_OFFSET(common_serial_bus.type),
407 	 1},
408 
409 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.common_serial_bus.slave_mode),
410 	 AML_OFFSET(common_serial_bus.flags),
411 	 0},
412 
413 	{ACPI_RSC_1BITFLAG,
414 	 ACPI_RS_OFFSET(data.common_serial_bus.producer_consumer),
415 	 AML_OFFSET(common_serial_bus.flags),
416 	 1},
417 
418 	{ACPI_RSC_1BITFLAG,
419 	 ACPI_RS_OFFSET(data.common_serial_bus.connection_sharing),
420 	 AML_OFFSET(common_serial_bus.flags),
421 	 2},
422 
423 	{ACPI_RSC_MOVE8,
424 	 ACPI_RS_OFFSET(data.common_serial_bus.type_revision_id),
425 	 AML_OFFSET(common_serial_bus.type_revision_id),
426 	 1},
427 
428 	{ACPI_RSC_MOVE16,
429 	 ACPI_RS_OFFSET(data.common_serial_bus.type_data_length),
430 	 AML_OFFSET(common_serial_bus.type_data_length),
431 	 1},
432 
433 	/* Vendor data */
434 
435 	{ACPI_RSC_COUNT_SERIAL_VEN,
436 	 ACPI_RS_OFFSET(data.common_serial_bus.vendor_length),
437 	 AML_OFFSET(common_serial_bus.type_data_length),
438 	 AML_RESOURCE_UART_MIN_DATA_LEN},
439 
440 	{ACPI_RSC_MOVE_SERIAL_VEN,
441 	 ACPI_RS_OFFSET(data.common_serial_bus.vendor_data),
442 	 0,
443 	 sizeof(struct aml_resource_uart_serialbus)},
444 
445 	/* Resource Source */
446 
447 	{ACPI_RSC_MOVE8,
448 	 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.index),
449 	 AML_OFFSET(common_serial_bus.res_source_index),
450 	 1},
451 
452 	{ACPI_RSC_COUNT_SERIAL_RES,
453 	 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_length),
454 	 AML_OFFSET(common_serial_bus.type_data_length),
455 	 sizeof(struct aml_resource_common_serialbus)},
456 
457 	{ACPI_RSC_MOVE_SERIAL_RES,
458 	 ACPI_RS_OFFSET(data.common_serial_bus.resource_source.string_ptr),
459 	 AML_OFFSET(common_serial_bus.type_data_length),
460 	 sizeof(struct aml_resource_common_serialbus)},
461 
462 	/* Uart bus type specific  */
463 
464 	{ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.flow_control),
465 	 AML_OFFSET(uart_serial_bus.type_specific_flags),
466 	 0},
467 
468 	{ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.stop_bits),
469 	 AML_OFFSET(uart_serial_bus.type_specific_flags),
470 	 2},
471 
472 	{ACPI_RSC_3BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.data_bits),
473 	 AML_OFFSET(uart_serial_bus.type_specific_flags),
474 	 4},
475 
476 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.uart_serial_bus.endian),
477 	 AML_OFFSET(uart_serial_bus.type_specific_flags),
478 	 7},
479 
480 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.uart_serial_bus.parity),
481 	 AML_OFFSET(uart_serial_bus.parity),
482 	 1},
483 
484 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.uart_serial_bus.lines_enabled),
485 	 AML_OFFSET(uart_serial_bus.lines_enabled),
486 	 1},
487 
488 	{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.uart_serial_bus.rx_fifo_size),
489 	 AML_OFFSET(uart_serial_bus.rx_fifo_size),
490 	 1},
491 
492 	{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.uart_serial_bus.tx_fifo_size),
493 	 AML_OFFSET(uart_serial_bus.tx_fifo_size),
494 	 1},
495 
496 	{ACPI_RSC_MOVE32,
497 	 ACPI_RS_OFFSET(data.uart_serial_bus.default_baud_rate),
498 	 AML_OFFSET(uart_serial_bus.default_baud_rate),
499 	 1},
500 };
501 
502 /*******************************************************************************
503  *
504  * acpi_rs_convert_pin_config
505  *
506  ******************************************************************************/
507 
508 struct acpi_rsconvert_info acpi_rs_convert_pin_config[14] = {
509 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_PIN_CONFIG,
510 	 ACPI_RS_SIZE(struct acpi_resource_pin_config),
511 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_pin_config)},
512 
513 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_PIN_CONFIG,
514 	 sizeof(struct aml_resource_pin_config),
515 	 0},
516 
517 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_config.revision_id),
518 	 AML_OFFSET(pin_config.revision_id),
519 	 1},
520 
521 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.pin_config.sharable),
522 	 AML_OFFSET(pin_config.flags),
523 	 0},
524 
525 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.pin_config.producer_consumer),
526 	 AML_OFFSET(pin_config.flags),
527 	 1},
528 
529 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_config.pin_config_type),
530 	 AML_OFFSET(pin_config.pin_config_type),
531 	 1},
532 
533 	{ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.pin_config.pin_config_value),
534 	 AML_OFFSET(pin_config.pin_config_value),
535 	 1},
536 
537 	/* Pin Table */
538 
539 	/*
540 	 * It is OK to use GPIO operations here because none of them refer GPIO
541 	 * structures directly but instead use offsets given here.
542 	 */
543 
544 	{ACPI_RSC_COUNT_GPIO_PIN,
545 	 ACPI_RS_OFFSET(data.pin_config.pin_table_length),
546 	 AML_OFFSET(pin_config.pin_table_offset),
547 	 AML_OFFSET(pin_config.res_source_offset)},
548 
549 	{ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET(data.pin_config.pin_table),
550 	 AML_OFFSET(pin_config.pin_table_offset),
551 	 0},
552 
553 	/* Resource Source */
554 
555 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_config.resource_source.index),
556 	 AML_OFFSET(pin_config.res_source_index),
557 	 1},
558 
559 	{ACPI_RSC_COUNT_GPIO_RES,
560 	 ACPI_RS_OFFSET(data.pin_config.resource_source.string_length),
561 	 AML_OFFSET(pin_config.res_source_offset),
562 	 AML_OFFSET(pin_config.vendor_offset)},
563 
564 	{ACPI_RSC_MOVE_GPIO_RES,
565 	 ACPI_RS_OFFSET(data.pin_config.resource_source.string_ptr),
566 	 AML_OFFSET(pin_config.res_source_offset),
567 	 0},
568 
569 	/* Vendor Data */
570 
571 	{ACPI_RSC_COUNT_GPIO_VEN, ACPI_RS_OFFSET(data.pin_config.vendor_length),
572 	 AML_OFFSET(pin_config.vendor_length),
573 	 1},
574 
575 	{ACPI_RSC_MOVE_GPIO_RES, ACPI_RS_OFFSET(data.pin_config.vendor_data),
576 	 AML_OFFSET(pin_config.vendor_offset),
577 	 0},
578 };
579 
580 /*******************************************************************************
581  *
582  * acpi_rs_convert_pin_group
583  *
584  ******************************************************************************/
585 
586 struct acpi_rsconvert_info acpi_rs_convert_pin_group[10] = {
587 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_PIN_GROUP,
588 	 ACPI_RS_SIZE(struct acpi_resource_pin_group),
589 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_pin_group)},
590 
591 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_PIN_GROUP,
592 	 sizeof(struct aml_resource_pin_group),
593 	 0},
594 
595 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_group.revision_id),
596 	 AML_OFFSET(pin_group.revision_id),
597 	 1},
598 
599 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.pin_group.producer_consumer),
600 	 AML_OFFSET(pin_group.flags),
601 	 0},
602 
603 	/* Pin Table */
604 
605 	/*
606 	 * It is OK to use GPIO operations here because none of them refer GPIO
607 	 * structures directly but instead use offsets given here.
608 	 */
609 
610 	{ACPI_RSC_COUNT_GPIO_PIN,
611 	 ACPI_RS_OFFSET(data.pin_group.pin_table_length),
612 	 AML_OFFSET(pin_group.pin_table_offset),
613 	 AML_OFFSET(pin_group.label_offset)},
614 
615 	{ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET(data.pin_group.pin_table),
616 	 AML_OFFSET(pin_group.pin_table_offset),
617 	 0},
618 
619 	/* Resource Label */
620 
621 	{ACPI_RSC_COUNT_GPIO_RES,
622 	 ACPI_RS_OFFSET(data.pin_group.resource_label.string_length),
623 	 AML_OFFSET(pin_group.label_offset),
624 	 AML_OFFSET(pin_group.vendor_offset)},
625 
626 	{ACPI_RSC_MOVE_GPIO_RES,
627 	 ACPI_RS_OFFSET(data.pin_group.resource_label.string_ptr),
628 	 AML_OFFSET(pin_group.label_offset),
629 	 0},
630 
631 	/* Vendor Data */
632 
633 	{ACPI_RSC_COUNT_GPIO_VEN, ACPI_RS_OFFSET(data.pin_group.vendor_length),
634 	 AML_OFFSET(pin_group.vendor_length),
635 	 1},
636 
637 	{ACPI_RSC_MOVE_GPIO_RES, ACPI_RS_OFFSET(data.pin_group.vendor_data),
638 	 AML_OFFSET(pin_group.vendor_offset),
639 	 0},
640 };
641 
642 /*******************************************************************************
643  *
644  * acpi_rs_convert_pin_group_function
645  *
646  ******************************************************************************/
647 
648 struct acpi_rsconvert_info acpi_rs_convert_pin_group_function[13] = {
649 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION,
650 	 ACPI_RS_SIZE(struct acpi_resource_pin_group_function),
651 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_pin_group_function)},
652 
653 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION,
654 	 sizeof(struct aml_resource_pin_group_function),
655 	 0},
656 
657 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_group_function.revision_id),
658 	 AML_OFFSET(pin_group_function.revision_id),
659 	 1},
660 
661 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.pin_group_function.sharable),
662 	 AML_OFFSET(pin_group_function.flags),
663 	 0},
664 
665 	{ACPI_RSC_1BITFLAG,
666 	 ACPI_RS_OFFSET(data.pin_group_function.producer_consumer),
667 	 AML_OFFSET(pin_group_function.flags),
668 	 1},
669 
670 	{ACPI_RSC_MOVE16,
671 	 ACPI_RS_OFFSET(data.pin_group_function.function_number),
672 	 AML_OFFSET(pin_group_function.function_number),
673 	 1},
674 
675 	/* Resource Source */
676 
677 	{ACPI_RSC_MOVE8,
678 	 ACPI_RS_OFFSET(data.pin_group_function.resource_source.index),
679 	 AML_OFFSET(pin_group_function.res_source_index),
680 	 1},
681 
682 	{ACPI_RSC_COUNT_GPIO_RES,
683 	 ACPI_RS_OFFSET(data.pin_group_function.resource_source.string_length),
684 	 AML_OFFSET(pin_group_function.res_source_offset),
685 	 AML_OFFSET(pin_group_function.res_source_label_offset)},
686 
687 	{ACPI_RSC_MOVE_GPIO_RES,
688 	 ACPI_RS_OFFSET(data.pin_group_function.resource_source.string_ptr),
689 	 AML_OFFSET(pin_group_function.res_source_offset),
690 	 0},
691 
692 	/* Resource Source Label */
693 
694 	{ACPI_RSC_COUNT_GPIO_RES,
695 	 ACPI_RS_OFFSET(data.pin_group_function.resource_source_label.
696 			string_length),
697 	 AML_OFFSET(pin_group_function.res_source_label_offset),
698 	 AML_OFFSET(pin_group_function.vendor_offset)},
699 
700 	{ACPI_RSC_MOVE_GPIO_RES,
701 	 ACPI_RS_OFFSET(data.pin_group_function.resource_source_label.
702 			string_ptr),
703 	 AML_OFFSET(pin_group_function.res_source_label_offset),
704 	 0},
705 
706 	/* Vendor Data */
707 
708 	{ACPI_RSC_COUNT_GPIO_VEN,
709 	 ACPI_RS_OFFSET(data.pin_group_function.vendor_length),
710 	 AML_OFFSET(pin_group_function.vendor_length),
711 	 1},
712 
713 	{ACPI_RSC_MOVE_GPIO_RES,
714 	 ACPI_RS_OFFSET(data.pin_group_function.vendor_data),
715 	 AML_OFFSET(pin_group_function.vendor_offset),
716 	 0},
717 };
718 
719 /*******************************************************************************
720  *
721  * acpi_rs_convert_pin_group_config
722  *
723  ******************************************************************************/
724 
725 struct acpi_rsconvert_info acpi_rs_convert_pin_group_config[14] = {
726 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG,
727 	 ACPI_RS_SIZE(struct acpi_resource_pin_group_config),
728 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_pin_group_config)},
729 
730 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG,
731 	 sizeof(struct aml_resource_pin_group_config),
732 	 0},
733 
734 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_group_config.revision_id),
735 	 AML_OFFSET(pin_group_config.revision_id),
736 	 1},
737 
738 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.pin_group_config.sharable),
739 	 AML_OFFSET(pin_group_config.flags),
740 	 0},
741 
742 	{ACPI_RSC_1BITFLAG,
743 	 ACPI_RS_OFFSET(data.pin_group_config.producer_consumer),
744 	 AML_OFFSET(pin_group_config.flags),
745 	 1},
746 
747 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_group_config.pin_config_type),
748 	 AML_OFFSET(pin_group_config.pin_config_type),
749 	 1},
750 
751 	{ACPI_RSC_MOVE32,
752 	 ACPI_RS_OFFSET(data.pin_group_config.pin_config_value),
753 	 AML_OFFSET(pin_group_config.pin_config_value),
754 	 1},
755 
756 	/* Resource Source */
757 
758 	{ACPI_RSC_MOVE8,
759 	 ACPI_RS_OFFSET(data.pin_group_config.resource_source.index),
760 	 AML_OFFSET(pin_group_config.res_source_index),
761 	 1},
762 
763 	{ACPI_RSC_COUNT_GPIO_RES,
764 	 ACPI_RS_OFFSET(data.pin_group_config.resource_source.string_length),
765 	 AML_OFFSET(pin_group_config.res_source_offset),
766 	 AML_OFFSET(pin_group_config.res_source_label_offset)},
767 
768 	{ACPI_RSC_MOVE_GPIO_RES,
769 	 ACPI_RS_OFFSET(data.pin_group_config.resource_source.string_ptr),
770 	 AML_OFFSET(pin_group_config.res_source_offset),
771 	 0},
772 
773 	/* Resource Source Label */
774 
775 	{ACPI_RSC_COUNT_GPIO_RES,
776 	 ACPI_RS_OFFSET(data.pin_group_config.resource_source_label.
777 			string_length),
778 	 AML_OFFSET(pin_group_config.res_source_label_offset),
779 	 AML_OFFSET(pin_group_config.vendor_offset)},
780 
781 	{ACPI_RSC_MOVE_GPIO_RES,
782 	 ACPI_RS_OFFSET(data.pin_group_config.resource_source_label.string_ptr),
783 	 AML_OFFSET(pin_group_config.res_source_label_offset),
784 	 0},
785 
786 	/* Vendor Data */
787 
788 	{ACPI_RSC_COUNT_GPIO_VEN,
789 	 ACPI_RS_OFFSET(data.pin_group_config.vendor_length),
790 	 AML_OFFSET(pin_group_config.vendor_length),
791 	 1},
792 
793 	{ACPI_RSC_MOVE_GPIO_RES,
794 	 ACPI_RS_OFFSET(data.pin_group_config.vendor_data),
795 	 AML_OFFSET(pin_group_config.vendor_offset),
796 	 0},
797 };
798