Merge branches 'acpi-resource', 'acpi-numa', 'acpi-soc' and 'acpi-misc'
[linux-2.6-block.git] / include / acpi / acpi_bus.h
index 4bde0b417476ce2dee93224232e96af14f78d891..2b3ae51f950df0639f35a17450a3d9b2a7ce9be6 100644 (file)
@@ -14,7 +14,7 @@
 
 struct acpi_handle_list {
        u32 count;
-       acpi_handlehandles;
+       acpi_handle *handles;
 };
 
 /* acpi_utils.h */
@@ -25,16 +25,15 @@ acpi_status
 acpi_evaluate_integer(acpi_handle handle,
                      acpi_string pathname,
                      struct acpi_object_list *arguments, unsigned long long *data);
-acpi_status
-acpi_evaluate_reference(acpi_handle handle,
-                       acpi_string pathname,
-                       struct acpi_object_list *arguments,
-                       struct acpi_handle_list *list);
+bool acpi_evaluate_reference(acpi_handle handle, acpi_string pathname,
+                            struct acpi_object_list *arguments,
+                            struct acpi_handle_list *list);
 bool acpi_handle_list_equal(struct acpi_handle_list *list1,
                            struct acpi_handle_list *list2);
 void acpi_handle_list_replace(struct acpi_handle_list *dst,
                              struct acpi_handle_list *src);
 void acpi_handle_list_free(struct acpi_handle_list *list);
+bool acpi_device_dep(acpi_handle target, acpi_handle match);
 acpi_status
 acpi_evaluate_ost(acpi_handle handle, u32 source_event, u32 status_code,
                  struct acpi_buffer *status_buf);
