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/leds.h> 10 #include <linux/regulator/driver.h> 11 #include <linux/regulator/machine.h> 12 #include <linux/types.h> 13 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" 17 #endif 18 19 /* PMIC GPIO Types */ 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 25 26 #define INT3472_PDEV_MAX_NAME_LEN 23 27 #define INT3472_MAX_SENSOR_GPIOS 3 28 29 #define GPIO_REGULATOR_NAME_LENGTH 21 30 #define GPIO_REGULATOR_SUPPLY_NAME_LENGTH 9 31 #define GPIO_REGULATOR_SUPPLY_MAP_COUNT 2 32 33 #define INT3472_LED_MAX_NAME_LEN 32 34 35 #define CIO2_SENSOR_SSDB_MCLKSPEED_OFFSET 86 36 37 #define INT3472_REGULATOR(_name, _supply, _ops) \ 38 (const struct regulator_desc) { \ 39 .name = _name, \ 40 .supply_name = _supply, \ 41 .type = REGULATOR_VOLTAGE, \ 42 .ops = _ops, \ 43 .owner = THIS_MODULE, \ 44 } 45 46 #define to_int3472_clk(hw) \ 47 container_of(hw, struct int3472_clock, clk_hw) 48 49 #define to_int3472_device(clk) \ 50 container_of(clk, struct int3472_discrete_device, clock) 51 52 struct acpi_device; 53 struct i2c_client; 54 struct platform_device; 55 56 struct int3472_cldb { 57 u8 version; 58 /* 59 * control logic type 60 * 0: UNKNOWN 61 * 1: DISCRETE(CRD-D) 62 * 2: PMIC TPS68470 63 * 3: PMIC uP6641 64 */ 65 u8 control_logic_type; 66 u8 control_logic_id; 67 u8 sensor_card_sku; 68 u8 reserved[10]; 69 u8 clock_source; 70 u8 reserved2[17]; 71 }; 72 73 struct int3472_discrete_device { 74 struct acpi_device *adev; 75 struct device *dev; 76 struct acpi_device *sensor; 77 const char *sensor_name; 78 79 const struct int3472_sensor_config *sensor_config; 80 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; 89 } regulator; 90 91 struct int3472_clock { 92 struct clk *clk; 93 struct clk_hw clk_hw; 94 struct clk_lookup *cl; 95 struct gpio_desc *ena_gpio; 96 u32 frequency; 97 u8 imgclk_index; 98 } clock; 99 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; 105 } pled; 106 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; 110 }; 111 112 union acpi_object *skl_int3472_get_acpi_buffer(struct acpi_device *adev, 113 char *id); 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); 118 119 int skl_int3472_register_gpio_clock(struct int3472_discrete_device *int3472, 120 struct acpi_resource_gpio *agpio, u32 polarity); 121 int skl_int3472_register_dsm_clock(struct int3472_discrete_device *int3472); 122 void skl_int3472_unregister_clock(struct int3472_discrete_device *int3472); 123 124 int skl_int3472_register_regulator(struct int3472_discrete_device *int3472, 125 struct acpi_resource_gpio *agpio); 126 void skl_int3472_unregister_regulator(struct int3472_discrete_device *int3472); 127 128 int skl_int3472_register_pled(struct int3472_discrete_device *int3472, 129 struct acpi_resource_gpio *agpio, u32 polarity); 130 void skl_int3472_unregister_pled(struct int3472_discrete_device *int3472); 131 132 #endif 133