From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932177Ab3CSO6E (ORCPT ); Tue, 19 Mar 2013 10:58:04 -0400 Received: from arroyo.ext.ti.com ([192.94.94.40]:37720 "EHLO arroyo.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932589Ab3CSO6A (ORCPT ); Tue, 19 Mar 2013 10:58:00 -0400 From: Eduardo Valentin To: CC: , , , , Eduardo Valentin Subject: [PATCHv2 07/12] staging: ti-soc-thermal: split writable data from readonly data Date: Tue, 19 Mar 2013 10:54:23 -0400 Message-ID: <1363704868-11843-8-git-send-email-eduardo.valentin@ti.com> X-Mailer: git-send-email 1.7.7.1.488.ge8e1c In-Reply-To: <1363704868-11843-1-git-send-email-eduardo.valentin@ti.com> References: <1363704868-11843-1-git-send-email-eduardo.valentin@ti.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- drivers/staging/ti-soc-thermal/ti-bandgap.c | 20 ++++-- drivers/staging/ti-soc-thermal/ti-bandgap.h | 65 +++++++++++--------- drivers/staging/ti-soc-thermal/ti-thermal-common.c | 2 +- 3 files changed, 51 insertions(+), 36 deletions(-) diff --git a/drivers/staging/ti-soc-thermal/ti-bandgap.c b/drivers/staging/ti-soc-thermal/ti-bandgap.c index b819af0..2fe90e1 100644 --- a/drivers/staging/ti-soc-thermal/ti-bandgap.c +++ b/drivers/staging/ti-soc-thermal/ti-bandgap.c @@ -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)) diff --git a/drivers/staging/ti-soc-thermal/ti-bandgap.h b/drivers/staging/ti-soc-thermal/ti-bandgap.h index 72c760f..394e8dd 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 * | * +----------+--------+ +-----------------+ @@ -47,11 +54,11 @@ * | | 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 *bgp, int id); int (*unregister_cooling)(struct ti_bandgap *bgp, 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 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eduardo Valentin Subject: [PATCHv2 07/12] staging: ti-soc-thermal: split writable data from readonly data Date: Tue, 19 Mar 2013 10:54:23 -0400 Message-ID: <1363704868-11843-8-git-send-email-eduardo.valentin@ti.com> References: <1363704868-11843-1-git-send-email-eduardo.valentin@ti.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: In-Reply-To: <1363704868-11843-1-git-send-email-eduardo.valentin@ti.com> Sender: linux-kernel-owner@vger.kernel.org To: gregkh@linuxfoundation.org Cc: devel@driverdev.osuosl.org, linux-omap@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Eduardo Valentin List-Id: linux-pm@vger.kernel.org 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 --- drivers/staging/ti-soc-thermal/ti-bandgap.c | 20 ++++-- drivers/staging/ti-soc-thermal/ti-bandgap.h | 65 +++++++++++--------- drivers/staging/ti-soc-thermal/ti-thermal-common.c | 2 +- 3 files changed, 51 insertions(+), 36 deletions(-) diff --git a/drivers/staging/ti-soc-thermal/ti-bandgap.c b/drivers/staging/ti-soc-thermal/ti-bandgap.c index b819af0..2fe90e1 100644 --- a/drivers/staging/ti-soc-thermal/ti-bandgap.c +++ b/drivers/staging/ti-soc-thermal/ti-bandgap.c @@ -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)) diff --git a/drivers/staging/ti-soc-thermal/ti-bandgap.h b/drivers/staging/ti-soc-thermal/ti-bandgap.h index 72c760f..394e8dd 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 * | * +----------+--------+ +-----------------+ @@ -47,11 +54,11 @@ * | | 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 *bgp, int id); int (*unregister_cooling)(struct ti_bandgap *bgp, 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