// SPDX-License-Identifier: GPL-2.0
// Copyright 2025 NXP.
// NXP PF0900 pmic driver
#include <linux/bitfield.h>
#include <linux/crc8.h>
#include <linux/err.h>
#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/of_regulator.h>
enum pf0900_regulators {
PF0900_SW1 = 0,
PF0900_SW2,
PF0900_SW3,
PF0900_SW4,
PF0900_SW5,
PF0900_LDO1,
PF0900_LDO2,
PF0900_LDO3,
PF0900_VAON,
PF0900_REGULATOR_CNT,
};
enum {
PF0900_DVS_LEVEL_RUN = 0,
PF0900_DVS_LEVEL_STANDBY,
PF0900_DVS_LEVEL_MAX,
};
#define PF0900_VAON_VOLTAGE_NUM 0x03
#define PF0900_SW_VOLTAGE_NUM 0x100
#define PF0900_LDO_VOLTAGE_NUM 0x20
#define REGU_SW_CNT 0x5
#define REGU_LDO_VAON_CNT 0x4
enum {
PF0900_REG_DEV_ID = 0x00,
PF0900_REG_DEV_FAM = 0x01,
PF0900_REG_REV_ID = 0x02,
PF0900_REG_PROG_ID1 = 0x03,
PF0900_REG_PROG_ID2 = 0x04,
PF0900_REG_SYSTEM_INT = 0x05,
PF0900_REG_STATUS1_INT = 0x06,
PF0900_REG_STATUS1_MSK = 0x07,
PF0900_REG_STATUS1_SNS = 0x08,
PF0900_REG_STATUS2_INT = 0x09,
PF0900_REG_STATUS2_MSK = 0x0A,
PF0900_REG_STATUS2_SNS = 0x0B,
PF0900_REG_STATUS3_INT = 0x0C,
PF0900_REG_STATUS3_MSK = 0x0D,
PF0900_REG_SW_MODE_INT = 0x0E,
PF0900_REG_SW_MODE_MSK = 0x0F,
PF0900_REG_SW_ILIM_INT = 0x10,
PF0900_REG_SW_ILIM_MSK = 0x11,
PF0900_REG_SW_ILIM_SNS = 0x12,
PF0900_REG_LDO_ILIM_INT = 0x13,
PF0900_REG_LDO_ILIM_MSK = 0x14,
PF0900_REG_LDO_ILIM_SNS = 0x15,
PF0900_REG_SW_UV_INT = 0x16,
PF0900_REG_SW_UV_MSK = 0x17,
PF0900_REG_SW_UV_SNS = 0x18,
PF0900_REG_SW_OV_INT = 0x19,
PF0900_REG_SW_OV_MSK = 0x1A,
PF0900_REG_SW_OV_SNS = 0x1B,
PF0900_REG_LDO_UV_INT = 0x1C,
PF0900_REG_LDO_UV_MSK = 0x1D,
PF0900_REG_LDO_UV_SNS = 0x1E,
PF0900_REG_LDO_OV_INT = 0x1F,
PF0900_REG_LDO_OV_MSK = 0x20,
PF0900_REG_LDO_OV_SNS = 0x21,
PF0900_REG_PWRON_INT = 0x22,
PF0900_REG_IO_INT = 0x24,
PF0900_REG_IO_MSK = 0x25,
PF0900_REG_IO_SNS = 0x26,
PF0900_REG_IOSHORT_SNS = 0x27,
PF0900_REG_ABIST_OV1 = 0x28,
PF0900_REG_ABIST_OV2 = 0x29,
PF0900_REG_ABIST_UV1 = 0x2A,
PF0900_REG_ABIST_UV2 = 0x2B,
PF0900_REG_ABIST_IO = 0x2C,
PF0900_REG_TEST_FLAGS = 0x2D,
PF0900_REG_HFAULT_FLAGS = 0x2E,
PF0900_REG_FAULT_FLAGS = 0x2F,
PF0900_REG_FS0B_CFG = 0x30,
PF0900_REG_FCCU_CFG = 0x31,
PF0900_REG_RSTB_CFG1 = 0x32,
PF0900_REG_SYSTEM_CMD = 0x33,
PF0900_REG_FS0B_CMD = 0x34,
PF0900_REG_SECURE_WR1 = 0x35,
PF0900_REG_SECURE_WR2 = 0x36,
PF0900_REG_VMON_CFG1 = 0x37,
PF0900_REG_SYS_CFG1 = 0x38,
PF0900_REG_GPO_CFG = 0x39,
PF0900_REG_GPO_CTRL = 0x3A,
PF0900_REG_PWRUP_CFG = 0x3B,
PF0900_REG_RSTB_PWRUP = 0x3C,
PF0900_REG_GPIO1_PWRUP = 0x3D,
PF0900_REG_GPIO2_PWRUP = 0x3E,
PF0900_REG_GPIO3_PWRUP = 0x3F,
PF0900_REG_GPIO4_PWRUP = 0x40,
PF0900_REG_VMON1_PWRUP = 0x41,
PF0900_REG_VMON2_PWRUP = 0x42,
PF0900_REG_SW1_PWRUP = 0x43,
PF0900_REG_SW2_PWRUP = 0x44,
PF0900_REG_SW3_PWRUP = 0x45,
PF0900_REG_SW4_PWRUP = 0x46,
PF0900_REG_SW5_PWRUP = 0x47,
PF0900_REG_LDO1_PWRUP = 0x48,
PF0900_REG_LDO2_PWRUP = 0x49,
PF0900_REG_LDO3_PWRUP = 0x4A,
PF0900_REG_VAON_PWRUP = 0x4B,
PF0900_REG_FREQ_CTRL = 0x4C,
PF0900_REG_PWRON_CFG = 0x4D,
PF0900_REG_WD_CTRL1 = 0x4E,
PF0900_REG_WD_CTRL2 = 0x4F,
PF0900_REG_WD_CFG1 = 0x50,
PF0900_REG_WD_CFG2 = 0x51,
PF0900_REG_WD_CNT1 = 0x52,
PF0900_REG_WD_CNT2 = 0x53,
PF0900_REG_FAULT_CFG = 0x54,
PF0900_REG_FAULT_CNT = 0x55,
PF0900_REG_DFS_CNT = 0x56,
PF0900_REG_AMUX_CFG = 0x57,
PF0900_REG_VMON1_RUN_CFG = 0x58,
PF0900_REG_VMON1_STBY_CFG = 0x59,
PF0900_REG_VMON1_CTRL = 0x5A,
PF0900_REG_VMON2_RUN_CFG = 0x5B,
PF0900_REG_VMON2_STBY_CFG = 0x5C,
PF0900_REG_VMON2_CTRL = 0x5D,
PF0900_REG_SW1_VRUN = 0x5E,
PF0900_REG_SW1_VSTBY = 0x5F,
PF0900_REG_SW1_MODE = 0x60,
PF0900_REG_SW1_CFG1 = 0x61,
PF0900_REG_SW1_CFG2 =