2019-05-27 09:55:01 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2011-05-03 01:19:46 +04:00
/*
2019-01-13 21:36:42 +03:00
* tps65910 . c - - TI TPS6591x chip family multi - function driver
2011-05-03 01:19:46 +04:00
*
* Copyright 2010 Texas Instruments Inc .
*
* Author : Graeme Gregory < gg @ slimlogic . co . uk >
* Author : Jorge Eduardo Candelaria < jedu @ slimlogic . co . uk >
*/
# include <linux/init.h>
2012-02-21 16:51:34 +04:00
# include <linux/err.h>
2011-05-03 01:19:46 +04:00
# include <linux/slab.h>
# include <linux/i2c.h>
2012-11-13 18:03:58 +04:00
# include <linux/interrupt.h>
# include <linux/irq.h>
# include <linux/irqdomain.h>
2011-05-03 01:19:46 +04:00
# include <linux/mfd/core.h>
2012-02-21 16:51:34 +04:00
# include <linux/regmap.h>
2011-05-03 01:19:46 +04:00
# include <linux/mfd/tps65910.h>
2013-10-16 12:56:55 +04:00
# include <linux/of.h>
2012-05-11 13:36:26 +04:00
# include <linux/of_device.h>
2011-05-03 01:19:46 +04:00
2020-09-22 22:26:54 +03:00
static const struct resource rtc_resources [ ] = {
2012-09-21 14:55:36 +04:00
{
. start = TPS65910_IRQ_RTC_ALARM ,
. end = TPS65910_IRQ_RTC_ALARM ,
. flags = IORESOURCE_IRQ ,
}
} ;
2013-11-18 17:33:02 +04:00
static const struct mfd_cell tps65910s [ ] = {
2012-05-11 17:07:44 +04:00
{
. name = " tps65910-gpio " ,
} ,
2011-05-03 01:19:46 +04:00
{
. name = " tps65910-pmic " ,
} ,
{
. name = " tps65910-rtc " ,
2012-09-21 14:55:36 +04:00
. num_resources = ARRAY_SIZE ( rtc_resources ) ,
. resources = & rtc_resources [ 0 ] ,
2011-05-03 01:19:46 +04:00
} ,
{
. name = " tps65910-power " ,
} ,
} ;
2012-11-13 18:03:58 +04:00
static const struct regmap_irq tps65911_irqs [ ] = {
/* INT_STS */
[ TPS65911_IRQ_PWRHOLD_F ] = {
. mask = INT_MSK_PWRHOLD_F_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65911_IRQ_VBAT_VMHI ] = {
. mask = INT_MSK_VMBHI_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65911_IRQ_PWRON ] = {
. mask = INT_MSK_PWRON_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65911_IRQ_PWRON_LP ] = {
. mask = INT_MSK_PWRON_LP_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65911_IRQ_PWRHOLD_R ] = {
. mask = INT_MSK_PWRHOLD_R_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65911_IRQ_HOTDIE ] = {
. mask = INT_MSK_HOTDIE_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65911_IRQ_RTC_ALARM ] = {
. mask = INT_MSK_RTC_ALARM_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65911_IRQ_RTC_PERIOD ] = {
. mask = INT_MSK_RTC_PERIOD_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
/* INT_STS2 */
[ TPS65911_IRQ_GPIO0_R ] = {
. mask = INT_MSK2_GPIO0_R_IT_MSK_MASK ,
. reg_offset = 1 ,
} ,
[ TPS65911_IRQ_GPIO0_F ] = {
. mask = INT_MSK2_GPIO0_F_IT_MSK_MASK ,
. reg_offset = 1 ,
} ,
[ TPS65911_IRQ_GPIO1_R ] = {
. mask = INT_MSK2_GPIO1_R_IT_MSK_MASK ,
. reg_offset = 1 ,
} ,
[ TPS65911_IRQ_GPIO1_F ] = {
. mask = INT_MSK2_GPIO1_F_IT_MSK_MASK ,
. reg_offset = 1 ,
} ,
[ TPS65911_IRQ_GPIO2_R ] = {
. mask = INT_MSK2_GPIO2_R_IT_MSK_MASK ,
. reg_offset = 1 ,
} ,
[ TPS65911_IRQ_GPIO2_F ] = {
. mask = INT_MSK2_GPIO2_F_IT_MSK_MASK ,
. reg_offset = 1 ,
} ,
[ TPS65911_IRQ_GPIO3_R ] = {
. mask = INT_MSK2_GPIO3_R_IT_MSK_MASK ,
. reg_offset = 1 ,
} ,
[ TPS65911_IRQ_GPIO3_F ] = {
. mask = INT_MSK2_GPIO3_F_IT_MSK_MASK ,
. reg_offset = 1 ,
} ,
/* INT_STS2 */
[ TPS65911_IRQ_GPIO4_R ] = {
. mask = INT_MSK3_GPIO4_R_IT_MSK_MASK ,
. reg_offset = 2 ,
} ,
[ TPS65911_IRQ_GPIO4_F ] = {
. mask = INT_MSK3_GPIO4_F_IT_MSK_MASK ,
. reg_offset = 2 ,
} ,
[ TPS65911_IRQ_GPIO5_R ] = {
. mask = INT_MSK3_GPIO5_R_IT_MSK_MASK ,
. reg_offset = 2 ,
} ,
[ TPS65911_IRQ_GPIO5_F ] = {
. mask = INT_MSK3_GPIO5_F_IT_MSK_MASK ,
. reg_offset = 2 ,
} ,
[ TPS65911_IRQ_WTCHDG ] = {
. mask = INT_MSK3_WTCHDG_IT_MSK_MASK ,
. reg_offset = 2 ,
} ,
[ TPS65911_IRQ_VMBCH2_H ] = {
. mask = INT_MSK3_VMBCH2_H_IT_MSK_MASK ,
. reg_offset = 2 ,
} ,
[ TPS65911_IRQ_VMBCH2_L ] = {
. mask = INT_MSK3_VMBCH2_L_IT_MSK_MASK ,
. reg_offset = 2 ,
} ,
[ TPS65911_IRQ_PWRDN ] = {
. mask = INT_MSK3_PWRDN_IT_MSK_MASK ,
. reg_offset = 2 ,
} ,
} ;
static const struct regmap_irq tps65910_irqs [ ] = {
/* INT_STS */
[ TPS65910_IRQ_VBAT_VMBDCH ] = {
. mask = TPS65910_INT_MSK_VMBDCH_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65910_IRQ_VBAT_VMHI ] = {
. mask = TPS65910_INT_MSK_VMBHI_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65910_IRQ_PWRON ] = {
. mask = TPS65910_INT_MSK_PWRON_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65910_IRQ_PWRON_LP ] = {
. mask = TPS65910_INT_MSK_PWRON_LP_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65910_IRQ_PWRHOLD ] = {
. mask = TPS65910_INT_MSK_PWRHOLD_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65910_IRQ_HOTDIE ] = {
. mask = TPS65910_INT_MSK_HOTDIE_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65910_IRQ_RTC_ALARM ] = {
. mask = TPS65910_INT_MSK_RTC_ALARM_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
[ TPS65910_IRQ_RTC_PERIOD ] = {
. mask = TPS65910_INT_MSK_RTC_PERIOD_IT_MSK_MASK ,
. reg_offset = 0 ,
} ,
/* INT_STS2 */
[ TPS65910_IRQ_GPIO_R ] = {
. mask = TPS65910_INT_MSK2_GPIO0_F_IT_MSK_MASK ,
. reg_offset = 1 ,
} ,
[ TPS65910_IRQ_GPIO_F ] = {
. mask = TPS65910_INT_MSK2_GPIO0_R_IT_MSK_MASK ,
. reg_offset = 1 ,
} ,
} ;
static struct regmap_irq_chip tps65911_irq_chip = {
. name = " tps65910 " ,
. irqs = tps65911_irqs ,
. num_irqs = ARRAY_SIZE ( tps65911_irqs ) ,
. num_regs = 3 ,
. irq_reg_stride = 2 ,
. status_base = TPS65910_INT_STS ,
. mask_base = TPS65910_INT_MSK ,
2012-11-29 10:42:12 +04:00
. ack_base = TPS65910_INT_STS ,
2012-11-13 18:03:58 +04:00
} ;
static struct regmap_irq_chip tps65910_irq_chip = {
. name = " tps65910 " ,
. irqs = tps65910_irqs ,
. num_irqs = ARRAY_SIZE ( tps65910_irqs ) ,
. num_regs = 2 ,
. irq_reg_stride = 2 ,
. status_base = TPS65910_INT_STS ,
. mask_base = TPS65910_INT_MSK ,
2012-11-29 10:42:12 +04:00
. ack_base = TPS65910_INT_STS ,
2012-11-13 18:03:58 +04:00
} ;
static int tps65910_irq_init ( struct tps65910 * tps65910 , int irq ,
struct tps65910_platform_data * pdata )
{
2018-03-09 11:06:14 +03:00
int ret ;
2012-11-13 18:03:58 +04:00
static struct regmap_irq_chip * tps6591x_irqs_chip ;
if ( ! irq ) {
dev_warn ( tps65910 - > dev , " No interrupt support, no core IRQ \n " ) ;
return - EINVAL ;
}
if ( ! pdata ) {
dev_warn ( tps65910 - > dev , " No interrupt support, no pdata \n " ) ;
return - EINVAL ;
}
switch ( tps65910_chip_id ( tps65910 ) ) {
case TPS65910 :
tps6591x_irqs_chip = & tps65910_irq_chip ;
break ;
case TPS65911 :
tps6591x_irqs_chip = & tps65911_irq_chip ;
break ;
}
tps65910 - > chip_irq = irq ;
2016-04-21 15:25:57 +03:00
ret = devm_regmap_add_irq_chip ( tps65910 - > dev , tps65910 - > regmap ,
tps65910 - > chip_irq ,
IRQF_ONESHOT , pdata - > irq_base ,
tps6591x_irqs_chip , & tps65910 - > irq_data ) ;
2014-03-12 19:50:44 +04:00
if ( ret < 0 ) {
2012-11-13 18:03:58 +04:00
dev_warn ( tps65910 - > dev , " Failed to add irq_chip %d \n " , ret ) ;
2014-03-12 19:50:44 +04:00
tps65910 - > chip_irq = 0 ;
}
2012-11-13 18:03:58 +04:00
return ret ;
}
2012-02-21 16:51:34 +04:00
static bool is_volatile_reg ( struct device * dev , unsigned int reg )
{
struct tps65910 * tps65910 = dev_get_drvdata ( dev ) ;
/*
* Caching all regulator registers .
* All regualator register address range is same for
* TPS65910 and TPS65911
*/
if ( ( reg > = TPS65910_VIO ) & & ( reg < = TPS65910_VDAC ) ) {
/* Check for non-existing register */
if ( tps65910_chip_id ( tps65910 ) = = TPS65910 )
if ( ( reg = = TPS65911_VDDCTRL_OP ) | |
( reg = = TPS65911_VDDCTRL_SR ) )
return true ;
return false ;
}
return true ;
}
2012-03-07 17:16:05 +04:00
static const struct regmap_config tps65910_regmap_config = {
2012-02-21 16:51:34 +04:00
. reg_bits = 8 ,
. val_bits = 8 ,
. volatile_reg = is_volatile_reg ,
2012-05-09 17:10:54 +04:00
. max_register = TPS65910_MAX_REGISTER - 1 ,
2012-02-21 16:51:34 +04:00
. cache_type = REGCACHE_RBTREE ,
} ;
2012-11-19 22:23:04 +04:00
static int tps65910_ck32k_init ( struct tps65910 * tps65910 ,
2012-06-28 14:20:21 +04:00
struct tps65910_board * pmic_pdata )
{
int ret ;
2012-07-11 17:44:33 +04:00
if ( ! pmic_pdata - > en_ck32k_xtal )
return 0 ;
2020-09-27 02:59:17 +03:00
ret = regmap_clear_bits ( tps65910 - > regmap , TPS65910_DEVCTRL ,
mfd: tps65910: Fix a bunch of alignment issues reported-by Checkpatch
CHECK: Alignment should match open parenthesis
#24: FILE: drivers/mfd/tps65910.c:296:
+ ret = regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_CK32K_CTRL_MASK);
CHECK: Alignment should match open parenthesis
#33: FILE: drivers/mfd/tps65910.c:318:
+ ret = regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#42: FILE: drivers/mfd/tps65910.c:326:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#51: FILE: drivers/mfd/tps65910.c:336:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#60: FILE: drivers/mfd/tps65910.c:346:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#69: FILE: drivers/mfd/tps65910.c:358:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#78: FILE: drivers/mfd/tps65910.c:440:
+ if (regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_PWR_OFF_MASK) < 0)
CHECK: Alignment should match open parenthesis
#83: FILE: drivers/mfd/tps65910.c:444:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_ON_MASK);
Signed-off-by: Lee Jones <lee.jones@linaro.org>
2020-11-04 17:49:05 +03:00
DEVCTRL_CK32K_CTRL_MASK ) ;
2012-07-11 17:44:33 +04:00
if ( ret < 0 ) {
dev_err ( tps65910 - > dev , " clear ck32k_ctrl failed: %d \n " , ret ) ;
return ret ;
2012-06-28 14:20:21 +04:00
}
return 0 ;
}
2012-11-19 22:23:04 +04:00
static int tps65910_sleepinit ( struct tps65910 * tps65910 ,
2012-04-18 14:13:51 +04:00
struct tps65910_board * pmic_pdata )
{
2018-03-09 11:10:09 +03:00
struct device * dev ;
2018-03-09 11:06:14 +03:00
int ret ;
2012-04-18 14:13:51 +04:00
if ( ! pmic_pdata - > en_dev_slp )
return 0 ;
2018-03-09 11:19:42 +03:00
dev = tps65910 - > dev ;
2012-04-18 14:13:51 +04:00
/* enabling SLEEP device state */
2020-09-27 02:59:17 +03:00
ret = regmap_set_bits ( tps65910 - > regmap , TPS65910_DEVCTRL ,
mfd: tps65910: Fix a bunch of alignment issues reported-by Checkpatch
CHECK: Alignment should match open parenthesis
#24: FILE: drivers/mfd/tps65910.c:296:
+ ret = regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_CK32K_CTRL_MASK);
CHECK: Alignment should match open parenthesis
#33: FILE: drivers/mfd/tps65910.c:318:
+ ret = regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#42: FILE: drivers/mfd/tps65910.c:326:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#51: FILE: drivers/mfd/tps65910.c:336:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#60: FILE: drivers/mfd/tps65910.c:346:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#69: FILE: drivers/mfd/tps65910.c:358:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#78: FILE: drivers/mfd/tps65910.c:440:
+ if (regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_PWR_OFF_MASK) < 0)
CHECK: Alignment should match open parenthesis
#83: FILE: drivers/mfd/tps65910.c:444:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_ON_MASK);
Signed-off-by: Lee Jones <lee.jones@linaro.org>
2020-11-04 17:49:05 +03:00
DEVCTRL_DEV_SLP_MASK ) ;
2012-04-18 14:13:51 +04:00
if ( ret < 0 ) {
dev_err ( dev , " set dev_slp failed: %d \n " , ret ) ;
goto err_sleep_init ;
}
2017-06-14 22:04:14 +03:00
if ( pmic_pdata - > slp_keepon . therm_keepon ) {
2020-09-27 02:59:17 +03:00
ret = regmap_set_bits ( tps65910 - > regmap ,
mfd: tps65910: Fix a bunch of alignment issues reported-by Checkpatch
CHECK: Alignment should match open parenthesis
#24: FILE: drivers/mfd/tps65910.c:296:
+ ret = regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_CK32K_CTRL_MASK);
CHECK: Alignment should match open parenthesis
#33: FILE: drivers/mfd/tps65910.c:318:
+ ret = regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#42: FILE: drivers/mfd/tps65910.c:326:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#51: FILE: drivers/mfd/tps65910.c:336:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#60: FILE: drivers/mfd/tps65910.c:346:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#69: FILE: drivers/mfd/tps65910.c:358:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#78: FILE: drivers/mfd/tps65910.c:440:
+ if (regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_PWR_OFF_MASK) < 0)
CHECK: Alignment should match open parenthesis
#83: FILE: drivers/mfd/tps65910.c:444:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_ON_MASK);
Signed-off-by: Lee Jones <lee.jones@linaro.org>
2020-11-04 17:49:05 +03:00
TPS65910_SLEEP_KEEP_RES_ON ,
SLEEP_KEEP_RES_ON_THERM_KEEPON_MASK ) ;
2012-04-18 14:13:51 +04:00
if ( ret < 0 ) {
dev_err ( dev , " set therm_keepon failed: %d \n " , ret ) ;
goto disable_dev_slp ;
}
}
2017-06-14 22:04:14 +03:00
if ( pmic_pdata - > slp_keepon . clkout32k_keepon ) {
2020-09-27 02:59:17 +03:00
ret = regmap_set_bits ( tps65910 - > regmap ,
mfd: tps65910: Fix a bunch of alignment issues reported-by Checkpatch
CHECK: Alignment should match open parenthesis
#24: FILE: drivers/mfd/tps65910.c:296:
+ ret = regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_CK32K_CTRL_MASK);
CHECK: Alignment should match open parenthesis
#33: FILE: drivers/mfd/tps65910.c:318:
+ ret = regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#42: FILE: drivers/mfd/tps65910.c:326:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#51: FILE: drivers/mfd/tps65910.c:336:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#60: FILE: drivers/mfd/tps65910.c:346:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#69: FILE: drivers/mfd/tps65910.c:358:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#78: FILE: drivers/mfd/tps65910.c:440:
+ if (regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_PWR_OFF_MASK) < 0)
CHECK: Alignment should match open parenthesis
#83: FILE: drivers/mfd/tps65910.c:444:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_ON_MASK);
Signed-off-by: Lee Jones <lee.jones@linaro.org>
2020-11-04 17:49:05 +03:00
TPS65910_SLEEP_KEEP_RES_ON ,
SLEEP_KEEP_RES_ON_CLKOUT32K_KEEPON_MASK ) ;
2012-04-18 14:13:51 +04:00
if ( ret < 0 ) {
dev_err ( dev , " set clkout32k_keepon failed: %d \n " , ret ) ;
goto disable_dev_slp ;
}
}
2017-06-14 22:04:14 +03:00
if ( pmic_pdata - > slp_keepon . i2chs_keepon ) {
2020-09-27 02:59:17 +03:00
ret = regmap_set_bits ( tps65910 - > regmap ,
mfd: tps65910: Fix a bunch of alignment issues reported-by Checkpatch
CHECK: Alignment should match open parenthesis
#24: FILE: drivers/mfd/tps65910.c:296:
+ ret = regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_CK32K_CTRL_MASK);
CHECK: Alignment should match open parenthesis
#33: FILE: drivers/mfd/tps65910.c:318:
+ ret = regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#42: FILE: drivers/mfd/tps65910.c:326:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#51: FILE: drivers/mfd/tps65910.c:336:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#60: FILE: drivers/mfd/tps65910.c:346:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#69: FILE: drivers/mfd/tps65910.c:358:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#78: FILE: drivers/mfd/tps65910.c:440:
+ if (regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_PWR_OFF_MASK) < 0)
CHECK: Alignment should match open parenthesis
#83: FILE: drivers/mfd/tps65910.c:444:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_ON_MASK);
Signed-off-by: Lee Jones <lee.jones@linaro.org>
2020-11-04 17:49:05 +03:00
TPS65910_SLEEP_KEEP_RES_ON ,
SLEEP_KEEP_RES_ON_I2CHS_KEEPON_MASK ) ;
2012-04-18 14:13:51 +04:00
if ( ret < 0 ) {
dev_err ( dev , " set i2chs_keepon failed: %d \n " , ret ) ;
goto disable_dev_slp ;
}
}
return 0 ;
disable_dev_slp :
2020-09-27 02:59:17 +03:00
regmap_clear_bits ( tps65910 - > regmap , TPS65910_DEVCTRL ,
mfd: tps65910: Fix a bunch of alignment issues reported-by Checkpatch
CHECK: Alignment should match open parenthesis
#24: FILE: drivers/mfd/tps65910.c:296:
+ ret = regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_CK32K_CTRL_MASK);
CHECK: Alignment should match open parenthesis
#33: FILE: drivers/mfd/tps65910.c:318:
+ ret = regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#42: FILE: drivers/mfd/tps65910.c:326:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#51: FILE: drivers/mfd/tps65910.c:336:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#60: FILE: drivers/mfd/tps65910.c:346:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#69: FILE: drivers/mfd/tps65910.c:358:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#78: FILE: drivers/mfd/tps65910.c:440:
+ if (regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_PWR_OFF_MASK) < 0)
CHECK: Alignment should match open parenthesis
#83: FILE: drivers/mfd/tps65910.c:444:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_ON_MASK);
Signed-off-by: Lee Jones <lee.jones@linaro.org>
2020-11-04 17:49:05 +03:00
DEVCTRL_DEV_SLP_MASK ) ;
2012-04-18 14:13:51 +04:00
err_sleep_init :
return ret ;
}
2012-05-11 13:36:26 +04:00
# ifdef CONFIG_OF
2014-05-07 12:15:48 +04:00
static const struct of_device_id tps65910_of_match [ ] = {
2012-05-11 13:36:26 +04:00
{ . compatible = " ti,tps65910 " , . data = ( void * ) TPS65910 } ,
{ . compatible = " ti,tps65911 " , . data = ( void * ) TPS65911 } ,
{ } ,
} ;
static struct tps65910_board * tps65910_parse_dt ( struct i2c_client * client ,
2014-07-02 17:34:13 +04:00
unsigned long * chip_id )
2012-05-11 13:36:26 +04:00
{
struct device_node * np = client - > dev . of_node ;
struct tps65910_board * board_info ;
unsigned int prop ;
const struct of_device_id * match ;
2018-03-09 11:06:14 +03:00
int ret ;
2012-05-11 13:36:26 +04:00
match = of_match_device ( tps65910_of_match , & client - > dev ) ;
if ( ! match ) {
dev_err ( & client - > dev , " Failed to find matching dt id \n " ) ;
return NULL ;
}
2014-07-02 17:34:13 +04:00
* chip_id = ( unsigned long ) match - > data ;
2012-05-11 13:36:26 +04:00
board_info = devm_kzalloc ( & client - > dev , sizeof ( * board_info ) ,
GFP_KERNEL ) ;
2018-03-09 11:00:59 +03:00
if ( ! board_info )
2012-05-11 13:36:26 +04:00
return NULL ;
ret = of_property_read_u32 ( np , " ti,vmbch-threshold " , & prop ) ;
if ( ! ret )
board_info - > vmbch_threshold = prop ;
ret = of_property_read_u32 ( np , " ti,vmbch2-threshold " , & prop ) ;
if ( ! ret )
board_info - > vmbch2_threshold = prop ;
2012-06-28 14:20:22 +04:00
prop = of_property_read_bool ( np , " ti,en-ck32k-xtal " ) ;
board_info - > en_ck32k_xtal = prop ;
2017-06-14 22:04:14 +03:00
prop = of_property_read_bool ( np , " ti,sleep-enable " ) ;
board_info - > en_dev_slp = prop ;
prop = of_property_read_bool ( np , " ti,sleep-keep-therm " ) ;
board_info - > slp_keepon . therm_keepon = prop ;
prop = of_property_read_bool ( np , " ti,sleep-keep-ck32k " ) ;
board_info - > slp_keepon . clkout32k_keepon = prop ;
prop = of_property_read_bool ( np , " ti,sleep-keep-hsclk " ) ;
board_info - > slp_keepon . i2chs_keepon = prop ;
2012-05-11 13:36:26 +04:00
board_info - > irq = client - > irq ;
board_info - > irq_base = - 1 ;
2012-08-20 05:07:56 +04:00
board_info - > pm_off = of_property_read_bool ( np ,
" ti,system-power-controller " ) ;
2012-05-11 13:36:26 +04:00
return board_info ;
}
# else
2012-05-11 17:10:28 +04:00
static inline
struct tps65910_board * tps65910_parse_dt ( struct i2c_client * client ,
2014-07-02 17:34:13 +04:00
unsigned long * chip_id )
2012-05-11 13:36:26 +04:00
{
return NULL ;
}
# endif
2012-04-18 14:13:51 +04:00
2012-08-20 05:07:56 +04:00
static struct i2c_client * tps65910_i2c_client ;
static void tps65910_power_off ( void )
{
struct tps65910 * tps65910 ;
tps65910 = dev_get_drvdata ( & tps65910_i2c_client - > dev ) ;
2020-11-15 23:45:05 +03:00
/*
* The PWR_OFF bit needs to be set separately , before transitioning
* to the OFF state . It enables the " sequential " power - off mode on
* TPS65911 , it ' s a NO - OP on TPS65910 .
*/
2020-09-27 02:59:17 +03:00
if ( regmap_set_bits ( tps65910 - > regmap , TPS65910_DEVCTRL ,
mfd: tps65910: Fix a bunch of alignment issues reported-by Checkpatch
CHECK: Alignment should match open parenthesis
#24: FILE: drivers/mfd/tps65910.c:296:
+ ret = regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_CK32K_CTRL_MASK);
CHECK: Alignment should match open parenthesis
#33: FILE: drivers/mfd/tps65910.c:318:
+ ret = regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#42: FILE: drivers/mfd/tps65910.c:326:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#51: FILE: drivers/mfd/tps65910.c:336:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#60: FILE: drivers/mfd/tps65910.c:346:
+ ret = regmap_set_bits(tps65910->regmap,
TPS65910_SLEEP_KEEP_RES_ON,
CHECK: Alignment should match open parenthesis
#69: FILE: drivers/mfd/tps65910.c:358:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_SLP_MASK);
CHECK: Alignment should match open parenthesis
#78: FILE: drivers/mfd/tps65910.c:440:
+ if (regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_PWR_OFF_MASK) < 0)
CHECK: Alignment should match open parenthesis
#83: FILE: drivers/mfd/tps65910.c:444:
+ regmap_clear_bits(tps65910->regmap, TPS65910_DEVCTRL,
DEVCTRL_DEV_ON_MASK);
Signed-off-by: Lee Jones <lee.jones@linaro.org>
2020-11-04 17:49:05 +03:00
DEVCTRL_PWR_OFF_MASK ) < 0 )
2012-08-20 05:07:56 +04:00
return ;
2020-11-15 23:45:05 +03:00
regmap_update_bits ( tps65910 - > regmap , TPS65910_DEVCTRL ,
DEVCTRL_DEV_OFF_MASK | DEVCTRL_DEV_ON_MASK ,
DEVCTRL_DEV_OFF_MASK ) ;
2012-08-20 05:07:56 +04:00
}
2012-11-19 22:23:04 +04:00
static int tps65910_i2c_probe ( struct i2c_client * i2c ,
2014-07-02 17:34:13 +04:00
const struct i2c_device_id * id )
2011-05-03 01:19:46 +04:00
{
struct tps65910 * tps65910 ;
2011-05-03 01:19:52 +04:00
struct tps65910_board * pmic_plat_data ;
2012-05-19 00:31:41 +04:00
struct tps65910_board * of_pmic_plat_data = NULL ;
2011-05-03 01:20:04 +04:00
struct tps65910_platform_data * init_data ;
2014-07-02 17:34:13 +04:00
unsigned long chip_id = id - > driver_data ;
2018-03-09 11:06:14 +03:00
int ret ;
2011-05-03 01:19:46 +04:00
2011-05-03 01:19:52 +04:00
pmic_plat_data = dev_get_platdata ( & i2c - > dev ) ;
2012-05-11 13:36:26 +04:00
2012-05-19 00:31:41 +04:00
if ( ! pmic_plat_data & & i2c - > dev . of_node ) {
2012-05-11 13:36:26 +04:00
pmic_plat_data = tps65910_parse_dt ( i2c , & chip_id ) ;
2012-05-19 00:31:41 +04:00
of_pmic_plat_data = pmic_plat_data ;
}
2012-05-11 13:36:26 +04:00
2011-05-03 01:19:52 +04:00
if ( ! pmic_plat_data )
return - EINVAL ;
2012-05-11 14:36:57 +04:00
init_data = devm_kzalloc ( & i2c - > dev , sizeof ( * init_data ) , GFP_KERNEL ) ;
2011-05-03 01:20:04 +04:00
if ( init_data = = NULL )
return - ENOMEM ;
2012-05-11 14:36:57 +04:00
tps65910 = devm_kzalloc ( & i2c - > dev , sizeof ( * tps65910 ) , GFP_KERNEL ) ;
if ( tps65910 = = NULL )
2011-05-03 01:19:46 +04:00
return - ENOMEM ;
2012-05-19 00:31:41 +04:00
tps65910 - > of_plat_data = of_pmic_plat_data ;
2011-05-03 01:19:46 +04:00
i2c_set_clientdata ( i2c , tps65910 ) ;
tps65910 - > dev = & i2c - > dev ;
tps65910 - > i2c_client = i2c ;
2012-05-11 13:36:26 +04:00
tps65910 - > id = chip_id ;
2011-05-03 01:19:46 +04:00
2014-08-22 19:30:56 +04:00
/* Work around silicon erratum SWCZ010: the tps65910 may miss the
* first I2C transfer . So issue a dummy transfer before the first
* real transfer .
*/
i2c_master_send ( i2c , " " , 1 ) ;
2012-05-11 14:36:57 +04:00
tps65910 - > regmap = devm_regmap_init_i2c ( i2c , & tps65910_regmap_config ) ;
2012-02-21 16:51:34 +04:00
if ( IS_ERR ( tps65910 - > regmap ) ) {
ret = PTR_ERR ( tps65910 - > regmap ) ;
dev_err ( & i2c - > dev , " regmap initialization failed: %d \n " , ret ) ;
2012-05-11 14:36:57 +04:00
return ret ;
2012-02-21 16:51:34 +04:00
}
2011-07-14 01:22:26 +04:00
init_data - > irq = pmic_plat_data - > irq ;
2012-01-18 18:49:16 +04:00
init_data - > irq_base = pmic_plat_data - > irq_base ;
2011-07-14 01:22:26 +04:00
2011-12-14 14:35:35 +04:00
tps65910_irq_init ( tps65910 , init_data - > irq , init_data ) ;
2012-07-11 17:44:33 +04:00
tps65910_ck32k_init ( tps65910 , pmic_plat_data ) ;
2012-04-18 14:13:51 +04:00
tps65910_sleepinit ( tps65910 , pmic_plat_data ) ;
2012-08-20 05:07:56 +04:00
if ( pmic_plat_data - > pm_off & & ! pm_power_off ) {
tps65910_i2c_client = i2c ;
pm_power_off = tps65910_power_off ;
}
2016-04-07 21:43:13 +03:00
ret = devm_mfd_add_devices ( tps65910 - > dev , - 1 ,
tps65910s , ARRAY_SIZE ( tps65910s ) ,
NULL , 0 ,
regmap_irq_get_domain ( tps65910 - > irq_data ) ) ;
2012-11-13 18:03:56 +04:00
if ( ret < 0 ) {
dev_err ( & i2c - > dev , " mfd_add_devices failed: %d \n " , ret ) ;
return ret ;
}
2011-05-03 01:19:46 +04:00
return ret ;
}
static const struct i2c_device_id tps65910_i2c_id [ ] = {
2011-05-17 03:34:59 +04:00
{ " tps65910 " , TPS65910 } ,
{ " tps65911 " , TPS65911 } ,
2011-05-03 01:19:46 +04:00
{ }
} ;
static struct i2c_driver tps65910_i2c_driver = {
. driver = {
. name = " tps65910 " ,
2012-05-11 13:36:26 +04:00
. of_match_table = of_match_ptr ( tps65910_of_match ) ,
2011-05-03 01:19:46 +04:00
} ,
. probe = tps65910_i2c_probe ,
. id_table = tps65910_i2c_id ,
} ;
static int __init tps65910_i2c_init ( void )
{
return i2c_add_driver ( & tps65910_i2c_driver ) ;
}
/* init early so consumer devices can complete system boot */
subsys_initcall ( tps65910_i2c_init ) ;