@@ -366,6 +365,98 @@ struct acpi_device_data {
 
 struct acpi_gpio_mapping;
 
+#define ACPI_DEVICE_SWNODE_ROOT                        0
+
+/*
+ * The maximum expected number of CSI-2 data lanes.
+ *
+ * This number is not expected to ever have to be equal to or greater than the
+ * number of bits in an unsigned long variable, but if it needs to be increased
+ * above that limit, code will need to be adjusted accordingly.
+ */
+#define ACPI_DEVICE_CSI2_DATA_LANES            8
+
+#define ACPI_DEVICE_SWNODE_PORT_NAME_LENGTH    8
+
+enum acpi_device_swnode_dev_props {
+       ACPI_DEVICE_SWNODE_DEV_ROTATION,
+       ACPI_DEVICE_SWNODE_DEV_CLOCK_FREQUENCY,
+       ACPI_DEVICE_SWNODE_DEV_LED_MAX_MICROAMP,
+       ACPI_DEVICE_SWNODE_DEV_FLASH_MAX_MICROAMP,
+       ACPI_DEVICE_SWNODE_DEV_FLASH_MAX_TIMEOUT_US,
+       ACPI_DEVICE_SWNODE_DEV_NUM_OF,
+       ACPI_DEVICE_SWNODE_DEV_NUM_ENTRIES
+};
+
+enum acpi_device_swnode_port_props {
+       ACPI_DEVICE_SWNODE_PORT_REG,
+       ACPI_DEVICE_SWNODE_PORT_NUM_OF,
+       ACPI_DEVICE_SWNODE_PORT_NUM_ENTRIES
+};
+
+enum acpi_device_swnode_ep_props {
+       ACPI_DEVICE_SWNODE_EP_REMOTE_EP,
+       ACPI_DEVICE_SWNODE_EP_BUS_TYPE,
+       ACPI_DEVICE_SWNODE_EP_REG,
+       ACPI_DEVICE_SWNODE_EP_CLOCK_LANES,
+       ACPI_DEVICE_SWNODE_EP_DATA_LANES,
+       ACPI_DEVICE_SWNODE_EP_LANE_POLARITIES,
+       /* TX only */
+       ACPI_DEVICE_SWNODE_EP_LINK_FREQUENCIES,
+       ACPI_DEVICE_SWNODE_EP_NUM_OF,
+       ACPI_DEVICE_SWNODE_EP_NUM_ENTRIES
+};
+
+/*
+ * Each device has a root software node plus two times as many nodes as the
+ * number of CSI-2 ports.
+ */
+#define ACPI_DEVICE_SWNODE_PORT(port)  (2 * (port) + 1)
+#define ACPI_DEVICE_SWNODE_EP(endpoint)        \
+               (ACPI_DEVICE_SWNODE_PORT(endpoint) + 1)
+
+/**
+ * struct acpi_device_software_node_port - MIPI DisCo for Imaging CSI-2 port
+ * @port_name: Port name.
+ * @data_lanes: "data-lanes" property values.
+ * @lane_polarities: "lane-polarities" property values.
+ * @link_frequencies: "link_frequencies" property values.
+ * @port_nr: Port number.
+ * @crs_crs2_local: _CRS CSI2 record present (i.e. this is a transmitter one).
+ * @port_props: Port properties.
+ * @ep_props: Endpoint properties.
+ * @remote_ep: Reference to the remote endpoint.
+ */
+struct acpi_device_software_node_port {
+       char port_name[ACPI_DEVICE_SWNODE_PORT_NAME_LENGTH + 1];
+       u32 data_lanes[ACPI_DEVICE_CSI2_DATA_LANES];
+       u32 lane_polarities[ACPI_DEVICE_CSI2_DATA_LANES + 1 /* clock lane */];
+       u64 link_frequencies[ACPI_DEVICE_CSI2_DATA_LANES];
+       unsigned int port_nr;
+       bool crs_csi2_local;
+
+       struct property_entry port_props[ACPI_DEVICE_SWNODE_PORT_NUM_ENTRIES];
+       struct property_entry ep_props[ACPI_DEVICE_SWNODE_EP_NUM_ENTRIES];
+
+       struct software_node_ref_args remote_ep[1];
+};
+
+/**
+ * struct acpi_device_software_nodes - Software nodes for an ACPI device
+ * @dev_props: Device properties.
+ * @nodes: Software nodes for root as well as ports and endpoints.
+ * @nodeprts: Array of software node pointers, for (un)registering them.
+ * @ports: Information related to each port and endpoint within a port.
+ * @num_ports: The number of ports.
+ */
+struct acpi_device_software_nodes {
+       struct property_entry dev_props[ACPI_DEVICE_SWNODE_DEV_NUM_ENTRIES];
+       struct software_node *nodes;
+       const struct software_node **nodeptrs;
+       struct acpi_device_software_node_port *ports;
+       unsigned int num_ports;
+};
+
 /* Device */
 struct acpi_device {
        u32 pld_crc;
@@ -384,6 +475,7 @@ struct acpi_device {
        struct acpi_device_data data;
        struct acpi_scan_handler *handler;
        struct acpi_hotplug_context *hp;
+       struct acpi_device_software_nodes *swnodes;
        const struct acpi_gpio_mapping *driver_gpios;
        void *driver_data;
        struct device dev;
@@ -764,9 +856,15 @@ static inline bool acpi_device_can_poweroff(struct acpi_device *adev)
                adev->power.states[ACPI_STATE_D3_HOT].flags.explicit_set);
 }
 
-bool acpi_dev_hid_uid_match(struct acpi_device *adev, const char *hid2, const char *uid2);
 int acpi_dev_uid_to_integer(struct acpi_device *adev, u64 *integer);
 
+static inline bool acpi_dev_hid_match(struct acpi_device *adev, const char *hid2)
+{
+       const char *hid1 = acpi_device_hid(adev);
+
+       return hid1 && hid2 && !strcmp(hid1, hid2);
+}
+
 static inline bool acpi_str_uid_match(struct acpi_device *adev, const char *uid2)
 {
        const char *uid1 = acpi_device_uid(adev);
@@ -807,6 +905,22 @@ static inline bool acpi_int_uid_match(struct acpi_device *adev, u64 uid2)
                 /* Treat as an integer otherwise */                    \
                 default: acpi_int_uid_match)(adev, uid2)
 
+/**
+ * acpi_dev_hid_uid_match - Match device by supplied HID and UID
+ * @adev: ACPI device to match.
+ * @hid2: Hardware ID of the device.
+ * @uid2: Unique ID of the device, pass 0 or NULL to not check _UID.
+ *
+ * Matches HID and UID in @adev with given @hid2 and @uid2. Absence of @uid2
+ * will be treated as a match. If user wants to validate @uid2, it should be
+ * done before calling this function.
+ *
+ * Returns: %true if matches or @uid2 is 0 or NULL, %false otherwise.
+ */
+#define acpi_dev_hid_uid_match(adev, hid2, uid2)                       \
+       (acpi_dev_hid_match(adev, hid2) &&                              \
+               (!(uid2) || acpi_dev_uid_match(adev, uid2)))
+
 void acpi_dev_clear_dependencies(struct acpi_device *supplier);
 bool acpi_dev_ready_for_enumeration(const struct acpi_device *device);
 struct acpi_device *acpi_dev_get_next_consumer_dev(struct acpi_device *supplier,