}
 }
 
+int acpi_dev_add_driver_gpios(struct acpi_device *adev,
+                             const struct acpi_gpio_mapping *gpios)
+{
+       if (adev && gpios) {
+               adev->driver_gpios = gpios;
+               return 0;
+       }
+       return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(acpi_dev_add_driver_gpios);
+
+static bool acpi_get_driver_gpio_data(struct acpi_device *adev,
+                                     const char *name, int index,
+                                     struct acpi_reference_args *args)
+{
+       const struct acpi_gpio_mapping *gm;
+
+       if (!adev->driver_gpios)
+               return false;
+
+       for (gm = adev->driver_gpios; gm->name; gm++)
+               if (!strcmp(name, gm->name) && gm->data && index < gm->size) {
+                       const struct acpi_gpio_params *par = gm->data + index;
+
+                       args->adev = adev;
+                       args->args[0] = par->crs_entry_index;
+                       args->args[1] = par->line_index;
+                       args->args[2] = par->active_low;
+                       args->nargs = 3;
+                       return true;
+               }
+
+       return false;
+}
+
 struct acpi_gpio_lookup {
        struct acpi_gpio_info info;
        int index;
                memset(&args, 0, sizeof(args));
                ret = acpi_dev_get_property_reference(adev, propname, NULL,
                                                      index, &args);
-               if (ret)
-                       return ERR_PTR(ret);
+               if (ret) {
+                       bool found = acpi_get_driver_gpio_data(adev, propname,
+                                                              index, &args);
+                       if (!found)
+                               return ERR_PTR(ret);
+               }
 
                /*
                 * The property was found and resolved so need to
 
        const union acpi_object *of_compatible;
 };
 
+struct acpi_gpio_mapping;
+
 /* Device */
 struct acpi_device {
        int device_type;
        struct acpi_scan_handler *handler;
        struct acpi_hotplug_context *hp;
        struct acpi_driver *driver;
+       const struct acpi_gpio_mapping *driver_gpios;
        void *driver_data;
        struct device dev;
        unsigned int physical_node_count;
 
 #endif
 #endif
 
+struct acpi_gpio_params {
+       unsigned int crs_entry_index;
+       unsigned int line_index;
+       bool active_low;
+};
+
+struct acpi_gpio_mapping {
+       const char *name;
+       const struct acpi_gpio_params *data;
+       unsigned int size;
+};
+
+#if defined(CONFIG_ACPI) && defined(CONFIG_GPIOLIB)
+int acpi_dev_add_driver_gpios(struct acpi_device *adev,
+                             const struct acpi_gpio_mapping *gpios);
+
+static inline void acpi_dev_remove_driver_gpios(struct acpi_device *adev)
+{
+       if (adev)
+               adev->driver_gpios = NULL;
+}
+#else
+static inline int acpi_dev_add_driver_gpios(struct acpi_device *adev,
+                             const struct acpi_gpio_mapping *gpios)
+{
+       return -ENXIO;
+}
+static inline void acpi_dev_remove_driver_gpios(struct acpi_device *adev) {}
+#endif
+
 /* Device properties */
 
 #define MAX_ACPI_REFERENCE_ARGS        8