2012-01-11 14:41:49 +04:00
/*
* tps65217 - regulator . c
*
* Regulator driver for TPS65217 PMIC
*
2020-07-19 23:06:23 +03:00
* Copyright ( C ) 2011 Texas Instruments Incorporated - https : //www.ti.com/
2012-01-11 14:41:49 +04:00
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation version 2.
*
* This program is distributed " as is " WITHOUT ANY WARRANTY of any
* kind , whether express or implied ; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*/
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/device.h>
# include <linux/init.h>
# include <linux/err.h>
# include <linux/platform_device.h>
2012-08-13 19:06:05 +04:00
# include <linux/regulator/of_regulator.h>
2012-01-11 14:41:49 +04:00
# include <linux/regulator/driver.h>
# include <linux/regulator/machine.h>
# include <linux/mfd/tps65217.h>
2014-09-10 02:16:11 +04:00
# define TPS65217_REGULATOR(_name, _id, _of_match, _ops, _n, _vr, _vm, _em, \
2016-06-24 11:28:07 +03:00
_t , _lr , _nlr , _sr , _sm ) \
2012-01-11 14:41:49 +04:00
{ \
. name = _name , \
. id = _id , \
2014-09-10 02:16:11 +04:00
. of_match = of_match_ptr ( _of_match ) , \
. regulators_node = of_match_ptr ( " regulators " ) , \
2012-01-11 14:41:49 +04:00
. ops = & _ops , \
. n_voltages = _n , \
. type = REGULATOR_VOLTAGE , \
. owner = THIS_MODULE , \
2012-06-13 07:27:11 +04:00
. vsel_reg = _vr , \
. vsel_mask = _vm , \
. enable_reg = TPS65217_REG_ENABLE , \
. enable_mask = _em , \
2012-06-29 05:45:16 +04:00
. volt_table = _t , \
2013-08-30 14:06:06 +04:00
. linear_ranges = _lr , \
. n_linear_ranges = _nlr , \
2016-06-24 11:28:07 +03:00
. bypass_reg = _sr , \
. bypass_mask = _sm , \
2012-01-11 14:41:49 +04:00
} \
2012-06-29 05:45:16 +04:00
static const unsigned int LDO1_VSEL_table [ ] = {
2012-01-11 14:41:49 +04:00
1000000 , 1100000 , 1200000 , 1250000 ,
1300000 , 1350000 , 1400000 , 1500000 ,
1600000 , 1800000 , 2500000 , 2750000 ,
2800000 , 3000000 , 3100000 , 3300000 ,
} ;
2020-05-08 18:43:36 +03:00
static const struct linear_range tps65217_uv1_ranges [ ] = {
2013-10-11 05:32:18 +04:00
REGULATOR_LINEAR_RANGE ( 900000 , 0 , 24 , 25000 ) ,
2019-03-04 07:41:33 +03:00
REGULATOR_LINEAR_RANGE ( 1550000 , 25 , 52 , 50000 ) ,
2013-10-11 05:32:18 +04:00
REGULATOR_LINEAR_RANGE ( 3000000 , 53 , 55 , 100000 ) ,
2019-03-24 09:00:04 +03:00
REGULATOR_LINEAR_RANGE ( 3300000 , 56 , 63 , 0 ) ,
2013-08-30 14:06:06 +04:00
} ;
2012-01-11 14:41:49 +04:00
2020-05-08 18:43:36 +03:00
static const struct linear_range tps65217_uv2_ranges [ ] = {
2013-10-11 05:32:18 +04:00
REGULATOR_LINEAR_RANGE ( 1500000 , 0 , 8 , 50000 ) ,
REGULATOR_LINEAR_RANGE ( 2000000 , 9 , 13 , 100000 ) ,
REGULATOR_LINEAR_RANGE ( 2450000 , 14 , 31 , 50000 ) ,
2012-01-11 14:41:49 +04:00
} ;
2012-03-12 08:11:46 +04:00
static int tps65217_pmic_enable ( struct regulator_dev * dev )
2012-01-11 14:41:49 +04:00
{
struct tps65217 * tps = rdev_get_drvdata ( dev ) ;
2014-06-24 12:29:15 +04:00
int rid = rdev_get_id ( dev ) ;
2012-01-11 14:41:49 +04:00
2012-03-12 08:11:46 +04:00
if ( rid < TPS65217_DCDC_1 | | rid > TPS65217_LDO_4 )
2012-01-11 14:41:49 +04:00
return - EINVAL ;
/* Enable the regulator and password protection is level 1 */
return tps65217_set_bits ( tps , TPS65217_REG_ENABLE ,
2012-06-13 07:27:11 +04:00
dev - > desc - > enable_mask , dev - > desc - > enable_mask ,
TPS65217_PROTECT_L1 ) ;
2012-01-11 14:41:49 +04:00
}
2012-03-12 08:11:46 +04:00
static int tps65217_pmic_disable ( struct regulator_dev * dev )
2012-01-11 14:41:49 +04:00
{
struct tps65217 * tps = rdev_get_drvdata ( dev ) ;
2014-06-24 12:29:15 +04:00
int rid = rdev_get_id ( dev ) ;
2012-01-11 14:41:49 +04:00
2012-03-12 08:11:46 +04:00
if ( rid < TPS65217_DCDC_1 | | rid > TPS65217_LDO_4 )
2012-01-11 14:41:49 +04:00
return - EINVAL ;
/* Disable the regulator and password protection is level 1 */
return tps65217_clear_bits ( tps , TPS65217_REG_ENABLE ,
2012-06-13 07:27:11 +04:00
dev - > desc - > enable_mask , TPS65217_PROTECT_L1 ) ;
2012-01-11 14:41:49 +04:00
}
2012-05-15 11:17:58 +04:00
static int tps65217_pmic_set_voltage_sel ( struct regulator_dev * dev ,
unsigned selector )
2012-01-11 14:41:49 +04:00
{
2012-05-15 11:17:58 +04:00
int ret ;
2012-01-11 14:41:49 +04:00
struct tps65217 * tps = rdev_get_drvdata ( dev ) ;
2012-05-15 11:17:58 +04:00
unsigned int rid = rdev_get_id ( dev ) ;
2012-01-11 14:41:49 +04:00
2012-05-15 11:17:58 +04:00
/* Set the voltage based on vsel value and write protect level is 2 */
2012-06-13 07:27:11 +04:00
ret = tps65217_set_bits ( tps , dev - > desc - > vsel_reg , dev - > desc - > vsel_mask ,
2012-05-15 11:17:58 +04:00
selector , TPS65217_PROTECT_L2 ) ;
2012-01-11 14:41:49 +04:00
2012-05-15 11:17:58 +04:00
/* Set GO bit for DCDCx to initiate voltage transistion */
switch ( rid ) {
case TPS65217_DCDC_1 . . . TPS65217_DCDC_3 :
ret = tps65217_set_bits ( tps , TPS65217_REG_DEFSLEW ,
TPS65217_DEFSLEW_GO , TPS65217_DEFSLEW_GO ,
TPS65217_PROTECT_L2 ) ;
break ;
}
2012-01-11 14:41:49 +04:00
2012-05-15 11:17:58 +04:00
return ret ;
2012-01-11 14:41:49 +04:00
}
2016-06-24 11:28:07 +03:00
static int tps65217_pmic_set_suspend_enable ( struct regulator_dev * dev )
{
struct tps65217 * tps = rdev_get_drvdata ( dev ) ;
unsigned int rid = rdev_get_id ( dev ) ;
2020-06-26 09:57:34 +03:00
if ( rid > TPS65217_LDO_4 )
2016-06-24 11:28:07 +03:00
return - EINVAL ;
return tps65217_clear_bits ( tps , dev - > desc - > bypass_reg ,
dev - > desc - > bypass_mask ,
TPS65217_PROTECT_L1 ) ;
}
static int tps65217_pmic_set_suspend_disable ( struct regulator_dev * dev )
{
struct tps65217 * tps = rdev_get_drvdata ( dev ) ;
unsigned int rid = rdev_get_id ( dev ) ;
2020-06-26 09:57:34 +03:00
if ( rid > TPS65217_LDO_4 )
2016-06-24 11:28:07 +03:00
return - EINVAL ;
if ( ! tps - > strobes [ rid ] )
return - EINVAL ;
return tps65217_set_bits ( tps , dev - > desc - > bypass_reg ,
dev - > desc - > bypass_mask ,
tps - > strobes [ rid ] , TPS65217_PROTECT_L1 ) ;
}
2012-03-12 08:11:46 +04:00
/* Operations permitted on DCDCx, LDO2, LDO3 and LDO4 */
2019-03-24 09:00:05 +03:00
static const struct regulator_ops tps65217_pmic_ops = {
2012-06-13 07:27:11 +04:00
. is_enabled = regulator_is_enabled_regmap ,
2012-03-12 08:11:46 +04:00
. enable = tps65217_pmic_enable ,
. disable = tps65217_pmic_disable ,
2012-06-13 07:27:11 +04:00
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
2012-05-15 11:17:58 +04:00
. set_voltage_sel = tps65217_pmic_set_voltage_sel ,
2013-08-30 14:06:06 +04:00
. list_voltage = regulator_list_voltage_linear_range ,
. map_voltage = regulator_map_voltage_linear_range ,
2016-06-24 11:28:07 +03:00
. set_suspend_enable = tps65217_pmic_set_suspend_enable ,
. set_suspend_disable = tps65217_pmic_set_suspend_disable ,
2012-01-11 14:41:49 +04:00
} ;
/* Operations permitted on LDO1 */
2019-03-24 09:00:05 +03:00
static const struct regulator_ops tps65217_pmic_ldo1_ops = {
2012-06-13 07:27:11 +04:00
. is_enabled = regulator_is_enabled_regmap ,
2012-03-12 08:11:46 +04:00
. enable = tps65217_pmic_enable ,
. disable = tps65217_pmic_disable ,
2012-06-13 07:27:11 +04:00
. get_voltage_sel = regulator_get_voltage_sel_regmap ,
2012-05-15 11:17:58 +04:00
. set_voltage_sel = tps65217_pmic_set_voltage_sel ,
2012-06-29 05:45:16 +04:00
. list_voltage = regulator_list_voltage_table ,
2014-04-15 15:55:35 +04:00
. map_voltage = regulator_map_voltage_ascend ,
2016-06-24 11:28:07 +03:00
. set_suspend_enable = tps65217_pmic_set_suspend_enable ,
. set_suspend_disable = tps65217_pmic_set_suspend_disable ,
2012-01-11 14:41:49 +04:00
} ;
2012-04-06 04:31:51 +04:00
static const struct regulator_desc regulators [ ] = {
2014-09-10 02:16:11 +04:00
TPS65217_REGULATOR ( " DCDC1 " , TPS65217_DCDC_1 , " dcdc1 " ,
tps65217_pmic_ops , 64 , TPS65217_REG_DEFDCDC1 ,
TPS65217_DEFDCDCX_DCDC_MASK , TPS65217_ENABLE_DC1_EN ,
2017-01-23 13:28:10 +03:00
NULL , tps65217_uv1_ranges ,
ARRAY_SIZE ( tps65217_uv1_ranges ) , TPS65217_REG_SEQ1 ,
2016-06-24 11:28:07 +03:00
TPS65217_SEQ1_DC1_SEQ_MASK ) ,
2014-09-10 02:16:11 +04:00
TPS65217_REGULATOR ( " DCDC2 " , TPS65217_DCDC_2 , " dcdc2 " ,
tps65217_pmic_ops , 64 , TPS65217_REG_DEFDCDC2 ,
TPS65217_DEFDCDCX_DCDC_MASK , TPS65217_ENABLE_DC2_EN ,
NULL , tps65217_uv1_ranges ,
2016-06-24 11:28:07 +03:00
ARRAY_SIZE ( tps65217_uv1_ranges ) , TPS65217_REG_SEQ1 ,
TPS65217_SEQ1_DC2_SEQ_MASK ) ,
2014-09-10 02:16:11 +04:00
TPS65217_REGULATOR ( " DCDC3 " , TPS65217_DCDC_3 , " dcdc3 " ,
tps65217_pmic_ops , 64 , TPS65217_REG_DEFDCDC3 ,
TPS65217_DEFDCDCX_DCDC_MASK , TPS65217_ENABLE_DC3_EN ,
2017-01-23 13:28:10 +03:00
NULL , tps65217_uv1_ranges ,
ARRAY_SIZE ( tps65217_uv1_ranges ) , TPS65217_REG_SEQ2 ,
2016-06-24 11:28:07 +03:00
TPS65217_SEQ2_DC3_SEQ_MASK ) ,
2014-09-10 02:16:11 +04:00
TPS65217_REGULATOR ( " LDO1 " , TPS65217_LDO_1 , " ldo1 " ,
tps65217_pmic_ldo1_ops , 16 , TPS65217_REG_DEFLDO1 ,
TPS65217_DEFLDO1_LDO1_MASK , TPS65217_ENABLE_LDO1_EN ,
2016-06-24 11:28:07 +03:00
LDO1_VSEL_table , NULL , 0 , TPS65217_REG_SEQ2 ,
TPS65217_SEQ2_LDO1_SEQ_MASK ) ,
2014-09-10 02:16:11 +04:00
TPS65217_REGULATOR ( " LDO2 " , TPS65217_LDO_2 , " ldo2 " , tps65217_pmic_ops ,
64 , TPS65217_REG_DEFLDO2 ,
TPS65217_DEFLDO2_LDO2_MASK , TPS65217_ENABLE_LDO2_EN ,
NULL , tps65217_uv1_ranges ,
2016-06-24 11:28:07 +03:00
ARRAY_SIZE ( tps65217_uv1_ranges ) , TPS65217_REG_SEQ3 ,
TPS65217_SEQ3_LDO2_SEQ_MASK ) ,
2014-09-10 02:16:11 +04:00
TPS65217_REGULATOR ( " LDO3 " , TPS65217_LDO_3 , " ldo3 " , tps65217_pmic_ops ,
32 , TPS65217_REG_DEFLS1 , TPS65217_DEFLDO3_LDO3_MASK ,
2012-06-29 05:45:16 +04:00
TPS65217_ENABLE_LS1_EN | TPS65217_DEFLDO3_LDO3_EN ,
2013-08-30 14:06:06 +04:00
NULL , tps65217_uv2_ranges ,
2016-06-24 11:28:07 +03:00
ARRAY_SIZE ( tps65217_uv2_ranges ) , TPS65217_REG_SEQ3 ,
TPS65217_SEQ3_LDO3_SEQ_MASK ) ,
2014-09-10 02:16:11 +04:00
TPS65217_REGULATOR ( " LDO4 " , TPS65217_LDO_4 , " ldo4 " , tps65217_pmic_ops ,
32 , TPS65217_REG_DEFLS2 , TPS65217_DEFLDO4_LDO4_MASK ,
2012-06-29 05:45:16 +04:00
TPS65217_ENABLE_LS2_EN | TPS65217_DEFLDO4_LDO4_EN ,
2013-08-30 14:06:06 +04:00
NULL , tps65217_uv2_ranges ,
2016-06-24 11:28:07 +03:00
ARRAY_SIZE ( tps65217_uv2_ranges ) , TPS65217_REG_SEQ4 ,
TPS65217_SEQ4_LDO4_SEQ_MASK ) ,
2012-01-11 14:41:49 +04:00
} ;
2012-11-19 22:22:22 +04:00
static int tps65217_regulator_probe ( struct platform_device * pdev )
2012-01-11 14:41:49 +04:00
{
2012-08-13 19:06:05 +04:00
struct tps65217 * tps = dev_get_drvdata ( pdev - > dev . parent ) ;
struct tps65217_board * pdata = dev_get_platdata ( tps - > dev ) ;
2012-01-11 14:41:49 +04:00
struct regulator_dev * rdev ;
2012-04-04 03:50:22 +04:00
struct regulator_config config = { } ;
2016-06-24 11:28:07 +03:00
int i , ret ;
unsigned int val ;
2012-01-11 14:41:49 +04:00
2016-06-24 11:28:07 +03:00
/* Allocate memory for strobes */
treewide: devm_kzalloc() -> devm_kcalloc()
The devm_kzalloc() function has a 2-factor argument form, devm_kcalloc().
This patch replaces cases of:
devm_kzalloc(handle, a * b, gfp)
with:
devm_kcalloc(handle, a * b, gfp)
as well as handling cases of:
devm_kzalloc(handle, a * b * c, gfp)
with:
devm_kzalloc(handle, array3_size(a, b, c), gfp)
as it's slightly less ugly than:
devm_kcalloc(handle, array_size(a, b), c, gfp)
This does, however, attempt to ignore constant size factors like:
devm_kzalloc(handle, 4 * 1024, gfp)
though any constants defined via macros get caught up in the conversion.
Any factors with a sizeof() of "unsigned char", "char", and "u8" were
dropped, since they're redundant.
Some manual whitespace fixes were needed in this patch, as Coccinelle
really liked to write "=devm_kcalloc..." instead of "= devm_kcalloc...".
The Coccinelle script used for this was:
// Fix redundant parens around sizeof().
@@
expression HANDLE;
type TYPE;
expression THING, E;
@@
(
devm_kzalloc(HANDLE,
- (sizeof(TYPE)) * E
+ sizeof(TYPE) * E
, ...)
|
devm_kzalloc(HANDLE,
- (sizeof(THING)) * E
+ sizeof(THING) * E
, ...)
)
// Drop single-byte sizes and redundant parens.
@@
expression HANDLE;
expression COUNT;
typedef u8;
typedef __u8;
@@
(
devm_kzalloc(HANDLE,
- sizeof(u8) * (COUNT)
+ COUNT
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(__u8) * (COUNT)
+ COUNT
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(char) * (COUNT)
+ COUNT
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(unsigned char) * (COUNT)
+ COUNT
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(u8) * COUNT
+ COUNT
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(__u8) * COUNT
+ COUNT
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(char) * COUNT
+ COUNT
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(unsigned char) * COUNT
+ COUNT
, ...)
)
// 2-factor product with sizeof(type/expression) and identifier or constant.
@@
expression HANDLE;
type TYPE;
expression THING;
identifier COUNT_ID;
constant COUNT_CONST;
@@
(
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- sizeof(TYPE) * (COUNT_ID)
+ COUNT_ID, sizeof(TYPE)
, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- sizeof(TYPE) * COUNT_ID
+ COUNT_ID, sizeof(TYPE)
, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- sizeof(TYPE) * (COUNT_CONST)
+ COUNT_CONST, sizeof(TYPE)
, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- sizeof(TYPE) * COUNT_CONST
+ COUNT_CONST, sizeof(TYPE)
, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- sizeof(THING) * (COUNT_ID)
+ COUNT_ID, sizeof(THING)
, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- sizeof(THING) * COUNT_ID
+ COUNT_ID, sizeof(THING)
, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- sizeof(THING) * (COUNT_CONST)
+ COUNT_CONST, sizeof(THING)
, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- sizeof(THING) * COUNT_CONST
+ COUNT_CONST, sizeof(THING)
, ...)
)
// 2-factor product, only identifiers.
@@
expression HANDLE;
identifier SIZE, COUNT;
@@
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- SIZE * COUNT
+ COUNT, SIZE
, ...)
// 3-factor product with 1 sizeof(type) or sizeof(expression), with
// redundant parens removed.
@@
expression HANDLE;
expression THING;
identifier STRIDE, COUNT;
type TYPE;
@@
(
devm_kzalloc(HANDLE,
- sizeof(TYPE) * (COUNT) * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(TYPE) * (COUNT) * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(TYPE) * COUNT * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(TYPE) * COUNT * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(THING) * (COUNT) * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(THING) * (COUNT) * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(THING) * COUNT * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(THING) * COUNT * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
)
// 3-factor product with 2 sizeof(variable), with redundant parens removed.
@@
expression HANDLE;
expression THING1, THING2;
identifier COUNT;
type TYPE1, TYPE2;
@@
(
devm_kzalloc(HANDLE,
- sizeof(TYPE1) * sizeof(TYPE2) * COUNT
+ array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(TYPE1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(THING1) * sizeof(THING2) * COUNT
+ array3_size(COUNT, sizeof(THING1), sizeof(THING2))
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(THING1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(THING1), sizeof(THING2))
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(TYPE1) * sizeof(THING2) * COUNT
+ array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
, ...)
|
devm_kzalloc(HANDLE,
- sizeof(TYPE1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
, ...)
)
// 3-factor product, only identifiers, with redundant parens removed.
@@
expression HANDLE;
identifier STRIDE, SIZE, COUNT;
@@
(
devm_kzalloc(HANDLE,
- (COUNT) * STRIDE * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
devm_kzalloc(HANDLE,
- COUNT * (STRIDE) * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
devm_kzalloc(HANDLE,
- COUNT * STRIDE * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
devm_kzalloc(HANDLE,
- (COUNT) * (STRIDE) * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
devm_kzalloc(HANDLE,
- COUNT * (STRIDE) * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
devm_kzalloc(HANDLE,
- (COUNT) * STRIDE * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
devm_kzalloc(HANDLE,
- (COUNT) * (STRIDE) * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
devm_kzalloc(HANDLE,
- COUNT * STRIDE * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
)
// Any remaining multi-factor products, first at least 3-factor products,
// when they're not all constants...
@@
expression HANDLE;
expression E1, E2, E3;
constant C1, C2, C3;
@@
(
devm_kzalloc(HANDLE, C1 * C2 * C3, ...)
|
devm_kzalloc(HANDLE,
- (E1) * E2 * E3
+ array3_size(E1, E2, E3)
, ...)
|
devm_kzalloc(HANDLE,
- (E1) * (E2) * E3
+ array3_size(E1, E2, E3)
, ...)
|
devm_kzalloc(HANDLE,
- (E1) * (E2) * (E3)
+ array3_size(E1, E2, E3)
, ...)
|
devm_kzalloc(HANDLE,
- E1 * E2 * E3
+ array3_size(E1, E2, E3)
, ...)
)
// And then all remaining 2 factors products when they're not all constants,
// keeping sizeof() as the second factor argument.
@@
expression HANDLE;
expression THING, E1, E2;
type TYPE;
constant C1, C2, C3;
@@
(
devm_kzalloc(HANDLE, sizeof(THING) * C2, ...)
|
devm_kzalloc(HANDLE, sizeof(TYPE) * C2, ...)
|
devm_kzalloc(HANDLE, C1 * C2 * C3, ...)
|
devm_kzalloc(HANDLE, C1 * C2, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- sizeof(TYPE) * (E2)
+ E2, sizeof(TYPE)
, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- sizeof(TYPE) * E2
+ E2, sizeof(TYPE)
, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- sizeof(THING) * (E2)
+ E2, sizeof(THING)
, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- sizeof(THING) * E2
+ E2, sizeof(THING)
, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- (E1) * E2
+ E1, E2
, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- (E1) * (E2)
+ E1, E2
, ...)
|
- devm_kzalloc
+ devm_kcalloc
(HANDLE,
- E1 * E2
+ E1, E2
, ...)
)
Signed-off-by: Kees Cook <keescook@chromium.org>
2018-06-13 00:07:58 +03:00
tps - > strobes = devm_kcalloc ( & pdev - > dev ,
TPS65217_NUM_REGULATOR , sizeof ( u8 ) ,
GFP_KERNEL ) ;
2018-07-27 16:59:29 +03:00
if ( ! tps - > strobes )
return - ENOMEM ;
2016-06-24 11:28:07 +03:00
2012-08-13 19:06:05 +04:00
platform_set_drvdata ( pdev , tps ) ;
2012-01-11 14:41:49 +04:00
2012-08-13 19:06:05 +04:00
for ( i = 0 ; i < TPS65217_NUM_REGULATOR ; i + + ) {
/* Register the regulators */
config . dev = tps - > dev ;
2014-09-06 15:10:47 +04:00
if ( pdata )
config . init_data = pdata - > tps65217_init_data [ i ] ;
2012-08-13 19:06:05 +04:00
config . driver_data = tps ;
config . regmap = tps - > regmap ;
2013-09-04 15:47:49 +04:00
rdev = devm_regulator_register ( & pdev - > dev , & regulators [ i ] ,
& config ) ;
2012-08-13 19:06:05 +04:00
if ( IS_ERR ( rdev ) ) {
dev_err ( tps - > dev , " failed to register %s regulator \n " ,
pdev - > name ) ;
2013-09-04 15:47:49 +04:00
return PTR_ERR ( rdev ) ;
2012-08-13 19:06:05 +04:00
}
2016-06-24 11:28:07 +03:00
/* Store default strobe info */
ret = tps65217_reg_read ( tps , regulators [ i ] . bypass_reg , & val ) ;
2020-06-26 09:57:35 +03:00
if ( ret )
return ret ;
2016-06-24 11:28:07 +03:00
tps - > strobes [ i ] = val & regulators [ i ] . bypass_mask ;
2012-08-13 19:06:05 +04:00
}
2014-09-10 02:16:11 +04:00
2012-01-11 14:41:49 +04:00
return 0 ;
}
static struct platform_driver tps65217_regulator_driver = {
. driver = {
. name = " tps65217-pmic " ,
} ,
. probe = tps65217_regulator_probe ,
} ;
static int __init tps65217_regulator_init ( void )
{
return platform_driver_register ( & tps65217_regulator_driver ) ;
}
subsys_initcall ( tps65217_regulator_init ) ;
static void __exit tps65217_regulator_exit ( void )
{
platform_driver_unregister ( & tps65217_regulator_driver ) ;
}
module_exit ( tps65217_regulator_exit ) ;
MODULE_AUTHOR ( " AnilKumar Ch <anilkumar@ti.com> " ) ;
MODULE_DESCRIPTION ( " TPS65217 voltage regulator driver " ) ;
MODULE_ALIAS ( " platform:tps65217-pmic " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;