2020-12-29 20:31:19 +03:00
// SPDX-License-Identifier: GPL-2.0+
//
// Regulator driver for ATC260x PMICs
//
// Copyright (C) 2019 Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
// Copyright (C) 2020 Cristian Ciocaltea <cristian.ciocaltea@gmail.com>
# include <linux/mfd/atc260x/core.h>
# include <linux/module.h>
# include <linux/of_device.h>
# include <linux/regmap.h>
# include <linux/regulator/driver.h>
struct atc260x_regulator_data {
int voltage_time_dcdc ;
int voltage_time_ldo ;
} ;
static const struct linear_range atc2603c_dcdc_voltage_ranges [ ] = {
REGULATOR_LINEAR_RANGE ( 1300000 , 0 , 13 , 50000 ) ,
REGULATOR_LINEAR_RANGE ( 1950000 , 14 , 15 , 100000 ) ,
} ;
static const struct linear_range atc2609a_dcdc_voltage_ranges [ ] = {
REGULATOR_LINEAR_RANGE ( 600000 , 0 , 127 , 6250 ) ,
REGULATOR_LINEAR_RANGE ( 1400000 , 128 , 232 , 25000 ) ,
} ;
static const struct linear_range atc2609a_ldo_voltage_ranges0 [ ] = {
REGULATOR_LINEAR_RANGE ( 700000 , 0 , 15 , 100000 ) ,
2021-05-29 02:01:47 +03:00
REGULATOR_LINEAR_RANGE ( 2100000 , 0 , 12 , 100000 ) ,
2020-12-29 20:31:19 +03:00
} ;
static const struct linear_range atc2609a_ldo_voltage_ranges1 [ ] = {
REGULATOR_LINEAR_RANGE ( 850000 , 0 , 15 , 100000 ) ,
2021-05-29 02:01:47 +03:00
REGULATOR_LINEAR_RANGE ( 2100000 , 0 , 11 , 100000 ) ,
2020-12-29 20:31:19 +03:00
} ;
static const unsigned int atc260x_ldo_voltage_range_sel [ ] = {
2021-05-29 02:01:47 +03:00
0x0 , 0x20 ,
2020-12-29 20:31:19 +03:00
} ;
static int atc260x_dcdc_set_voltage_time_sel ( struct regulator_dev * rdev ,
unsigned int old_selector ,
unsigned int new_selector )
{
struct atc260x_regulator_data * data = rdev_get_drvdata ( rdev ) ;
if ( new_selector > old_selector )
return data - > voltage_time_dcdc ;
return 0 ;
}
static int atc260x_ldo_set_voltage_time_sel ( struct regulator_dev * rdev ,
unsigned int old_selector ,
unsigned int new_selector )
{
struct atc260x_regulator_data * data = rdev_get_drvdata ( rdev ) ;
if ( new_selector > old_selector )
return data - > voltage_time_ldo ;
return 0 ;
}
static const struct regulator_ops atc260x_dcdc_ops = {
. enable = regulator_enable_regmap ,
. disable = regulator_disable_regmap ,
. is_enabled = regulator_is_enabled_regmap ,
. list_voltage = regulator_list_voltage_linear ,
. set_voltage_sel = regulator_set_voltage_sel_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
. set_voltage_time_sel = atc260x_dcdc_set_voltage_time_sel ,
} ;
static const struct regulator_ops atc260x_ldo_ops = {
. enable = regulator_enable_regmap ,
. disable = regulator_disable_regmap ,
. is_enabled = regulator_is_enabled_regmap ,
. list_voltage = regulator_list_voltage_linear ,
. set_voltage_sel = regulator_set_voltage_sel_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
. set_voltage_time_sel = atc260x_ldo_set_voltage_time_sel ,
} ;
static const struct regulator_ops atc260x_ldo_bypass_ops = {
. enable = regulator_enable_regmap ,
. disable = regulator_disable_regmap ,
. is_enabled = regulator_is_enabled_regmap ,
. list_voltage = regulator_list_voltage_linear ,
. set_voltage_sel = regulator_set_voltage_sel_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
. set_voltage_time_sel = atc260x_ldo_set_voltage_time_sel ,
. set_bypass = regulator_set_bypass_regmap ,
. get_bypass = regulator_get_bypass_regmap ,
} ;
static const struct regulator_ops atc260x_ldo_bypass_discharge_ops = {
. enable = regulator_enable_regmap ,
. disable = regulator_disable_regmap ,
. is_enabled = regulator_is_enabled_regmap ,
. list_voltage = regulator_list_voltage_linear ,
. set_voltage_sel = regulator_set_voltage_sel_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
. set_voltage_time_sel = atc260x_ldo_set_voltage_time_sel ,
. set_bypass = regulator_set_bypass_regmap ,
. get_bypass = regulator_get_bypass_regmap ,
. set_active_discharge = regulator_set_active_discharge_regmap ,
} ;
static const struct regulator_ops atc260x_dcdc_range_ops = {
. enable = regulator_enable_regmap ,
. disable = regulator_disable_regmap ,
. is_enabled = regulator_is_enabled_regmap ,
. list_voltage = regulator_list_voltage_linear_range ,
. set_voltage_sel = regulator_set_voltage_sel_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
. set_voltage_time_sel = atc260x_dcdc_set_voltage_time_sel ,
} ;
static const struct regulator_ops atc260x_ldo_range_pick_ops = {
. enable = regulator_enable_regmap ,
. disable = regulator_disable_regmap ,
. is_enabled = regulator_is_enabled_regmap ,
. list_voltage = regulator_list_voltage_pickable_linear_range ,
. set_voltage_sel = regulator_set_voltage_sel_pickable_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_pickable_regmap ,
. set_voltage_time_sel = atc260x_ldo_set_voltage_time_sel ,
} ;
static const struct regulator_ops atc260x_dcdc_fixed_ops = {
. list_voltage = regulator_list_voltage_linear ,
. set_voltage_sel = regulator_set_voltage_sel_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
. set_voltage_time_sel = atc260x_dcdc_set_voltage_time_sel ,
} ;
static const struct regulator_ops atc260x_ldo_fixed_ops = {
. list_voltage = regulator_list_voltage_linear ,
. set_voltage_sel = regulator_set_voltage_sel_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
. set_voltage_time_sel = atc260x_ldo_set_voltage_time_sel ,
} ;
static const struct regulator_ops atc260x_no_ops = {
} ;
/*
* Note LDO8 is not documented in datasheet ( v2 .4 ) , but supported
* in the vendor ' s driver implementation ( xapp - le - kernel ) .
*/
enum atc2603c_reg_ids {
ATC2603C_ID_DCDC1 ,
ATC2603C_ID_DCDC2 ,
ATC2603C_ID_DCDC3 ,
ATC2603C_ID_LDO1 ,
ATC2603C_ID_LDO2 ,
ATC2603C_ID_LDO3 ,
ATC2603C_ID_LDO5 ,
ATC2603C_ID_LDO6 ,
ATC2603C_ID_LDO7 ,
ATC2603C_ID_LDO8 ,
ATC2603C_ID_LDO11 ,
ATC2603C_ID_LDO12 ,
ATC2603C_ID_SWITCHLDO1 ,
ATC2603C_ID_MAX ,
} ;
# define atc2603c_reg_desc_dcdc(num, min, step, n_volt, vsel_h, vsel_l) { \
. name = " DCDC " # num , \
. supply_name = " dcdc " # num , \
. of_match = of_match_ptr ( " dcdc " # num ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
. id = ATC2603C_ID_DCDC # # num , \
. ops = & atc260x_dcdc_ops , \
. type = REGULATOR_VOLTAGE , \
. min_uV = min , \
. uV_step = step , \
. n_voltages = n_volt , \
. vsel_reg = ATC2603C_PMU_DC # # num # # _CTL0 , \
. vsel_mask = GENMASK ( vsel_h , vsel_l ) , \
. enable_reg = ATC2603C_PMU_DC # # num # # _CTL0 , \
. enable_mask = BIT ( 15 ) , \
. enable_time = 800 , \
. owner = THIS_MODULE , \
}
# define atc2603c_reg_desc_dcdc_range(num, vsel_h, vsel_l) { \
. name = " DCDC " # num , \
. supply_name = " dcdc " # num , \
. of_match = of_match_ptr ( " dcdc " # num ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
. id = ATC2603C_ID_DCDC # # num , \
. ops = & atc260x_dcdc_range_ops , \
. type = REGULATOR_VOLTAGE , \
. n_voltages = 16 , \
. linear_ranges = atc2603c_dcdc_voltage_ranges , \
. n_linear_ranges = ARRAY_SIZE ( atc2603c_dcdc_voltage_ranges ) , \
. vsel_reg = ATC2603C_PMU_DC # # num # # _CTL0 , \
. vsel_mask = GENMASK ( vsel_h , vsel_l ) , \
. enable_reg = ATC2603C_PMU_DC # # num # # _CTL0 , \
. enable_mask = BIT ( 15 ) , \
. enable_time = 800 , \
. owner = THIS_MODULE , \
}
# define atc2603c_reg_desc_dcdc_fixed(num, min, step, n_volt, vsel_h, vsel_l) { \
. name = " DCDC " # num , \
. supply_name = " dcdc " # num , \
. of_match = of_match_ptr ( " dcdc " # num ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
. id = ATC2603C_ID_DCDC # # num , \
. ops = & atc260x_dcdc_fixed_ops , \
. type = REGULATOR_VOLTAGE , \
. min_uV = min , \
. uV_step = step , \
. n_voltages = n_volt , \
. vsel_reg = ATC2603C_PMU_DC # # num # # _CTL0 , \
. vsel_mask = GENMASK ( vsel_h , vsel_l ) , \
. enable_time = 800 , \
. owner = THIS_MODULE , \
}
# define atc2603c_reg_desc_ldo(num, min, step, n_volt, vsel_h, vsel_l) { \
. name = " LDO " # num , \
. supply_name = " ldo " # num , \
. of_match = of_match_ptr ( " ldo " # num ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
. id = ATC2603C_ID_LDO # # num , \
. ops = & atc260x_ldo_ops , \
. type = REGULATOR_VOLTAGE , \
. min_uV = min , \
. uV_step = step , \
. n_voltages = n_volt , \
. vsel_reg = ATC2603C_PMU_LDO # # num # # _CTL , \
. vsel_mask = GENMASK ( vsel_h , vsel_l ) , \
. enable_reg = ATC2603C_PMU_LDO # # num # # _CTL , \
. enable_mask = BIT ( 0 ) , \
. enable_time = 2000 , \
. owner = THIS_MODULE , \
}
# define atc2603c_reg_desc_ldo_fixed(num, min, step, n_volt, vsel_h, vsel_l) { \
. name = " LDO " # num , \
. supply_name = " ldo " # num , \
. of_match = of_match_ptr ( " ldo " # num ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
. id = ATC2603C_ID_LDO # # num , \
. ops = & atc260x_ldo_fixed_ops , \
. type = REGULATOR_VOLTAGE , \
. min_uV = min , \
. uV_step = step , \
. n_voltages = n_volt , \
. vsel_reg = ATC2603C_PMU_LDO # # num # # _CTL , \
. vsel_mask = GENMASK ( vsel_h , vsel_l ) , \
. enable_time = 2000 , \
. owner = THIS_MODULE , \
}
# define atc2603c_reg_desc_ldo_noops(num, vfixed) { \
. name = " LDO " # num , \
. supply_name = " ldo " # num , \
. of_match = of_match_ptr ( " ldo " # num ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
. id = ATC2603C_ID_LDO # # num , \
. ops = & atc260x_no_ops , \
. type = REGULATOR_VOLTAGE , \
. fixed_uV = vfixed , \
. n_voltages = 1 , \
. owner = THIS_MODULE , \
}
# define atc2603c_reg_desc_ldo_switch(num, min, step, n_volt, vsel_h, vsel_l) { \
. name = " SWITCHLDO " # num , \
. supply_name = " switchldo " # num , \
. of_match = of_match_ptr ( " switchldo " # num ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
. id = ATC2603C_ID_SWITCHLDO # # num , \
. ops = & atc260x_ldo_bypass_discharge_ops , \
. type = REGULATOR_VOLTAGE , \
. min_uV = min , \
. uV_step = step , \
. n_voltages = n_volt , \
. vsel_reg = ATC2603C_PMU_SWITCH_CTL , \
. vsel_mask = GENMASK ( vsel_h , vsel_l ) , \
. enable_reg = ATC2603C_PMU_SWITCH_CTL , \
. enable_mask = BIT ( 15 ) , \
. enable_is_inverted = true , \
. enable_time = 2000 , \
. bypass_reg = ATC2603C_PMU_SWITCH_CTL , \
. bypass_mask = BIT ( 5 ) , \
. active_discharge_reg = ATC2603C_PMU_SWITCH_CTL , \
. active_discharge_mask = BIT ( 1 ) , \
2022-04-03 16:22:35 +03:00
. active_discharge_on = BIT ( 1 ) , \
2020-12-29 20:31:19 +03:00
. owner = THIS_MODULE , \
}
static const struct regulator_desc atc2603c_reg [ ] = {
atc2603c_reg_desc_dcdc_fixed ( 1 , 700000 , 25000 , 29 , 11 , 7 ) ,
atc2603c_reg_desc_dcdc_range ( 2 , 12 , 8 ) ,
atc2603c_reg_desc_dcdc_fixed ( 3 , 2600000 , 100000 , 8 , 11 , 9 ) ,
atc2603c_reg_desc_ldo_fixed ( 1 , 2600000 , 100000 , 8 , 15 , 13 ) ,
atc2603c_reg_desc_ldo_fixed ( 2 , 2600000 , 100000 , 8 , 15 , 13 ) ,
atc2603c_reg_desc_ldo_fixed ( 3 , 1500000 , 100000 , 6 , 15 , 13 ) ,
atc2603c_reg_desc_ldo ( 5 , 2600000 , 100000 , 8 , 15 , 13 ) ,
atc2603c_reg_desc_ldo_fixed ( 6 , 700000 , 25000 , 29 , 15 , 11 ) ,
atc2603c_reg_desc_ldo ( 7 , 1500000 , 100000 , 6 , 15 , 13 ) ,
atc2603c_reg_desc_ldo ( 8 , 2300000 , 100000 , 11 , 15 , 12 ) ,
atc2603c_reg_desc_ldo_fixed ( 11 , 2600000 , 100000 , 8 , 15 , 13 ) ,
atc2603c_reg_desc_ldo_noops ( 12 , 1800000 ) ,
atc2603c_reg_desc_ldo_switch ( 1 , 3000000 , 100000 , 4 , 4 , 3 ) ,
} ;
static const struct regulator_desc atc2603c_reg_dcdc2_ver_b =
atc2603c_reg_desc_dcdc ( 2 , 1000000 , 50000 , 18 , 12 , 8 ) ;
enum atc2609a_reg_ids {
ATC2609A_ID_DCDC0 ,
ATC2609A_ID_DCDC1 ,
ATC2609A_ID_DCDC2 ,
ATC2609A_ID_DCDC3 ,
ATC2609A_ID_DCDC4 ,
ATC2609A_ID_LDO0 ,
ATC2609A_ID_LDO1 ,
ATC2609A_ID_LDO2 ,
ATC2609A_ID_LDO3 ,
ATC2609A_ID_LDO4 ,
ATC2609A_ID_LDO5 ,
ATC2609A_ID_LDO6 ,
ATC2609A_ID_LDO7 ,
ATC2609A_ID_LDO8 ,
ATC2609A_ID_LDO9 ,
ATC2609A_ID_MAX ,
} ;
# define atc2609a_reg_desc_dcdc(num, en_bit) { \
. name = " DCDC " # num , \
. supply_name = " dcdc " # num , \
. of_match = of_match_ptr ( " dcdc " # num ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
. id = ATC2609A_ID_DCDC # # num , \
. ops = & atc260x_dcdc_ops , \
. type = REGULATOR_VOLTAGE , \
. min_uV = 600000 , \
. uV_step = 6250 , \
. n_voltages = 256 , \
. vsel_reg = ATC2609A_PMU_DC # # num # # _CTL0 , \
. vsel_mask = GENMASK ( 15 , 8 ) , \
. enable_reg = ATC2609A_PMU_DC_OSC , \
. enable_mask = BIT ( en_bit ) , \
. enable_time = 800 , \
. owner = THIS_MODULE , \
}
# define atc2609a_reg_desc_dcdc_range(num, en_bit) { \
. name = " DCDC " # num , \
. supply_name = " dcdc " # num , \
. of_match = of_match_ptr ( " dcdc " # num ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
. id = ATC2609A_ID_DCDC # # num , \
. ops = & atc260x_dcdc_range_ops , \
. type = REGULATOR_VOLTAGE , \
. n_voltages = 233 , \
. linear_ranges = atc2609a_dcdc_voltage_ranges , \
. n_linear_ranges = ARRAY_SIZE ( atc2609a_dcdc_voltage_ranges ) , \
. vsel_reg = ATC2609A_PMU_DC # # num # # _CTL0 , \
. vsel_mask = GENMASK ( 15 , 8 ) , \
. enable_reg = ATC2609A_PMU_DC_OSC , \
. enable_mask = BIT ( en_bit ) , \
. enable_time = 800 , \
. owner = THIS_MODULE , \
}
# define atc2609a_reg_desc_ldo(num) { \
. name = " LDO " # num , \
. supply_name = " ldo " # num , \
. of_match = of_match_ptr ( " ldo " # num ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
. id = ATC2609A_ID_LDO # # num , \
. ops = & atc260x_ldo_ops , \
. type = REGULATOR_VOLTAGE , \
. min_uV = 700000 , \
. uV_step = 100000 , \
. n_voltages = 16 , \
. vsel_reg = ATC2609A_PMU_LDO # # num # # _CTL0 , \
. vsel_mask = GENMASK ( 4 , 1 ) , \
. enable_reg = ATC2609A_PMU_LDO # # num # # _CTL0 , \
. enable_mask = BIT ( 0 ) , \
. enable_time = 2000 , \
. owner = THIS_MODULE , \
}
# define atc2609a_reg_desc_ldo_bypass(num) { \
. name = " LDO " # num , \
. supply_name = " ldo " # num , \
. of_match = of_match_ptr ( " ldo " # num ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
. id = ATC2609A_ID_LDO # # num , \
. ops = & atc260x_ldo_bypass_ops , \
. type = REGULATOR_VOLTAGE , \
. min_uV = 2300000 , \
. uV_step = 100000 , \
. n_voltages = 12 , \
. vsel_reg = ATC2609A_PMU_LDO # # num # # _CTL0 , \
. vsel_mask = GENMASK ( 5 , 2 ) , \
. enable_reg = ATC2609A_PMU_LDO # # num # # _CTL0 , \
. enable_mask = BIT ( 0 ) , \
. enable_time = 2000 , \
. bypass_reg = ATC2609A_PMU_LDO # # num # # _CTL0 , \
. bypass_mask = BIT ( 1 ) , \
. owner = THIS_MODULE , \
}
2021-05-29 02:01:47 +03:00
# define atc2609a_reg_desc_ldo_range_pick(num, n_range, n_volt) { \
2020-12-29 20:31:19 +03:00
. name = " LDO " # num , \
. supply_name = " ldo " # num , \
. of_match = of_match_ptr ( " ldo " # num ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
. id = ATC2609A_ID_LDO # # num , \
. ops = & atc260x_ldo_range_pick_ops , \
. type = REGULATOR_VOLTAGE , \
. linear_ranges = atc2609a_ldo_voltage_ranges # # n_range , \
. n_linear_ranges = ARRAY_SIZE ( atc2609a_ldo_voltage_ranges # # n_range ) , \
2021-05-29 02:01:47 +03:00
. n_voltages = n_volt , \
2020-12-29 20:31:19 +03:00
. vsel_reg = ATC2609A_PMU_LDO # # num # # _CTL0 , \
. vsel_mask = GENMASK ( 4 , 1 ) , \
. vsel_range_reg = ATC2609A_PMU_LDO # # num # # _CTL0 , \
. vsel_range_mask = BIT ( 5 ) , \
. linear_range_selectors = atc260x_ldo_voltage_range_sel , \
. enable_reg = ATC2609A_PMU_LDO # # num # # _CTL0 , \
. enable_mask = BIT ( 0 ) , \
. enable_time = 2000 , \
. owner = THIS_MODULE , \
}
# define atc2609a_reg_desc_ldo_fixed(num) { \
. name = " LDO " # num , \
. supply_name = " ldo " # num , \
. of_match = of_match_ptr ( " ldo " # num ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
. id = ATC2609A_ID_LDO # # num , \
. ops = & atc260x_ldo_fixed_ops , \
. type = REGULATOR_VOLTAGE , \
. min_uV = 2600000 , \
. uV_step = 100000 , \
. n_voltages = 8 , \
. vsel_reg = ATC2609A_PMU_LDO # # num # # _CTL , \
. vsel_mask = GENMASK ( 15 , 13 ) , \
. enable_time = 2000 , \
. owner = THIS_MODULE , \
}
static const struct regulator_desc atc2609a_reg [ ] = {
atc2609a_reg_desc_dcdc ( 0 , 4 ) ,
atc2609a_reg_desc_dcdc ( 1 , 5 ) ,
atc2609a_reg_desc_dcdc ( 2 , 6 ) ,
atc2609a_reg_desc_dcdc_range ( 3 , 7 ) ,
atc2609a_reg_desc_dcdc ( 4 , 8 ) ,
atc2609a_reg_desc_ldo_bypass ( 0 ) ,
atc2609a_reg_desc_ldo_bypass ( 1 ) ,
atc2609a_reg_desc_ldo_bypass ( 2 ) ,
2021-05-29 02:01:47 +03:00
atc2609a_reg_desc_ldo_range_pick ( 3 , 0 , 29 ) ,
atc2609a_reg_desc_ldo_range_pick ( 4 , 0 , 29 ) ,
2020-12-29 20:31:19 +03:00
atc2609a_reg_desc_ldo ( 5 ) ,
2021-05-29 02:01:47 +03:00
atc2609a_reg_desc_ldo_range_pick ( 6 , 1 , 28 ) ,
atc2609a_reg_desc_ldo_range_pick ( 7 , 0 , 29 ) ,
atc2609a_reg_desc_ldo_range_pick ( 8 , 0 , 29 ) ,
2020-12-29 20:31:19 +03:00
atc2609a_reg_desc_ldo_fixed ( 9 ) ,
} ;
static int atc260x_regulator_probe ( struct platform_device * pdev )
{
struct atc260x * atc260x = dev_get_drvdata ( pdev - > dev . parent ) ;
struct device * dev = atc260x - > dev ;
struct atc260x_regulator_data * atc260x_data ;
struct regulator_config config = { } ;
struct regulator_dev * atc260x_rdev ;
const struct regulator_desc * regulators ;
bool atc2603c_ver_b = false ;
int i , nregulators ;
atc260x_data = devm_kzalloc ( & pdev - > dev , sizeof ( * atc260x_data ) , GFP_KERNEL ) ;
if ( ! atc260x_data )
return - ENOMEM ;
atc260x_data - > voltage_time_dcdc = 350 ;
atc260x_data - > voltage_time_ldo = 800 ;
switch ( atc260x - > ic_type ) {
case ATC2603C :
regulators = atc2603c_reg ;
nregulators = ATC2603C_ID_MAX ;
atc2603c_ver_b = atc260x - > ic_ver = = ATC260X_B ;
break ;
case ATC2609A :
atc260x_data - > voltage_time_dcdc = 250 ;
regulators = atc2609a_reg ;
nregulators = ATC2609A_ID_MAX ;
break ;
default :
dev_err ( dev , " unsupported ATC260X ID %d \n " , atc260x - > ic_type ) ;
return - EINVAL ;
}
config . dev = dev ;
config . regmap = atc260x - > regmap ;
config . driver_data = atc260x_data ;
/* Instantiate the regulators */
for ( i = 0 ; i < nregulators ; i + + ) {
if ( atc2603c_ver_b & & regulators [ i ] . id = = ATC2603C_ID_DCDC2 )
atc260x_rdev = devm_regulator_register ( & pdev - > dev ,
& atc2603c_reg_dcdc2_ver_b ,
& config ) ;
else
atc260x_rdev = devm_regulator_register ( & pdev - > dev ,
& regulators [ i ] ,
& config ) ;
if ( IS_ERR ( atc260x_rdev ) ) {
dev_err ( dev , " failed to register regulator: %d \n " , i ) ;
return PTR_ERR ( atc260x_rdev ) ;
}
}
return 0 ;
}
static struct platform_driver atc260x_regulator_driver = {
. probe = atc260x_regulator_probe ,
. driver = {
. name = " atc260x-regulator " ,
2023-03-16 22:54:42 +03:00
. probe_type = PROBE_PREFER_ASYNCHRONOUS ,
2020-12-29 20:31:19 +03:00
} ,
} ;
module_platform_driver ( atc260x_regulator_driver ) ;
MODULE_DESCRIPTION ( " Regulator driver for ATC260x PMICs " ) ;
MODULE_AUTHOR ( " Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> " ) ;
MODULE_AUTHOR ( " Cristian Ciocaltea <cristian.ciocaltea@gmail.com> " ) ;
MODULE_LICENSE ( " GPL " ) ;