linux/drivers/platform/x86/intel/int3472/intel_skl_int3472_common.h
<<
>>
Prefs
   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
  48struct acpi_device;
  49struct i2c_client;
  50struct platform_device;
  51
  52struct 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
  67struct int3472_gpio_function_remap {
  68        const char *documented;
  69        const char *actual;
  70};
  71
  72struct 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
  78struct 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
 108int skl_int3472_discrete_probe(struct platform_device *pdev);
 109int skl_int3472_discrete_remove(struct platform_device *pdev);
 110int skl_int3472_tps68470_probe(struct i2c_client *client);
 111union acpi_object *skl_int3472_get_acpi_buffer(struct acpi_device *adev,
 112                                               char *id);
 113int skl_int3472_fill_cldb(struct acpi_device *adev, struct int3472_cldb *cldb);
 114
 115int skl_int3472_register_clock(struct int3472_discrete_device *int3472);
 116void skl_int3472_unregister_clock(struct int3472_discrete_device *int3472);
 117
 118int skl_int3472_register_regulator(struct int3472_discrete_device *int3472,
 119                                   struct acpi_resource_gpio *agpio);
 120void skl_int3472_unregister_regulator(struct int3472_discrete_device *int3472);
 121
 122#endif
 123