Skip to content

Commit

Permalink
staging: omap-thermal: improve conf data handling and initialization
Browse files Browse the repository at this point in the history
While registering the thermal zone, it is required to have the cooling
devices already setup, so that the .bind callback can succeed.

Due to that, the driver code needs to be reorganized so that we first
setup the cooling devices then the zones. This way we cope with the
right thermal framework initialization sequence.

This patch changes the order of the thermal zone initialization,
so that we create it only when the cooling devices are available.
It also adds some defensive checks for the config data, so that
the callbacks are ready for calls when the data is still not
initialized.

Signed-off-by: Eduardo Valentin <eduardo.valentin@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Eduardo Valentin authored and Greg Kroah-Hartman committed Sep 11, 2012
1 parent 765a193 commit 04a4d10
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 8 deletions.
6 changes: 3 additions & 3 deletions drivers/staging/omap-thermal/omap-bandgap.c
Original file line number Diff line number Diff line change
Expand Up @@ -953,12 +953,12 @@ int __devinit omap_bandgap_probe(struct platform_device *pdev)
for (i = 0; i < bg_ptr->conf->sensor_count; i++) {
char *domain;

if (bg_ptr->conf->sensors[i].register_cooling)
bg_ptr->conf->sensors[i].register_cooling(bg_ptr, i);

domain = bg_ptr->conf->sensors[i].domain;
if (bg_ptr->conf->expose_sensor)
bg_ptr->conf->expose_sensor(bg_ptr, i, domain);

if (bg_ptr->conf->sensors[i].register_cooling)
bg_ptr->conf->sensors[i].register_cooling(bg_ptr, i);
}

/*
Expand Down
38 changes: 33 additions & 5 deletions drivers/staging/omap-thermal/omap-thermal-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,16 @@ static inline int omap_thermal_get_temp(struct thermal_zone_device *thermal,
unsigned long *temp)
{
struct omap_thermal_data *data = thermal->devdata;
struct omap_bandgap *bg_ptr = data->bg_ptr;
struct omap_temp_sensor *s = &bg_ptr->conf->sensors[data->sensor_id];
struct omap_bandgap *bg_ptr;
struct omap_temp_sensor *s;
int ret, tmp, pcb_temp, slope, constant;

if (!data)
return 0;

bg_ptr = data->bg_ptr;
s = &bg_ptr->conf->sensors[data->sensor_id];

ret = omap_bandgap_read_temperature(bg_ptr, data->sensor_id, &tmp);
if (ret)
return ret;
Expand Down Expand Up @@ -227,21 +233,37 @@ static struct thermal_zone_device_ops omap_thermal_ops = {
.get_crit_temp = omap_thermal_get_crit_temp,
};

int omap_thermal_expose_sensor(struct omap_bandgap *bg_ptr, int id,
char *domain)
static struct omap_thermal_data
*omap_thermal_build_data(struct omap_bandgap *bg_ptr, int id)
{
struct omap_thermal_data *data;

data = devm_kzalloc(bg_ptr->dev, sizeof(*data), GFP_KERNEL);
if (!data) {
dev_err(bg_ptr->dev, "kzalloc fail\n");
return -ENOMEM;
return NULL;
}
data->sensor_id = id;
data->bg_ptr = bg_ptr;
data->mode = THERMAL_DEVICE_ENABLED;
INIT_WORK(&data->thermal_wq, omap_thermal_work);

return data;
}

int omap_thermal_expose_sensor(struct omap_bandgap *bg_ptr, int id,
char *domain)
{
struct omap_thermal_pdata pdata;

data = omap_bandgap_get_sensor_data(bg_ptr, id);

if (!data)
data = omap_thermal_build_pdata(bg_ptr, id);

if (!data)
return -EINVAL;

/* TODO: remove TC1 TC2 */
/* Create thermal zone */
data->omap_thermal = thermal_zone_device_register(domain,
Expand Down Expand Up @@ -335,6 +357,11 @@ int omap_thermal_register_cpu_cooling(struct omap_bandgap *bg_ptr, int id)
int tab_size, ret;

data = omap_bandgap_get_sensor_data(bg_ptr, id);
if (!data)
data = omap_thermal_build_pdata(bg_ptr, id);

if (!data)
return -EINVAL;

ret = omap_thermal_build_cpufreq_clip(bg_ptr, &tab_ptr, &tab_size);
if (ret < 0) {
Expand All @@ -351,6 +378,7 @@ int omap_thermal_register_cpu_cooling(struct omap_bandgap *bg_ptr, int id)
return PTR_ERR(data->cool_dev);
}
bg_ptr->conf->sensors[id].cooling_data.freq_clip_count = tab_size;
omap_bandgap_set_sensor_data(bg_ptr, id, data);

return 0;
}
Expand Down

0 comments on commit 04a4d10

Please sign in to comment.