[PATCH 6/8] staging: ti-soc-thermal: split writable data from readonly data

From: Eduardo Valentin
Date: Mon Mar 18 2013 - 11:02:24 EST


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@xxxxxx>

diff --git a/drivers/staging/ti-soc-thermal/ti-bandgap.c b/drivers/staging/ti-soc-thermal/ti-bandgap.c
index c850e13..b74e847 100644
--- a/drivers/staging/ti-soc-thermal/ti-bandgap.c
+++ b/drivers/staging/ti-soc-thermal/ti-bandgap.c
@@ -249,7 +249,7 @@ static irqreturn_t ti_bandgap_tshut_irq_handler(int irq, void *data)
static
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;

/* look up for temperature in the table and return the temperature */
@@ -277,7 +277,7 @@ exit:
static
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;
int high, low, mid, ret = 0;

@@ -726,7 +726,7 @@ int ti_bandgap_set_sensor_data(struct ti_bandgap *bgp, int id, void *data)
if (ret)
return ret;

- bgp->conf->sensors[id].data = data;
+ bgp->regval[id].data = data;

return 0;
}
@@ -745,7 +745,7 @@ void *ti_bandgap_get_sensor_data(struct ti_bandgap *bgp, int id)
if (ret)
return ERR_PTR(ret);

- return bgp->conf->sensors[id].data;
+ return bgp->regval[id].data;
}

/*** Helper functions used during device initialization ***/
@@ -913,6 +913,14 @@ static struct ti_bandgap *ti_bandgap_build(struct platform_device *pdev)
if (of_id)
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;
do {
void __iomem *chunk;
@@ -1149,7 +1157,7 @@ static int ti_bandgap_save_ctxt(struct ti_bandgap *bgp)
struct temp_sensor_registers *tsr;
struct temp_sensor_regval *rval;

- rval = &bgp->conf->sensors[i].regval;
+ rval = &bgp->regval[i];
tsr = bgp->conf->sensors[i].registers;

if (TI_BANDGAP_HAS(bgp, MODE_CONFIG))
@@ -1182,7 +1190,7 @@ static int ti_bandgap_restore_ctxt(struct ti_bandgap *bgp)
struct temp_sensor_regval *rval;
u32 val = 0;

- rval = &bgp->conf->sensors[i].regval;
+ rval = &bgp->regval[i];
tsr = bgp->conf->sensors[i].registers;

if (TI_BANDGAP_HAS(bgp, COUNTER))
diff --git a/drivers/staging/ti-soc-thermal/ti-bandgap.h b/drivers/staging/ti-soc-thermal/ti-bandgap.h
index 00d7596..66bbd07 100644
--- a/drivers/staging/ti-soc-thermal/ti-bandgap.h
+++ b/drivers/staging/ti-soc-thermal/ti-bandgap.h
@@ -30,6 +30,13 @@
/**
* DOC: bandgap driver data structure
* ==================================
+ *
+ * +----------+----------------+
+ * | struct temp_sensor_regval |
+ * +---------------------------+
+ * * (Array of)
+ * |
+ * |
* +-------------------+ +-----------------+
* | struct ti_bandgap |-->| struct device * |
* +--------+----------+ +-----------------+
@@ -44,14 +51,14 @@
* * (Array of)
* +------------+------------------------------------------------------+
* | +----------+--------------+ +-------------------------+ |
- * | | struct ti_temp_sensor |-->| struct temp_sensor_data | |
+ * | | struct ti_temp_sensor |-->| struct temp_sensor_data | |
* | +-------------------------+ +------------+------------+ |
* | | |
- * | +--------------------------+ |
- * | V V |
- * | +----------+- --------------+ +----+-------------------------+ |
- * | | struct temp_sensor_regval | | struct temp_sensor_registers | |
- * | +---------------------------+ +------------------------------+ |
+ * | + |
+ * | V |
+ * | +----------+-------------------+ |
+ * | | struct temp_sensor_registers | |
+ * | +------------------------------+ |
* | |
* +-------------------------------------------------------------------+
*
@@ -190,10 +197,32 @@ struct temp_sensor_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
* @dev: struct device pointer
* @base: io memory base address
* @conf: struct with bandgap configuration set (# sensors, conv_table, etc)
+ * @regval: temperature sensor register values
* @fclock: pointer to functional clock of temperature sensor
* @div_clk: pointer to divider clock of temperature sensor fclk
* @bg_mutex: mutex for ti_bandgap structure
@@ -208,7 +237,8 @@ struct ti_bandgap_data;
struct ti_bandgap {
struct device *dev;
void __iomem *base;
- struct ti_bandgap_data *conf;
+ const struct ti_bandgap_data *conf;
+ struct temp_sensor_regval *regval;
struct clk *fclock;
struct clk *div_clk;
spinlock_t lock; /* shields this struct */
@@ -218,29 +248,9 @@ struct ti_bandgap {
};

/**
- * 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
* @ts_data: pointer to struct with thresholds, limits of temperature sensor
* @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
* @slope: sensor gradient slope 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
* @constant_pcb: sensor gradient const info for hotspot extrapolation equation
* with no external influence
- * @data: private data
* @register_cooling: function to describe how this sensor is going to be cooled
* @unregister_cooling: function to release cooling data
*
@@ -261,14 +270,12 @@ struct temp_sensor_regval {
struct ti_temp_sensor {
struct temp_sensor_data *ts_data;
struct temp_sensor_registers *registers;
- struct temp_sensor_regval regval;
char *domain;
/* for hotspot extrapolation */
const int slope;
const int constant;
const int slope_pcb;
const int constant_pcb;
- void *data;
int (*register_cooling)(struct ti_bandgap *bg_ptr, int id);
int (*unregister_cooling)(struct ti_bandgap *bg_ptr, int id);
};
diff --git a/drivers/staging/ti-soc-thermal/ti-thermal-common.c b/drivers/staging/ti-soc-thermal/ti-thermal-common.c
index fb50e7e..231c549 100644
--- a/drivers/staging/ti-soc-thermal/ti-thermal-common.c
+++ b/drivers/staging/ti-soc-thermal/ti-thermal-common.c
@@ -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_bandgap *bgp;
- struct ti_temp_sensor *s;
+ const struct ti_temp_sensor *s;
int ret, tmp, pcb_temp, slope, constant;

if (!data)
--
1.7.7.1.488.ge8e1c

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/