1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Author: Dan Scally <djrscally@gmail.com> */
3 
4 #ifndef _INTEL_SKL_INT3472_H
5 #define _INTEL_SKL_INT3472_H
6 
7 #include <linux/clk-provider.h>
8 #include <linux/gpio/machine.h>
9 #include <linux/regulator/driver.h>
10 #include <linux/regulator/machine.h>
11 #include <linux/types.h>
12 
13 /* FIXME drop this once the I2C_DEV_NAME_FORMAT macro has been added to include/linux/i2c.h */
14 #ifndef I2C_DEV_NAME_FORMAT
15 #define I2C_DEV_NAME_FORMAT					"i2c-%s"
16 #endif
17 
18 /* PMIC GPIO Types */
19 #define INT3472_GPIO_TYPE_RESET					0x00
20 #define INT3472_GPIO_TYPE_POWERDOWN				0x01
21 #define INT3472_GPIO_TYPE_POWER_ENABLE				0x0b
22 #define INT3472_GPIO_TYPE_CLK_ENABLE				0x0c
23 #define INT3472_GPIO_TYPE_PRIVACY_LED				0x0d
24 
25 #define INT3472_PDEV_MAX_NAME_LEN				23
26 #define INT3472_MAX_SENSOR_GPIOS				3
27 
28 #define GPIO_REGULATOR_NAME_LENGTH				21
29 #define GPIO_REGULATOR_SUPPLY_NAME_LENGTH			9
30 
31 #define CIO2_SENSOR_SSDB_MCLKSPEED_OFFSET			86
32 
33 #define INT3472_REGULATOR(_name, _supply, _ops)			\
34 	(const struct regulator_desc) {				\
35 		.name = _name,					\
36 		.supply_name = _supply,				\
37 		.type = REGULATOR_VOLTAGE,			\
38 		.ops = _ops,					\
39 		.owner = THIS_MODULE,				\
40 	}
41 
42 #define to_int3472_clk(hw)					\
43 	container_of(hw, struct int3472_gpio_clock, clk_hw)
44 
45 #define to_int3472_device(clk)					\
46 	container_of(clk, struct int3472_discrete_device, clock)
47 
48 struct acpi_device;
49 struct i2c_client;
50 struct platform_device;
51 
52 struct int3472_cldb {
53 	u8 version;
54 	/*
55 	 * control logic type
56 	 * 0: UNKNOWN
57 	 * 1: DISCRETE(CRD-D)
58 	 * 2: PMIC TPS68470
59 	 * 3: PMIC uP6641
60 	 */
61 	u8 control_logic_type;
62 	u8 control_logic_id;
63 	u8 sensor_card_sku;
64 	u8 reserved[28];
65 };
66 
67 struct int3472_gpio_function_remap {
68 	const char *documented;
69 	const char *actual;
70 };
71 
72 struct int3472_sensor_config {
73 	const char *sensor_module_name;
74 	struct regulator_consumer_supply supply_map;
75 	const struct int3472_gpio_function_remap *function_maps;
76 };
77 
78 struct int3472_discrete_device {
79 	struct acpi_device *adev;
80 	struct device *dev;
81 	struct acpi_device *sensor;
82 	const char *sensor_name;
83 
84 	const struct int3472_sensor_config *sensor_config;
85 
86 	struct int3472_gpio_regulator {
87 		char regulator_name[GPIO_REGULATOR_NAME_LENGTH];
88 		char supply_name[GPIO_REGULATOR_SUPPLY_NAME_LENGTH];
89 		struct gpio_desc *gpio;
90 		struct regulator_dev *rdev;
91 		struct regulator_desc rdesc;
92 	} regulator;
93 
94 	struct int3472_gpio_clock {
95 		struct clk *clk;
96 		struct clk_hw clk_hw;
97 		struct clk_lookup *cl;
98 		struct gpio_desc *ena_gpio;
99 		struct gpio_desc *led_gpio;
100 		u32 frequency;
101 	} clock;
102 
103 	unsigned int ngpios; /* how many GPIOs have we seen */
104 	unsigned int n_sensor_gpios; /* how many have we mapped to sensor */
105 	struct gpiod_lookup_table gpios;
106 };
107 
108 union acpi_object *skl_int3472_get_acpi_buffer(struct acpi_device *adev,
109 					       char *id);
110 int skl_int3472_fill_cldb(struct acpi_device *adev, struct int3472_cldb *cldb);
111 int skl_int3472_get_sensor_adev_and_name(struct device *dev,
112 					 struct acpi_device **sensor_adev_ret,
113 					 const char **name_ret);
114 
115 int skl_int3472_register_clock(struct int3472_discrete_device *int3472);
116 void skl_int3472_unregister_clock(struct int3472_discrete_device *int3472);
117 
118 int skl_int3472_register_regulator(struct int3472_discrete_device *int3472,
119 				   struct acpi_resource_gpio *agpio);
120 void skl_int3472_unregister_regulator(struct int3472_discrete_device *int3472);
121 
122 #endif
123