1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Author: Dan Scally <djrscally@gmail.com> */
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
31 #define GPIO_REGULATOR_SUPPLY_MAP_COUNT 2
33 #define INT3472_LED_MAX_NAME_LEN 32
35 #define CIO2_SENSOR_SSDB_MCLKSPEED_OFFSET 86
37 #define INT3472_REGULATOR(_name, _supply, _ops) \
38 (const struct regulator_desc) { \
40 .supply_name = _supply, \
41 .type = REGULATOR_VOLTAGE, \
43 .owner = THIS_MODULE, \
46 #define to_int3472_clk(hw) \
47 container_of(hw, struct int3472_clock, clk_hw)
49 #define to_int3472_device(clk) \
50 container_of(clk, struct int3472_discrete_device, clock)
54 struct platform_device
;
65 u8 control_logic_type
;
73 struct int3472_discrete_device
{
74 struct acpi_device
*adev
;
76 struct acpi_device
*sensor
;
77 const char *sensor_name
;
79 const struct int3472_sensor_config
*sensor_config
;
81 struct int3472_gpio_regulator
{
82 /* SUPPLY_MAP_COUNT * 2 to make room for second sensor mappings */
83 struct regulator_consumer_supply supply_map
[GPIO_REGULATOR_SUPPLY_MAP_COUNT
* 2];
84 char regulator_name
[GPIO_REGULATOR_NAME_LENGTH
];
85 char supply_name
[GPIO_REGULATOR_SUPPLY_NAME_LENGTH
];
86 struct gpio_desc
*gpio
;
87 struct regulator_dev
*rdev
;
88 struct regulator_desc rdesc
;
91 struct int3472_clock
{
94 struct clk_lookup
*cl
;
95 struct gpio_desc
*ena_gpio
;
100 struct int3472_pled
{
101 struct led_classdev classdev
;
102 struct led_lookup_data lookup
;
103 char name
[INT3472_LED_MAX_NAME_LEN
];
104 struct gpio_desc
*gpio
;
107 unsigned int ngpios
; /* how many GPIOs have we seen */
108 unsigned int n_sensor_gpios
; /* how many have we mapped to sensor */
109 struct gpiod_lookup_table gpios
;
112 union acpi_object
*skl_int3472_get_acpi_buffer(struct acpi_device
*adev
,
114 int skl_int3472_fill_cldb(struct acpi_device
*adev
, struct int3472_cldb
*cldb
);
115 int skl_int3472_get_sensor_adev_and_name(struct device
*dev
,
116 struct acpi_device
**sensor_adev_ret
,
117 const char **name_ret
);
119 int skl_int3472_register_gpio_clock(struct int3472_discrete_device
*int3472
,
120 struct gpio_desc
*gpio
);
121 int skl_int3472_register_dsm_clock(struct int3472_discrete_device
*int3472
);
122 void skl_int3472_unregister_clock(struct int3472_discrete_device
*int3472
);
124 int skl_int3472_register_regulator(struct int3472_discrete_device
*int3472
,
125 struct gpio_desc
*gpio
);
126 void skl_int3472_unregister_regulator(struct int3472_discrete_device
*int3472
);
128 int skl_int3472_register_pled(struct int3472_discrete_device
*int3472
, struct gpio_desc
*gpio
);
129 void skl_int3472_unregister_pled(struct int3472_discrete_device
*int3472
);