auto
  "   ˆl–Ðz¾””ÔD¨ 	Å íÁ5q±)‹FÿÈƒh¹¿Å      virtio:d00000008v00001AF4
     ˆÉÈ…beáÇ¿Å ?÷     /* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * TI Palmas
 *
 * Copyright 2011-2013 Texas Instruments Inc.
 *
 * Author: Graeme Gregory <gg@slimlogic.co.uk>
 * Author: Ian Lartey <ian@slimlogic.co.uk>
 */

#ifndef __LINUX_MFD_PALMAS_H
#define __LINUX_MFD_PALMAS_H

#include <linux/usb/otg.h>
#include <linux/leds.h>
#include <linux/regmap.h>
#include <linux/regulator/driver.h>
#include <linux/extcon-provider.h>
#include <linux/of_gpio.h>
#include <linux/usb/phy_companion.h>

#define PALMAS_NUM_CLIENTS		3

/* The ID_REVISION NUMBERS */
#define PALMAS_CHIP_OLD_ID		0x0000
#define PALMAS_CHIP_ID			0xC035
#define PALMAS_CHIP_CHARGER_ID		0xC036

#define TPS65917_RESERVED		-1

#define is_palmas(a)	(((a) == PALMAS_CHIP_OLD_ID) || \
			((a) == PALMAS_CHIP_ID))
#define is_palmas_charger(a) ((a) == PALMAS_CHIP_CHARGER_ID)

/**
 * Palmas PMIC feature types
 *
 * PALMAS_PMIC_FEATURE_SMPS10_BOOST - used when the PMIC provides SMPS10_BOOST
 *	regulator.
 *
 * PALMAS_PMIC_HAS(b, f) - macro to check if a bandgap device is capable of a
 *	specific feature (above) or not. Return non-zero, if yes.
 */
#define PALMAS_PMIC_FEATURE_SMPS10_BOOST	BIT(0)
#define PALMAS_PMIC_HAS(b, f)			\
			((b)->features & PALMAS_PMIC_FEATURE_ ## f)

struct palmas_pmic;
struct palmas_gpadc;
struct palmas_resource;
struct palmas_usb;
struct palmas_pmic_driver_data;
struct palmas_pmic_platform_data;

enum palmas_usb_state {
	PALMAS_USB_STATE_DISCONNECT,
	PALMAS_USB_STATE_VBUS,
	PALMAS_USB_STATE_ID,
};

struct palmas {
	struct device *dev;

	struct i2c_client *i2c_clients[PALMAS_NUM_CLIENTS];
	struct regmap *regmap[PALMAS_NUM_CLIENTS];

	/* Stored chip id */
	int id;

	unsigned int features;
	/* IRQ Data */
	int irq;
	u32 irq_mask;
	struct mutex irq_lock;
	struct regmap_irq_chip_data *irq_data;

	struct palmas_pmic_driver_data *pmic_ddata;

	/* Child Devices */
	struct palmas_pmic *pmic;
	struct palmas_gpadc *gpadc;
	struct palmas_resource *resource;
	struct palmas_usb *usb;

	/* GPIO MUXing */
	u8 gpio_muxed;
	u8 led_muxed;
	u8 pwm_muxed;
};

#define PALMAS_EXT_REQ (PALMAS_EXT_CONTROL_ENABLE1 |	\
			PALMAS_EXT_CONTROL_ENABLE2 |	\
			PALMAS_EXT_CONTROL_NSLEEP)

struct palmas_sleep_requestor_info {
	int id;
	int reg_offset;
	int bit_pos;
};

struct palmas_regs_info {
	char	*name;
	char	*sname;
	u8	vsel_addr;
	u8	ctrl_addr;
	u8	tstep_addr;
	int	sleep_id;
};

struct palmas_pmic_driver_data {
	int smps_start;
	int smps_end;
	int ldo_begin;
	int ldo_end;
	int max_reg;
	bool has_regen3;
	struct palmas_regs_info *palmas_regs_info;
	struct of_regulator_match *palmas_matches;
	struct palmas_sleep_requestor_info *sleep_req_info;
	int (*smps_register)(struct palmas_pmic *pmic,
			     struct palmas_pmic_driver_data *ddata,
			     struct palmas_pmic_platform_data *pdata,
			     const char *pdev_name,
			     struct regulator_config config);
	int (*ldo_register)(struct palmas_pmic *pmic,
			    struct palmas_pmic_driver_data *ddata,
			    struct palmas_pmic_platform_data *pdata,
			    const char *pdev_name,
			    struct regulator_config config);
};

struct palmas_adc_wakeup_property {
	int adc_channel_number;
	int adc_high_threshold;
	int adc_low_threshold;
};

struct palmas_gpadc_platform_data {
	/* Channel 3 current source is only enabled during conversion */
	int ch3_current;	/* 0: off; 1: 10uA; 2: 400uA; 3: 800 uA */

	/* Channel 0 current source can be used for battery detection.
	 * If used for battery detection this will cause a permanent current
	 * consumption depending on current level set here.
	 */
	int ch0_current;	/* 0: off; 1: 5uA; 2: 15uA; 3: 20 uA */
	bool extended_delay;	/* use extended delay for conversion */

	/* default BAT_REMOVAL_DAT setting on device probe */
	int bat_removal;

	/* Sets the START_POLARITY bit in the RT_CTRL register */
	int start_polarity;

	int auto_conversion_period_ms;
	struct palmas_adc_wakeup_property *adc_wakeup1_data;
	struct palmas_adc_wakeup_property *adc_wakeup2_data;
};

struct palmas_reg_init {
	/* warm_