Commit f8a6c866 authored by Mika Westerberg's avatar Mika Westerberg Committed by Rafael J. Wysocki
Browse files

ACPICA: ACPI 6.2: Add support for PinGroupFunction() resource

ACPICA commit bd9a745749eac7137cd23085e6bdeb322de14ea2

PinGroupFunction() is a new resource introduced with ACPI 6.2. It is
used with PinGroup() to configure specific mode for a set of pins
exposed by a GPIO controller.

The format of the resource is:

  PinGroupFunction (Shared/Exclusive, FunctionNumber, ResourceSource,
                    ResourceSourceIndex, ResourceSourceLabel,
                    ResourceUsage, DescriptorName, VendorData)

The resource_source and ResourceSourceLabel fields are used to specify
the PinGroup() resource referenced by PinGroupFunction().

  Device (GPIO)
  {
      Name (_CRS, ResourceTemplate () {
          PinGroup ("group1") {2, 3}
          PinGroup ("group2") {4, 5}
          ...
      })
  }

  Device (I2C)
  {
      Name (_CRS, ResourceTemplate () {
          PinGroupFunction (Exclusive, 6, "^GPIO", 0, "mygroup2")
      })
  }

In the above example the PinGroupFunction() references the second
PinGroup() resource (using label "mygroup2" and configures pins 4 and 5
into mode 6.

Link: https://github.com/acpica/acpica/commit/bd9a7457


Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent fdaa0980
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1146,7 +1146,8 @@ struct acpi_port_info {
#define ACPI_RESOURCE_NAME_SERIAL_BUS           0x8E
#define ACPI_RESOURCE_NAME_PIN_CONFIG           0x8F
#define ACPI_RESOURCE_NAME_PIN_GROUP            0x90
#define ACPI_RESOURCE_NAME_LARGE_MAX            0x90
#define ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION   0x91
#define ACPI_RESOURCE_NAME_LARGE_MAX            0x91

/*****************************************************************************
 *
+3 −0
Original line number Diff line number Diff line
@@ -150,6 +150,7 @@ typedef enum {
	ACPI_RSD_UINT64,
	ACPI_RSD_WORDLIST,
	ACPI_RSD_LABEL,
	ACPI_RSD_SOURCE_LABEL,

} ACPI_RSDUMP_OPCODES;

@@ -334,6 +335,7 @@ extern struct acpi_rsconvert_info acpi_rs_convert_uart_serial_bus[];
extern struct acpi_rsconvert_info acpi_rs_convert_pin_function[];
extern struct acpi_rsconvert_info acpi_rs_convert_pin_config[];
extern struct acpi_rsconvert_info acpi_rs_convert_pin_group[];
extern struct acpi_rsconvert_info acpi_rs_convert_pin_group_function[];

/* These resources require separate get/set tables */

@@ -386,6 +388,7 @@ extern struct acpi_rsdump_info acpi_rs_dump_uart_serial_bus[];
extern struct acpi_rsdump_info acpi_rs_dump_general_flags[];
extern struct acpi_rsdump_info acpi_rs_dump_pin_config[];
extern struct acpi_rsdump_info acpi_rs_dump_pin_group[];
extern struct acpi_rsdump_info acpi_rs_dump_pin_group_function[];
#endif

#endif				/* __ACRESRC_H__ */
+20 −0
Original line number Diff line number Diff line
@@ -464,6 +464,25 @@ struct aml_resource_pin_group {

#define AML_RESOURCE_PIN_GROUP_REVISION      1	/* ACPI 6.2 */

struct aml_resource_pin_group_function {
	AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
	u16 flags;
	u16 function_number;
	u8 res_source_index;
	u16 res_source_offset;
	u16 res_source_label_offset;
	u16 vendor_offset;
	u16 vendor_length;
	/*
	 * Optional fields follow immediately:
	 * 1) Resource Source String
	 * 2) Resource Source Label String
	 * 3) Vendor Data bytes
	 */
};

#define AML_RESOURCE_PIN_GROUP_FUNCTION_REVISION    1	/* ACPI 6.2 */

/* restore default alignment */

#pragma pack()
@@ -509,6 +528,7 @@ union aml_resource {
	struct aml_resource_pin_function pin_function;
	struct aml_resource_pin_config pin_config;
	struct aml_resource_pin_group pin_group;
	struct aml_resource_pin_group_function pin_group_function;

	/* Utility overlays */

+26 −0
Original line number Diff line number Diff line
@@ -402,6 +402,23 @@ acpi_rs_get_aml_length(struct acpi_resource *resource,

			break;

		case ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION:

			total_size = (acpi_rs_length)(total_size +
						      resource->data.
						      pin_group_function.
						      resource_source.
						      string_length +
						      resource->data.
						      pin_group_function.
						      resource_source_label.
						      string_length +
						      resource->data.
						      pin_group_function.
						      vendor_length);

			break;

		default:

			break;
@@ -634,6 +651,15 @@ acpi_rs_get_list_length(u8 *aml_buffer,

			break;

		case ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION:

			extra_struct_bytes +=
			    aml_resource->pin_group_function.vendor_offset -
			    aml_resource->pin_group_function.res_source_offset +
			    aml_resource->pin_group_function.vendor_length;

			break;

		default:

			break;
+10 −0
Original line number Diff line number Diff line
@@ -385,6 +385,16 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
								  target));
			break;

		case ACPI_RSD_SOURCE_LABEL:
			/*
			 * resource_source_label
			 */
			acpi_rs_dump_resource_label("Resource Source Label",
						    ACPI_CAST_PTR(struct
								  acpi_resource_label,
								  target));
			break;

		default:

			acpi_os_printf("**** Invalid table opcode [%X] ****\n",
Loading