regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
/*
* gpio - regulator . c
*
* Copyright 2011 Heiko Stuebner < heiko @ sntech . de >
*
* based on fixed . c
*
* Copyright 2008 Wolfson Microelectronics PLC .
*
* Author : Mark Brown < broonie @ opensource . wolfsonmicro . com >
*
* Copyright ( c ) 2009 Nokia Corporation
* Roger Quadros < ext - roger . quadros @ nokia . com >
*
* 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 ; either version 2 of the
* License , or ( at your option ) any later version .
*
* This is useful for systems with mixed controllable and
* non - controllable regulators , as well as for allowing testing on
* systems with no controllable regulators .
*/
# include <linux/err.h>
# include <linux/mutex.h>
2011-10-11 16:59:13 +04:00
# include <linux/module.h>
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
# include <linux/platform_device.h>
# include <linux/regulator/driver.h>
# include <linux/regulator/machine.h>
2012-10-15 17:16:59 +04:00
# include <linux/regulator/of_regulator.h>
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
# include <linux/regulator/gpio-regulator.h>
# include <linux/gpio.h>
# include <linux/slab.h>
2012-10-15 17:16:59 +04:00
# include <linux/of.h>
# include <linux/of_gpio.h>
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
struct gpio_regulator_data {
struct regulator_desc desc ;
struct regulator_dev * dev ;
struct gpio * gpios ;
int nr_gpios ;
struct gpio_regulator_state * states ;
int nr_states ;
int state ;
} ;
static int gpio_regulator_get_value ( struct regulator_dev * dev )
{
struct gpio_regulator_data * data = rdev_get_drvdata ( dev ) ;
int ptr ;
for ( ptr = 0 ; ptr < data - > nr_states ; ptr + + )
if ( data - > states [ ptr ] . gpios = = data - > state )
return data - > states [ ptr ] . value ;
return - EINVAL ;
}
2012-08-08 02:50:19 +04:00
static int gpio_regulator_set_voltage ( struct regulator_dev * dev ,
int min_uV , int max_uV ,
unsigned * selector )
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
{
struct gpio_regulator_data * data = rdev_get_drvdata ( dev ) ;
2012-06-03 23:31:09 +04:00
int ptr , target = 0 , state , best_val = INT_MAX ;
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
for ( ptr = 0 ; ptr < data - > nr_states ; ptr + + )
2012-03-22 10:08:04 +04:00
if ( data - > states [ ptr ] . value < best_val & &
2012-08-08 02:50:19 +04:00
data - > states [ ptr ] . value > = min_uV & &
data - > states [ ptr ] . value < = max_uV ) {
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
target = data - > states [ ptr ] . gpios ;
2012-06-03 23:31:09 +04:00
best_val = data - > states [ ptr ] . value ;
2012-06-03 23:32:05 +04:00
if ( selector )
* selector = ptr ;
2012-06-03 23:31:09 +04:00
}
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
2012-03-22 10:08:04 +04:00
if ( best_val = = INT_MAX )
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
return - EINVAL ;
for ( ptr = 0 ; ptr < data - > nr_gpios ; ptr + + ) {
state = ( target & ( 1 < < ptr ) ) > > ptr ;
2012-12-10 12:55:53 +04:00
gpio_set_value_cansleep ( data - > gpios [ ptr ] . gpio , state ) ;
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
}
data - > state = target ;
return 0 ;
}
static int gpio_regulator_list_voltage ( struct regulator_dev * dev ,
unsigned selector )
{
struct gpio_regulator_data * data = rdev_get_drvdata ( dev ) ;
if ( selector > = data - > nr_states )
return - EINVAL ;
return data - > states [ selector ] . value ;
}
static int gpio_regulator_set_current_limit ( struct regulator_dev * dev ,
int min_uA , int max_uA )
{
2012-08-08 02:50:19 +04:00
struct gpio_regulator_data * data = rdev_get_drvdata ( dev ) ;
int ptr , target = 0 , state , best_val = 0 ;
for ( ptr = 0 ; ptr < data - > nr_states ; ptr + + )
if ( data - > states [ ptr ] . value > best_val & &
data - > states [ ptr ] . value > = min_uA & &
data - > states [ ptr ] . value < = max_uA ) {
target = data - > states [ ptr ] . gpios ;
best_val = data - > states [ ptr ] . value ;
}
if ( best_val = = 0 )
return - EINVAL ;
for ( ptr = 0 ; ptr < data - > nr_gpios ; ptr + + ) {
state = ( target & ( 1 < < ptr ) ) > > ptr ;
2012-12-10 12:55:53 +04:00
gpio_set_value_cansleep ( data - > gpios [ ptr ] . gpio , state ) ;
2012-08-08 02:50:19 +04:00
}
data - > state = target ;
return 0 ;
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
}
static struct regulator_ops gpio_regulator_voltage_ops = {
. get_voltage = gpio_regulator_get_value ,
. set_voltage = gpio_regulator_set_voltage ,
. list_voltage = gpio_regulator_list_voltage ,
} ;
2013-01-28 18:17:46 +04:00
static struct gpio_regulator_config *
2014-11-10 16:43:53 +03:00
of_get_gpio_regulator_config ( struct device * dev , struct device_node * np ,
const struct regulator_desc * desc )
2012-10-15 17:16:59 +04:00
{
struct gpio_regulator_config * config ;
const char * regtype ;
int proplen , gpio , i ;
2013-11-09 16:12:28 +04:00
int ret ;
2012-10-15 17:16:59 +04:00
config = devm_kzalloc ( dev ,
sizeof ( struct gpio_regulator_config ) ,
GFP_KERNEL ) ;
if ( ! config )
return ERR_PTR ( - ENOMEM ) ;
2014-11-10 16:43:53 +03:00
config - > init_data = of_get_regulator_init_data ( dev , np , desc ) ;
2012-10-15 17:16:59 +04:00
if ( ! config - > init_data )
return ERR_PTR ( - EINVAL ) ;
config - > supply_name = config - > init_data - > constraints . name ;
if ( of_property_read_bool ( np , " enable-active-high " ) )
config - > enable_high = true ;
if ( of_property_read_bool ( np , " enable-at-boot " ) )
config - > enabled_at_boot = true ;
of_property_read_u32 ( np , " startup-delay-us " , & config - > startup_delay ) ;
config - > enable_gpio = of_get_named_gpio ( np , " enable-gpio " , 0 ) ;
2016-03-16 18:21:12 +03:00
if ( config - > enable_gpio = = - EPROBE_DEFER )
return ERR_PTR ( - EPROBE_DEFER ) ;
2012-10-15 17:16:59 +04:00
2014-11-19 17:13:06 +03:00
/* Fetch GPIOs. - optional property*/
ret = of_gpio_count ( np ) ;
if ( ( ret < 0 ) & & ( ret ! = - ENOENT ) )
return ERR_PTR ( ret ) ;
if ( ret > 0 ) {
config - > nr_gpios = ret ;
config - > gpios = devm_kzalloc ( dev ,
sizeof ( struct gpio ) * config - > nr_gpios ,
GFP_KERNEL ) ;
if ( ! config - > gpios )
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 ;
}
2014-01-31 09:25:14 +04:00
2014-11-19 17:13:06 +03:00
for ( i = 0 ; i < config - > nr_gpios ; i + + ) {
gpio = of_get_named_gpio ( np , " gpios " , i ) ;
if ( gpio < 0 )
break ;
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 ;
}
2014-02-13 19:34:32 +04:00
}
2012-10-15 17:16:59 +04:00
}
/* Fetch states. */
2014-02-12 04:01:08 +04:00
proplen = of_property_count_u32_elems ( np , " states " ) ;
if ( proplen < 0 ) {
2012-11-14 15:51:36 +04:00
dev_err ( dev , " No 'states' property found \n " ) ;
return ERR_PTR ( - EINVAL ) ;
}
2012-10-15 17:16:59 +04:00
config - > states = devm_kzalloc ( dev ,
sizeof ( struct gpio_regulator_state )
* ( proplen / 2 ) ,
GFP_KERNEL ) ;
if ( ! config - > states )
return ERR_PTR ( - ENOMEM ) ;
for ( i = 0 ; i < proplen / 2 ; i + + ) {
2014-02-12 04:01:08 +04:00
of_property_read_u32_index ( np , " states " , i * 2 ,
& config - > states [ i ] . value ) ;
of_property_read_u32_index ( np , " states " , i * 2 + 1 ,
& config - > states [ i ] . gpios ) ;
2012-10-15 17:16:59 +04:00
}
config - > nr_states = i ;
2013-12-05 04:29:57 +04:00
config - > type = REGULATOR_VOLTAGE ;
2013-11-09 16:12:28 +04:00
ret = of_property_read_string ( np , " regulator-type " , & regtype ) ;
2013-12-05 04:29:57 +04:00
if ( ret > = 0 ) {
if ( ! strncmp ( " voltage " , regtype , 7 ) )
config - > type = REGULATOR_VOLTAGE ;
else if ( ! strncmp ( " current " , regtype , 7 ) )
config - > type = REGULATOR_CURRENT ;
2013-12-05 23:09:55 +04:00
else
dev_warn ( dev , " Unknown regulator-type '%s' \n " ,
regtype ) ;
2013-11-09 16:12:28 +04:00
}
2012-10-15 17:16:59 +04:00
return config ;
}
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
static struct regulator_ops gpio_regulator_current_ops = {
. get_current_limit = gpio_regulator_get_value ,
. set_current_limit = gpio_regulator_set_current_limit ,
} ;
2012-11-19 22:22:22 +04:00
static int gpio_regulator_probe ( struct platform_device * pdev )
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
{
2013-07-30 12:20:47 +04:00
struct gpio_regulator_config * config = dev_get_platdata ( & pdev - > dev ) ;
2012-10-15 17:16:59 +04:00
struct device_node * np = pdev - > dev . of_node ;
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
struct gpio_regulator_data * drvdata ;
2012-04-04 03:50:22 +04:00
struct regulator_config cfg = { } ;
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
int ptr , ret , state ;
2012-04-04 02:20:56 +04:00
drvdata = devm_kzalloc ( & pdev - > dev , sizeof ( struct gpio_regulator_data ) ,
GFP_KERNEL ) ;
2014-01-24 21:48:18 +04:00
if ( drvdata = = NULL )
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
return - ENOMEM ;
2014-11-10 16:43:53 +03:00
if ( np ) {
config = of_get_gpio_regulator_config ( & pdev - > dev , np ,
& drvdata - > desc ) ;
if ( IS_ERR ( config ) )
return PTR_ERR ( config ) ;
}
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
drvdata - > desc . name = kstrdup ( config - > supply_name , GFP_KERNEL ) ;
if ( drvdata - > desc . name = = NULL ) {
dev_err ( & pdev - > dev , " Failed to allocate supply name \n " ) ;
ret = - ENOMEM ;
goto err ;
}
2014-11-19 17:13:06 +03:00
if ( config - > nr_gpios ! = 0 ) {
drvdata - > gpios = kmemdup ( config - > gpios ,
config - > nr_gpios * sizeof ( struct gpio ) ,
GFP_KERNEL ) ;
if ( drvdata - > gpios = = NULL ) {
dev_err ( & pdev - > dev , " Failed to allocate gpio data \n " ) ;
ret = - ENOMEM ;
goto err_name ;
}
drvdata - > nr_gpios = config - > nr_gpios ;
ret = gpio_request_array ( drvdata - > gpios , drvdata - > nr_gpios ) ;
if ( ret ) {
2016-02-19 13:27:53 +03:00
if ( ret ! = - EPROBE_DEFER )
dev_err ( & pdev - > dev ,
" Could not obtain regulator setting GPIOs: %d \n " ,
ret ) ;
2014-11-19 17:13:06 +03:00
goto err_memstate ;
}
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
}
drvdata - > states = kmemdup ( config - > states ,
config - > nr_states *
sizeof ( struct gpio_regulator_state ) ,
GFP_KERNEL ) ;
if ( drvdata - > states = = NULL ) {
dev_err ( & pdev - > dev , " Failed to allocate state data \n " ) ;
ret = - ENOMEM ;
goto err_memgpio ;
}
drvdata - > nr_states = config - > nr_states ;
drvdata - > desc . owner = THIS_MODULE ;
2012-07-04 06:19:46 +04:00
drvdata - > desc . enable_time = config - > startup_delay ;
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
/* handle regulator type*/
switch ( config - > type ) {
case REGULATOR_VOLTAGE :
drvdata - > desc . type = REGULATOR_VOLTAGE ;
drvdata - > desc . ops = & gpio_regulator_voltage_ops ;
drvdata - > desc . n_voltages = config - > nr_states ;
break ;
case REGULATOR_CURRENT :
drvdata - > desc . type = REGULATOR_CURRENT ;
drvdata - > desc . ops = & gpio_regulator_current_ops ;
break ;
default :
dev_err ( & pdev - > dev , " No regulator type set \n " ) ;
ret = - EINVAL ;
goto err_memgpio ;
}
/* build initial state from gpio init data. */
state = 0 ;
for ( ptr = 0 ; ptr < drvdata - > nr_gpios ; ptr + + ) {
if ( config - > gpios [ ptr ] . flags & GPIOF_OUT_INIT_HIGH )
state | = ( 1 < < ptr ) ;
}
drvdata - > state = state ;
2012-04-04 03:50:22 +04:00
cfg . dev = & pdev - > dev ;
cfg . init_data = config - > init_data ;
2012-06-03 23:30:33 +04:00
cfg . driver_data = drvdata ;
2012-11-12 13:59:52 +04:00
cfg . of_node = np ;
2012-04-04 03:50:22 +04:00
2014-11-03 21:12:06 +03:00
if ( gpio_is_valid ( config - > enable_gpio ) ) {
2012-07-04 06:20:46 +04:00
cfg . ena_gpio = config - > enable_gpio ;
2014-11-03 21:12:04 +03:00
cfg . ena_gpio_initialized = true ;
}
2012-07-04 06:20:46 +04:00
cfg . ena_gpio_invert = ! config - > enable_high ;
if ( config - > enabled_at_boot ) {
if ( config - > enable_high )
cfg . ena_gpio_flags | = GPIOF_OUT_INIT_HIGH ;
else
cfg . ena_gpio_flags | = GPIOF_OUT_INIT_LOW ;
} else {
if ( config - > enable_high )
cfg . ena_gpio_flags | = GPIOF_OUT_INIT_LOW ;
else
cfg . ena_gpio_flags | = GPIOF_OUT_INIT_HIGH ;
}
2012-04-04 03:50:22 +04:00
drvdata - > dev = regulator_register ( & drvdata - > desc , & cfg ) ;
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
if ( IS_ERR ( drvdata - > dev ) ) {
ret = PTR_ERR ( drvdata - > dev ) ;
dev_err ( & pdev - > dev , " Failed to register regulator: %d \n " , ret ) ;
goto err_stategpio ;
}
platform_set_drvdata ( pdev , drvdata ) ;
return 0 ;
err_stategpio :
gpio_free_array ( drvdata - > gpios , drvdata - > nr_gpios ) ;
err_memstate :
kfree ( drvdata - > states ) ;
err_memgpio :
kfree ( drvdata - > gpios ) ;
err_name :
kfree ( drvdata - > desc . name ) ;
err :
return ret ;
}
2012-11-19 22:26:10 +04:00
static int gpio_regulator_remove ( struct platform_device * pdev )
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
{
struct gpio_regulator_data * drvdata = platform_get_drvdata ( pdev ) ;
regulator_unregister ( drvdata - > dev ) ;
gpio_free_array ( drvdata - > gpios , drvdata - > nr_gpios ) ;
kfree ( drvdata - > states ) ;
kfree ( drvdata - > gpios ) ;
kfree ( drvdata - > desc . name ) ;
return 0 ;
}
2012-12-04 06:32:05 +04:00
# if defined(CONFIG_OF)
2012-12-22 01:26:06 +04:00
static const struct of_device_id regulator_gpio_of_match [ ] = {
2012-10-15 17:16:59 +04:00
{ . compatible = " regulator-gpio " , } ,
{ } ,
} ;
2015-09-18 20:09:24 +03:00
MODULE_DEVICE_TABLE ( of , regulator_gpio_of_match ) ;
2012-12-04 06:32:05 +04:00
# endif
2012-10-15 17:16:59 +04:00
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
static struct platform_driver gpio_regulator_driver = {
. probe = gpio_regulator_probe ,
2012-11-19 22:20:42 +04:00
. remove = gpio_regulator_remove ,
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
. driver = {
. name = " gpio-regulator " ,
2012-12-04 06:32:05 +04:00
. of_match_table = of_match_ptr ( regulator_gpio_of_match ) ,
regulator: Add driver for gpio-controlled regulators
This patch adds support for regulators that can be controlled via gpios.
Examples for such regulators are the TI-tps65024x voltage regulators
with 4 fixed and 1 runtime-switchable voltage regulators
or the TI-bq240XX charger regulators.
The number of controlling gpios is not limited, the mapping between
voltage/current and target gpio state is done via the states map
and the driver can be used for either voltage or current regulators.
A mapping for a regulator with two GPIOs could look like:
gpios = {
{ .gpio = GPIO1, .flags = GPIOF_OUT_INIT_HIGH, .label = "gpio name 1" },
{ .gpio = GPIO2, .flags = GPIOF_OUT_INIT_LOW, .label = "gpio name 2" },
}
The flags element of the gpios array determines the initial state of
the gpio, set during probe. The initial state of the regulator is also
calculated from these values
states = {
{ .value = volt_or_cur1, .gpios = (0 << 1) | (0 << 0) },
{ .value = volt_or_cur2, .gpios = (0 << 1) | (1 << 0) },
{ .value = volt_or_cur3, .gpios = (1 << 1) | (0 << 0) },
{ .value = volt_or_cur4, .gpios = (1 << 1) | (1 << 0) },
}
The target-state for the n-th gpio is determined by the n-th bit
in the bitfield of the target-value.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2011-10-05 14:27:05 +04:00
} ,
} ;
static int __init gpio_regulator_init ( void )
{
return platform_driver_register ( & gpio_regulator_driver ) ;
}
subsys_initcall ( gpio_regulator_init ) ;
static void __exit gpio_regulator_exit ( void )
{
platform_driver_unregister ( & gpio_regulator_driver ) ;
}
module_exit ( gpio_regulator_exit ) ;
MODULE_AUTHOR ( " Heiko Stuebner <heiko@sntech.de> " ) ;
MODULE_DESCRIPTION ( " gpio voltage regulator " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_ALIAS ( " platform:gpio-regulator " ) ;