1 /* SPDX-License-Identifier: GPL-2.0 */
4 #ifndef _INTEL_SKL_INT3472_H
5 #define _INTEL_SKL_INT3472_H
7 #include <linux/clk-provider.h>
8 #include <linux/gpio/machine.h>
9 #include <linux/leds.h>
10 #include <linux/regulator/driver.h>
11 #include <linux/regulator/machine.h>
12 #include <linux/types.h>
14 /* FIXME drop this once the I2C_DEV_NAME_FORMAT macro has been added to include/linux/i2c.h */
15 #ifndef I2C_DEV_NAME_FORMAT
16 #define I2C_DEV_NAME_FORMAT "i2c-%s"
20 #define INT3472_GPIO_TYPE_RESET 0x00
21 #define INT3472_GPIO_TYPE_POWERDOWN 0x01
22 #define INT3472_GPIO_TYPE_POWER_ENABLE 0x0b
23 #define INT3472_GPIO_TYPE_CLK_ENABLE 0x0c
24 #define INT3472_GPIO_TYPE_PRIVACY_LED 0x0d
26 #define INT3472_PDEV_MAX_NAME_LEN 23
27 #define INT3472_MAX_SENSOR_GPIOS 3
29 #define GPIO_REGULATOR_NAME_LENGTH 21
30 #define GPIO_REGULATOR_SUPPLY_NAME_LENGTH 9
32 #define INT3472_LED_MAX_NAME_LEN 32
34 #define CIO2_SENSOR_SSDB_MCLKSPEED_OFFSET 86
36 #define INT3472_REGULATOR(_name, _supply, _ops) \
37 (const struct regulator_desc) { \
39 .supply_name = _supply, \
40 .type = REGULATOR_VOLTAGE, \
42 .owner = THIS_MODULE, \
45 #define to_int3472_clk(hw) \
46 container_of(hw, struct int3472_gpio_clock, clk_hw)
48 #define to_int3472_device(clk) \
49 container_of(clk, struct int3472_discrete_device, clock)
53 struct platform_device;
64 u8 control_logic_type;
70 struct int3472_gpio_function_remap {
71 const char *documented;
75 struct int3472_sensor_config {
76 const char *sensor_module_name;
77 struct regulator_consumer_supply supply_map;
78 const struct int3472_gpio_function_remap *function_maps;
81 struct int3472_discrete_device {
82 struct acpi_device *adev;
84 struct acpi_device *sensor;
85 const char *sensor_name;
87 const struct int3472_sensor_config *sensor_config;
89 struct int3472_gpio_regulator {
90 char regulator_name[GPIO_REGULATOR_NAME_LENGTH];
91 char supply_name[GPIO_REGULATOR_SUPPLY_NAME_LENGTH];
92 struct gpio_desc *gpio;
93 struct regulator_dev *rdev;
94 struct regulator_desc rdesc;
97 struct int3472_gpio_clock {
100 struct clk_lookup *cl;
101 struct gpio_desc *ena_gpio;
105 struct int3472_pled {
106 struct led_classdev classdev;
107 struct led_lookup_data lookup;
108 char name[INT3472_LED_MAX_NAME_LEN];
109 struct gpio_desc *gpio;
112 unsigned int ngpios; /* how many GPIOs have we seen */
113 unsigned int n_sensor_gpios; /* how many have we mapped to sensor */
114 struct gpiod_lookup_table gpios;
117 union acpi_object *skl_int3472_get_acpi_buffer(struct acpi_device *adev,
119 int skl_int3472_fill_cldb(struct acpi_device *adev, struct int3472_cldb *cldb);
120 int skl_int3472_get_sensor_adev_and_name(struct device *dev,
121 struct acpi_device **sensor_adev_ret,
122 const char **name_ret);
124 int skl_int3472_register_clock(struct int3472_discrete_device *int3472,
125 struct acpi_resource_gpio *agpio, u32 polarity);
126 void skl_int3472_unregister_clock(struct int3472_discrete_device *int3472);
128 int skl_int3472_register_regulator(struct int3472_discrete_device *int3472,
129 struct acpi_resource_gpio *agpio);
130 void skl_int3472_unregister_regulator(struct int3472_discrete_device *int3472);
132 int skl_int3472_register_pled(struct int3472_discrete_device *int3472,
133 struct acpi_resource_gpio *agpio, u32 polarity);
134 void skl_int3472_unregister_pled(struct int3472_discrete_device *int3472);