Merge tag 'pm+acpi-3.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[cascardo/linux.git] / include / acpi / acpi_bus.h
index da7fb61..227ba7d 100644 (file)
@@ -83,20 +83,30 @@ enum acpi_bus_device_type {
 struct acpi_driver;
 struct acpi_device;
 
+/*
+ * ACPI Scan Handler
+ * -----------------
+ */
+
+struct acpi_scan_handler {
+       const struct acpi_device_id *ids;
+       struct list_head list_node;
+       int (*attach)(struct acpi_device *dev, const struct acpi_device_id *id);
+       void (*detach)(struct acpi_device *dev);
+};
+
 /*
  * ACPI Driver
  * -----------
  */
 
 typedef int (*acpi_op_add) (struct acpi_device * device);
-typedef int (*acpi_op_remove) (struct acpi_device * device, int type);
-typedef int (*acpi_op_start) (struct acpi_device * device);
+typedef int (*acpi_op_remove) (struct acpi_device * device);
 typedef void (*acpi_op_notify) (struct acpi_device * device, u32 event);
 
 struct acpi_device_ops {
        acpi_op_add add;
        acpi_op_remove remove;
-       acpi_op_start start;
        acpi_op_notify notify;
 };
 
@@ -199,7 +209,7 @@ struct acpi_device_power_state {
        } flags;
        int power;              /* % Power (compared to D0) */
        int latency;            /* Dx->D0 time (microseconds) */
-       struct acpi_handle_list resources;      /* Power resources referenced */
+       struct list_head resources;     /* Power resources referenced */
 };
 
 struct acpi_device_power {
@@ -242,7 +252,7 @@ struct acpi_device_wakeup {
        acpi_handle gpe_device;
        u64 gpe_number;
        u64 sleep_state;
-       struct acpi_handle_list resources;
+       struct list_head resources;
        struct acpi_device_wakeup_flags flags;
        int prepare_count;
 };
@@ -271,6 +281,7 @@ struct acpi_device {
        struct acpi_device_wakeup wakeup;
        struct acpi_device_perf performance;
        struct acpi_device_dir dir;
+       struct acpi_scan_handler *handler;
        struct acpi_driver *driver;
        void *driver_data;
        struct device dev;
@@ -279,6 +290,8 @@ struct acpi_device {
        struct list_head physical_node_list;
        struct mutex physical_node_lock;
        DECLARE_BITMAP(physical_node_id_bitmap, ACPI_MAX_PHYSICAL_NODE);
+       struct list_head power_dependent;
+       void (*remove)(struct acpi_device *);
 };
 
 static inline void *acpi_driver_data(struct acpi_device *d)
@@ -329,13 +342,51 @@ void acpi_bus_data_handler(acpi_handle handle, void *context);
 acpi_status acpi_bus_get_status_handle(acpi_handle handle,
                                       unsigned long long *sta);
 int acpi_bus_get_status(struct acpi_device *device);
+
+#ifdef CONFIG_PM
 int acpi_bus_set_power(acpi_handle handle, int state);
+const char *acpi_power_state_string(int state);
+int acpi_device_get_power(struct acpi_device *device, int *state);
 int acpi_device_set_power(struct acpi_device *device, int state);
+int acpi_bus_init_power(struct acpi_device *device);
 int acpi_bus_update_power(acpi_handle handle, int *state_p);
 bool acpi_bus_power_manageable(acpi_handle handle);
 bool acpi_bus_can_wakeup(acpi_handle handle);
-int acpi_power_resource_register_device(struct device *dev, acpi_handle handle);
-void acpi_power_resource_unregister_device(struct device *dev, acpi_handle handle);
+#else /* !CONFIG_PM */
+static inline int acpi_bus_set_power(acpi_handle handle, int state)
+{
+       return 0;
+}
+static inline const char *acpi_power_state_string(int state)
+{
+       return "D0";
+}
+static inline int acpi_device_get_power(struct acpi_device *device, int *state)
+{
+       return 0;
+}
+static inline int acpi_device_set_power(struct acpi_device *device, int state)
+{
+       return 0;
+}
+static inline int acpi_bus_init_power(struct acpi_device *device)
+{
+       return 0;
+}
+static inline int acpi_bus_update_power(acpi_handle handle, int *state_p)
+{
+       return 0;
+}
+static inline bool acpi_bus_power_manageable(acpi_handle handle)
+{
+       return false;
+}
+static inline bool acpi_bus_can_wakeup(acpi_handle handle)
+{
+       return false;
+}
+#endif /* !CONFIG_PM */
+
 #ifdef CONFIG_ACPI_PROC_EVENT
 int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data);
 int acpi_bus_generate_proc_event4(const char *class, const char *bid, u8 type, int data);
@@ -344,6 +395,10 @@ int acpi_bus_receive_event(struct acpi_bus_event *event);
 static inline int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data)
        { return 0; }
 #endif
+
+void acpi_scan_lock_acquire(void);
+void acpi_scan_lock_release(void);
+int acpi_scan_add_handler(struct acpi_scan_handler *handler);
 int acpi_bus_register_driver(struct acpi_driver *driver);
 void acpi_bus_unregister_driver(struct acpi_driver *driver);
 int acpi_bus_scan(acpi_handle handle);
@@ -414,6 +469,8 @@ acpi_status acpi_remove_pm_notifier(struct acpi_device *adev,
 int acpi_device_power_state(struct device *dev, struct acpi_device *adev,
                            u32 target_state, int d_max_in, int *d_min_p);
 int acpi_pm_device_sleep_state(struct device *, int *, int);
+void acpi_dev_pm_add_dependent(acpi_handle handle, struct device *depdev);
+void acpi_dev_pm_remove_dependent(acpi_handle handle, struct device *depdev);
 #else
 static inline acpi_status acpi_add_pm_notifier(struct acpi_device *adev,
                                               acpi_notify_handler handler,
@@ -443,6 +500,10 @@ static inline int acpi_pm_device_sleep_state(struct device *d, int *p, int m)
 {
        return __acpi_device_power_state(m, p);
 }
+static inline void acpi_dev_pm_add_dependent(acpi_handle handle,
+                                            struct device *depdev) {}
+static inline void acpi_dev_pm_remove_dependent(acpi_handle handle,
+                                               struct device *depdev) {}
 #endif
 
 #ifdef CONFIG_PM_RUNTIME