@@ -2,6 +2,10 @@
/* Author: Dan Scally <djrscally@gmail.com> */
#include <linux/acpi.h>
+#include <linux/cleanup.h>
+#include <linux/device.h>
+#include <linux/gpio/machine.h>
+#include <linux/overflow.h>
#include <linux/slab.h>
#include "common.h"
@@ -80,3 +84,28 @@ int skl_int3472_get_sensor_adev_and_name(struct device *dev,
return ret;
}
+
+/* This should *really* only be used when there's no other way... */
+struct gpio_desc *
+skl_int3472_gpiod_get_from_temp_lookup(struct device *dev,
+ const char *chip_label, u16 hwnum,
+ const char *con_id,
+ enum gpio_lookup_flags lflags,
+ enum gpiod_flags rflags)
+{
+ struct gpio_desc *desc;
+
+ struct gpiod_lookup_table *lookup __free(kfree) =
+ kzalloc(struct_size(lookup, table, 1), GFP_KERNEL);
+ if (!lookup)
+ return ERR_PTR(-ENOMEM);
+
+ lookup->dev_id = dev_name(dev);
+ lookup->table[0] = GPIO_LOOKUP(chip_label, hwnum, con_id, lflags);
+
+ gpiod_add_lookup_table(lookup);
+
+ desc = gpiod_get(dev, con_id, rflags);
+ gpiod_remove_lookup_table(lookup);
+ return desc;
+}
@@ -5,6 +5,8 @@
#define _INTEL_SKL_INT3472_H
#include <linux/clk-provider.h>
+#include <linux/device.h>
+#include <linux/gpio/consumer.h>
#include <linux/gpio/machine.h>
#include <linux/leds.h>
#include <linux/regulator/driver.h>
@@ -129,4 +131,11 @@ int skl_int3472_register_pled(struct int3472_discrete_device *int3472,
struct acpi_resource_gpio *agpio, u32 polarity);
void skl_int3472_unregister_pled(struct int3472_discrete_device *int3472);
+struct gpio_desc *
+skl_int3472_gpiod_get_from_temp_lookup(struct device *dev,
+ const char *chip_label, u16 hwnum,
+ const char *con_id,
+ enum gpio_lookup_flags lflags,
+ enum gpiod_flags rflags);
+
#endif