From: Stephen Rothwell Date: Wed, 20 Feb 2013 02:02:52 +0000 (+1100) Subject: Merge remote-tracking branch 'thermal/next' X-Git-Tag: next-20130220~74 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=93989e9cf1b619fc5a58846a2bfc8034428839fc;p=karo-tx-linux.git Merge remote-tracking branch 'thermal/next' Conflicts: drivers/thermal/exynos_thermal.c --- 93989e9cf1b619fc5a58846a2bfc8034428839fc diff --cc drivers/thermal/exynos_thermal.c index 224751e9f5ff,64aa8b445054..a5ae30e3cfa9 --- a/drivers/thermal/exynos_thermal.c +++ b/drivers/thermal/exynos_thermal.c @@@ -832,7 -852,95 +852,95 @@@ static inline struct exynos_tmu_platfo return (struct exynos_tmu_platform_data *) platform_get_device_id(pdev)->driver_data; } + + #ifdef CONFIG_EXYNOS_THERMAL_EMUL + static ssize_t exynos_tmu_emulation_show(struct device *dev, + struct device_attribute *attr, + char *buf) + { + struct platform_device *pdev = container_of(dev, + struct platform_device, dev); + struct exynos_tmu_data *data = platform_get_drvdata(pdev); + unsigned int reg; + u8 temp_code; + int temp = 0; + + if (data->soc == SOC_ARCH_EXYNOS4210) + goto out; + + mutex_lock(&data->lock); + clk_enable(data->clk); + reg = readl(data->base + EXYNOS_EMUL_CON); + clk_disable(data->clk); + mutex_unlock(&data->lock); + + if (reg & EXYNOS_EMUL_ENABLE) { + reg >>= EXYNOS_EMUL_DATA_SHIFT; + temp_code = reg & EXYNOS_EMUL_DATA_MASK; + temp = code_to_temp(data, temp_code); + } + out: + return sprintf(buf, "%d\n", temp * MCELSIUS); + } + + static ssize_t exynos_tmu_emulation_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) + { + struct platform_device *pdev = container_of(dev, + struct platform_device, dev); + struct exynos_tmu_data *data = platform_get_drvdata(pdev); + unsigned int reg; + int temp; + + if (data->soc == SOC_ARCH_EXYNOS4210) + goto out; + + if (!sscanf(buf, "%d\n", &temp) || temp < 0) + return -EINVAL; + + mutex_lock(&data->lock); + clk_enable(data->clk); + + reg = readl(data->base + EXYNOS_EMUL_CON); + + if (temp) { + /* Both CELSIUS and MCELSIUS type are available for input */ + if (temp > MCELSIUS) + temp /= MCELSIUS; + + reg = (EXYNOS_EMUL_TIME << EXYNOS_EMUL_TIME_SHIFT) | + (temp_to_code(data, (temp / MCELSIUS)) + << EXYNOS_EMUL_DATA_SHIFT) | EXYNOS_EMUL_ENABLE; + } else { + reg &= ~EXYNOS_EMUL_ENABLE; + } + + writel(reg, data->base + EXYNOS_EMUL_CON); + + clk_disable(data->clk); + mutex_unlock(&data->lock); + + out: + return count; + } + + static DEVICE_ATTR(emulation, 0644, exynos_tmu_emulation_show, + exynos_tmu_emulation_store); + static int create_emulation_sysfs(struct device *dev) + { + return device_create_file(dev, &dev_attr_emulation); + } + static void remove_emulation_sysfs(struct device *dev) + { + device_remove_file(dev, &dev_attr_emulation); + } + #else + static inline int create_emulation_sysfs(struct device *dev) { return 0; } + static inline void remove_emulation_sysfs(struct device *dev) {} + #endif + -static int __devinit exynos_tmu_probe(struct platform_device *pdev) +static int exynos_tmu_probe(struct platform_device *pdev) { struct exynos_tmu_data *data; struct exynos_tmu_platform_data *pdata = pdev->dev.platform_data; @@@ -982,10 -1099,10 +1099,10 @@@ static struct platform_driver exynos_tm .name = "exynos-tmu", .owner = THIS_MODULE, .pm = EXYNOS_TMU_PM, - .of_match_table = exynos_tmu_match, + .of_match_table = of_match_ptr(exynos_tmu_match), }, .probe = exynos_tmu_probe, - .remove = __devexit_p(exynos_tmu_remove), + .remove = exynos_tmu_remove, .id_table = exynos_tmu_driver_ids, };