staging: ti-soc-thermal: split writable data from readonly data
authorEduardo Valentin <eduardo.valentin@ti.com>
Tue, 19 Mar 2013 14:54:23 +0000 (10:54 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 25 Mar 2013 18:28:31 +0000 (11:28 -0700)
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>
drivers/staging/ti-soc-thermal/ti-bandgap.c
drivers/staging/ti-soc-thermal/ti-bandgap.h
drivers/staging/ti-soc-thermal/ti-thermal-common.c

index b819af0d164bc67c606c5013bb266efdc544fa59..2fe90e1401c8a6c6306ebb5b9d41a7080c26a48a 100644 (file)
@@ -248,7 +248,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 */
@@ -276,7 +276,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;
 
@@ -724,7 +724,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;
 }
@@ -743,7 +743,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   ***/
@@ -911,6 +911,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;
@@ -1147,7 +1155,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))
@@ -1180,7 +1188,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))
index 72c760f5cdb8f4921285132b7a83e2446e9ba648..394e8dde4da2051e898775e7e56e597146dd44a9 100644 (file)
 /**
  * DOC: bandgap driver data structure
  * ==================================
+ *
+ *   +----------+----------------+
+ *   | struct temp_sensor_regval |
+ *   +---------------------------+
+ *              * (Array of)
+ *              |
+ *              |
  *   +-------------------+   +-----------------+
  *   | struct ti_bandgap |-->| struct device * |
  *   +----------+--------+   +-----------------+
  * | | struct ti_temp_sensor |-->| struct temp_sensor_data |           |
  * | +-----------------------+   +------------+------------+           |
  * |            |                                                      |
- * |            +--------------------------+                           |
- * |            V                          V                           |
- * | +----------+- --------------+  +----+-------------------------+   |
- * | | struct temp_sensor_regval |  | struct temp_sensor_registers |   |
- * | +---------------------------+  +------------------------------+   |
+ * |            +                                                      |
+ * |            V                                                      |
+ * | +----------+-------------------+                                  |
+ * | | struct temp_sensor_registers |                                  |
+ * | +------------------------------+                                  |
  * |                                                                   |
  * +-------------------------------------------------------------------+
  *
@@ -189,11 +196,33 @@ 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 */
@@ -217,30 +247,10 @@ struct ti_bandgap {
        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
  * @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 *bgp, int id);
        int (*unregister_cooling)(struct ti_bandgap *bgp, int id);
 };
index fb50e7ef6afb446ee074dd69f6bc357e9b323290..231c5490d1b1509f7075aaa9840d588dbba377a9 100644 (file)
@@ -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)