summaryrefslogtreecommitdiffstats
path: root/drivers/platform/x86/intel-int3472/intel_skl_int3472_common.h
blob: 714fde73b5247cb410f61bb145ea458553bd19ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/* SPDX-License-Identifier: GPL-2.0 */
/* Author: Dan Scally <djrscally@gmail.com> */

#ifndef _INTEL_SKL_INT3472_H
#define _INTEL_SKL_INT3472_H

#include <linux/clk-provider.h>
#include <linux/gpio/machine.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/machine.h>
#include <linux/types.h>

/* FIXME drop this once the I2C_DEV_NAME_FORMAT macro has been added to include/linux/i2c.h */
#ifndef I2C_DEV_NAME_FORMAT
#define I2C_DEV_NAME_FORMAT					"i2c-%s"
#endif

/* PMIC GPIO Types */
#define INT3472_GPIO_TYPE_RESET					0x00
#define INT3472_GPIO_TYPE_POWERDOWN				0x01
#define INT3472_GPIO_TYPE_POWER_ENABLE				0x0b
#define INT3472_GPIO_TYPE_CLK_ENABLE				0x0c
#define INT3472_GPIO_TYPE_PRIVACY_LED				0x0d

#define INT3472_PDEV_MAX_NAME_LEN				23
#define INT3472_MAX_SENSOR_GPIOS				3

#define GPIO_REGULATOR_NAME_LENGTH				21
#define GPIO_REGULATOR_SUPPLY_NAME_LENGTH			9

#define CIO2_SENSOR_SSDB_MCLKSPEED_OFFSET			86

#define INT3472_REGULATOR(_name, _supply, _ops)			\
	(const struct regulator_desc) {				\
		.name = _name,					\
		.supply_name = _supply,				\
		.type = REGULATOR_VOLTAGE,			\
		.ops = _ops,					\
		.owner = THIS_MODULE,				\
	}

#define to_int3472_clk(hw)					\
	container_of(hw, struct int3472_gpio_clock, clk_hw)

#define to_int3472_device(clk)					\
	container_of(clk, struct int3472_discrete_device, clock)

struct acpi_device;
struct i2c_client;
struct platform_device;

struct int3472_cldb {
	u8 version;
	/*
	 * control logic type
	 * 0: UNKNOWN
	 * 1: DISCRETE(CRD-D)
	 * 2: PMIC TPS68470
	 * 3: PMIC uP6641
	 */
	u8 control_logic_type;
	u8 control_logic_id;
	u8 sensor_card_sku;
	u8 reserved[28];
};

struct int3472_gpio_function_remap {
	const char *documented;
	const char *actual;
};

struct int3472_sensor_config {
	const char *sensor_module_name;
	struct regulator_consumer_supply supply_map;
	const struct int3472_gpio_function_remap *function_maps;
};

struct int3472_discrete_device {
	struct acpi_device *adev;
	struct device *dev;
	struct acpi_device *sensor;
	const char *sensor_name;

	const struct int3472_sensor_config *sensor_config;

	struct int3472_gpio_regulator {
		char regulator_name[GPIO_REGULATOR_NAME_LENGTH];
		char supply_name[GPIO_REGULATOR_SUPPLY_NAME_LENGTH];
		struct gpio_desc *gpio;
		struct regulator_dev *rdev;
		struct regulator_desc rdesc;
	} regulator;

	struct int3472_gpio_clock {
		struct clk *clk;
		struct clk_hw clk_hw;
		struct clk_lookup *cl;
		struct gpio_desc *ena_gpio;
		struct gpio_desc *led_gpio;
		u32 frequency;
	} clock;

	unsigned int ngpios; /* how many GPIOs have we seen */
	unsigned int n_sensor_gpios; /* how many have we mapped to sensor */
	struct gpiod_lookup_table gpios;
};

int skl_int3472_discrete_probe(struct platform_device *pdev);
int skl_int3472_discrete_remove(struct platform_device *pdev);
int skl_int3472_tps68470_probe(struct i2c_client *client);
union acpi_object *skl_int3472_get_acpi_buffer(struct acpi_device *adev,
					       char *id);
int skl_int3472_fill_cldb(struct acpi_device *adev, struct int3472_cldb *cldb);

int skl_int3472_register_clock(struct int3472_discrete_device *int3472);
void skl_int3472_unregister_clock(struct int3472_discrete_device *int3472);

int skl_int3472_register_regulator(struct int3472_discrete_device *int3472,
				   struct acpi_resource_gpio *agpio);
void skl_int3472_unregister_regulator(struct int3472_discrete_device *int3472);

#endif