staging: ti-soc-thermal: split writable data from readonly data
This patch changes the data structures of this driver so that readonly data can reside only in the conf pointer. Now each register has a struct to hold its configuration info, to be used base on chip version for instance, and a struct of values to be written, like register shadow and priv data. Signed-off-by: Eduardo Valentin <eduardo.valentin@ti.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
2f8ec2a971
commit
9879b2c46f
3 changed files with 51 additions and 36 deletions
|
@ -248,7 +248,7 @@ static irqreturn_t ti_bandgap_tshut_irq_handler(int irq, void *data)
|
||||||
static
|
static
|
||||||
int ti_bandgap_adc_to_mcelsius(struct ti_bandgap *bgp, int adc_val, int *t)
|
int ti_bandgap_adc_to_mcelsius(struct ti_bandgap *bgp, int adc_val, int *t)
|
||||||
{
|
{
|
||||||
struct ti_bandgap_data *conf = bgp->conf;
|
const struct ti_bandgap_data *conf = bgp->conf;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
/* look up for temperature in the table and return the temperature */
|
/* look up for temperature in the table and return the temperature */
|
||||||
|
@ -276,7 +276,7 @@ exit:
|
||||||
static
|
static
|
||||||
int ti_bandgap_mcelsius_to_adc(struct ti_bandgap *bgp, long temp, int *adc)
|
int ti_bandgap_mcelsius_to_adc(struct ti_bandgap *bgp, long temp, int *adc)
|
||||||
{
|
{
|
||||||
struct ti_bandgap_data *conf = bgp->conf;
|
const struct ti_bandgap_data *conf = bgp->conf;
|
||||||
const int *conv_table = bgp->conf->conv_table;
|
const int *conv_table = bgp->conf->conv_table;
|
||||||
int high, low, mid, ret = 0;
|
int high, low, mid, ret = 0;
|
||||||
|
|
||||||
|
@ -724,7 +724,7 @@ int ti_bandgap_set_sensor_data(struct ti_bandgap *bgp, int id, void *data)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
bgp->conf->sensors[id].data = data;
|
bgp->regval[id].data = data;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -743,7 +743,7 @@ void *ti_bandgap_get_sensor_data(struct ti_bandgap *bgp, int id)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
|
||||||
return bgp->conf->sensors[id].data;
|
return bgp->regval[id].data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*** Helper functions used during device initialization ***/
|
/*** Helper functions used during device initialization ***/
|
||||||
|
@ -911,6 +911,14 @@ static struct ti_bandgap *ti_bandgap_build(struct platform_device *pdev)
|
||||||
if (of_id)
|
if (of_id)
|
||||||
bgp->conf = of_id->data;
|
bgp->conf = of_id->data;
|
||||||
|
|
||||||
|
/* register shadow for context save and restore */
|
||||||
|
bgp->regval = devm_kzalloc(&pdev->dev, sizeof(*bgp->regval) *
|
||||||
|
bgp->conf->sensor_count, GFP_KERNEL);
|
||||||
|
if (!bgp) {
|
||||||
|
dev_err(&pdev->dev, "Unable to allocate mem for driver ref\n");
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
do {
|
do {
|
||||||
void __iomem *chunk;
|
void __iomem *chunk;
|
||||||
|
@ -1147,7 +1155,7 @@ static int ti_bandgap_save_ctxt(struct ti_bandgap *bgp)
|
||||||
struct temp_sensor_registers *tsr;
|
struct temp_sensor_registers *tsr;
|
||||||
struct temp_sensor_regval *rval;
|
struct temp_sensor_regval *rval;
|
||||||
|
|
||||||
rval = &bgp->conf->sensors[i].regval;
|
rval = &bgp->regval[i];
|
||||||
tsr = bgp->conf->sensors[i].registers;
|
tsr = bgp->conf->sensors[i].registers;
|
||||||
|
|
||||||
if (TI_BANDGAP_HAS(bgp, MODE_CONFIG))
|
if (TI_BANDGAP_HAS(bgp, MODE_CONFIG))
|
||||||
|
@ -1180,7 +1188,7 @@ static int ti_bandgap_restore_ctxt(struct ti_bandgap *bgp)
|
||||||
struct temp_sensor_regval *rval;
|
struct temp_sensor_regval *rval;
|
||||||
u32 val = 0;
|
u32 val = 0;
|
||||||
|
|
||||||
rval = &bgp->conf->sensors[i].regval;
|
rval = &bgp->regval[i];
|
||||||
tsr = bgp->conf->sensors[i].registers;
|
tsr = bgp->conf->sensors[i].registers;
|
||||||
|
|
||||||
if (TI_BANDGAP_HAS(bgp, COUNTER))
|
if (TI_BANDGAP_HAS(bgp, COUNTER))
|
||||||
|
|
|
@ -30,6 +30,13 @@
|
||||||
/**
|
/**
|
||||||
* DOC: bandgap driver data structure
|
* DOC: bandgap driver data structure
|
||||||
* ==================================
|
* ==================================
|
||||||
|
*
|
||||||
|
* +----------+----------------+
|
||||||
|
* | struct temp_sensor_regval |
|
||||||
|
* +---------------------------+
|
||||||
|
* * (Array of)
|
||||||
|
* |
|
||||||
|
* |
|
||||||
* +-------------------+ +-----------------+
|
* +-------------------+ +-----------------+
|
||||||
* | struct ti_bandgap |-->| struct device * |
|
* | struct ti_bandgap |-->| struct device * |
|
||||||
* +----------+--------+ +-----------------+
|
* +----------+--------+ +-----------------+
|
||||||
|
@ -47,11 +54,11 @@
|
||||||
* | | struct ti_temp_sensor |-->| struct temp_sensor_data | |
|
* | | struct ti_temp_sensor |-->| struct temp_sensor_data | |
|
||||||
* | +-----------------------+ +------------+------------+ |
|
* | +-----------------------+ +------------+------------+ |
|
||||||
* | | |
|
* | | |
|
||||||
* | +--------------------------+ |
|
* | + |
|
||||||
* | V V |
|
* | V |
|
||||||
* | +----------+- --------------+ +----+-------------------------+ |
|
* | +----------+-------------------+ |
|
||||||
* | | struct temp_sensor_regval | | struct temp_sensor_registers | |
|
* | | struct temp_sensor_registers | |
|
||||||
* | +---------------------------+ +------------------------------+ |
|
* | +------------------------------+ |
|
||||||
* | |
|
* | |
|
||||||
* +-------------------------------------------------------------------+
|
* +-------------------------------------------------------------------+
|
||||||
*
|
*
|
||||||
|
@ -189,11 +196,33 @@ struct temp_sensor_data {
|
||||||
|
|
||||||
struct ti_bandgap_data;
|
struct ti_bandgap_data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct temp_sensor_regval - temperature sensor register values and priv data
|
||||||
|
* @bg_mode_ctrl: temp sensor control register value
|
||||||
|
* @bg_ctrl: bandgap ctrl register value
|
||||||
|
* @bg_counter: bandgap counter value
|
||||||
|
* @bg_threshold: bandgap threshold register value
|
||||||
|
* @tshut_threshold: bandgap tshut register value
|
||||||
|
* @data: private data
|
||||||
|
*
|
||||||
|
* Data structure to save and restore bandgap register set context. Only
|
||||||
|
* required registers are shadowed, when needed.
|
||||||
|
*/
|
||||||
|
struct temp_sensor_regval {
|
||||||
|
u32 bg_mode_ctrl;
|
||||||
|
u32 bg_ctrl;
|
||||||
|
u32 bg_counter;
|
||||||
|
u32 bg_threshold;
|
||||||
|
u32 tshut_threshold;
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct ti_bandgap - bandgap device structure
|
* struct ti_bandgap - bandgap device structure
|
||||||
* @dev: struct device pointer
|
* @dev: struct device pointer
|
||||||
* @base: io memory base address
|
* @base: io memory base address
|
||||||
* @conf: struct with bandgap configuration set (# sensors, conv_table, etc)
|
* @conf: struct with bandgap configuration set (# sensors, conv_table, etc)
|
||||||
|
* @regval: temperature sensor register values
|
||||||
* @fclock: pointer to functional clock of temperature sensor
|
* @fclock: pointer to functional clock of temperature sensor
|
||||||
* @div_clk: pointer to divider clock of temperature sensor fclk
|
* @div_clk: pointer to divider clock of temperature sensor fclk
|
||||||
* @bg_mutex: mutex for ti_bandgap structure
|
* @bg_mutex: mutex for ti_bandgap structure
|
||||||
|
@ -208,7 +237,8 @@ struct ti_bandgap_data;
|
||||||
struct ti_bandgap {
|
struct ti_bandgap {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
struct ti_bandgap_data *conf;
|
const struct ti_bandgap_data *conf;
|
||||||
|
struct temp_sensor_regval *regval;
|
||||||
struct clk *fclock;
|
struct clk *fclock;
|
||||||
struct clk *div_clk;
|
struct clk *div_clk;
|
||||||
spinlock_t lock; /* shields this struct */
|
spinlock_t lock; /* shields this struct */
|
||||||
|
@ -217,30 +247,10 @@ struct ti_bandgap {
|
||||||
u32 clk_rate;
|
u32 clk_rate;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* struct temp_sensor_regval - temperature sensor register values
|
|
||||||
* @bg_mode_ctrl: temp sensor control register value
|
|
||||||
* @bg_ctrl: bandgap ctrl register value
|
|
||||||
* @bg_counter: bandgap counter value
|
|
||||||
* @bg_threshold: bandgap threshold register value
|
|
||||||
* @tshut_threshold: bandgap tshut register value
|
|
||||||
*
|
|
||||||
* Data structure to save and restore bandgap register set context. Only
|
|
||||||
* required registers are shadowed, when needed.
|
|
||||||
*/
|
|
||||||
struct temp_sensor_regval {
|
|
||||||
u32 bg_mode_ctrl;
|
|
||||||
u32 bg_ctrl;
|
|
||||||
u32 bg_counter;
|
|
||||||
u32 bg_threshold;
|
|
||||||
u32 tshut_threshold;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct ti_temp_sensor - bandgap temperature sensor configuration data
|
* struct ti_temp_sensor - bandgap temperature sensor configuration data
|
||||||
* @ts_data: pointer to struct with thresholds, limits of temperature sensor
|
* @ts_data: pointer to struct with thresholds, limits of temperature sensor
|
||||||
* @registers: pointer to the list of register offsets and bitfields
|
* @registers: pointer to the list of register offsets and bitfields
|
||||||
* @regval: temperature sensor register values
|
|
||||||
* @domain: the name of the domain where the sensor is located
|
* @domain: the name of the domain where the sensor is located
|
||||||
* @slope: sensor gradient slope info for hotspot extrapolation equation
|
* @slope: sensor gradient slope info for hotspot extrapolation equation
|
||||||
* @const: sensor gradient const info for hotspot extrapolation equation
|
* @const: sensor gradient const info for hotspot extrapolation equation
|
||||||
|
@ -248,7 +258,6 @@ struct temp_sensor_regval {
|
||||||
* with no external influence
|
* with no external influence
|
||||||
* @constant_pcb: sensor gradient const info for hotspot extrapolation equation
|
* @constant_pcb: sensor gradient const info for hotspot extrapolation equation
|
||||||
* with no external influence
|
* with no external influence
|
||||||
* @data: private data
|
|
||||||
* @register_cooling: function to describe how this sensor is going to be cooled
|
* @register_cooling: function to describe how this sensor is going to be cooled
|
||||||
* @unregister_cooling: function to release cooling data
|
* @unregister_cooling: function to release cooling data
|
||||||
*
|
*
|
||||||
|
@ -261,14 +270,12 @@ struct temp_sensor_regval {
|
||||||
struct ti_temp_sensor {
|
struct ti_temp_sensor {
|
||||||
struct temp_sensor_data *ts_data;
|
struct temp_sensor_data *ts_data;
|
||||||
struct temp_sensor_registers *registers;
|
struct temp_sensor_registers *registers;
|
||||||
struct temp_sensor_regval regval;
|
|
||||||
char *domain;
|
char *domain;
|
||||||
/* for hotspot extrapolation */
|
/* for hotspot extrapolation */
|
||||||
const int slope;
|
const int slope;
|
||||||
const int constant;
|
const int constant;
|
||||||
const int slope_pcb;
|
const int slope_pcb;
|
||||||
const int constant_pcb;
|
const int constant_pcb;
|
||||||
void *data;
|
|
||||||
int (*register_cooling)(struct ti_bandgap *bgp, int id);
|
int (*register_cooling)(struct ti_bandgap *bgp, int id);
|
||||||
int (*unregister_cooling)(struct ti_bandgap *bgp, int id);
|
int (*unregister_cooling)(struct ti_bandgap *bgp, int id);
|
||||||
};
|
};
|
||||||
|
|
|
@ -79,7 +79,7 @@ static inline int ti_thermal_get_temp(struct thermal_zone_device *thermal,
|
||||||
{
|
{
|
||||||
struct ti_thermal_data *data = thermal->devdata;
|
struct ti_thermal_data *data = thermal->devdata;
|
||||||
struct ti_bandgap *bgp;
|
struct ti_bandgap *bgp;
|
||||||
struct ti_temp_sensor *s;
|
const struct ti_temp_sensor *s;
|
||||||
int ret, tmp, pcb_temp, slope, constant;
|
int ret, tmp, pcb_temp, slope, constant;
|
||||||
|
|
||||||
if (!data)
|
if (!data)
|
||||||
|
|
Loading…
Add table
Reference in a new issue