2008-04-30 22:42:28 +08:00
|
|
|
/*
|
|
|
|
* 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_dev;
|
regulator: core - Rework machine API to remove string based functions.
This improves the machine level API in order to configure
regulator constraints and consumers as platform data and removes the
old string based API that required several calls to set up each regulator.
The intention is to create a struct regulator_init_data, populate
it's fields with constraints, consumers devices, etc and then register
the regulator device from board.c in the standard Linux way.
e.g. regulator LDO2 (supplying codec and sim) platform data.
/* regulator LDO2 consumer devices */
static struct regulator_consumer_supply ldo2_consumers[] = {
{
.dev = &platform_audio_device.dev,
.supply = "codec_avdd",
},
{
.dev = &platform_sim_device.dev,
.supply = "sim_vcc",
}
};
/* regulator LDO2 constraints */
static struct regulator_init_data ldo2_data = {
.constraints = {
.min_uV = 3300000,
.max_uV = 3300000,
.valid_modes_mask = REGULATOR_MODE_NORMAL,
.apply_uV = 1,
},
.num_consumer_supplies = ARRAY_SIZE(ldo2_consumers),
.consumer_supplies = ldo2_consumers,
};
/* machine regulator devices with thier consumers and constraints */
static struct platform_device wm8350_regulator_devices[] = {
{
.name = "wm8350-regulator",
.id = WM8350_LDO_2,
.dev = {
.platform_data = &ldo2_data,
},
},
};
Changes in detail:-
o Removed all const char* regulator config functions in machine API.
o Created new struct regulator_init_data to contain regulator
machine configuration constraints and consmuers.
o Changed set_supply(), set_machine_constraints(),
set_consumer_device_supply() to remove their string identifier
parameters. Also made them static and moved functions nearer top of
core.c.
o Removed no longer used inline func to_rdev()
o Added regulator_get_init_drvdata() to retrieve init data.
o Added struct device* as parameter to regulator_register().
o Changed my email address.
Signed-off-by: Eric Miao <eric.miao@marvell.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
2008-10-10 20:22:20 +08:00
|
|
|
struct regulator_init_data;
|
2008-04-30 22:42:28 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* struct regulator_ops - regulator operations.
|
|
|
|
*
|
2008-12-31 20:52:42 +08:00
|
|
|
* This struct describes regulator operations which can be implemented by
|
|
|
|
* regulator chip drivers.
|
|
|
|
*
|
|
|
|
* @enable: Enable the regulator.
|
|
|
|
* @disable: Disable the regulator.
|
|
|
|
* @is_enabled: Return 1 if the reguator is enabled, 0 otherwise.
|
|
|
|
*
|
|
|
|
* @set_voltage: Set the voltage for the regulator within the range specified.
|
|
|
|
* The driver should select the voltage closest to min_uV.
|
|
|
|
* @get_voltage: Return the currently configured voltage for the regulator.
|
|
|
|
*
|
|
|
|
* @set_current: Set the current for the regulator within the range specified.
|
|
|
|
* The driver should select the current closest to min_uA.
|
|
|
|
* @get_current: Return the currently configured current for the regulator.
|
|
|
|
*
|
|
|
|
* @set_current_limit: Configure a limit for a current-limited regulator.
|
|
|
|
* @get_current_limit: Get the limit for a current-limited regulator.
|
|
|
|
*
|
|
|
|
* @set_mode: Set the operating mode for the regulator.
|
|
|
|
* @get_mode: Get the current operating mode for the regulator.
|
|
|
|
* @get_optimum_mode: Get the most efficient operating mode for the regulator
|
|
|
|
* when running with the specified parameters.
|
|
|
|
*
|
|
|
|
* @set_suspend_voltage: Set the voltage for the regulator when the system
|
|
|
|
* is suspended.
|
|
|
|
* @set_suspend_enable: Mark the regulator as enabled when the system is
|
|
|
|
* suspended.
|
|
|
|
* @set_suspend_disable: Mark the regulator as disabled when the system is
|
|
|
|
* suspended.
|
|
|
|
* @set_suspend_mode: Set the operating mode for the regulator when the
|
|
|
|
* system is suspended.
|
2008-04-30 22:42:28 +08:00
|
|
|
*/
|
|
|
|
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
|
2008-09-09 23:21:17 +08:00
|
|
|
* its parent PMIC enters a global STANDBY/HIBERNATE state */
|
2008-04-30 22:42:28 +08:00
|
|
|
|
|
|
|
/* 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
|
|
|
|
*
|
2008-12-31 20:52:42 +08:00
|
|
|
* Each regulator registered with the core is described with a structure of
|
|
|
|
* this type.
|
|
|
|
*
|
|
|
|
* @name: Identifying name for the regulator.
|
|
|
|
* @id: Numerical identifier for the regulator.
|
|
|
|
* @ops: Regulator operations table.
|
|
|
|
* @type: Indicates if the regulator is a voltage or current regulator.
|
|
|
|
* @owner: Module providing the regulator, used for refcounting.
|
2008-04-30 22:42:28 +08:00
|
|
|
*/
|
|
|
|
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,
|
regulator: core - Rework machine API to remove string based functions.
This improves the machine level API in order to configure
regulator constraints and consumers as platform data and removes the
old string based API that required several calls to set up each regulator.
The intention is to create a struct regulator_init_data, populate
it's fields with constraints, consumers devices, etc and then register
the regulator device from board.c in the standard Linux way.
e.g. regulator LDO2 (supplying codec and sim) platform data.
/* regulator LDO2 consumer devices */
static struct regulator_consumer_supply ldo2_consumers[] = {
{
.dev = &platform_audio_device.dev,
.supply = "codec_avdd",
},
{
.dev = &platform_sim_device.dev,
.supply = "sim_vcc",
}
};
/* regulator LDO2 constraints */
static struct regulator_init_data ldo2_data = {
.constraints = {
.min_uV = 3300000,
.max_uV = 3300000,
.valid_modes_mask = REGULATOR_MODE_NORMAL,
.apply_uV = 1,
},
.num_consumer_supplies = ARRAY_SIZE(ldo2_consumers),
.consumer_supplies = ldo2_consumers,
};
/* machine regulator devices with thier consumers and constraints */
static struct platform_device wm8350_regulator_devices[] = {
{
.name = "wm8350-regulator",
.id = WM8350_LDO_2,
.dev = {
.platform_data = &ldo2_data,
},
},
};
Changes in detail:-
o Removed all const char* regulator config functions in machine API.
o Created new struct regulator_init_data to contain regulator
machine configuration constraints and consmuers.
o Changed set_supply(), set_machine_constraints(),
set_consumer_device_supply() to remove their string identifier
parameters. Also made them static and moved functions nearer top of
core.c.
o Removed no longer used inline func to_rdev()
o Added regulator_get_init_drvdata() to retrieve init data.
o Added struct device* as parameter to regulator_register().
o Changed my email address.
Signed-off-by: Eric Miao <eric.miao@marvell.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
2008-10-10 20:22:20 +08:00
|
|
|
struct device *dev, void *driver_data);
|
2008-04-30 22:42:28 +08:00
|
|
|
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);
|
regulator: core - Rework machine API to remove string based functions.
This improves the machine level API in order to configure
regulator constraints and consumers as platform data and removes the
old string based API that required several calls to set up each regulator.
The intention is to create a struct regulator_init_data, populate
it's fields with constraints, consumers devices, etc and then register
the regulator device from board.c in the standard Linux way.
e.g. regulator LDO2 (supplying codec and sim) platform data.
/* regulator LDO2 consumer devices */
static struct regulator_consumer_supply ldo2_consumers[] = {
{
.dev = &platform_audio_device.dev,
.supply = "codec_avdd",
},
{
.dev = &platform_sim_device.dev,
.supply = "sim_vcc",
}
};
/* regulator LDO2 constraints */
static struct regulator_init_data ldo2_data = {
.constraints = {
.min_uV = 3300000,
.max_uV = 3300000,
.valid_modes_mask = REGULATOR_MODE_NORMAL,
.apply_uV = 1,
},
.num_consumer_supplies = ARRAY_SIZE(ldo2_consumers),
.consumer_supplies = ldo2_consumers,
};
/* machine regulator devices with thier consumers and constraints */
static struct platform_device wm8350_regulator_devices[] = {
{
.name = "wm8350-regulator",
.id = WM8350_LDO_2,
.dev = {
.platform_data = &ldo2_data,
},
},
};
Changes in detail:-
o Removed all const char* regulator config functions in machine API.
o Created new struct regulator_init_data to contain regulator
machine configuration constraints and consmuers.
o Changed set_supply(), set_machine_constraints(),
set_consumer_device_supply() to remove their string identifier
parameters. Also made them static and moved functions nearer top of
core.c.
o Removed no longer used inline func to_rdev()
o Added regulator_get_init_drvdata() to retrieve init data.
o Added struct device* as parameter to regulator_register().
o Changed my email address.
Signed-off-by: Eric Miao <eric.miao@marvell.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
2008-10-10 20:22:20 +08:00
|
|
|
struct device *rdev_get_dev(struct regulator_dev *rdev);
|
2008-04-30 22:42:28 +08:00
|
|
|
int rdev_get_id(struct regulator_dev *rdev);
|
|
|
|
|
regulator: core - Rework machine API to remove string based functions.
This improves the machine level API in order to configure
regulator constraints and consumers as platform data and removes the
old string based API that required several calls to set up each regulator.
The intention is to create a struct regulator_init_data, populate
it's fields with constraints, consumers devices, etc and then register
the regulator device from board.c in the standard Linux way.
e.g. regulator LDO2 (supplying codec and sim) platform data.
/* regulator LDO2 consumer devices */
static struct regulator_consumer_supply ldo2_consumers[] = {
{
.dev = &platform_audio_device.dev,
.supply = "codec_avdd",
},
{
.dev = &platform_sim_device.dev,
.supply = "sim_vcc",
}
};
/* regulator LDO2 constraints */
static struct regulator_init_data ldo2_data = {
.constraints = {
.min_uV = 3300000,
.max_uV = 3300000,
.valid_modes_mask = REGULATOR_MODE_NORMAL,
.apply_uV = 1,
},
.num_consumer_supplies = ARRAY_SIZE(ldo2_consumers),
.consumer_supplies = ldo2_consumers,
};
/* machine regulator devices with thier consumers and constraints */
static struct platform_device wm8350_regulator_devices[] = {
{
.name = "wm8350-regulator",
.id = WM8350_LDO_2,
.dev = {
.platform_data = &ldo2_data,
},
},
};
Changes in detail:-
o Removed all const char* regulator config functions in machine API.
o Created new struct regulator_init_data to contain regulator
machine configuration constraints and consmuers.
o Changed set_supply(), set_machine_constraints(),
set_consumer_device_supply() to remove their string identifier
parameters. Also made them static and moved functions nearer top of
core.c.
o Removed no longer used inline func to_rdev()
o Added regulator_get_init_drvdata() to retrieve init data.
o Added struct device* as parameter to regulator_register().
o Changed my email address.
Signed-off-by: Eric Miao <eric.miao@marvell.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
2008-10-10 20:22:20 +08:00
|
|
|
void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data);
|
|
|
|
|
2008-04-30 22:42:28 +08:00
|
|
|
#endif
|