blob: 2f7444d18aada3196988c06e7a0d4c50cf647d43 [file]
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* include/linux/amlogic/pmic/meson_pmic6b.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef _MESON_PMIC6B_H
#define _MESON_PMIC6B_H
#include <linux/interrupt.h>
/*Power Up and Down Slot Register*/
#define PMIC6B_POWER_UP_SEL0 0x00
#define PMIC6B_POWER_UP_SEL1 0x01
#define PMIC6B_POWER_UP_SEL2 0x02
#define PMIC6B_POWER_UP_SEL3 0x03
#define PMIC6B_OTP_REG_0x04 0x04
#define PMIC6B_OTP_REG_0x05 0x05
#define PMIC6B_OTP_REG_0x06 0x06
#define PMIC6B_OTP_REG_0x07 0x07
#define PMIC6B_OTP_REG_0x08 0x08
#define PMIC6B_OTP_REG_0x09 0x09
#define PMIC6B_OTP_REG_0x0A 0x0A
#define PMIC6B_OTP_REG_0x0B 0x0B
#define PMIC6B_OTP_REG_0x0C 0x0C
#define PMIC6B_OTP_REG_0x0D 0x0D
#define PMIC6B_OTP_REG_0x0E 0x0E
#define PMIC6B_OTP_REG_0x0F 0x0F
#define PMIC6B_OTP_REG_0x10 0x10
#define PMIC6B_OTP_REG_0x11 0x11
#define PMIC6B_OTP_REG_0x12 0x12
#define PMIC6B_OTP_REG_0x13 0x13
#define PMIC6B_OTP_REG_0x14 0x14
#define PMIC6B_OTP_REG_0x15 0x15
#define PMIC6B_OTP_REG_0x16 0x16
#define PMIC6B_OTP_REG_0x17 0x17
#define PMIC6B_OTP_REG_0x18 0x18
#define PMIC6B_OTP_REG_0x19 0x19
#define PMIC6B_OTP_REG_0x1A 0x1A
#define PMIC6B_OTP_REG_0x1B 0x1B
#define PMIC6B_OTP_REG_0x1C 0x1C
#define PMIC6B_OTP_REG_0x1D 0x1D
#define PMIC6B_OTP_REG_0x1E 0x1E
#define PMIC6B_OTP_REG_0x1F 0x1F
#define PMIC6B_OTP_REG_0x20 0x20
#define PMIC6B_OTP_REG_0x21 0x21
#define PMIC6B_OTP_REG_0x22 0x22
#define PMIC6B_OTP_REG_0x23 0x23
#define PMIC6B_OTP_REG_0x24 0x24
#define PMIC6B_OTP_REG_0x25 0x25
#define PMIC6B_OTP_REG_0x26 0x26
#define PMIC6B_OTP_REG_0x27 0x27
#define PMIC6B_OTP_REG_0x28 0x28
#define PMIC6B_OTP_REG_0x29 0x29
#define PMIC6B_OTP_REG_0x2A 0x2A
#define PMIC6B_OTP_REG_0x2B 0x2B
#define PMIC6B_OTP_REG_0x2C 0x2C
#define PMIC6B_OTP_REG_0x2D 0x2D
#define PMIC6B_OTP_REG_0x2E 0x2E
#define PMIC6B_OTP_REG_0x2F 0x2F
#define PMIC6B_OTP_REG_0x30 0x30
#define PMIC6B_OTP_REG_0x31 0x31
#define PMIC6B_OTP_REG_0x32 0x32
#define PMIC6B_OTP_REG_0x33 0x33
#define PMIC6B_OTP_REG_0x34 0x34
#define PMIC6B_OTP_REG_0x35 0x35
#define PMIC6B_OTP_REG_0x36 0x36
#define PMIC6B_OTP_REG_0x37 0x37
#define PMIC6B_OTP_REG_0x38 0x38
#define PMIC6B_OTP_REG_0x39 0x39
#define PMIC6B_OTP_REG_0x3A 0x3A
#define PMIC6B_OTP_REG_0x3B 0x3B
#define PMIC6B_OTP_REG_0x3C 0x3C
#define PMIC6B_OTP_REG_0x3D 0x3D
#define PMIC6B_OTP_REG_0x3E 0x3E
#define PMIC6B_OTP_REG_0x3F 0x3F
/* NON-OTP Registers */
#define PMIC6B_GEN_CNTL0 0x40
#define PMIC6B_SW_POWER_UP 0x41
#define PMIC6B_SW_POWER_DOWN 0x42
#define PMIC6B_GEN_STATUS0 0x43
#define PMIC6B_GEN_STATUS1 0x44
#define PMIC6B_WATCHDOG 0x45
#define PMIC6B_WATCHDOG_CNT 0x46
#define PMIC6B_OTP_CNTL 0x47
#define PMIC6B_LOW_TIMEBASE 0x48
#define PMIC6B_HIGH_TIMEBASE 0x49
#define PMIC6B_CLK_DIV_CNTL 0x4A
#define PMIC6B_SP_SOFT_RESET 0x4B
#define PMIC6B_IRQ_MASK0 0x4C
#define PMIC6B_IRQ_MASK1 0x4D
#define PMIC6B_IRQ_STATUS_CLR0 0x4E
#define PMIC6B_IRQ_STATUS_CLR1 0x4F
#define PMIC6B_SP_DCDC_STATUS 0x50
#define PMIC6B_SP_LDO_STATUS 0x51
#define PMIC6B_PIN_MUX_REG0 0x52
#define PMIC6B_PIN_MUX_REG1 0x53
#define PMIC6B_PIN_MUX_REG2 0x54
#define PMIC6B_PIN_MUX_REG3 0x55
#define PMIC6B_PIN_MUX_REG4 0x56
#define PMIC6B_PIN_MUX_REG5 0x57
#define PMIC6B_PIN_MUX_REG6 0x58
#define PMIC6B_PIN_MUX_REG7 0x59
#define PMIC6B_PIN_MUX_REG8 0x5A
#define PMIC6B_GPIO_OUTPUT_CONTROL 0x5B
#define PMIC6B_GPIO_Input_LEVEL 0x5C
#define PMIC6B_I2C_OTP_ADDR 0x5d
#define PMIC6B_I2C_OTP_WDATA 0x5e
#define PMIC6B_I2C_OTP_RDATA_BYTE0 0x5f
#define PMIC6B_I2C_OTP_RDATA_BYTE1 0x60
#define PMIC6B_PWM1_TH_REG0 0x61
#define PMIC6B_PWM1_TH_REG1 0x62
#define PMIC6B_PWM1_TL_REG0 0x63
#define PMIC6B_PWM1_TL_REG1 0x64
#define PMIC6B_PWM2_TH_REG0 0x65
#define PMIC6B_PWM2_TH_REG1 0x66
#define PMIC6B_PWM2_TL_REG0 0x67
#define PMIC6B_PWM2_TL_REG1 0x68
#define PMIC6B_PWM_CLK_TCNT_REG 0x69
#define PMIC6B_PWM_ENABLE 0x6A
#define PMIC6B_CNTL_ADJUST_DC1 0x6B
#define PMIC6B_CNTL_ADJUST_DC2 0x6C
#define PMIC6B_BUCK_MUX_SEL 0x6D
#define PMIC6B_BUCK_EN 0x41
#define PMIC6B_AR_SW_EN 0x70
#define PMIC6B_SAR_CNTL_REG0 0x71
#define PMIC6B_SAR_CNTL_REG1 0x72
#define PMIC6B_SAR_CNTL_REG2 0x73
#define PMIC6B_SAR_CNTL_REG3 0x74
#define PMIC6B_SAR_CNTL_REG4 0x75
#define PMIC6B_SAR_CNTL_REG5 0x76
#define PMIC6B_SAR_CNTL_REG6 0x77
#define PMIC6B_SAR_CNTL_REG7 0x78
#define PMIC6B_SAR_CNTL_REG8 0x79
#define PMIC6B_SAR_CNTL_REG9 0x7A
#define PMIC6B_SAR_RD_IBAT_LAST 0x7B
#define PMIC6B_SAR_RD_VBAT_OFF 0x7C
#define PMIC6B_SAR_RD_VBAT_ACTIVE 0x7D
#define PMIC6B_SAR_RD_MANUAL 0x7E
#define PMIC6B_SAR_RD_IBAT_CHG0 0x7F
#define PMIC6B_SAR_RD_IBAT_CHG1 0x80
#define PMIC6B_SAR_RD_IBAT_CHG2 0x81
#define PMIC6B_SAR_RD_IBAT_DISCHG0 0x82
#define PMIC6B_SAR_RD_IBAT_DISCHG1 0x83
#define PMIC6B_SAR_RD_IBAT_DISCHG2 0x84
#define PMIC6B_SAR_RD_IBAT_CNT_CHG0 0x85
#define PMIC6B_SAR_RD_IBAT_CNT_CHG1 0x86
#define PMIC6B_SAR_RD_IBAT_CNT_DISCHG0 0x87
#define PMIC6B_SAR_RD_IBAT_CNT_DISCHG1 0x88
#define PMIC6B_SAR_RD_IBAT_LAST_RAW 0x89
#define PMIC6B_SAR_RD_IBA_RAW_CHG0 0X8A
#define PMIC6B_SAR_RD_IBA_RAW_CHG1 0x8B
#define PMIC6B_SAR_RD_IBA_RAW_CHG2 0x8C
#define PMIC6B_SAR_RD_IBAT_RAW_DISCHG0 0x8D
#define PMIC6B_SAR_RD_IBAT_RAW_DISCHG1 0x8E
#define PMIC6B_SAR_RD_IBAT_RAW_DISCHG2 0x8F
#define PMIC6B_SAR_RD_RAW 0x90
#define PMIC6B_CHG_SW_SEL0 0x91
#define PMIC6B_CHG_SW_SEL1 0x92
#define PMIC6B_CHG_SW_VAL0 0x93
#define PMIC6B_CHG_SW_VAL1 0x94
#define PMIC6B_CHG_TIMER0 0x95
#define PMIC6B_CHG_TIMER1 0x96
#define PMIC6B_CHG_FSM_SET 0x97
#define PMIC6B_CHG_FSM_CLR 0x98
#define PMIC6B_CHG_OUT_SEL 0x99
#define PMIC6B_CHG_OUT_VAL 0x9A
#define PMIC6B_CHG_DA_OUT_REG 0x9B
#define PMIC6B_CHG_DA_DB_REG0 0x9C
#define PMIC6B_CHG_DA_DB_REG1 0x9D
#define PMIC6B_CHG_AD_REG0 0x9E
#define PMIC6B_CHG_AD_REG1 0x9F
#define PMIC6B_CHG_DIG_REG0 0xA0
#define PMIC6B_CHG_ADJ_CTRL 0xA1
#define PMIC6B_CHG_ERR_MASK 0xA2
#define PMIC6B_CHG_INT_MASK 0xA3
#define PMIC6B_RG_RTC_REG0 0xA4
#define PMIC6B_RG_RTC_REG1 0XA5
#define PMIC6B_RG_RTC_REG2 0xA6
#define PMIC6B_RG_RTC_REG3 0xA7
#define PMIC6B_RG_RTC_REG4 0xA8
#define PMIC6B_RG_RTC_REG5 0xA9
#define PMIC6B_RG_RTC_REG6 0xAA
#define PMIC6B_RG_RTC_REG7 0xAB
#define PMIC6B_RG_RTC_REG8 0xAC
#define PMIC6B_RG_RTC_REG9 0xAD
#define PMIC6B_RG_RTC_REG10 0xAE
#define PMIC6B_RG_RTC_REG11 0xAF
#define PMIC6B_RG_RTC_REG12 0xB0
#define PMIC6B_RG_RTC_REG13 0xB1
#define PMIC6B_RG_RTC_REG14 0xB2
#define PMIC6B_RG_RTC_REG15 0xB3
#define PMIC6B_RG_RTC_REG16 0xB4
#define PMIC6B_RG_RTC_REG17 0xB5
#define PMIC6B_RG_RTC_REG18 0xB6
#define PMIC6B_ANALOG_REG_0 0xB7
#define PMIC6B_ANALOG_REG_1 0xB8
#define PMIC6B_ANALOG_REG_2 0xB9
#define PMIC6B_ANALOG_REG_3 0xBA
#define PMIC6B_ANALOG_REG_4 0xBB
#define PMIC6B_ANALOG_REG_5 0xBC
#define PMIC6B_ANALOG_REG_6 0xBD
#define PMIC6B_ANALOG_REG_7 0xBE
#define PMIC6B_ANALOG_REG_8 0xBF
#define PMIC6B_ANALOG_REG_9 0xC0
#define PMIC6B_ANALOG_REG_10 0xC1
#define PMIC6B_ANALOG_REG_11 0xC2
#define PMIC6B_ANALOG_REG_12 0xC3
#define PMIC6B_ANALOG_REG_13 0xC4
#define PMIC6B_ANALOG_REG_14 0xC5
#define PMIC6B_ANALOG_REG_15 0xC6
#define PMIC6B_ANALOG_REG_16 0xC7
#define PMIC6B_ANALOG_REG_17 0xC8
#define PMIC6B_ANALOG_REG_18 0xC9
#define PMIC6B_ANALOG_REG_19 0xCA
#define PMIC6B_ANALOG_REG_20 0xCB
#define PMIC6B_ANALOG_REG_21 0xCC
#define PMIC6B_ANALOG_REG_22 0xCD
#define PMIC6B_ANALOG_REG_23 0xCE
#define PMIC6B_ANALOG_REG_24 0xCF
#define PMIC6B_ANALOG_REG_25 0xD0
#define PMIC6B_ANALOG_REG_26 0xD1
#define PMIC6B_ANALOG_REG_27 0xD2
#define PMIC6B_ANALOG_REG_28 0xD3
#define PMIC6B_ANALOG_REG_29 0xD4
#define PMIC6B_ANALOG_REG_30 0xD5
#define PMIC6B_REG_MAX 0xD6
/* PMIC6 modules */
#define PMIC6B_DRVNAME_REGULATORS "pmic6b-regulators"
#define PMIC6B_DRVNAME_LEDS "pmic6b-leds"
#define PMIC6B_DRVNAME_WATCHDOG "pmic6b-watchdog"
#define PMIC6B_DRVNAME_ONKEY "pmic6b-pwrkey"
#define PMIC6B_DRVNAME_BATTERY "pmic6b-battery"
#define PMIC6B_DRVNAME_GPIO "pmic6b-gpio"
#define PMIC6B_DRVNAME_RTC "pmic6b-rtc"
#define PMIC6B_DCDC1_VOLTAGE_NUM 0x39
#define PMIC6B_DCDC2_VOLTAGE_NUM 0x59
#define PMIC6B_DCDC3_VOLTAGE_NUM 5
#define PMIC6B_LDO1_VOLTAGE_NUM 16
#define PMIC6B_LDO2_VOLTAGE_NUM 0x3f
#define PMIC6B_LDO3_VOLTAGE_NUM 0x3c
#define IRQ_MASK_BITS_POS_16 0x0
#define IRQ_MASK_BITS_POS_17 0x1
#define IRQ_MASK_BITS_POS_18 0x2
#define IRQ_MASK_BITS_POS_19 0x3
#define IRQ_MASK_BITS_POS_20 0x4
#define IRQ_MASK_BITS_POS_21 0x5
#define IRQ_MASK_BITS_POS_22 0x6
#define IRQ_MASK_BITS_POS_23 0x7
#define IRQ_MASK_BITS_POS_24 0x8
#define IRQ_MASK_BITS_POS_25 0x9
#define IRQ_MASK_BITS_POS_26 0xA
#define IRQ_MASK_BITS_POS_27 0xB
#define IRQ_MASK_BITS_POS_28 0xC
#define IRQ_MASK_BITS_POS_29 0xD
#define IRQ_MASK_BITS_POS_30 0xE
#define IRQ_MASK_BITS_POS_31 0xF
#define CALENDAR_EN_MASK_BITS_POS 0x9
#define ALARM_WKP_EN_MASK_BITS_POS 0xA
#define ALARM_CLEAN_MASK_BITS_POS 0x8
#define ALARM_SEL_POS 0xE
#define ALARM_SEL_DATE_HOUR_MIN_SEC 0x0
#define ALARM_SEL_MIN_SEC 0x1
#define ALARM_SEL_HOUR_MIN_SEC 0x2
#define ALARM_SEL_DAY_HOUR_MIN_SEC 0x3
#define CALENDAR_SEC_MASK_BITS 0x3F
#define CALENDAR_SEC_MASK_POS 0x0
#define CALENDAR_MIN_MASK_BITS 0x3F
#define CALENDAR_MIN_MASK_POS 0x8
#define CALENDAR_HOUR_MASK_BITS 0x1F
#define CALENDAR_HOUR_MASK_POS 0x0
#define CALENDAR_DAY_MASK_BITS 0x1F
#define CALENDAR_DAY_MASK_POS 0x8
#define CALENDAR_WEEK_MASK_BITS 0x7
#define CALENDAR_WEEK_MASK_POS 0x0
#define CALENDAR_MON_MASK_BITS 0x7
#define CALENDAR_MON_MASK_POS 0x8
#define CALENDAR_YEAR_MASK_BITS 0xFFF
#define CALENDAR_YEAR_MASK_POS 0x0
#define CALENDAR_TIME_SET_POS 0x0
#define CALENDAR_ALARM_SET_POS 0x4
#define CALENDAR_ALARM_CLEAN_POS 0x4
enum {
PMIC6B_DCDC1,
PMIC6B_DCDC2,
PMIC6B_DCDC3,
PMIC6B_LDO1,
PMIC6B_LDO2,
PMIC6B_LDO3,
PMIC6B_REGU_MAX,
};
/* Interrupts */
enum pmic6b_irqs {
PMIC6B_RTC_IRQ = 0,
PMIC6B_IRQ_CHG_ERROR,
PMIC6B_IRQ_CHG_BAT_OCOV,
PMIC6B_IRQ_CHG_EOC,
PMIC6B_IRQ_CHG_NOBAT,
PMIC6B_IRQ_CHG_CHGING,
PMIC6B_IRQ_CHG_BAT_TEMP,
PMIC6B_IRQ_CHG_TIMEOUT,
PMIC6B_IRQ_CHG_STATE_DIFF,
PMIC6B_IRQ_CHG_PLUGOUT,
PMIC6B_IRQ_CHG_PLUGIN,
PMIC6B_DC1_OC_SP,
PMIC6B_DC2_OC_SP,
PMIC6B_DC3_OC_SP,
PMIC6B_LDO1_OV_SP,
PMIC6B_LDO1_UV_SP,
PMIC6B_LDO1_OC_SP,
PMIC6B_LDO2_UV_SP,
PMIC6B_LDO2_OC_SP,
PMIC6B_LDO3_OV_SP,
PMIC6B_LDO3_UV_SP,
PMIC6B_LDO3_OC_SP,
PMIC6B_DCIN_OVP_DB,
PMIC6B_DCIN_UVLO_DB,
PMIC6B_SYS_UVLO_DB,
PMIC6B_SYS_OVP_DB,
PMIC6B_OTP_SHUT,
PMIC6B_RTC_TRING_DEEP_SLEEP,
PMIC6B_RTC_TRING_SLEEP,
PMIC6B_RTC_WAKE_UP,
PMIC6B_PWR_KEY_PRESS,
PMIC6B_SAR_IRQ,
};
struct meson_pmic6b {
/* Device */
struct device *dev;
unsigned int flags;
/* Control interface */
struct regmap *regmap;
/* Interrupts */
int chip_irq;
unsigned int irq_base;
struct regmap_irq_chip_data *regmap_irq;
};
/* Regulators platform data */
struct pmic6b_regulator_data {
int id;
struct regulator_init_data *initdata;
};
struct pmic6b_regulators_pdata {
unsigned int n_regulators;
struct pmic6b_regulator_data *regulator_data;
};
/* PMIC6 platform data */
struct pmic6b_pdata {
int (*init)(struct meson_pmic6b *pmic6b);
int irq_base;
int key_power;
unsigned int flags;
struct pmic6b_regulators_pdata *regulators_pdata;
struct led_platform_data *leds_pdata;
};
#endif /* _MESON_PMIC6B_H */