static int __devexit exynos_tmu_remove(struct platform_device *pdev) { struct exynos_tmu_data *data = platform_get_drvdata(pdev); int i; for (i = 0; i < EXYNOS_TMU_COUNT; i++) exynos_tmu_control(pdev, i, false); exynos_unregister_thermal(); clk_put(data->clk); for (i = 0; i < EXYNOS_TMU_COUNT; i++) free_irq(data->irq[i], data); for (i = 0; i < EXYNOS_TMU_COUNT; i++) iounmap(data->base[i]); for (i = 0; i < EXYNOS_TMU_COUNT; i++) release_mem_region(data->mem[i]->start, resource_size(data->mem[i])); platform_set_drvdata(pdev, NULL); kfree(data); return 0; }
/* Register with the in-kernel thermal management */ int exynos_register_thermal(struct thermal_sensor_conf *sensor_conf) { int ret; struct cpumask mask_val; struct exynos_thermal_zone *th_zone; if (!sensor_conf || !sensor_conf->read_temperature) { pr_err("Temperature sensor not initialised\n"); return -EINVAL; } th_zone = devm_kzalloc(sensor_conf->dev, sizeof(struct exynos_thermal_zone), GFP_KERNEL); if (!th_zone) return -ENOMEM; th_zone->sensor_conf = sensor_conf; /* * TODO: 1) Handle multiple cooling devices in a thermal zone * 2) Add a flag/name in cooling info to map to specific * sensor */ if (sensor_conf->cooling_data.freq_clip_count > 0) { cpumask_set_cpu(0, &mask_val); th_zone->cool_dev[th_zone->cool_dev_size] = cpufreq_cooling_register(&mask_val); if (IS_ERR(th_zone->cool_dev[th_zone->cool_dev_size])) { dev_err(sensor_conf->dev, "Failed to register cpufreq cooling device\n"); ret = -EINVAL; goto err_unregister; } th_zone->cool_dev_size++; } th_zone->therm_dev = thermal_zone_device_register( sensor_conf->name, sensor_conf->trip_data.trip_count, 0, th_zone, &exynos_dev_ops, NULL, 0, sensor_conf->trip_data.trigger_falling ? 0 : IDLE_INTERVAL); if (IS_ERR(th_zone->therm_dev)) { dev_err(sensor_conf->dev, "Failed to register thermal zone device\n"); ret = PTR_ERR(th_zone->therm_dev); goto err_unregister; } th_zone->mode = THERMAL_DEVICE_ENABLED; sensor_conf->pzone_data = th_zone; dev_info(sensor_conf->dev, "Exynos: Thermal zone(%s) registered\n", sensor_conf->name); return 0; err_unregister: exynos_unregister_thermal(sensor_conf); return ret; }
/* Register with the in-kernel thermal management */ static int exynos_register_thermal(struct thermal_sensor_conf *sensor_conf) { int ret, count, tab_size, pos = 0; struct freq_clip_table *tab_ptr, *clip_data; if (!sensor_conf || !sensor_conf->read_temperature) { pr_err("Temperature sensor not initialised\n"); return -EINVAL; } th_zone = kzalloc(sizeof(struct exynos_thermal_zone), GFP_KERNEL); if (!th_zone) return -ENOMEM; th_zone->sensor_conf = sensor_conf; tab_ptr = (struct freq_clip_table *)sensor_conf->cooling_data.freq_data; /* Register the cpufreq cooling device */ for (count = 0; count < EXYNOS_ZONE_COUNT; count++) { tab_size = sensor_conf->cooling_data.size[count]; if (tab_size == 0) continue; clip_data = (struct freq_clip_table *)&(tab_ptr[pos]); th_zone->cool_dev[count] = cpufreq_cooling_register( clip_data, tab_size); pos += tab_size; if (IS_ERR(th_zone->cool_dev[count])) { pr_err("Failed to register cpufreq cooling device\n"); ret = -EINVAL; th_zone->cool_dev_size = count; goto err_unregister; } } th_zone->cool_dev_size = count; th_zone->therm_dev = thermal_zone_device_register(sensor_conf->name, EXYNOS_ZONE_COUNT, 7, NULL, &exynos_dev_ops, 1, 1, PASSIVE_INTERVAL, IDLE_INTERVAL); if (IS_ERR(th_zone->therm_dev)) { pr_err("Failed to register thermal zone device\n"); ret = -EINVAL; goto err_unregister; } th_zone->mode = THERMAL_DEVICE_ENABLED; pr_info("Exynos: Kernel Thermal management registered\n"); return 0; err_unregister: exynos_unregister_thermal(); return ret; }
static int exynos_tmu_remove(struct platform_device *pdev) { struct exynos_tmu_data *data = platform_get_drvdata(pdev); remove_emulation_sysfs(&pdev->dev); exynos_tmu_control(pdev, false); exynos_unregister_thermal(); clk_put(data->clk); platform_set_drvdata(pdev, NULL); return 0; }
static int __devexit exynos_tmu_remove(struct platform_device *pdev) { struct exynos_tmu_data *data = platform_get_drvdata(pdev); exynos_tmu_control(pdev, false); exynos_unregister_thermal(); clk_put(data->clk); regulator_put(data->regulator); platform_set_drvdata(pdev, NULL); return 0; }
/* Register with the in-kernel thermal management */ static int exynos_register_thermal(struct thermal_sensor_conf *sensor_conf) { int ret; struct cpumask mask_val; if (!sensor_conf || !sensor_conf->read_temperature) { pr_err("Temperature sensor not initialised\n"); return -EINVAL; } th_zone = kzalloc(sizeof(struct exynos_thermal_zone), GFP_KERNEL); if (!th_zone) return -ENOMEM; th_zone->sensor_conf = sensor_conf; cpumask_set_cpu(0, &mask_val); th_zone->cool_dev[0] = cpufreq_cooling_register(&mask_val); if (IS_ERR(th_zone->cool_dev[0])) { pr_err("Failed to register cpufreq cooling device\n"); ret = -EINVAL; goto err_unregister; } th_zone->cool_dev_size++; th_zone->therm_dev = thermal_zone_device_register(sensor_conf->name, EXYNOS_ZONE_COUNT, 0, NULL, &exynos_dev_ops, NULL, 0, sensor_conf->trip_data.trigger_falling ? 0 : IDLE_INTERVAL); if (IS_ERR(th_zone->therm_dev)) { pr_err("Failed to register thermal zone device\n"); ret = PTR_ERR(th_zone->therm_dev); goto err_unregister; } th_zone->mode = THERMAL_DEVICE_ENABLED; pr_info("Exynos: Kernel Thermal management registered\n"); return 0; err_unregister: exynos_unregister_thermal(); return ret; }