Commit 794016f9 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'regulator/topic/doc',...

Merge remote-tracking branches 'regulator/topic/doc', 'regulator/topic/enable', 'regulator/topic/fan53555', 'regulator/topic/fixed', 'regulator/topic/gpio', 'regulator/topic/lp3971', 'regulator/topic/lp872x' and 'regulator/topic/max14577' into regulator-next
...@@ -8,8 +8,12 @@ Required properties: ...@@ -8,8 +8,12 @@ Required properties:
Optional properties: Optional properties:
- enable-gpio : GPIO to use to enable/disable the regulator. - enable-gpio : GPIO to use to enable/disable the regulator.
- gpios : GPIO group used to control voltage. - gpios : GPIO group used to control voltage.
- gpios-states : gpios pin's initial states array. 0: LOW, 1: HIGH.
defualt is LOW if nothing is specified.
- startup-delay-us : Startup time in microseconds. - startup-delay-us : Startup time in microseconds.
- enable-active-high : Polarity of GPIO is active high (default is low). - enable-active-high : Polarity of GPIO is active high (default is low).
- regulator-type : Specifies what is being regulated, must be either
"voltage" or "current", defaults to current.
Any property defined as part of the core regulator binding defined in Any property defined as part of the core regulator binding defined in
regulator.txt can also be used. regulator.txt can also be used.
......
...@@ -790,6 +790,32 @@ void * devm_kmalloc(struct device *dev, size_t size, gfp_t gfp) ...@@ -790,6 +790,32 @@ void * devm_kmalloc(struct device *dev, size_t size, gfp_t gfp)
} }
EXPORT_SYMBOL_GPL(devm_kmalloc); EXPORT_SYMBOL_GPL(devm_kmalloc);
/**
* devm_kstrdup - Allocate resource managed space and
* copy an existing string into that.
* @dev: Device to allocate memory for
* @s: the string to duplicate
* @gfp: the GFP mask used in the devm_kmalloc() call when
* allocating memory
* RETURNS:
* Pointer to allocated string on success, NULL on failure.
*/
char *devm_kstrdup(struct device *dev, const char *s, gfp_t gfp)
{
size_t size;
char *buf;
if (!s)
return NULL;
size = strlen(s) + 1;
buf = devm_kmalloc(dev, size, gfp);
if (buf)
memcpy(buf, s, size);
return buf;
}
EXPORT_SYMBOL_GPL(devm_kstrdup);
/** /**
* devm_kfree - Resource-managed kfree * devm_kfree - Resource-managed kfree
* @dev: Device this memory belongs to * @dev: Device this memory belongs to
......
...@@ -903,6 +903,38 @@ struct device_node *of_find_node_by_phandle(phandle handle) ...@@ -903,6 +903,38 @@ struct device_node *of_find_node_by_phandle(phandle handle)
} }
EXPORT_SYMBOL(of_find_node_by_phandle); EXPORT_SYMBOL(of_find_node_by_phandle);
/**
* of_property_count_elems_of_size - Count the number of elements in a property
*
* @np: device node from which the property value is to be read.
* @propname: name of the property to be searched.
* @elem_size: size of the individual element
*
* Search for a property in a device node and count the number of elements of
* size elem_size in it. Returns number of elements on sucess, -EINVAL if the
* property does not exist or its length does not match a multiple of elem_size
* and -ENODATA if the property does not have a value.
*/
int of_property_count_elems_of_size(const struct device_node *np,
const char *propname, int elem_size)
{
struct property *prop = of_find_property(np, propname, NULL);
if (!prop)
return -EINVAL;
if (!prop->value)
return -ENODATA;
if (prop->length % elem_size != 0) {
pr_err("size of %s in node %s is not a multiple of %d\n",
propname, np->full_name, elem_size);
return -EINVAL;
}
return prop->length / elem_size;
}
EXPORT_SYMBOL_GPL(of_property_count_elems_of_size);
/** /**
* of_find_property_value_of_size * of_find_property_value_of_size
* *
......
...@@ -90,11 +90,11 @@ static int fan53555_set_suspend_voltage(struct regulator_dev *rdev, int uV) ...@@ -90,11 +90,11 @@ static int fan53555_set_suspend_voltage(struct regulator_dev *rdev, int uV)
return 0; return 0;
ret = regulator_map_voltage_linear(rdev, uV, uV); ret = regulator_map_voltage_linear(rdev, uV, uV);
if (ret < 0) if (ret < 0)
return -EINVAL; return ret;
ret = regmap_update_bits(di->regmap, di->sleep_reg, ret = regmap_update_bits(di->regmap, di->sleep_reg,
VSEL_NSEL_MASK, ret); VSEL_NSEL_MASK, ret);
if (ret < 0) if (ret < 0)
return -EINVAL; return ret;
/* Cache the sleep voltage setting. /* Cache the sleep voltage setting.
* Might not be the real voltage which is rounded */ * Might not be the real voltage which is rounded */
di->sleep_vol_cache = uV; di->sleep_vol_cache = uV;
...@@ -244,10 +244,9 @@ static int fan53555_regulator_probe(struct i2c_client *client, ...@@ -244,10 +244,9 @@ static int fan53555_regulator_probe(struct i2c_client *client,
di = devm_kzalloc(&client->dev, sizeof(struct fan53555_device_info), di = devm_kzalloc(&client->dev, sizeof(struct fan53555_device_info),
GFP_KERNEL); GFP_KERNEL);
if (!di) { if (!di)
dev_err(&client->dev, "Failed to allocate device info data!\n");
return -ENOMEM; return -ENOMEM;
}
di->regmap = devm_regmap_init_i2c(client, &fan53555_regmap_config); di->regmap = devm_regmap_init_i2c(client, &fan53555_regmap_config);
if (IS_ERR(di->regmap)) { if (IS_ERR(di->regmap)) {
dev_err(&client->dev, "Failed to allocate regmap!\n"); dev_err(&client->dev, "Failed to allocate regmap!\n");
...@@ -260,14 +259,14 @@ static int fan53555_regulator_probe(struct i2c_client *client, ...@@ -260,14 +259,14 @@ static int fan53555_regulator_probe(struct i2c_client *client,
ret = regmap_read(di->regmap, FAN53555_ID1, &val); ret = regmap_read(di->regmap, FAN53555_ID1, &val);
if (ret < 0) { if (ret < 0) {
dev_err(&client->dev, "Failed to get chip ID!\n"); dev_err(&client->dev, "Failed to get chip ID!\n");
return -ENODEV; return ret;
} }
di->chip_id = val & DIE_ID; di->chip_id = val & DIE_ID;
/* Get chip revision */ /* Get chip revision */
ret = regmap_read(di->regmap, FAN53555_ID2, &val); ret = regmap_read(di->regmap, FAN53555_ID2, &val);
if (ret < 0) { if (ret < 0) {
dev_err(&client->dev, "Failed to get chip Rev!\n"); dev_err(&client->dev, "Failed to get chip Rev!\n");
return -ENODEV; return ret;
} }
di->chip_rev = val & DIE_REV; di->chip_rev = val & DIE_REV;
dev_info(&client->dev, "FAN53555 Option[%d] Rev[%d] Detected!\n", dev_info(&client->dev, "FAN53555 Option[%d] Rev[%d] Detected!\n",
......
...@@ -130,17 +130,15 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev) ...@@ -130,17 +130,15 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
drvdata = devm_kzalloc(&pdev->dev, sizeof(struct fixed_voltage_data), drvdata = devm_kzalloc(&pdev->dev, sizeof(struct fixed_voltage_data),
GFP_KERNEL); GFP_KERNEL);
if (drvdata == NULL) { if (!drvdata)
dev_err(&pdev->dev, "Failed to allocate device data\n"); return -ENOMEM;
ret = -ENOMEM;
goto err;
}
drvdata->desc.name = kstrdup(config->supply_name, GFP_KERNEL); drvdata->desc.name = devm_kstrdup(&pdev->dev,
config->supply_name,
GFP_KERNEL);
if (drvdata->desc.name == NULL) { if (drvdata->desc.name == NULL) {
dev_err(&pdev->dev, "Failed to allocate supply name\n"); dev_err(&pdev->dev, "Failed to allocate supply name\n");
ret = -ENOMEM; return -ENOMEM;
goto err;
} }
drvdata->desc.type = REGULATOR_VOLTAGE; drvdata->desc.type = REGULATOR_VOLTAGE;
drvdata->desc.owner = THIS_MODULE; drvdata->desc.owner = THIS_MODULE;
...@@ -149,13 +147,13 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev) ...@@ -149,13 +147,13 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
drvdata->desc.enable_time = config->startup_delay; drvdata->desc.enable_time = config->startup_delay;
if (config->input_supply) { if (config->input_supply) {
drvdata->desc.supply_name = kstrdup(config->input_supply, drvdata->desc.supply_name = devm_kstrdup(&pdev->dev,
config->input_supply,
GFP_KERNEL); GFP_KERNEL);
if (!drvdata->desc.supply_name) { if (!drvdata->desc.supply_name) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Failed to allocate input supply\n"); "Failed to allocate input supply\n");
ret = -ENOMEM; return -ENOMEM;
goto err_name;
} }
} }
...@@ -186,11 +184,12 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev) ...@@ -186,11 +184,12 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
cfg.driver_data = drvdata; cfg.driver_data = drvdata;
cfg.of_node = pdev->dev.of_node; cfg.of_node = pdev->dev.of_node;
drvdata->dev = regulator_register(&drvdata->desc, &cfg); drvdata->dev = devm_regulator_register(&pdev->dev, &drvdata->desc,
&cfg);
if (IS_ERR(drvdata->dev)) { if (IS_ERR(drvdata->dev)) {
ret = PTR_ERR(drvdata->dev); ret = PTR_ERR(drvdata->dev);
dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret); dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret);
goto err_input; return ret;
} }
platform_set_drvdata(pdev, drvdata); platform_set_drvdata(pdev, drvdata);
...@@ -199,24 +198,6 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev) ...@@ -199,24 +198,6 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
drvdata->desc.fixed_uV); drvdata->desc.fixed_uV);
return 0; return 0;
err_input:
kfree(drvdata->desc.supply_name);
err_name:
kfree(drvdata->desc.name);
err:
return ret;
}
static int reg_fixed_voltage_remove(struct platform_device *pdev)
{
struct fixed_voltage_data *drvdata = platform_get_drvdata(pdev);
regulator_unregister(drvdata->dev);
kfree(drvdata->desc.supply_name);
kfree(drvdata->desc.name);
return 0;
} }
#if defined(CONFIG_OF) #if defined(CONFIG_OF)
...@@ -229,7 +210,6 @@ MODULE_DEVICE_TABLE(of, fixed_of_match); ...@@ -229,7 +210,6 @@ MODULE_DEVICE_TABLE(of, fixed_of_match);
static struct platform_driver regulator_fixed_voltage_driver = { static struct platform_driver regulator_fixed_voltage_driver = {
.probe = reg_fixed_voltage_probe, .probe = reg_fixed_voltage_probe,
.remove = reg_fixed_voltage_remove,
.driver = { .driver = {
.name = "reg-fixed-voltage", .name = "reg-fixed-voltage",
.owner = THIS_MODULE, .owner = THIS_MODULE,
......
...@@ -136,7 +136,6 @@ static struct gpio_regulator_config * ...@@ -136,7 +136,6 @@ static struct gpio_regulator_config *
of_get_gpio_regulator_config(struct device *dev, struct device_node *np) of_get_gpio_regulator_config(struct device *dev, struct device_node *np)
{ {
struct gpio_regulator_config *config; struct gpio_regulator_config *config;
struct property *prop;
const char *regtype; const char *regtype;
int proplen, gpio, i; int proplen, gpio, i;
int ret; int ret;
...@@ -172,22 +171,35 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np) ...@@ -172,22 +171,35 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np)
if (!config->gpios) if (!config->gpios)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
proplen = of_property_count_u32_elems(np, "gpios-states");
/* optional property */
if (proplen < 0)
proplen = 0;
if (proplen > 0 && proplen != config->nr_gpios) {
dev_warn(dev, "gpios <-> gpios-states mismatch\n");
proplen = 0;
}
for (i = 0; i < config->nr_gpios; i++) { for (i = 0; i < config->nr_gpios; i++) {
gpio = of_get_named_gpio(np, "gpios", i); gpio = of_get_named_gpio(np, "gpios", i);
if (gpio < 0) if (gpio < 0)
break; break;
config->gpios[i].gpio = gpio; config->gpios[i].gpio = gpio;
if (proplen > 0) {
of_property_read_u32_index(np, "gpios-states", i, &ret);
if (ret)
config->gpios[i].flags = GPIOF_OUT_INIT_HIGH;
}
} }
/* Fetch states. */ /* Fetch states. */
prop = of_find_property(np, "states", NULL); proplen = of_property_count_u32_elems(np, "states");
if (!prop) { if (proplen < 0) {
dev_err(dev, "No 'states' property found\n"); dev_err(dev, "No 'states' property found\n");
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
proplen = prop->length / sizeof(int);
config->states = devm_kzalloc(dev, config->states = devm_kzalloc(dev,
sizeof(struct gpio_regulator_state) sizeof(struct gpio_regulator_state)
* (proplen / 2), * (proplen / 2),
...@@ -196,10 +208,10 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np) ...@@ -196,10 +208,10 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
for (i = 0; i < proplen / 2; i++) { for (i = 0; i < proplen / 2; i++) {
config->states[i].value = of_property_read_u32_index(np, "states", i * 2,
be32_to_cpup((int *)prop->value + (i * 2)); &config->states[i].value);
config->states[i].gpios = of_property_read_u32_index(np, "states", i * 2 + 1,
be32_to_cpup((int *)prop->value + (i * 2 + 1)); &config->states[i].gpios);
} }
config->nr_states = i; config->nr_states = i;
...@@ -239,10 +251,8 @@ static int gpio_regulator_probe(struct platform_device *pdev) ...@@ -239,10 +251,8 @@ static int gpio_regulator_probe(struct platform_device *pdev)
drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data), drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data),
GFP_KERNEL); GFP_KERNEL);
if (drvdata == NULL) { if (drvdata == NULL)
dev_err(&pdev->dev, "Failed to allocate device data\n");
return -ENOMEM; return -ENOMEM;
}
drvdata->desc.name = kstrdup(config->supply_name, GFP_KERNEL); drvdata->desc.name = kstrdup(config->supply_name, GFP_KERNEL);
if (drvdata->desc.name == NULL) { if (drvdata->desc.name == NULL) {
......
...@@ -37,10 +37,17 @@ int regulator_is_enabled_regmap(struct regulator_dev *rdev) ...@@ -37,10 +37,17 @@ int regulator_is_enabled_regmap(struct regulator_dev *rdev)
if (ret != 0) if (ret != 0)
return ret; return ret;
if (rdev->desc->enable_is_inverted) val &= rdev->desc->enable_mask;
return (val & rdev->desc->enable_mask) == 0;
else if (rdev->desc->enable_is_inverted) {
return (val & rdev->desc->enable_mask) != 0; if (rdev->desc->enable_val)
return val != rdev->desc->enable_val;
return val == 0;
} else {
if (rdev->desc->enable_val)
return val == rdev->desc->enable_val;
return val != 0;
}
} }
EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap); EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap);
...@@ -57,10 +64,13 @@ int regulator_enable_regmap(struct regulator_dev *rdev) ...@@ -57,10 +64,13 @@ int regulator_enable_regmap(struct regulator_dev *rdev)
{ {
unsigned int val; unsigned int val;
if (rdev->desc->enable_is_inverted) if (rdev->desc->enable_is_inverted) {
val = 0; val = rdev->desc->disable_val;
else } else {
val = rdev->desc->enable_val;
if (!val)
val = rdev->desc->enable_mask; val = rdev->desc->enable_mask;
}
return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
rdev->desc->enable_mask, val); rdev->desc->enable_mask, val);
...@@ -80,10 +90,13 @@ int regulator_disable_regmap(struct regulator_dev *rdev) ...@@ -80,10 +90,13 @@ int regulator_disable_regmap(struct regulator_dev *rdev)
{ {
unsigned int val; unsigned int val;
if (rdev->desc->enable_is_inverted) if (rdev->desc->enable_is_inverted) {
val = rdev->desc->enable_val;
if (!val)
val = rdev->desc->enable_mask; val = rdev->desc->enable_mask;
else } else {
val = 0; val = rdev->desc->disable_val;
}
return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
rdev->desc->enable_mask, val); rdev->desc->enable_mask, val);
...@@ -419,10 +432,13 @@ int regulator_set_bypass_regmap(struct regulator_dev *rdev, bool enable) ...@@ -419,10 +432,13 @@ int regulator_set_bypass_regmap(struct regulator_dev *rdev, bool enable)
{ {
unsigned int val; unsigned int val;
if (enable) if (enable) {
val = rdev->desc->bypass_val_on;
if (!val)
val = rdev->desc->bypass_mask; val = rdev->desc->bypass_mask;
else } else {
val = 0; val = rdev->desc->bypass_val_off;
}
return regmap_update_bits(rdev->regmap, rdev->desc->bypass_reg, return regmap_update_bits(rdev->regmap, rdev->desc->bypass_reg,
rdev->desc->bypass_mask, val); rdev->desc->bypass_mask, val);
......
...@@ -327,7 +327,7 @@ static int lp3971_i2c_read(struct i2c_client *i2c, char reg, int count, ...@@ -327,7 +327,7 @@ static int lp3971_i2c_read(struct i2c_client *i2c, char reg, int count,
return -EIO; return -EIO;
ret = i2c_smbus_read_byte_data(i2c, reg); ret = i2c_smbus_read_byte_data(i2c, reg);
if (ret < 0) if (ret < 0)
return -EIO; return ret;
*dest = ret; *dest = ret;
return 0; return 0;
......
...@@ -211,7 +211,7 @@ static int lp872x_get_timestep_usec(struct lp872x *lp) ...@@ -211,7 +211,7 @@ static int lp872x_get_timestep_usec(struct lp872x *lp)
ret = lp872x_read_byte(lp, LP872X_GENERAL_CFG, &val); ret = lp872x_read_byte(lp, LP872X_GENERAL_CFG, &val);
if (ret) if (ret)
return -EINVAL; return ret;
val = (val & mask) >> shift; val = (val & mask) >> shift;
if (val >= size) if (val >= size)
...@@ -229,7 +229,7 @@ static int lp872x_regulator_enable_time(struct regulator_dev *rdev) ...@@ -229,7 +229,7 @@ static int lp872x_regulator_enable_time(struct regulator_dev *rdev)
u8 addr, val; u8 addr, val;
if (time_step_us < 0) if (time_step_us < 0)
return -EINVAL; return time_step_us;
switch (rid) { switch (rid) {
case LP8720_ID_LDO1 ... LP8720_ID_BUCK: case LP8720_ID_LDO1 ... LP8720_ID_BUCK:
......
/* /*
* max14577.c - Regulator driver for the Maxim 14577 * max14577.c - Regulator driver for the Maxim 14577
* *
* Copyright (C) 2013 Samsung Electronics * Copyright (C) 2013,2014 Samsung Electronics
* Krzysztof Kozlowski <k.kozlowski@samsung.com> * Krzysztof Kozlowski <k.kozlowski@samsung.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -22,12 +22,6 @@ ...@@ -22,12 +22,6 @@
#include <linux/mfd/max14577-private.h> #include <linux/mfd/max14577-private.h>
#include <linux/regulator/of_regulator.h> #include <linux/regulator/of_regulator.h>
struct max14577_regulator {
struct device *dev;
struct max14577 *max14577;
struct regulator_dev **regulators;
};
static int max14577_reg_is_enabled(struct regulator_dev *rdev) static int max14577_reg_is_enabled(struct regulator_dev *rdev)
{ {
int rid = rdev_get_id(rdev); int rid = rdev_get_id(rdev);
......
...@@ -626,6 +626,7 @@ static inline void *devm_kcalloc(struct device *dev, ...@@ -626,6 +626,7 @@ static inline void *devm_kcalloc(struct device *dev,
return devm_kmalloc_array(dev, n, size, flags | __GFP_ZERO); return devm_kmalloc_array(dev, n, size, flags | __GFP_ZERO);
} }
extern void devm_kfree(struct device *dev, void *p); extern void devm_kfree(struct device *dev, void *p);
extern char *devm_kstrdup(struct device *dev, const char *s, gfp_t gfp);
void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res); void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res);
void __iomem *devm_request_and_ioremap(struct device *dev, void __iomem *devm_request_and_ioremap(struct device *dev,
......
...@@ -198,6 +198,8 @@ extern struct device_node *of_find_node_with_property( ...@@ -198,6 +198,8 @@ extern struct device_node *of_find_node_with_property(
extern struct property *of_find_property(const struct device_node *np, extern struct property *of_find_property(const struct device_node *np,
const char *name, const char *name,
int *lenp); int *lenp);
extern int of_property_count_elems_of_size(const struct device_node *np,
const char *propname, int elem_size);
extern int of_property_read_u32_index(const struct device_node *np, extern int of_property_read_u32_index(const struct device_node *np,
const char *propname, const char *propname,
u32 index, u32 *out_value); u32 index, u32 *out_value);
...@@ -390,6 +392,12 @@ static inline struct device_node *of_find_compatible_node( ...@@ -390,6 +392,12 @@ static inline struct device_node *of_find_compatible_node(
return NULL; return NULL;
} }
static inline int of_property_count_elems_of_size(const struct device_node *np,
const char *propname, int elem_size)
{
return -ENOSYS;
}
static inline int of_property_read_u32_index(const struct device_node *np, static inline int of_property_read_u32_index(const struct device_node *np,
const char *propname, u32 index, u32 *out_value) const char *propname, u32 index, u32 *out_value)
{ {
...@@ -535,6 +543,74 @@ static inline struct device_node *of_find_matching_node( ...@@ -535,6 +543,74 @@ static inline struct device_node *of_find_matching_node(
return of_find_matching_node_and_match(from, matches, NULL); return of_find_matching_node_and_match(from, matches, NULL);
} }
/**
* of_property_count_u8_elems - Count the number of u8 elements in a property
*
* @np: device node from which the property value is to be read.
* @propname: name of the property to be searched.
*
* Search for a property in a device node and count the number of u8 elements
* in it. Returns number of elements on sucess, -EINVAL if the property does
* not exist or its length does not match a multiple of u8 and -ENODATA if the
* property does not have a value.
*/
static inline int of_property_count_u8_elems(const struct device_node *np,
const char *propname)
{
return of_property_count_elems_of_size(np, propname, sizeof(u8));
}
/**
* of_property_count_u16_elems - Count the number of u16 elements in a property
*
* @np: device node from which the property value is to be read.
* @propname: name of the property to be searched.
*
* Search for a property in a device node and count the number of u16 elements
* in it. Returns number of elements on sucess, -EINVAL if the property does
* not exist or its length does not match a multiple of u16 and -ENODATA if the
* property does not have a value.
*/
static inline int of_property_count_u16_elems(const struct device_node *np,
const char *propname)
{
return of_property_count_elems_of_size(np, propname, sizeof(u16));
}
/**
* of_property_count_u32_elems - Count the number of u32 elements in a property
*
* @np: device node from which the property value is to be read.
* @propname: name of the property to be searched.
*
* Search for a property in a device node and count the number of u32 elements
* in it. Returns number of elements on sucess, -EINVAL if the property does
* not exist or its length does not match a multiple of u32 and -ENODATA if the
* property does not have a value.
*/
static inline int of_property_count_u32_elems(const struct device_node *np,
const char *propname)
{
return of_property_count_elems_of_size(np, propname, sizeof(u32));
}
/**
* of_property_count_u64_elems - Count the number of u64 elements in a property
*
* @np: device node from which the property value is to be read.
* @propname: name of the property to be searched.
*
* Search for a property in a device node and count the number of u64 elements
* in it. Returns number of elements on sucess, -EINVAL if the property does
* not exist or its length does not match a multiple of u64 and -ENODATA if the
* property does not have a value.
*/
static inline int of_property_count_u64_elems(const struct device_node *np,
const char *propname)
{
return of_property_count_elems_of_size(np, propname, sizeof(u64));
}
/** /**
* of_property_read_bool - Findfrom a property * of_property_read_bool - Findfrom a property
* @np: device node from which the property value is to be read. * @np: device node from which the property value is to be read.
......
...@@ -228,10 +228,14 @@ enum regulator_type { ...@@ -228,10 +228,14 @@ enum regulator_type {
* output when using regulator_set_voltage_sel_regmap * output when using regulator_set_voltage_sel_regmap
* @enable_reg: Register for control when using regmap enable/disable ops * @enable_reg: Register for control when using regmap enable/disable ops
* @enable_mask: Mask for control when using regmap enable/disable ops * @enable_mask: Mask for control when using regmap enable/disable ops
* @enable_val: Enabling value for control when using regmap enable/disable ops
* @disable_val: Disabling value for control when using regmap enable/disable ops
* @enable_is_inverted: A flag to indicate set enable_mask bits to disable * @enable_is_inverted: A flag to indicate set enable_mask bits to disable
* when using regulator_enable_regmap and friends APIs. * when using regulator_enable_regmap and friends APIs.
* @bypass_reg: Register for control when using regmap set_bypass * @bypass_reg: Register for control when using regmap set_bypass
* @bypass_mask: Mask for control when using regmap set_bypass * @bypass_mask: Mask for control when using regmap set_bypass
* @bypass_val_on: Enabling value for control when using regmap set_bypass
* @bypass_val_off: Disabling value for control when using regmap set_bypass
* *
* @enable_time: Time taken for initial enable of regulator (in uS). * @enable_time: Time taken for initial enable of regulator (in uS).
*/ */
...@@ -263,9 +267,13 @@ struct regulator_desc { ...@@ -263,9 +267,13 @@ struct regulator_desc {
unsigned int apply_bit; unsigned int apply_bit;
unsigned int enable_reg; unsigned int enable_reg;
unsigned int enable_mask; unsigned int enable_mask;
unsigned int enable_val;
unsigned int disable_val;
bool enable_is_inverted; bool enable_is_inverted;
unsigned int bypass_reg; unsigned int bypass_reg;
unsigned int bypass_mask; unsigned int bypass_mask;
unsigned int bypass_val_on;
unsigned int bypass_val_off;
unsigned int enable_time; unsigned int enable_time;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment