2019-06-01 11:09:00 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2014-08-30 16:50:24 +04:00
/*
* Regulator driver for Ricoh RN5T618 PMIC
*
* Copyright ( C ) 2014 Beniamino Galvani < b . galvani @ gmail . com >
*/
# include <linux/mfd/rn5t618.h>
# include <linux/module.h>
# include <linux/of.h>
# include <linux/platform_device.h>
# include <linux/regmap.h>
# include <linux/regulator/driver.h>
# include <linux/regulator/of_regulator.h>
2017-01-28 18:22:23 +03:00
static const struct regulator_ops rn5t618_reg_ops = {
2014-08-30 16:50:24 +04:00
. enable = regulator_enable_regmap ,
. disable = regulator_disable_regmap ,
. is_enabled = regulator_is_enabled_regmap ,
. set_voltage_sel = regulator_set_voltage_sel_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
. list_voltage = regulator_list_voltage_linear ,
} ;
# define REG(rid, ereg, emask, vreg, vmask, min, max, step) \
2017-10-13 19:37:31 +03:00
{ \
2014-08-30 16:50:24 +04:00
. name = # rid , \
2014-10-09 01:19:08 +04:00
. of_match = of_match_ptr ( # rid ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
2014-08-30 16:50:24 +04:00
. id = RN5T618_ # # rid , \
. type = REGULATOR_VOLTAGE , \
. owner = THIS_MODULE , \
. ops = & rn5t618_reg_ops , \
. n_voltages = ( ( max ) - ( min ) ) / ( step ) + 1 , \
. min_uV = ( min ) , \
. uV_step = ( step ) , \
. enable_reg = RN5T618_ # # ereg , \
. enable_mask = ( emask ) , \
. vsel_reg = RN5T618_ # # vreg , \
. vsel_mask = ( vmask ) , \
}
2019-03-20 15:10:57 +03:00
static const struct regulator_desc rn5t567_regulators [ ] = {
2016-06-29 08:53:20 +03:00
/* DCDC */
REG ( DCDC1 , DC1CTL , BIT ( 0 ) , DC1DAC , 0xff , 600000 , 3500000 , 12500 ) ,
REG ( DCDC2 , DC2CTL , BIT ( 0 ) , DC2DAC , 0xff , 600000 , 3500000 , 12500 ) ,
REG ( DCDC3 , DC3CTL , BIT ( 0 ) , DC3DAC , 0xff , 600000 , 3500000 , 12500 ) ,
REG ( DCDC4 , DC4CTL , BIT ( 0 ) , DC4DAC , 0xff , 600000 , 3500000 , 12500 ) ,
/* LDO */
REG ( LDO1 , LDOEN1 , BIT ( 0 ) , LDO1DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
REG ( LDO2 , LDOEN1 , BIT ( 1 ) , LDO2DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
REG ( LDO3 , LDOEN1 , BIT ( 2 ) , LDO3DAC , 0x7f , 600000 , 3500000 , 25000 ) ,
REG ( LDO4 , LDOEN1 , BIT ( 3 ) , LDO4DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
REG ( LDO5 , LDOEN1 , BIT ( 4 ) , LDO5DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
/* LDO RTC */
REG ( LDORTC1 , LDOEN2 , BIT ( 4 ) , LDORTCDAC , 0x7f , 1200000 , 3500000 , 25000 ) ,
REG ( LDORTC2 , LDOEN2 , BIT ( 5 ) , LDORTC2DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
} ;
2019-03-20 15:10:57 +03:00
static const struct regulator_desc rn5t618_regulators [ ] = {
2014-08-30 16:50:24 +04:00
/* DCDC */
REG ( DCDC1 , DC1CTL , BIT ( 0 ) , DC1DAC , 0xff , 600000 , 3500000 , 12500 ) ,
REG ( DCDC2 , DC2CTL , BIT ( 0 ) , DC2DAC , 0xff , 600000 , 3500000 , 12500 ) ,
REG ( DCDC3 , DC3CTL , BIT ( 0 ) , DC3DAC , 0xff , 600000 , 3500000 , 12500 ) ,
/* LDO */
REG ( LDO1 , LDOEN1 , BIT ( 0 ) , LDO1DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
REG ( LDO2 , LDOEN1 , BIT ( 1 ) , LDO2DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
REG ( LDO3 , LDOEN1 , BIT ( 2 ) , LDO3DAC , 0x7f , 600000 , 3500000 , 25000 ) ,
REG ( LDO4 , LDOEN1 , BIT ( 3 ) , LDO4DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
REG ( LDO5 , LDOEN1 , BIT ( 4 ) , LDO5DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
/* LDO RTC */
REG ( LDORTC1 , LDOEN2 , BIT ( 4 ) , LDORTCDAC , 0x7f , 1700000 , 3500000 , 25000 ) ,
REG ( LDORTC2 , LDOEN2 , BIT ( 5 ) , LDORTC2DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
} ;
2019-03-20 15:10:57 +03:00
static const struct regulator_desc rc5t619_regulators [ ] = {
2017-08-27 16:58:31 +03:00
/* DCDC */
REG ( DCDC1 , DC1CTL , BIT ( 0 ) , DC1DAC , 0xff , 600000 , 3500000 , 12500 ) ,
REG ( DCDC2 , DC2CTL , BIT ( 0 ) , DC2DAC , 0xff , 600000 , 3500000 , 12500 ) ,
REG ( DCDC3 , DC3CTL , BIT ( 0 ) , DC3DAC , 0xff , 600000 , 3500000 , 12500 ) ,
REG ( DCDC4 , DC4CTL , BIT ( 0 ) , DC4DAC , 0xff , 600000 , 3500000 , 12500 ) ,
REG ( DCDC5 , DC5CTL , BIT ( 0 ) , DC5DAC , 0xff , 600000 , 3500000 , 12500 ) ,
/* LDO */
REG ( LDO1 , LDOEN1 , BIT ( 0 ) , LDO1DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
REG ( LDO2 , LDOEN1 , BIT ( 1 ) , LDO2DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
REG ( LDO3 , LDOEN1 , BIT ( 2 ) , LDO3DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
REG ( LDO4 , LDOEN1 , BIT ( 3 ) , LDO4DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
REG ( LDO5 , LDOEN1 , BIT ( 4 ) , LDO5DAC , 0x7f , 600000 , 3500000 , 25000 ) ,
REG ( LDO6 , LDOEN1 , BIT ( 5 ) , LDO6DAC , 0x7f , 600000 , 3500000 , 25000 ) ,
REG ( LDO7 , LDOEN1 , BIT ( 6 ) , LDO7DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
REG ( LDO8 , LDOEN1 , BIT ( 7 ) , LDO8DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
REG ( LDO9 , LDOEN2 , BIT ( 0 ) , LDO9DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
2019-11-13 21:26:43 +03:00
REG ( LDO10 , LDOEN2 , BIT ( 1 ) , LDO10DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
2017-08-27 16:58:31 +03:00
/* LDO RTC */
REG ( LDORTC1 , LDOEN2 , BIT ( 4 ) , LDORTCDAC , 0x7f , 1700000 , 3500000 , 25000 ) ,
REG ( LDORTC2 , LDOEN2 , BIT ( 5 ) , LDORTC2DAC , 0x7f , 900000 , 3500000 , 25000 ) ,
} ;
2014-08-30 16:50:24 +04:00
static int rn5t618_regulator_probe ( struct platform_device * pdev )
{
struct rn5t618 * rn5t618 = dev_get_drvdata ( pdev - > dev . parent ) ;
struct regulator_config config = { } ;
struct regulator_dev * rdev ;
2019-03-20 15:10:57 +03:00
const struct regulator_desc * regulators ;
2014-10-09 01:19:08 +04:00
int i ;
2017-08-27 16:58:31 +03:00
int num_regulators = 0 ;
2014-08-30 16:50:24 +04:00
2016-06-29 08:53:20 +03:00
switch ( rn5t618 - > variant ) {
case RN5T567 :
regulators = rn5t567_regulators ;
2017-08-27 16:58:31 +03:00
num_regulators = ARRAY_SIZE ( rn5t567_regulators ) ;
2016-06-29 08:53:20 +03:00
break ;
case RN5T618 :
regulators = rn5t618_regulators ;
2017-08-27 16:58:31 +03:00
num_regulators = ARRAY_SIZE ( rn5t618_regulators ) ;
break ;
case RC5T619 :
regulators = rc5t619_regulators ;
num_regulators = ARRAY_SIZE ( rc5t619_regulators ) ;
2016-06-29 08:53:20 +03:00
break ;
default :
return - EINVAL ;
}
config . dev = pdev - > dev . parent ;
config . regmap = rn5t618 - > regmap ;
2017-08-27 16:58:31 +03:00
for ( i = 0 ; i < num_regulators ; i + + ) {
2014-08-30 16:50:24 +04:00
rdev = devm_regulator_register ( & pdev - > dev ,
2016-06-29 08:53:20 +03:00
& regulators [ i ] ,
2014-08-30 16:50:24 +04:00
& config ) ;
if ( IS_ERR ( rdev ) ) {
dev_err ( & pdev - > dev , " failed to register %s regulator \n " ,
2016-06-29 08:53:20 +03:00
regulators [ i ] . name ) ;
2014-08-30 16:50:24 +04:00
return PTR_ERR ( rdev ) ;
}
}
return 0 ;
}
static struct platform_driver rn5t618_regulator_driver = {
. probe = rn5t618_regulator_probe ,
. driver = {
. name = " rn5t618-regulator " ,
} ,
} ;
module_platform_driver ( rn5t618_regulator_driver ) ;
2019-12-12 01:16:00 +03:00
MODULE_ALIAS ( " platform:rn5t618-regulator " ) ;
2014-08-30 16:50:24 +04:00
MODULE_AUTHOR ( " Beniamino Galvani <b.galvani@gmail.com> " ) ;
MODULE_DESCRIPTION ( " RN5T618 regulator driver " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;