2022-09-13 14:34:54 +02:00
// SPDX-License-Identifier: GPL-2.0
//
// Copyright (c) 2022 Collabora Ltd.
// Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
//
// Based on mt6323-regulator.c,
// Copyright (c) 2016 MediaTek Inc.
//
# include <linux/module.h>
# include <linux/of.h>
# include <linux/platform_device.h>
# include <linux/regmap.h>
# include <linux/mfd/mt6397/core.h>
# include <linux/mfd/mt6331/registers.h>
# include <linux/regulator/driver.h>
# include <linux/regulator/machine.h>
# include <linux/regulator/mt6331-regulator.h>
# include <linux/regulator/of_regulator.h>
# define MT6331_LDO_MODE_NORMAL 0
# define MT6331_LDO_MODE_LP 1
/*
* MT6331 regulators information
*
* @ desc : standard fields of regulator description .
* @ qi : Mask for query enable signal status of regulators
* @ vselon_reg : Register sections for hardware control mode of bucks
* @ vselctrl_reg : Register for controlling the buck control mode .
* @ vselctrl_mask : Mask for query buck ' s voltage control mode .
* @ status_reg : Register for regulator enable status where qi unavailable
* @ status_mask : Mask for querying regulator enable status
*/
struct mt6331_regulator_info {
struct regulator_desc desc ;
u32 qi ;
u32 vselon_reg ;
u32 vselctrl_reg ;
u32 vselctrl_mask ;
u32 modeset_reg ;
u32 modeset_mask ;
u32 status_reg ;
u32 status_mask ;
} ;
# define MT6331_BUCK(match, vreg, min, max, step, volt_ranges, enreg, \
vosel , vosel_mask , voselon , vosel_ctrl ) \
[ MT6331_ID_ # # vreg ] = { \
. desc = { \
. name = # vreg , \
. of_match = of_match_ptr ( match ) , \
. ops = & mt6331_volt_range_ops , \
. type = REGULATOR_VOLTAGE , \
. id = MT6331_ID_ # # vreg , \
. owner = THIS_MODULE , \
. n_voltages = ( max - min ) / step + 1 , \
. linear_ranges = volt_ranges , \
. n_linear_ranges = ARRAY_SIZE ( volt_ranges ) , \
. vsel_reg = vosel , \
. vsel_mask = vosel_mask , \
. enable_reg = enreg , \
. enable_mask = BIT ( 0 ) , \
} , \
. qi = BIT ( 13 ) , \
. vselon_reg = voselon , \
. vselctrl_reg = vosel_ctrl , \
. vselctrl_mask = BIT ( 1 ) , \
. status_mask = 0 , \
}
# define MT6331_LDO_AO(match, vreg, ldo_volt_table, vosel, vosel_mask) \
[ MT6331_ID_ # # vreg ] = { \
. desc = { \
. name = # vreg , \
. of_match = of_match_ptr ( match ) , \
. ops = & mt6331_volt_table_ao_ops , \
. type = REGULATOR_VOLTAGE , \
. id = MT6331_ID_ # # vreg , \
. owner = THIS_MODULE , \
. n_voltages = ARRAY_SIZE ( ldo_volt_table ) , \
. volt_table = ldo_volt_table , \
. vsel_reg = vosel , \
. vsel_mask = vosel_mask , \
} , \
}
# define MT6331_LDO_S(match, vreg, ldo_volt_table, enreg, enbit, vosel, \
vosel_mask , _modeset_reg , _modeset_mask , \
_status_reg , _status_mask ) \
[ MT6331_ID_ # # vreg ] = { \
. desc = { \
. name = # vreg , \
. of_match = of_match_ptr ( match ) , \
. ops = & mt6331_volt_table_no_qi_ops , \
. type = REGULATOR_VOLTAGE , \
. id = MT6331_ID_ # # vreg , \
. owner = THIS_MODULE , \
. n_voltages = ARRAY_SIZE ( ldo_volt_table ) , \
. volt_table = ldo_volt_table , \
. vsel_reg = vosel , \
. vsel_mask = vosel_mask , \
. enable_reg = enreg , \
. enable_mask = BIT ( enbit ) , \
} , \
. modeset_reg = _modeset_reg , \
. modeset_mask = _modeset_mask , \
. status_reg = _status_reg , \
. status_mask = _status_mask , \
}
# define MT6331_LDO(match, vreg, ldo_volt_table, enreg, enbit, vosel, \
vosel_mask , _modeset_reg , _modeset_mask ) \
[ MT6331_ID_ # # vreg ] = { \
. desc = { \
. name = # vreg , \
. of_match = of_match_ptr ( match ) , \
. ops = ( _modeset_reg ? \
& mt6331_volt_table_ops : \
& mt6331_volt_table_no_ms_ops ) , \
. type = REGULATOR_VOLTAGE , \
. id = MT6331_ID_ # # vreg , \
. owner = THIS_MODULE , \
. n_voltages = ARRAY_SIZE ( ldo_volt_table ) , \
. volt_table = ldo_volt_table , \
. vsel_reg = vosel , \
. vsel_mask = vosel_mask , \
. enable_reg = enreg , \
. enable_mask = BIT ( enbit ) , \
} , \
. qi = BIT ( 15 ) , \
. modeset_reg = _modeset_reg , \
. modeset_mask = _modeset_mask , \
}
# define MT6331_REG_FIXED(match, vreg, enreg, enbit, qibit, volt, \
_modeset_reg , _modeset_mask ) \
[ MT6331_ID_ # # vreg ] = { \
. desc = { \
. name = # vreg , \
. of_match = of_match_ptr ( match ) , \
. ops = ( _modeset_reg ? \
& mt6331_volt_fixed_ops : \
& mt6331_volt_fixed_no_ms_ops ) , \
. type = REGULATOR_VOLTAGE , \
. id = MT6331_ID_ # # vreg , \
. owner = THIS_MODULE , \
. n_voltages = 1 , \
. enable_reg = enreg , \
. enable_mask = BIT ( enbit ) , \
. min_uV = volt , \
} , \
. qi = BIT ( qibit ) , \
. modeset_reg = _modeset_reg , \
. modeset_mask = _modeset_mask , \
}
static const struct linear_range buck_volt_range [ ] = {
REGULATOR_LINEAR_RANGE ( 700000 , 0 , 0x7f , 6250 ) ,
} ;
static const unsigned int ldo_volt_table1 [ ] = {
2800000 , 3000000 , 0 , 3200000
} ;
static const unsigned int ldo_volt_table2 [ ] = {
1500000 , 1800000 , 2500000 , 2800000 ,
} ;
static const unsigned int ldo_volt_table3 [ ] = {
1200000 , 1300000 , 1500000 , 1800000 , 2000000 , 2800000 , 3000000 , 3300000 ,
} ;
static const unsigned int ldo_volt_table4 [ ] = {
0 , 0 , 1700000 , 1800000 , 1860000 , 2760000 , 3000000 , 3100000 ,
} ;
static const unsigned int ldo_volt_table5 [ ] = {
1800000 , 3300000 , 1800000 , 3300000 ,
} ;
static const unsigned int ldo_volt_table6 [ ] = {
3000000 , 3300000 ,
} ;
static const unsigned int ldo_volt_table7 [ ] = {
1200000 , 1600000 , 1700000 , 1800000 , 1900000 , 2000000 , 2100000 , 2200000 ,
} ;
static const unsigned int ldo_volt_table8 [ ] = {
900000 , 1000000 , 1100000 , 1220000 , 1300000 , 1500000 , 1500000 , 1500000 ,
} ;
static const unsigned int ldo_volt_table9 [ ] = {
1000000 , 1050000 , 1100000 , 1150000 , 1200000 , 1250000 , 1300000 , 1300000 ,
} ;
static const unsigned int ldo_volt_table10 [ ] = {
1200000 , 1300000 , 1500000 , 1800000 ,
} ;
static const unsigned int ldo_volt_table11 [ ] = {
1200000 , 1300000 , 1400000 , 1500000 , 1600000 , 1700000 , 1800000 , 1800000 ,
} ;
static int mt6331_get_status ( struct regulator_dev * rdev )
{
struct mt6331_regulator_info * info = rdev_get_drvdata ( rdev ) ;
u32 regval ;
int ret ;
ret = regmap_read ( rdev - > regmap , info - > desc . enable_reg , & regval ) ;
if ( ret ! = 0 ) {
dev_err ( & rdev - > dev , " Failed to get enable reg: %d \n " , ret ) ;
return ret ;
}
return ( regval & info - > qi ) ? REGULATOR_STATUS_ON : REGULATOR_STATUS_OFF ;
}
static int mt6331_ldo_set_mode ( struct regulator_dev * rdev , unsigned int mode )
{
struct mt6331_regulator_info * info = rdev_get_drvdata ( rdev ) ;
int val ;
switch ( mode ) {
case REGULATOR_MODE_STANDBY :
val = MT6331_LDO_MODE_LP ;
break ;
case REGULATOR_MODE_NORMAL :
val = MT6331_LDO_MODE_NORMAL ;
break ;
default :
return - EINVAL ;
}
val < < = ffs ( info - > modeset_mask ) - 1 ;
return regmap_update_bits ( rdev - > regmap , info - > modeset_reg ,
info - > modeset_mask , val ) ;
}
static unsigned int mt6331_ldo_get_mode ( struct regulator_dev * rdev )
{
struct mt6331_regulator_info * info = rdev_get_drvdata ( rdev ) ;
unsigned int val ;
int ret ;
ret = regmap_read ( rdev - > regmap , info - > modeset_reg , & val ) ;
if ( ret < 0 )
return ret ;
val & = info - > modeset_mask ;
val > > = ffs ( info - > modeset_mask ) - 1 ;
return ( val & BIT ( 0 ) ) ? REGULATOR_MODE_STANDBY : REGULATOR_MODE_NORMAL ;
}
static const struct regulator_ops mt6331_volt_range_ops = {
. list_voltage = regulator_list_voltage_linear_range ,
. map_voltage = regulator_map_voltage_linear_range ,
. set_voltage_sel = regulator_set_voltage_sel_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
. set_voltage_time_sel = regulator_set_voltage_time_sel ,
. enable = regulator_enable_regmap ,
. disable = regulator_disable_regmap ,
. is_enabled = regulator_is_enabled_regmap ,
. get_status = mt6331_get_status ,
} ;
static const struct regulator_ops mt6331_volt_table_no_ms_ops = {
. list_voltage = regulator_list_voltage_table ,
. map_voltage = regulator_map_voltage_iterate ,
. set_voltage_sel = regulator_set_voltage_sel_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
. set_voltage_time_sel = regulator_set_voltage_time_sel ,
. enable = regulator_enable_regmap ,
. disable = regulator_disable_regmap ,
. is_enabled = regulator_is_enabled_regmap ,
. get_status = mt6331_get_status ,
} ;
static const struct regulator_ops mt6331_volt_table_no_qi_ops = {
. list_voltage = regulator_list_voltage_table ,
. map_voltage = regulator_map_voltage_iterate ,
. set_voltage_sel = regulator_set_voltage_sel_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
. set_voltage_time_sel = regulator_set_voltage_time_sel ,
. enable = regulator_enable_regmap ,
. disable = regulator_disable_regmap ,
. is_enabled = regulator_is_enabled_regmap ,
. set_mode = mt6331_ldo_set_mode ,
. get_mode = mt6331_ldo_get_mode ,
} ;
static const struct regulator_ops mt6331_volt_table_ops = {
. list_voltage = regulator_list_voltage_table ,
. map_voltage = regulator_map_voltage_iterate ,
. set_voltage_sel = regulator_set_voltage_sel_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
. set_voltage_time_sel = regulator_set_voltage_time_sel ,
. enable = regulator_enable_regmap ,
. disable = regulator_disable_regmap ,
. is_enabled = regulator_is_enabled_regmap ,
. get_status = mt6331_get_status ,
. set_mode = mt6331_ldo_set_mode ,
. get_mode = mt6331_ldo_get_mode ,
} ;
static const struct regulator_ops mt6331_volt_table_ao_ops = {
. list_voltage = regulator_list_voltage_table ,
. map_voltage = regulator_map_voltage_iterate ,
. set_voltage_sel = regulator_set_voltage_sel_regmap ,
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
. set_voltage_time_sel = regulator_set_voltage_time_sel ,
} ;
static const struct regulator_ops mt6331_volt_fixed_no_ms_ops = {
. list_voltage = regulator_list_voltage_linear ,
. enable = regulator_enable_regmap ,
. disable = regulator_disable_regmap ,
. is_enabled = regulator_is_enabled_regmap ,
. get_status = mt6331_get_status ,
} ;
static const struct regulator_ops mt6331_volt_fixed_ops = {
. list_voltage = regulator_list_voltage_linear ,
. enable = regulator_enable_regmap ,
. disable = regulator_disable_regmap ,
. is_enabled = regulator_is_enabled_regmap ,
. get_status = mt6331_get_status ,
. set_mode = mt6331_ldo_set_mode ,
. get_mode = mt6331_ldo_get_mode ,
} ;
/* The array is indexed by id(MT6331_ID_XXX) */
static struct mt6331_regulator_info mt6331_regulators [ ] = {
MT6331_BUCK ( " buck-vdvfs11 " , VDVFS11 , 700000 , 1493750 , 6250 ,
buck_volt_range , MT6331_VDVFS11_CON9 ,
MT6331_VDVFS11_CON11 , GENMASK ( 6 , 0 ) ,
MT6331_VDVFS11_CON12 , MT6331_VDVFS11_CON7 ) ,
MT6331_BUCK ( " buck-vdvfs12 " , VDVFS12 , 700000 , 1493750 , 6250 ,
buck_volt_range , MT6331_VDVFS12_CON9 ,
MT6331_VDVFS12_CON11 , GENMASK ( 6 , 0 ) ,
MT6331_VDVFS12_CON12 , MT6331_VDVFS12_CON7 ) ,
MT6331_BUCK ( " buck-vdvfs13 " , VDVFS13 , 700000 , 1493750 , 6250 ,
buck_volt_range , MT6331_VDVFS13_CON9 ,
MT6331_VDVFS13_CON11 , GENMASK ( 6 , 0 ) ,
MT6331_VDVFS13_CON12 , MT6331_VDVFS13_CON7 ) ,
MT6331_BUCK ( " buck-vdvfs14 " , VDVFS14 , 700000 , 1493750 , 6250 ,
buck_volt_range , MT6331_VDVFS14_CON9 ,
MT6331_VDVFS14_CON11 , GENMASK ( 6 , 0 ) ,
MT6331_VDVFS14_CON12 , MT6331_VDVFS14_CON7 ) ,
MT6331_BUCK ( " buck-vcore2 " , VCORE2 , 700000 , 1493750 , 6250 ,
buck_volt_range , MT6331_VCORE2_CON9 ,
MT6331_VCORE2_CON11 , GENMASK ( 6 , 0 ) ,
MT6331_VCORE2_CON12 , MT6331_VCORE2_CON7 ) ,
MT6331_REG_FIXED ( " buck-vio18 " , VIO18 , MT6331_VIO18_CON9 , 0 , 13 , 1800000 , 0 , 0 ) ,
MT6331_REG_FIXED ( " ldo-vrtc " , VRTC , MT6331_DIGLDO_CON11 , 8 , 15 , 2800000 , 0 , 0 ) ,
MT6331_REG_FIXED ( " ldo-vtcxo1 " , VTCXO1 , MT6331_ANALDO_CON1 , 10 , 15 , 2800000 ,
MT6331_ANALDO_CON1 , GENMASK ( 1 , 0 ) ) ,
MT6331_REG_FIXED ( " ldo-vtcxo2 " , VTCXO2 , MT6331_ANALDO_CON2 , 10 , 15 , 2800000 ,
MT6331_ANALDO_CON2 , GENMASK ( 1 , 0 ) ) ,
MT6331_REG_FIXED ( " ldo-vsram " , VSRAM_DVFS1 , MT6331_SYSLDO_CON4 , 10 , 15 , 1012500 ,
MT6331_SYSLDO_CON4 , GENMASK ( 1 , 0 ) ) ,
MT6331_REG_FIXED ( " ldo-vio28 " , VIO28 , MT6331_DIGLDO_CON1 , 10 , 15 , 2800000 ,
MT6331_DIGLDO_CON1 , GENMASK ( 1 , 0 ) ) ,
MT6331_LDO ( " ldo-avdd32aud " , AVDD32_AUD , ldo_volt_table1 , MT6331_ANALDO_CON3 , 10 ,
MT6331_ANALDO_CON10 , GENMASK ( 6 , 5 ) , MT6331_ANALDO_CON3 , GENMASK ( 1 , 0 ) ) ,
MT6331_LDO ( " ldo-vauxa32 " , VAUXA32 , ldo_volt_table1 , MT6331_ANALDO_CON4 , 10 ,
MT6331_ANALDO_CON6 , GENMASK ( 6 , 5 ) , MT6331_ANALDO_CON4 , GENMASK ( 1 , 0 ) ) ,
MT6331_LDO ( " ldo-vemc33 " , VEMC33 , ldo_volt_table6 , MT6331_DIGLDO_CON5 , 10 ,
MT6331_DIGLDO_CON17 , BIT ( 6 ) , MT6331_DIGLDO_CON5 , GENMASK ( 1 , 0 ) ) ,
MT6331_LDO ( " ldo-vibr " , VIBR , ldo_volt_table3 , MT6331_DIGLDO_CON12 , 10 ,
MT6331_DIGLDO_CON20 , GENMASK ( 6 , 4 ) , MT6331_DIGLDO_CON12 , GENMASK ( 1 , 0 ) ) ,
MT6331_LDO ( " ldo-vmc " , VMC , ldo_volt_table5 , MT6331_DIGLDO_CON3 , 10 ,
MT6331_DIGLDO_CON15 , GENMASK ( 5 , 4 ) , MT6331_DIGLDO_CON3 , GENMASK ( 1 , 0 ) ) ,
MT6331_LDO ( " ldo-vmch " , VMCH , ldo_volt_table6 , MT6331_DIGLDO_CON4 , 10 ,
MT6331_DIGLDO_CON16 , BIT ( 6 ) , MT6331_DIGLDO_CON4 , GENMASK ( 1 , 0 ) ) ,
MT6331_LDO ( " ldo-vmipi " , VMIPI , ldo_volt_table3 , MT6331_SYSLDO_CON5 , 10 ,
MT6331_SYSLDO_CON13 , GENMASK ( 5 , 3 ) , MT6331_SYSLDO_CON5 , GENMASK ( 1 , 0 ) ) ,
MT6331_LDO ( " ldo-vsim1 " , VSIM1 , ldo_volt_table4 , MT6331_DIGLDO_CON8 , 10 ,
MT6331_DIGLDO_CON21 , GENMASK ( 6 , 4 ) , MT6331_DIGLDO_CON8 , GENMASK ( 1 , 0 ) ) ,
MT6331_LDO ( " ldo-vsim2 " , VSIM2 , ldo_volt_table4 , MT6331_DIGLDO_CON9 , 10 ,
MT6331_DIGLDO_CON22 , GENMASK ( 6 , 4 ) , MT6331_DIGLDO_CON9 , GENMASK ( 1 , 0 ) ) ,
MT6331_LDO ( " ldo-vusb10 " , VUSB10 , ldo_volt_table9 , MT6331_SYSLDO_CON2 , 10 ,
MT6331_SYSLDO_CON10 , GENMASK ( 5 , 3 ) , MT6331_SYSLDO_CON2 , GENMASK ( 1 , 0 ) ) ,
MT6331_LDO ( " ldo-vcama " , VCAMA , ldo_volt_table2 , MT6331_ANALDO_CON5 , 15 ,
MT6331_ANALDO_CON9 , GENMASK ( 5 , 4 ) , 0 , 0 ) ,
MT6331_LDO_S ( " ldo-vcamaf " , VCAM_AF , ldo_volt_table3 , MT6331_DIGLDO_CON2 , 10 ,
MT6331_DIGLDO_CON14 , GENMASK ( 6 , 4 ) , MT6331_DIGLDO_CON2 , GENMASK ( 1 , 0 ) ,
MT6331_EN_STATUS1 , BIT ( 0 ) ) ,
MT6331_LDO_S ( " ldo-vcamd " , VCAMD , ldo_volt_table8 , MT6331_SYSLDO_CON1 , 15 ,
MT6331_SYSLDO_CON9 , GENMASK ( 6 , 4 ) , MT6331_SYSLDO_CON1 , GENMASK ( 1 , 0 ) ,
MT6331_EN_STATUS1 , BIT ( 11 ) ) ,
MT6331_LDO_S ( " ldo-vcamio " , VCAM_IO , ldo_volt_table10 , MT6331_SYSLDO_CON3 , 10 ,
MT6331_SYSLDO_CON11 , GENMASK ( 4 , 3 ) , MT6331_SYSLDO_CON3 , GENMASK ( 1 , 0 ) ,
MT6331_EN_STATUS1 , BIT ( 13 ) ) ,
MT6331_LDO_S ( " ldo-vgp1 " , VGP1 , ldo_volt_table3 , MT6331_DIGLDO_CON6 , 10 ,
MT6331_DIGLDO_CON19 , GENMASK ( 6 , 4 ) , MT6331_DIGLDO_CON6 , GENMASK ( 1 , 0 ) ,
MT6331_EN_STATUS1 , BIT ( 4 ) ) ,
MT6331_LDO_S ( " ldo-vgp2 " , VGP2 , ldo_volt_table10 , MT6331_SYSLDO_CON6 , 10 ,
MT6331_SYSLDO_CON14 , GENMASK ( 4 , 3 ) , MT6331_SYSLDO_CON6 , GENMASK ( 1 , 0 ) ,
MT6331_EN_STATUS1 , BIT ( 15 ) ) ,
MT6331_LDO_S ( " ldo-vgp3 " , VGP3 , ldo_volt_table10 , MT6331_SYSLDO_CON7 , 10 ,
MT6331_SYSLDO_CON15 , GENMASK ( 4 , 3 ) , MT6331_SYSLDO_CON7 , GENMASK ( 1 , 0 ) ,
MT6331_EN_STATUS2 , BIT ( 0 ) ) ,
MT6331_LDO_S ( " ldo-vgp4 " , VGP4 , ldo_volt_table7 , MT6331_DIGLDO_CON7 , 10 ,
MT6331_DIGLDO_CON18 , GENMASK ( 6 , 4 ) , MT6331_DIGLDO_CON7 , GENMASK ( 1 , 0 ) ,
MT6331_EN_STATUS1 , BIT ( 5 ) ) ,
MT6331_LDO_AO ( " ldo-vdig18 " , VDIG18 , ldo_volt_table11 ,
MT6331_DIGLDO_CON28 , GENMASK ( 14 , 12 ) ) ,
} ;
static int mt6331_set_buck_vosel_reg ( struct platform_device * pdev )
{
struct mt6397_chip * mt6331 = dev_get_drvdata ( pdev - > dev . parent ) ;
int i ;
u32 regval ;
for ( i = 0 ; i < MT6331_ID_VREG_MAX ; i + + ) {
if ( mt6331_regulators [ i ] . vselctrl_reg ) {
if ( regmap_read ( mt6331 - > regmap ,
mt6331_regulators [ i ] . vselctrl_reg ,
& regval ) < 0 ) {
dev_err ( & pdev - > dev ,
" Failed to read buck ctrl \n " ) ;
return - EIO ;
}
if ( regval & mt6331_regulators [ i ] . vselctrl_mask ) {
mt6331_regulators [ i ] . desc . vsel_reg =
mt6331_regulators [ i ] . vselon_reg ;
}
}
}
return 0 ;
}
static int mt6331_regulator_probe ( struct platform_device * pdev )
{
struct mt6397_chip * mt6331 = dev_get_drvdata ( pdev - > dev . parent ) ;
struct regulator_config config = { } ;
struct regulator_dev * rdev ;
int i ;
u32 reg_value ;
/* Query buck controller to select activated voltage register part */
if ( mt6331_set_buck_vosel_reg ( pdev ) )
return - EIO ;
/* Read PMIC chip revision to update constraints and voltage table */
if ( regmap_read ( mt6331 - > regmap , MT6331_HWCID , & reg_value ) < 0 ) {
dev_err ( & pdev - > dev , " Failed to read Chip ID \n " ) ;
return - EIO ;
}
reg_value & = GENMASK ( 7 , 0 ) ;
dev_info ( & pdev - > dev , " Chip ID = 0x%x \n " , reg_value ) ;
/*
* ChipID 0x10 is " MT6331 E1 " , has a different voltage table and
* it ' s currently not supported in this driver . Upon detection of
* this ID , refuse to register the regulators , as we will wrongly
* interpret the VSEL for this revision , potentially overvolting
* some device .
*/
if ( reg_value = = 0x10 ) {
dev_err ( & pdev - > dev , " Chip version not supported. Bailing out. \n " ) ;
return - EINVAL ;
}
for ( i = 0 ; i < MT6331_ID_VREG_MAX ; i + + ) {
config . dev = & pdev - > dev ;
config . driver_data = & mt6331_regulators [ i ] ;
config . regmap = mt6331 - > regmap ;
rdev = devm_regulator_register ( & pdev - > dev ,
& mt6331_regulators [ i ] . desc , & config ) ;
if ( IS_ERR ( rdev ) ) {
dev_err ( & pdev - > dev , " failed to register %s \n " ,
mt6331_regulators [ i ] . desc . name ) ;
return PTR_ERR ( rdev ) ;
}
}
return 0 ;
}
static const struct platform_device_id mt6331_platform_ids [ ] = {
{ " mt6331-regulator " , 0 } ,
{ /* sentinel */ } ,
} ;
MODULE_DEVICE_TABLE ( platform , mt6331_platform_ids ) ;
static struct platform_driver mt6331_regulator_driver = {
. driver = {
. name = " mt6331-regulator " ,
2023-03-16 12:54:43 -07:00
. probe_type = PROBE_PREFER_ASYNCHRONOUS ,
2022-09-13 14:34:54 +02:00
} ,
. probe = mt6331_regulator_probe ,
. id_table = mt6331_platform_ids ,
} ;
module_platform_driver ( mt6331_regulator_driver ) ;
MODULE_AUTHOR ( " AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> " ) ;
MODULE_DESCRIPTION ( " Regulator Driver for MediaTek MT6331 PMIC " ) ;
MODULE_LICENSE ( " GPL " ) ;