2022-06-07 17:11:31 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2016-01-25 18:43:45 +03:00
/*
* Core functions for TI TPS65912x PMICs
*
2020-07-22 22:24:54 +03:00
* Copyright ( C ) 2015 Texas Instruments Incorporated - https : //www.ti.com/
2016-01-25 18:43:45 +03:00
* Andrew F . Davis < afd @ ti . com >
*
* Based on the TPS65218 driver and the previous TPS65912 driver by
* Margarita Olaya Cabrera < magi @ slimlogic . co . uk >
*/
# include <linux/interrupt.h>
# include <linux/mfd/core.h>
# include <linux/module.h>
# include <linux/mfd/tps65912.h>
static const struct mfd_cell tps65912_cells [ ] = {
{ . name = " tps65912-regulator " , } ,
{ . name = " tps65912-gpio " , } ,
} ;
static const struct regmap_irq tps65912_irqs [ ] = {
/* INT_STS IRQs */
REGMAP_IRQ_REG ( TPS65912_IRQ_PWRHOLD_F , 0 , TPS65912_INT_STS_PWRHOLD_F ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_VMON , 0 , TPS65912_INT_STS_VMON ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PWRON , 0 , TPS65912_INT_STS_PWRON ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PWRON_LP , 0 , TPS65912_INT_STS_PWRON_LP ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PWRHOLD_R , 0 , TPS65912_INT_STS_PWRHOLD_R ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_HOTDIE , 0 , TPS65912_INT_STS_HOTDIE ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_GPIO1_R , 0 , TPS65912_INT_STS_GPIO1_R ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_GPIO1_F , 0 , TPS65912_INT_STS_GPIO1_F ) ,
/* INT_STS2 IRQs */
REGMAP_IRQ_REG ( TPS65912_IRQ_GPIO2_R , 1 , TPS65912_INT_STS2_GPIO2_R ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_GPIO2_F , 1 , TPS65912_INT_STS2_GPIO2_F ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_GPIO3_R , 1 , TPS65912_INT_STS2_GPIO3_R ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_GPIO3_F , 1 , TPS65912_INT_STS2_GPIO3_F ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_GPIO4_R , 1 , TPS65912_INT_STS2_GPIO4_R ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_GPIO4_F , 1 , TPS65912_INT_STS2_GPIO4_F ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_GPIO5_R , 1 , TPS65912_INT_STS2_GPIO5_R ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_GPIO5_F , 1 , TPS65912_INT_STS2_GPIO5_F ) ,
/* INT_STS3 IRQs */
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_DCDC1 , 2 , TPS65912_INT_STS3_PGOOD_DCDC1 ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_DCDC2 , 2 , TPS65912_INT_STS3_PGOOD_DCDC2 ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_DCDC3 , 2 , TPS65912_INT_STS3_PGOOD_DCDC3 ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_DCDC4 , 2 , TPS65912_INT_STS3_PGOOD_DCDC4 ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_LDO1 , 2 , TPS65912_INT_STS3_PGOOD_LDO1 ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_LDO2 , 2 , TPS65912_INT_STS3_PGOOD_LDO2 ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_LDO3 , 2 , TPS65912_INT_STS3_PGOOD_LDO3 ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_LDO4 , 2 , TPS65912_INT_STS3_PGOOD_LDO4 ) ,
/* INT_STS4 IRQs */
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_LDO5 , 3 , TPS65912_INT_STS4_PGOOD_LDO5 ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_LDO6 , 3 , TPS65912_INT_STS4_PGOOD_LDO6 ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_LDO7 , 3 , TPS65912_INT_STS4_PGOOD_LDO7 ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_LDO8 , 3 , TPS65912_INT_STS4_PGOOD_LDO8 ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_LDO9 , 3 , TPS65912_INT_STS4_PGOOD_LDO9 ) ,
REGMAP_IRQ_REG ( TPS65912_IRQ_PGOOD_LDO10 , 3 , TPS65912_INT_STS4_PGOOD_LDO10 ) ,
} ;
static struct regmap_irq_chip tps65912_irq_chip = {
. name = " tps65912 " ,
. irqs = tps65912_irqs ,
. num_irqs = ARRAY_SIZE ( tps65912_irqs ) ,
. num_regs = 4 ,
. irq_reg_stride = 2 ,
. mask_base = TPS65912_INT_MSK ,
. status_base = TPS65912_INT_STS ,
. ack_base = TPS65912_INT_STS ,
. init_ack_masked = true ,
} ;
2016-09-15 14:35:30 +03:00
static const struct regmap_range tps65912_yes_ranges [ ] = {
regmap_reg_range ( TPS65912_INT_STS , TPS65912_GPIO5 ) ,
} ;
static const struct regmap_access_table tps65912_volatile_table = {
. yes_ranges = tps65912_yes_ranges ,
. n_yes_ranges = ARRAY_SIZE ( tps65912_yes_ranges ) ,
} ;
const struct regmap_config tps65912_regmap_config = {
. reg_bits = 8 ,
. val_bits = 8 ,
. cache_type = REGCACHE_RBTREE ,
. volatile_table = & tps65912_volatile_table ,
} ;
EXPORT_SYMBOL_GPL ( tps65912_regmap_config ) ;
2016-01-25 18:43:45 +03:00
int tps65912_device_init ( struct tps65912 * tps )
{
int ret ;
ret = regmap_add_irq_chip ( tps - > regmap , tps - > irq , IRQF_ONESHOT , 0 ,
& tps65912_irq_chip , & tps - > irq_data ) ;
if ( ret )
return ret ;
ret = mfd_add_devices ( tps - > dev , PLATFORM_DEVID_AUTO , tps65912_cells ,
ARRAY_SIZE ( tps65912_cells ) , NULL , 0 ,
regmap_irq_get_domain ( tps - > irq_data ) ) ;
if ( ret ) {
regmap_del_irq_chip ( tps - > irq , tps - > irq_data ) ;
return ret ;
}
return 0 ;
}
EXPORT_SYMBOL_GPL ( tps65912_device_init ) ;
2021-10-12 18:39:35 +03:00
void tps65912_device_exit ( struct tps65912 * tps )
2016-01-25 18:43:45 +03:00
{
regmap_del_irq_chip ( tps - > irq , tps - > irq_data ) ;
}
EXPORT_SYMBOL_GPL ( tps65912_device_exit ) ;
MODULE_AUTHOR ( " Andrew F. Davis <afd@ti.com> " ) ;
MODULE_DESCRIPTION ( " TPS65912x MFD Driver " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;