Merge branch 'reg-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6
* 'reg-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6: regulator: TI bq24022 Li-Ion Charger driver regulator: maintainers - add maintainers for regulator framework. regulator: documentation - ABI regulator: documentation - machine regulator: documentation - regulator driver regulator: documentation - consumer interface regulator: documentation - overview regulator: core kbuild files regulator: regulator test harness regulator: add support for fixed regulators. regulator: regulator framework core regulator: fixed regulator interface regulator: machine driver interface regulator: regulator driver interface regulator: consumer device interface
This commit is contained in:
commit
561b35b341
19 changed files with 3956 additions and 0 deletions
21
include/linux/regulator/bq24022.h
Normal file
21
include/linux/regulator/bq24022.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* Support for TI bq24022 (bqTINY-II) Dual Input (USB/AC Adpater)
|
||||
* 1-Cell Li-Ion Charger connected via GPIOs.
|
||||
*
|
||||
* Copyright (c) 2008 Philipp Zabel
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* bq24022_mach_info - platform data for bq24022
|
||||
* @gpio_nce: GPIO line connected to the nCE pin, used to enable / disable charging
|
||||
* @gpio_iset2: GPIO line connected to the ISET2 pin, used to limit charging current to 100 mA / 500 mA
|
||||
*/
|
||||
struct bq24022_mach_info {
|
||||
int gpio_nce;
|
||||
int gpio_iset2;
|
||||
};
|
284
include/linux/regulator/consumer.h
Normal file
284
include/linux/regulator/consumer.h
Normal file
|
@ -0,0 +1,284 @@
|
|||
/*
|
||||
* consumer.h -- SoC Regulator consumer support.
|
||||
*
|
||||
* Copyright (C) 2007, 2008 Wolfson Microelectronics PLC.
|
||||
*
|
||||
* Author: Liam Girdwood <lg@opensource.wolfsonmicro.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Regulator Consumer Interface.
|
||||
*
|
||||
* A Power Management Regulator framework for SoC based devices.
|
||||
* Features:-
|
||||
* o Voltage and current level control.
|
||||
* o Operating mode control.
|
||||
* o Regulator status.
|
||||
* o sysfs entries for showing client devices and status
|
||||
*
|
||||
* EXPERIMENTAL FEATURES:
|
||||
* Dynamic Regulator operating Mode Switching (DRMS) - allows regulators
|
||||
* to use most efficient operating mode depending upon voltage and load and
|
||||
* is transparent to client drivers.
|
||||
*
|
||||
* e.g. Devices x,y,z share regulator r. Device x and y draw 20mA each during
|
||||
* IO and 1mA at idle. Device z draws 100mA when under load and 5mA when
|
||||
* idling. Regulator r has > 90% efficiency in NORMAL mode at loads > 100mA
|
||||
* but this drops rapidly to 60% when below 100mA. Regulator r has > 90%
|
||||
* efficiency in IDLE mode at loads < 10mA. Thus regulator r will operate
|
||||
* in normal mode for loads > 10mA and in IDLE mode for load <= 10mA.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_REGULATOR_CONSUMER_H_
|
||||
#define __LINUX_REGULATOR_CONSUMER_H_
|
||||
|
||||
/*
|
||||
* Regulator operating modes.
|
||||
*
|
||||
* Regulators can run in a variety of different operating modes depending on
|
||||
* output load. This allows further system power savings by selecting the
|
||||
* best (and most efficient) regulator mode for a desired load.
|
||||
*
|
||||
* Most drivers will only care about NORMAL. The modes below are generic and
|
||||
* will probably not match the naming convention of your regulator data sheet
|
||||
* but should match the use cases in the datasheet.
|
||||
*
|
||||
* In order of power efficiency (least efficient at top).
|
||||
*
|
||||
* Mode Description
|
||||
* FAST Regulator can handle fast changes in it's load.
|
||||
* e.g. useful in CPU voltage & frequency scaling where
|
||||
* load can quickly increase with CPU frequency increases.
|
||||
*
|
||||
* NORMAL Normal regulator power supply mode. Most drivers will
|
||||
* use this mode.
|
||||
*
|
||||
* IDLE Regulator runs in a more efficient mode for light
|
||||
* loads. Can be used for devices that have a low power
|
||||
* requirement during periods of inactivity. This mode
|
||||
* may be more noisy than NORMAL and may not be able
|
||||
* to handle fast load switching.
|
||||
*
|
||||
* STANDBY Regulator runs in the most efficient mode for very
|
||||
* light loads. Can be used by devices when they are
|
||||
* in a sleep/standby state. This mode is likely to be
|
||||
* the most noisy and may not be able to handle fast load
|
||||
* switching.
|
||||
*
|
||||
* NOTE: Most regulators will only support a subset of these modes. Some
|
||||
* will only just support NORMAL.
|
||||
*
|
||||
* These modes can be OR'ed together to make up a mask of valid register modes.
|
||||
*/
|
||||
|
||||
#define REGULATOR_MODE_FAST 0x1
|
||||
#define REGULATOR_MODE_NORMAL 0x2
|
||||
#define REGULATOR_MODE_IDLE 0x4
|
||||
#define REGULATOR_MODE_STANDBY 0x8
|
||||
|
||||
/*
|
||||
* Regulator notifier events.
|
||||
*
|
||||
* UNDER_VOLTAGE Regulator output is under voltage.
|
||||
* OVER_CURRENT Regulator output current is too high.
|
||||
* REGULATION_OUT Regulator output is out of regulation.
|
||||
* FAIL Regulator output has failed.
|
||||
* OVER_TEMP Regulator over temp.
|
||||
* FORCE_DISABLE Regulator shut down by software.
|
||||
*
|
||||
* NOTE: These events can be OR'ed together when passed into handler.
|
||||
*/
|
||||
|
||||
#define REGULATOR_EVENT_UNDER_VOLTAGE 0x01
|
||||
#define REGULATOR_EVENT_OVER_CURRENT 0x02
|
||||
#define REGULATOR_EVENT_REGULATION_OUT 0x04
|
||||
#define REGULATOR_EVENT_FAIL 0x08
|
||||
#define REGULATOR_EVENT_OVER_TEMP 0x10
|
||||
#define REGULATOR_EVENT_FORCE_DISABLE 0x20
|
||||
|
||||
struct regulator;
|
||||
|
||||
/**
|
||||
* struct regulator_bulk_data - Data used for bulk regulator operations.
|
||||
*
|
||||
* @supply The name of the supply. Initialised by the user before
|
||||
* using the bulk regulator APIs.
|
||||
* @consumer The regulator consumer for the supply. This will be managed
|
||||
* by the bulk API.
|
||||
*
|
||||
* The regulator APIs provide a series of regulator_bulk_() API calls as
|
||||
* a convenience to consumers which require multiple supplies. This
|
||||
* structure is used to manage data for these calls.
|
||||
*/
|
||||
struct regulator_bulk_data {
|
||||
const char *supply;
|
||||
struct regulator *consumer;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_REGULATOR)
|
||||
|
||||
/* regulator get and put */
|
||||
struct regulator *__must_check regulator_get(struct device *dev,
|
||||
const char *id);
|
||||
void regulator_put(struct regulator *regulator);
|
||||
|
||||
/* regulator output control and status */
|
||||
int regulator_enable(struct regulator *regulator);
|
||||
int regulator_disable(struct regulator *regulator);
|
||||
int regulator_force_disable(struct regulator *regulator);
|
||||
int regulator_is_enabled(struct regulator *regulator);
|
||||
|
||||
int regulator_bulk_get(struct device *dev, int num_consumers,
|
||||
struct regulator_bulk_data *consumers);
|
||||
int regulator_bulk_enable(int num_consumers,
|
||||
struct regulator_bulk_data *consumers);
|
||||
int regulator_bulk_disable(int num_consumers,
|
||||
struct regulator_bulk_data *consumers);
|
||||
void regulator_bulk_free(int num_consumers,
|
||||
struct regulator_bulk_data *consumers);
|
||||
|
||||
int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV);
|
||||
int regulator_get_voltage(struct regulator *regulator);
|
||||
int regulator_set_current_limit(struct regulator *regulator,
|
||||
int min_uA, int max_uA);
|
||||
int regulator_get_current_limit(struct regulator *regulator);
|
||||
|
||||
int regulator_set_mode(struct regulator *regulator, unsigned int mode);
|
||||
unsigned int regulator_get_mode(struct regulator *regulator);
|
||||
int regulator_set_optimum_mode(struct regulator *regulator, int load_uA);
|
||||
|
||||
/* regulator notifier block */
|
||||
int regulator_register_notifier(struct regulator *regulator,
|
||||
struct notifier_block *nb);
|
||||
int regulator_unregister_notifier(struct regulator *regulator,
|
||||
struct notifier_block *nb);
|
||||
|
||||
/* driver data - core doesn't touch */
|
||||
void *regulator_get_drvdata(struct regulator *regulator);
|
||||
void regulator_set_drvdata(struct regulator *regulator, void *data);
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Make sure client drivers will still build on systems with no software
|
||||
* controllable voltage or current regulators.
|
||||
*/
|
||||
static inline struct regulator *__must_check regulator_get(struct device *dev,
|
||||
const char *id)
|
||||
{
|
||||
/* Nothing except the stubbed out regulator API should be
|
||||
* looking at the value except to check if it is an error
|
||||
* value so the actual return value doesn't matter.
|
||||
*/
|
||||
return (struct regulator *)id;
|
||||
}
|
||||
static inline void regulator_put(struct regulator *regulator)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int regulator_enable(struct regulator *regulator)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int regulator_disable(struct regulator *regulator)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int regulator_is_enabled(struct regulator *regulator)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int regulator_bulk_get(struct device *dev,
|
||||
int num_consumers,
|
||||
struct regulator_bulk_data *consumers)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int regulator_bulk_enable(int num_consumers,
|
||||
struct regulator_bulk_data *consumers)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int regulator_bulk_disable(int num_consumers,
|
||||
struct regulator_bulk_data *consumers)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void regulator_bulk_free(int num_consumers,
|
||||
struct regulator_bulk_data *consumers)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int regulator_set_voltage(struct regulator *regulator,
|
||||
int min_uV, int max_uV)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int regulator_get_voltage(struct regulator *regulator)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int regulator_set_current_limit(struct regulator *regulator,
|
||||
int min_uA, int max_uA)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int regulator_get_current_limit(struct regulator *regulator)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int regulator_set_mode(struct regulator *regulator,
|
||||
unsigned int mode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline unsigned int regulator_get_mode(struct regulator *regulator)
|
||||
{
|
||||
return REGULATOR_MODE_NORMAL;
|
||||
}
|
||||
|
||||
static inline int regulator_set_optimum_mode(struct regulator *regulator,
|
||||
int load_uA)
|
||||
{
|
||||
return REGULATOR_MODE_NORMAL;
|
||||
}
|
||||
|
||||
static inline int regulator_register_notifier(struct regulator *regulator,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int regulator_unregister_notifier(struct regulator *regulator,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void *regulator_get_drvdata(struct regulator *regulator)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void regulator_set_drvdata(struct regulator *regulator,
|
||||
void *data)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
99
include/linux/regulator/driver.h
Normal file
99
include/linux/regulator/driver.h
Normal file
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
* driver.h -- SoC Regulator driver support.
|
||||
*
|
||||
* Copyright (C) 2007, 2008 Wolfson Microelectronics PLC.
|
||||
*
|
||||
* Author: Liam Girdwood <lg@opensource.wolfsonmicro.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Regulator Driver Interface.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_REGULATOR_DRIVER_H_
|
||||
#define __LINUX_REGULATOR_DRIVER_H_
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
struct regulator_constraints;
|
||||
struct regulator_dev;
|
||||
|
||||
/**
|
||||
* struct regulator_ops - regulator operations.
|
||||
*
|
||||
* This struct describes regulator operations.
|
||||
*/
|
||||
struct regulator_ops {
|
||||
|
||||
/* get/set regulator voltage */
|
||||
int (*set_voltage) (struct regulator_dev *, int min_uV, int max_uV);
|
||||
int (*get_voltage) (struct regulator_dev *);
|
||||
|
||||
/* get/set regulator current */
|
||||
int (*set_current_limit) (struct regulator_dev *,
|
||||
int min_uA, int max_uA);
|
||||
int (*get_current_limit) (struct regulator_dev *);
|
||||
|
||||
/* enable/disable regulator */
|
||||
int (*enable) (struct regulator_dev *);
|
||||
int (*disable) (struct regulator_dev *);
|
||||
int (*is_enabled) (struct regulator_dev *);
|
||||
|
||||
/* get/set regulator operating mode (defined in regulator.h) */
|
||||
int (*set_mode) (struct regulator_dev *, unsigned int mode);
|
||||
unsigned int (*get_mode) (struct regulator_dev *);
|
||||
|
||||
/* get most efficient regulator operating mode for load */
|
||||
unsigned int (*get_optimum_mode) (struct regulator_dev *, int input_uV,
|
||||
int output_uV, int load_uA);
|
||||
|
||||
/* the operations below are for configuration of regulator state when
|
||||
* it's parent PMIC enters a global STANBY/HIBERNATE state */
|
||||
|
||||
/* set regulator suspend voltage */
|
||||
int (*set_suspend_voltage) (struct regulator_dev *, int uV);
|
||||
|
||||
/* enable/disable regulator in suspend state */
|
||||
int (*set_suspend_enable) (struct regulator_dev *);
|
||||
int (*set_suspend_disable) (struct regulator_dev *);
|
||||
|
||||
/* set regulator suspend operating mode (defined in regulator.h) */
|
||||
int (*set_suspend_mode) (struct regulator_dev *, unsigned int mode);
|
||||
};
|
||||
|
||||
/*
|
||||
* Regulators can either control voltage or current.
|
||||
*/
|
||||
enum regulator_type {
|
||||
REGULATOR_VOLTAGE,
|
||||
REGULATOR_CURRENT,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct regulator_desc - Regulator descriptor
|
||||
*
|
||||
*/
|
||||
struct regulator_desc {
|
||||
const char *name;
|
||||
int id;
|
||||
struct regulator_ops *ops;
|
||||
int irq;
|
||||
enum regulator_type type;
|
||||
struct module *owner;
|
||||
};
|
||||
|
||||
|
||||
struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
|
||||
void *reg_data);
|
||||
void regulator_unregister(struct regulator_dev *rdev);
|
||||
|
||||
int regulator_notifier_call_chain(struct regulator_dev *rdev,
|
||||
unsigned long event, void *data);
|
||||
|
||||
void *rdev_get_drvdata(struct regulator_dev *rdev);
|
||||
int rdev_get_id(struct regulator_dev *rdev);
|
||||
|
||||
#endif
|
22
include/linux/regulator/fixed.h
Normal file
22
include/linux/regulator/fixed.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
* fixed.h
|
||||
*
|
||||
* Copyright 2008 Wolfson Microelectronics PLC.
|
||||
*
|
||||
* Author: Mark Brown <broonie@opensource.wolfsonmicro.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.
|
||||
*/
|
||||
|
||||
#ifndef __REGULATOR_FIXED_H
|
||||
#define __REGULATOR_FIXED_H
|
||||
|
||||
struct fixed_voltage_config {
|
||||
const char *supply_name;
|
||||
int microvolts;
|
||||
};
|
||||
|
||||
#endif
|
104
include/linux/regulator/machine.h
Normal file
104
include/linux/regulator/machine.h
Normal file
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* machine.h -- SoC Regulator support, machine/board driver API.
|
||||
*
|
||||
* Copyright (C) 2007, 2008 Wolfson Microelectronics PLC.
|
||||
*
|
||||
* Author: Liam Girdwood <lg@opensource.wolfsonmicro.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Regulator Machine/Board Interface.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_REGULATOR_MACHINE_H_
|
||||
#define __LINUX_REGULATOR_MACHINE_H_
|
||||
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/suspend.h>
|
||||
|
||||
struct regulator;
|
||||
|
||||
/*
|
||||
* Regulator operation constraint flags. These flags are used to enable
|
||||
* certain regulator operations and can be OR'ed together.
|
||||
*
|
||||
* VOLTAGE: Regulator output voltage can be changed by software on this
|
||||
* board/machine.
|
||||
* CURRENT: Regulator output current can be changed by software on this
|
||||
* board/machine.
|
||||
* MODE: Regulator operating mode can be changed by software on this
|
||||
* board/machine.
|
||||
* STATUS: Regulator can be enabled and disabled.
|
||||
* DRMS: Dynamic Regulator Mode Switching is enabled for this regulator.
|
||||
*/
|
||||
|
||||
#define REGULATOR_CHANGE_VOLTAGE 0x1
|
||||
#define REGULATOR_CHANGE_CURRENT 0x2
|
||||
#define REGULATOR_CHANGE_MODE 0x4
|
||||
#define REGULATOR_CHANGE_STATUS 0x8
|
||||
#define REGULATOR_CHANGE_DRMS 0x10
|
||||
|
||||
/**
|
||||
* struct regulator_state - regulator state during low power syatem states
|
||||
*
|
||||
* This describes a regulators state during a system wide low power state.
|
||||
*/
|
||||
struct regulator_state {
|
||||
int uV; /* suspend voltage */
|
||||
unsigned int mode; /* suspend regulator operating mode */
|
||||
int enabled; /* is regulator enabled in this suspend state */
|
||||
};
|
||||
|
||||
/**
|
||||
* struct regulation_constraints - regulator operating constraints.
|
||||
*
|
||||
* This struct describes regulator and board/machine specific constraints.
|
||||
*/
|
||||
struct regulation_constraints {
|
||||
|
||||
char *name;
|
||||
|
||||
/* voltage output range (inclusive) - for voltage control */
|
||||
int min_uV;
|
||||
int max_uV;
|
||||
|
||||
/* current output range (inclusive) - for current control */
|
||||
int min_uA;
|
||||
int max_uA;
|
||||
|
||||
/* valid regulator operating modes for this machine */
|
||||
unsigned int valid_modes_mask;
|
||||
|
||||
/* valid operations for regulator on this machine */
|
||||
unsigned int valid_ops_mask;
|
||||
|
||||
/* regulator input voltage - only if supply is another regulator */
|
||||
int input_uV;
|
||||
|
||||
/* regulator suspend states for global PMIC STANDBY/HIBERNATE */
|
||||
struct regulator_state state_disk;
|
||||
struct regulator_state state_mem;
|
||||
struct regulator_state state_standby;
|
||||
suspend_state_t initial_state; /* suspend state to set at init */
|
||||
|
||||
/* constriant flags */
|
||||
unsigned always_on:1; /* regulator never off when system is on */
|
||||
unsigned boot_on:1; /* bootloader/firmware enabled regulator */
|
||||
unsigned apply_uV:1; /* apply uV constraint iff min == max */
|
||||
};
|
||||
|
||||
int regulator_set_supply(const char *regulator, const char *regulator_supply);
|
||||
|
||||
const char *regulator_get_supply(const char *regulator);
|
||||
|
||||
int regulator_set_machine_constraints(const char *regulator,
|
||||
struct regulation_constraints *constraints);
|
||||
|
||||
int regulator_set_device_supply(const char *regulator, struct device *dev,
|
||||
const char *supply);
|
||||
|
||||
int regulator_suspend_prepare(suspend_state_t state);
|
||||
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue