Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal
Pull thermal fixes from Eduardo Valentin: "Specifics: - a few code fixes improving the Exynos code base. They remove dead and unreachable code. No functional changes here - in Exynos code base, fixes regarding the right usage of features (TRIMINFO and TRIMRELOAD) - documentation of RCAR thermal - fix in the of-thermal, regarding the proper usage of of-APIs - fixes on thermal-core, removal of unreachable code" [ Eduardo is sending the thermal fixes on behalf of Rui Zhang this time. Rui is currently unable to send pull requests due to troubles with his machine and he's currently in a business trip ] * 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal: Thermal:Remove usless if(!result) before return tz thermal: exynos: fix IRQ clearing on TMU initialization thermal: fix multiple disbalanced device node counters thermal: rcar: Add binding docs for new R-Car Gen2 SoCs thermal: exynos: Add support for TRIM_RELOAD feature at Exynos3250 thermal: exynos: Add support for many TRIMINFO_CTRL registers thermal: samsung: Exynos5260 and Exynos5420 should not use TRIM_RELOAD flag thermal: exynos: remove identical values from exynos*_tmu_registers structures thermal: exynos: remove redundant pdata checks from exynos_tmu_control() thermal: exynos: cache non_hw_trigger_levels in pdata thermal: exynos: simplify temp_to_code() and code_to_temp() thermal: exynos: remove redundant threshold_code checks from exynos_tmu_initialize() thermal: exynos: remove redundant pdata checks from exynos_tmu_initialize() thermal: exynos: remove dead code for HW_MODE calibration thermal: exynos: remove unused struct exynos_tmu_registers entries
This commit is contained in:
commit
a1cff6e25e
|
@ -7,7 +7,10 @@ Required properties:
|
|||
- "renesas,thermal-r8a73a4" (R-Mobile AP6)
|
||||
- "renesas,thermal-r8a7779" (R-Car H1)
|
||||
- "renesas,thermal-r8a7790" (R-Car H2)
|
||||
- "renesas,thermal-r8a7791" (R-Car M2)
|
||||
- "renesas,thermal-r8a7791" (R-Car M2-W)
|
||||
- "renesas,thermal-r8a7792" (R-Car V2H)
|
||||
- "renesas,thermal-r8a7793" (R-Car M2-N)
|
||||
- "renesas,thermal-r8a7794" (R-Car E2)
|
||||
- reg : Address range of the thermal registers.
|
||||
The 1st reg will be recognized as common register
|
||||
if it has "interrupts".
|
||||
|
|
|
@ -387,15 +387,18 @@ thermal_zone_of_sensor_register(struct device *dev, int sensor_id,
|
|||
int (*get_trend)(void *, long *))
|
||||
{
|
||||
struct device_node *np, *child, *sensor_np;
|
||||
struct thermal_zone_device *tzd = ERR_PTR(-ENODEV);
|
||||
|
||||
np = of_find_node_by_name(NULL, "thermal-zones");
|
||||
if (!np)
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
if (!dev || !dev->of_node)
|
||||
if (!dev || !dev->of_node) {
|
||||
of_node_put(np);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
sensor_np = dev->of_node;
|
||||
sensor_np = of_node_get(dev->of_node);
|
||||
|
||||
for_each_child_of_node(np, child) {
|
||||
struct of_phandle_args sensor_specs;
|
||||
|
@ -422,16 +425,21 @@ thermal_zone_of_sensor_register(struct device *dev, int sensor_id,
|
|||
}
|
||||
|
||||
if (sensor_specs.np == sensor_np && id == sensor_id) {
|
||||
of_node_put(np);
|
||||
return thermal_zone_of_add_sensor(child, sensor_np,
|
||||
data,
|
||||
get_temp,
|
||||
get_trend);
|
||||
tzd = thermal_zone_of_add_sensor(child, sensor_np,
|
||||
data,
|
||||
get_temp,
|
||||
get_trend);
|
||||
of_node_put(sensor_specs.np);
|
||||
of_node_put(child);
|
||||
goto exit;
|
||||
}
|
||||
of_node_put(sensor_specs.np);
|
||||
}
|
||||
exit:
|
||||
of_node_put(sensor_np);
|
||||
of_node_put(np);
|
||||
|
||||
return ERR_PTR(-ENODEV);
|
||||
return tzd;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(thermal_zone_of_sensor_register);
|
||||
|
||||
|
@ -623,6 +631,7 @@ static int thermal_of_populate_trip(struct device_node *np,
|
|||
|
||||
/* Required for cooling map matching */
|
||||
trip->np = np;
|
||||
of_node_get(np);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -730,9 +739,14 @@ finish:
|
|||
return tz;
|
||||
|
||||
free_tbps:
|
||||
for (i = 0; i < tz->num_tbps; i++)
|
||||
of_node_put(tz->tbps[i].cooling_device);
|
||||
kfree(tz->tbps);
|
||||
free_trips:
|
||||
for (i = 0; i < tz->ntrips; i++)
|
||||
of_node_put(tz->trips[i].np);
|
||||
kfree(tz->trips);
|
||||
of_node_put(gchild);
|
||||
free_tz:
|
||||
kfree(tz);
|
||||
of_node_put(child);
|
||||
|
@ -742,7 +756,13 @@ free_tz:
|
|||
|
||||
static inline void of_thermal_free_zone(struct __thermal_zone *tz)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < tz->num_tbps; i++)
|
||||
of_node_put(tz->tbps[i].cooling_device);
|
||||
kfree(tz->tbps);
|
||||
for (i = 0; i < tz->ntrips; i++)
|
||||
of_node_put(tz->trips[i].np);
|
||||
kfree(tz->trips);
|
||||
kfree(tz);
|
||||
}
|
||||
|
@ -814,10 +834,13 @@ int __init of_parse_thermal_zones(void)
|
|||
/* attempting to build remaining zones still */
|
||||
}
|
||||
}
|
||||
of_node_put(np);
|
||||
|
||||
return 0;
|
||||
|
||||
exit_free:
|
||||
of_node_put(child);
|
||||
of_node_put(np);
|
||||
of_thermal_free_zone(tz);
|
||||
|
||||
/* no memory available, so free what we have built */
|
||||
|
@ -859,4 +882,5 @@ void of_thermal_destroy_zones(void)
|
|||
kfree(zone->ops);
|
||||
of_thermal_free_zone(zone->devdata);
|
||||
}
|
||||
of_node_put(np);
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
#define SENSOR_NAME_LEN 16
|
||||
#define MAX_TRIP_COUNT 8
|
||||
#define MAX_COOLING_DEVICE 4
|
||||
#define MAX_THRESHOLD_LEVS 5
|
||||
#define MAX_TRIMINFO_CTRL_REG 2
|
||||
|
||||
#define ACTIVE_INTERVAL 500
|
||||
#define IDLE_INTERVAL 10000
|
||||
|
|
|
@ -77,16 +77,6 @@ static int temp_to_code(struct exynos_tmu_data *data, u8 temp)
|
|||
struct exynos_tmu_platform_data *pdata = data->pdata;
|
||||
int temp_code;
|
||||
|
||||
if (pdata->cal_mode == HW_MODE)
|
||||
return temp;
|
||||
|
||||
if (data->soc == SOC_ARCH_EXYNOS4210)
|
||||
/* temp should range between 25 and 125 */
|
||||
if (temp < 25 || temp > 125) {
|
||||
temp_code = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
switch (pdata->cal_type) {
|
||||
case TYPE_TWO_POINT_TRIMMING:
|
||||
temp_code = (temp - pdata->first_point_trim) *
|
||||
|
@ -101,7 +91,7 @@ static int temp_to_code(struct exynos_tmu_data *data, u8 temp)
|
|||
temp_code = temp + pdata->default_temp_offset;
|
||||
break;
|
||||
}
|
||||
out:
|
||||
|
||||
return temp_code;
|
||||
}
|
||||
|
||||
|
@ -114,16 +104,6 @@ static int code_to_temp(struct exynos_tmu_data *data, u8 temp_code)
|
|||
struct exynos_tmu_platform_data *pdata = data->pdata;
|
||||
int temp;
|
||||
|
||||
if (pdata->cal_mode == HW_MODE)
|
||||
return temp_code;
|
||||
|
||||
if (data->soc == SOC_ARCH_EXYNOS4210)
|
||||
/* temp_code should range between 75 and 175 */
|
||||
if (temp_code < 75 || temp_code > 175) {
|
||||
temp = -ENODATA;
|
||||
goto out;
|
||||
}
|
||||
|
||||
switch (pdata->cal_type) {
|
||||
case TYPE_TWO_POINT_TRIMMING:
|
||||
temp = (temp_code - data->temp_error1) *
|
||||
|
@ -138,18 +118,35 @@ static int code_to_temp(struct exynos_tmu_data *data, u8 temp_code)
|
|||
temp = temp_code - pdata->default_temp_offset;
|
||||
break;
|
||||
}
|
||||
out:
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
static void exynos_tmu_clear_irqs(struct exynos_tmu_data *data)
|
||||
{
|
||||
const struct exynos_tmu_registers *reg = data->pdata->registers;
|
||||
unsigned int val_irq;
|
||||
|
||||
val_irq = readl(data->base + reg->tmu_intstat);
|
||||
/*
|
||||
* Clear the interrupts. Please note that the documentation for
|
||||
* Exynos3250, Exynos4412, Exynos5250 and Exynos5260 incorrectly
|
||||
* states that INTCLEAR register has a different placing of bits
|
||||
* responsible for FALL IRQs than INTSTAT register. Exynos5420
|
||||
* and Exynos5440 documentation is correct (Exynos4210 doesn't
|
||||
* support FALL IRQs at all).
|
||||
*/
|
||||
writel(val_irq, data->base + reg->tmu_intclear);
|
||||
}
|
||||
|
||||
static int exynos_tmu_initialize(struct platform_device *pdev)
|
||||
{
|
||||
struct exynos_tmu_data *data = platform_get_drvdata(pdev);
|
||||
struct exynos_tmu_platform_data *pdata = data->pdata;
|
||||
const struct exynos_tmu_registers *reg = pdata->registers;
|
||||
unsigned int status, trim_info = 0, con;
|
||||
unsigned int status, trim_info = 0, con, ctrl;
|
||||
unsigned int rising_threshold = 0, falling_threshold = 0;
|
||||
int ret = 0, threshold_code, i, trigger_levs = 0;
|
||||
int ret = 0, threshold_code, i;
|
||||
|
||||
mutex_lock(&data->lock);
|
||||
clk_enable(data->clk);
|
||||
|
@ -164,11 +161,17 @@ static int exynos_tmu_initialize(struct platform_device *pdev)
|
|||
}
|
||||
}
|
||||
|
||||
if (TMU_SUPPORTS(pdata, TRIM_RELOAD))
|
||||
__raw_writel(1, data->base + reg->triminfo_ctrl);
|
||||
|
||||
if (pdata->cal_mode == HW_MODE)
|
||||
goto skip_calib_data;
|
||||
if (TMU_SUPPORTS(pdata, TRIM_RELOAD)) {
|
||||
for (i = 0; i < reg->triminfo_ctrl_count; i++) {
|
||||
if (pdata->triminfo_reload[i]) {
|
||||
ctrl = readl(data->base +
|
||||
reg->triminfo_ctrl[i]);
|
||||
ctrl |= pdata->triminfo_reload[i];
|
||||
writel(ctrl, data->base +
|
||||
reg->triminfo_ctrl[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Save trimming info in order to perform calibration */
|
||||
if (data->soc == SOC_ARCH_EXYNOS5440) {
|
||||
|
@ -197,7 +200,7 @@ static int exynos_tmu_initialize(struct platform_device *pdev)
|
|||
trim_info = readl(data->base + reg->triminfo_data);
|
||||
}
|
||||
data->temp_error1 = trim_info & EXYNOS_TMU_TEMP_MASK;
|
||||
data->temp_error2 = ((trim_info >> reg->triminfo_85_shift) &
|
||||
data->temp_error2 = ((trim_info >> EXYNOS_TRIMINFO_85_SHIFT) &
|
||||
EXYNOS_TMU_TEMP_MASK);
|
||||
|
||||
if (!data->temp_error1 ||
|
||||
|
@ -207,67 +210,33 @@ static int exynos_tmu_initialize(struct platform_device *pdev)
|
|||
|
||||
if (!data->temp_error2)
|
||||
data->temp_error2 =
|
||||
(pdata->efuse_value >> reg->triminfo_85_shift) &
|
||||
(pdata->efuse_value >> EXYNOS_TRIMINFO_85_SHIFT) &
|
||||
EXYNOS_TMU_TEMP_MASK;
|
||||
|
||||
skip_calib_data:
|
||||
if (pdata->max_trigger_level > MAX_THRESHOLD_LEVS) {
|
||||
dev_err(&pdev->dev, "Invalid max trigger level\n");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (i = 0; i < pdata->max_trigger_level; i++) {
|
||||
if (!pdata->trigger_levels[i])
|
||||
continue;
|
||||
|
||||
if ((pdata->trigger_type[i] == HW_TRIP) &&
|
||||
(!pdata->trigger_levels[pdata->max_trigger_level - 1])) {
|
||||
dev_err(&pdev->dev, "Invalid hw trigger level\n");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Count trigger levels except the HW trip*/
|
||||
if (!(pdata->trigger_type[i] == HW_TRIP))
|
||||
trigger_levs++;
|
||||
}
|
||||
|
||||
rising_threshold = readl(data->base + reg->threshold_th0);
|
||||
|
||||
if (data->soc == SOC_ARCH_EXYNOS4210) {
|
||||
/* Write temperature code for threshold */
|
||||
threshold_code = temp_to_code(data, pdata->threshold);
|
||||
if (threshold_code < 0) {
|
||||
ret = threshold_code;
|
||||
goto out;
|
||||
}
|
||||
writeb(threshold_code,
|
||||
data->base + reg->threshold_temp);
|
||||
for (i = 0; i < trigger_levs; i++)
|
||||
for (i = 0; i < pdata->non_hw_trigger_levels; i++)
|
||||
writeb(pdata->trigger_levels[i], data->base +
|
||||
reg->threshold_th0 + i * sizeof(reg->threshold_th0));
|
||||
|
||||
writel(reg->intclr_rise_mask, data->base + reg->tmu_intclear);
|
||||
exynos_tmu_clear_irqs(data);
|
||||
} else {
|
||||
/* Write temperature code for rising and falling threshold */
|
||||
for (i = 0;
|
||||
i < trigger_levs && i < EXYNOS_MAX_TRIGGER_PER_REG; i++) {
|
||||
for (i = 0; i < pdata->non_hw_trigger_levels; i++) {
|
||||
threshold_code = temp_to_code(data,
|
||||
pdata->trigger_levels[i]);
|
||||
if (threshold_code < 0) {
|
||||
ret = threshold_code;
|
||||
goto out;
|
||||
}
|
||||
rising_threshold &= ~(0xff << 8 * i);
|
||||
rising_threshold |= threshold_code << 8 * i;
|
||||
if (pdata->threshold_falling) {
|
||||
threshold_code = temp_to_code(data,
|
||||
pdata->trigger_levels[i] -
|
||||
pdata->threshold_falling);
|
||||
if (threshold_code > 0)
|
||||
falling_threshold |=
|
||||
threshold_code << 8 * i;
|
||||
falling_threshold |= threshold_code << 8 * i;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -276,9 +245,7 @@ skip_calib_data:
|
|||
writel(falling_threshold,
|
||||
data->base + reg->threshold_th1);
|
||||
|
||||
writel((reg->intclr_rise_mask << reg->intclr_rise_shift) |
|
||||
(reg->intclr_fall_mask << reg->intclr_fall_shift),
|
||||
data->base + reg->tmu_intclear);
|
||||
exynos_tmu_clear_irqs(data);
|
||||
|
||||
/* if last threshold limit is also present */
|
||||
i = pdata->max_trigger_level - 1;
|
||||
|
@ -286,10 +253,6 @@ skip_calib_data:
|
|||
(pdata->trigger_type[i] == HW_TRIP)) {
|
||||
threshold_code = temp_to_code(data,
|
||||
pdata->trigger_levels[i]);
|
||||
if (threshold_code < 0) {
|
||||
ret = threshold_code;
|
||||
goto out;
|
||||
}
|
||||
if (i == EXYNOS_MAX_TRIGGER_PER_REG - 1) {
|
||||
/* 1-4 level to be assigned in th0 reg */
|
||||
rising_threshold &= ~(0xff << 8 * i);
|
||||
|
@ -325,7 +288,7 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on)
|
|||
struct exynos_tmu_data *data = platform_get_drvdata(pdev);
|
||||
struct exynos_tmu_platform_data *pdata = data->pdata;
|
||||
const struct exynos_tmu_registers *reg = pdata->registers;
|
||||
unsigned int con, interrupt_en, cal_val;
|
||||
unsigned int con, interrupt_en;
|
||||
|
||||
mutex_lock(&data->lock);
|
||||
clk_enable(data->clk);
|
||||
|
@ -335,15 +298,11 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on)
|
|||
if (pdata->test_mux)
|
||||
con |= (pdata->test_mux << reg->test_mux_addr_shift);
|
||||
|
||||
if (pdata->reference_voltage) {
|
||||
con &= ~(reg->buf_vref_sel_mask << reg->buf_vref_sel_shift);
|
||||
con |= pdata->reference_voltage << reg->buf_vref_sel_shift;
|
||||
}
|
||||
con &= ~(EXYNOS_TMU_REF_VOLTAGE_MASK << EXYNOS_TMU_REF_VOLTAGE_SHIFT);
|
||||
con |= pdata->reference_voltage << EXYNOS_TMU_REF_VOLTAGE_SHIFT;
|
||||
|
||||
if (pdata->gain) {
|
||||
con &= ~(reg->buf_slope_sel_mask << reg->buf_slope_sel_shift);
|
||||
con |= (pdata->gain << reg->buf_slope_sel_shift);
|
||||
}
|
||||
con &= ~(EXYNOS_TMU_BUF_SLOPE_SEL_MASK << EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT);
|
||||
con |= (pdata->gain << EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT);
|
||||
|
||||
if (pdata->noise_cancel_mode) {
|
||||
con &= ~(reg->therm_trip_mode_mask <<
|
||||
|
@ -351,29 +310,8 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on)
|
|||
con |= (pdata->noise_cancel_mode << reg->therm_trip_mode_shift);
|
||||
}
|
||||
|
||||
if (pdata->cal_mode == HW_MODE) {
|
||||
con &= ~(reg->calib_mode_mask << reg->calib_mode_shift);
|
||||
cal_val = 0;
|
||||
switch (pdata->cal_type) {
|
||||
case TYPE_TWO_POINT_TRIMMING:
|
||||
cal_val = 3;
|
||||
break;
|
||||
case TYPE_ONE_POINT_TRIMMING_85:
|
||||
cal_val = 2;
|
||||
break;
|
||||
case TYPE_ONE_POINT_TRIMMING_25:
|
||||
cal_val = 1;
|
||||
break;
|
||||
case TYPE_NONE:
|
||||
break;
|
||||
default:
|
||||
dev_err(&pdev->dev, "Invalid calibration type, using none\n");
|
||||
}
|
||||
con |= cal_val << reg->calib_mode_shift;
|
||||
}
|
||||
|
||||
if (on) {
|
||||
con |= (1 << reg->core_en_shift);
|
||||
con |= (1 << EXYNOS_TMU_CORE_EN_SHIFT);
|
||||
interrupt_en =
|
||||
pdata->trigger_enable[3] << reg->inten_rise3_shift |
|
||||
pdata->trigger_enable[2] << reg->inten_rise2_shift |
|
||||
|
@ -383,7 +321,7 @@ static void exynos_tmu_control(struct platform_device *pdev, bool on)
|
|||
interrupt_en |=
|
||||
interrupt_en << reg->inten_fall0_shift;
|
||||
} else {
|
||||
con &= ~(1 << reg->core_en_shift);
|
||||
con &= ~(1 << EXYNOS_TMU_CORE_EN_SHIFT);
|
||||
interrupt_en = 0; /* Disable all interrupts */
|
||||
}
|
||||
writel(interrupt_en, data->base + reg->tmu_inten);
|
||||
|
@ -404,8 +342,16 @@ static int exynos_tmu_read(struct exynos_tmu_data *data)
|
|||
clk_enable(data->clk);
|
||||
|
||||
temp_code = readb(data->base + reg->tmu_cur_temp);
|
||||
temp = code_to_temp(data, temp_code);
|
||||
|
||||
if (data->soc == SOC_ARCH_EXYNOS4210)
|
||||
/* temp_code should range between 75 and 175 */
|
||||
if (temp_code < 75 || temp_code > 175) {
|
||||
temp = -ENODATA;
|
||||
goto out;
|
||||
}
|
||||
|
||||
temp = code_to_temp(data, temp_code);
|
||||
out:
|
||||
clk_disable(data->clk);
|
||||
mutex_unlock(&data->lock);
|
||||
|
||||
|
@ -465,7 +411,7 @@ static void exynos_tmu_work(struct work_struct *work)
|
|||
struct exynos_tmu_data, irq_work);
|
||||
struct exynos_tmu_platform_data *pdata = data->pdata;
|
||||
const struct exynos_tmu_registers *reg = pdata->registers;
|
||||
unsigned int val_irq, val_type;
|
||||
unsigned int val_type;
|
||||
|
||||
if (!IS_ERR(data->clk_sec))
|
||||
clk_enable(data->clk_sec);
|
||||
|
@ -483,9 +429,7 @@ static void exynos_tmu_work(struct work_struct *work)
|
|||
clk_enable(data->clk);
|
||||
|
||||
/* TODO: take action based on particular interrupt */
|
||||
val_irq = readl(data->base + reg->tmu_intstat);
|
||||
/* clear the interrupts */
|
||||
writel(val_irq, data->base + reg->tmu_intclear);
|
||||
exynos_tmu_clear_irqs(data);
|
||||
|
||||
clk_disable(data->clk);
|
||||
mutex_unlock(&data->lock);
|
||||
|
|
|
@ -34,11 +34,6 @@ enum calibration_type {
|
|||
TYPE_NONE,
|
||||
};
|
||||
|
||||
enum calibration_mode {
|
||||
SW_MODE,
|
||||
HW_MODE,
|
||||
};
|
||||
|
||||
enum soc_type {
|
||||
SOC_ARCH_EXYNOS3250 = 1,
|
||||
SOC_ARCH_EXYNOS4210,
|
||||
|
@ -82,46 +77,19 @@ enum soc_type {
|
|||
* bitfields. The register validity, offsets and bitfield values may vary
|
||||
* slightly across different exynos SOC's.
|
||||
* @triminfo_data: register containing 2 pont trimming data
|
||||
* @triminfo_25_shift: shift bit of the 25 C trim value in triminfo_data reg.
|
||||
* @triminfo_85_shift: shift bit of the 85 C trim value in triminfo_data reg.
|
||||
* @triminfo_ctrl: trim info controller register.
|
||||
* @triminfo_reload_shift: shift of triminfo reload enable bit in triminfo_ctrl
|
||||
reg.
|
||||
* @triminfo_ctrl_count: the number of trim info controller register.
|
||||
* @tmu_ctrl: TMU main controller register.
|
||||
* @test_mux_addr_shift: shift bits of test mux address.
|
||||
* @buf_vref_sel_shift: shift bits of reference voltage in tmu_ctrl register.
|
||||
* @buf_vref_sel_mask: mask bits of reference voltage in tmu_ctrl register.
|
||||
* @therm_trip_mode_shift: shift bits of tripping mode in tmu_ctrl register.
|
||||
* @therm_trip_mode_mask: mask bits of tripping mode in tmu_ctrl register.
|
||||
* @therm_trip_en_shift: shift bits of tripping enable in tmu_ctrl register.
|
||||
* @buf_slope_sel_shift: shift bits of amplifier gain value in tmu_ctrl
|
||||
register.
|
||||
* @buf_slope_sel_mask: mask bits of amplifier gain value in tmu_ctrl register.
|
||||
* @calib_mode_shift: shift bits of calibration mode value in tmu_ctrl
|
||||
register.
|
||||
* @calib_mode_mask: mask bits of calibration mode value in tmu_ctrl
|
||||
register.
|
||||
* @therm_trip_tq_en_shift: shift bits of thermal trip enable by TQ pin in
|
||||
tmu_ctrl register.
|
||||
* @core_en_shift: shift bits of TMU core enable bit in tmu_ctrl register.
|
||||
* @tmu_status: register drescribing the TMU status.
|
||||
* @tmu_cur_temp: register containing the current temperature of the TMU.
|
||||
* @tmu_cur_temp_shift: shift bits of current temp value in tmu_cur_temp
|
||||
register.
|
||||
* @threshold_temp: register containing the base threshold level.
|
||||
* @threshold_th0: Register containing first set of rising levels.
|
||||
* @threshold_th0_l0_shift: shift bits of level0 threshold temperature.
|
||||
* @threshold_th0_l1_shift: shift bits of level1 threshold temperature.
|
||||
* @threshold_th0_l2_shift: shift bits of level2 threshold temperature.
|
||||
* @threshold_th0_l3_shift: shift bits of level3 threshold temperature.
|
||||
* @threshold_th1: Register containing second set of rising levels.
|
||||
* @threshold_th1_l0_shift: shift bits of level0 threshold temperature.
|
||||
* @threshold_th1_l1_shift: shift bits of level1 threshold temperature.
|
||||
* @threshold_th1_l2_shift: shift bits of level2 threshold temperature.
|
||||
* @threshold_th1_l3_shift: shift bits of level3 threshold temperature.
|
||||
* @threshold_th2: Register containing third set of rising levels.
|
||||
* @threshold_th2_l0_shift: shift bits of level0 threshold temperature.
|
||||
* @threshold_th3: Register containing fourth set of rising levels.
|
||||
* @threshold_th3_l0_shift: shift bits of level0 threshold temperature.
|
||||
* @tmu_inten: register containing the different threshold interrupt
|
||||
enable bits.
|
||||
|
@ -130,68 +98,35 @@ enum soc_type {
|
|||
* @inten_rise2_shift: shift bits of rising 2 interrupt bits.
|
||||
* @inten_rise3_shift: shift bits of rising 3 interrupt bits.
|
||||
* @inten_fall0_shift: shift bits of falling 0 interrupt bits.
|
||||
* @inten_fall1_shift: shift bits of falling 1 interrupt bits.
|
||||
* @inten_fall2_shift: shift bits of falling 2 interrupt bits.
|
||||
* @inten_fall3_shift: shift bits of falling 3 interrupt bits.
|
||||
* @tmu_intstat: Register containing the interrupt status values.
|
||||
* @tmu_intclear: Register for clearing the raised interrupt status.
|
||||
* @intclr_fall_shift: shift bits for interrupt clear fall 0
|
||||
* @intclr_rise_shift: shift bits of all rising interrupt bits.
|
||||
* @intclr_rise_mask: mask bits of all rising interrupt bits.
|
||||
* @intclr_fall_mask: mask bits of all rising interrupt bits.
|
||||
* @emul_con: TMU emulation controller register.
|
||||
* @emul_temp_shift: shift bits of emulation temperature.
|
||||
* @emul_time_shift: shift bits of emulation time.
|
||||
* @emul_time_mask: mask bits of emulation time.
|
||||
* @tmu_irqstatus: register to find which TMU generated interrupts.
|
||||
* @tmu_pmin: register to get/set the Pmin value.
|
||||
*/
|
||||
struct exynos_tmu_registers {
|
||||
u32 triminfo_data;
|
||||
u32 triminfo_25_shift;
|
||||
u32 triminfo_85_shift;
|
||||
|
||||
u32 triminfo_ctrl;
|
||||
u32 triminfo_ctrl1;
|
||||
u32 triminfo_reload_shift;
|
||||
u32 triminfo_ctrl[MAX_TRIMINFO_CTRL_REG];
|
||||
u32 triminfo_ctrl_count;
|
||||
|
||||
u32 tmu_ctrl;
|
||||
u32 test_mux_addr_shift;
|
||||
u32 buf_vref_sel_shift;
|
||||
u32 buf_vref_sel_mask;
|
||||
u32 therm_trip_mode_shift;
|
||||
u32 therm_trip_mode_mask;
|
||||
u32 therm_trip_en_shift;
|
||||
u32 buf_slope_sel_shift;
|
||||
u32 buf_slope_sel_mask;
|
||||
u32 calib_mode_shift;
|
||||
u32 calib_mode_mask;
|
||||
u32 therm_trip_tq_en_shift;
|
||||
u32 core_en_shift;
|
||||
|
||||
u32 tmu_status;
|
||||
|
||||
u32 tmu_cur_temp;
|
||||
u32 tmu_cur_temp_shift;
|
||||
|
||||
u32 threshold_temp;
|
||||
|
||||
u32 threshold_th0;
|
||||
u32 threshold_th0_l0_shift;
|
||||
u32 threshold_th0_l1_shift;
|
||||
u32 threshold_th0_l2_shift;
|
||||
u32 threshold_th0_l3_shift;
|
||||
|
||||
u32 threshold_th1;
|
||||
u32 threshold_th1_l0_shift;
|
||||
u32 threshold_th1_l1_shift;
|
||||
u32 threshold_th1_l2_shift;
|
||||
u32 threshold_th1_l3_shift;
|
||||
|
||||
u32 threshold_th2;
|
||||
u32 threshold_th2_l0_shift;
|
||||
|
||||
u32 threshold_th3;
|
||||
u32 threshold_th3_l0_shift;
|
||||
|
||||
u32 tmu_inten;
|
||||
|
@ -200,22 +135,14 @@ struct exynos_tmu_registers {
|
|||
u32 inten_rise2_shift;
|
||||
u32 inten_rise3_shift;
|
||||
u32 inten_fall0_shift;
|
||||
u32 inten_fall1_shift;
|
||||
u32 inten_fall2_shift;
|
||||
u32 inten_fall3_shift;
|
||||
|
||||
u32 tmu_intstat;
|
||||
|
||||
u32 tmu_intclear;
|
||||
u32 intclr_fall_shift;
|
||||
u32 intclr_rise_shift;
|
||||
u32 intclr_fall_mask;
|
||||
u32 intclr_rise_mask;
|
||||
|
||||
u32 emul_con;
|
||||
u32 emul_temp_shift;
|
||||
u32 emul_time_shift;
|
||||
u32 emul_time_mask;
|
||||
|
||||
u32 tmu_irqstatus;
|
||||
u32 tmu_pmin;
|
||||
|
@ -250,11 +177,12 @@ struct exynos_tmu_registers {
|
|||
* 1 = enable trigger_level[] interrupt,
|
||||
* 0 = disable trigger_level[] interrupt
|
||||
* @max_trigger_level: max trigger level supported by the TMU
|
||||
* @non_hw_trigger_levels: number of defined non-hardware trigger levels
|
||||
* @gain: gain of amplifier in the positive-TC generator block
|
||||
* 0 <= gain <= 15
|
||||
* 0 < gain <= 15
|
||||
* @reference_voltage: reference voltage of amplifier
|
||||
* in the positive-TC generator block
|
||||
* 0 <= reference_voltage <= 31
|
||||
* 0 < reference_voltage <= 31
|
||||
* @noise_cancel_mode: noise cancellation mode
|
||||
* 000, 100, 101, 110 and 111 can be different modes
|
||||
* @type: determines the type of SOC
|
||||
|
@ -265,8 +193,8 @@ struct exynos_tmu_registers {
|
|||
* @second_point_trim: temp value of the second point trimming
|
||||
* @default_temp_offset: default temperature offset in case of no trimming
|
||||
* @test_mux; information if SoC supports test MUX
|
||||
* @triminfo_reload: reload value to read TRIMINFO register
|
||||
* @cal_type: calibration type for temperature
|
||||
* @cal_mode: calibration mode for temperature
|
||||
* @freq_clip_table: Table representing frequency reduction percentage.
|
||||
* @freq_tab_count: Count of the above table as frequency reduction may
|
||||
* applicable to only some of the trigger levels.
|
||||
|
@ -284,6 +212,7 @@ struct exynos_tmu_platform_data {
|
|||
enum trigger_type trigger_type[MAX_TRIP_COUNT];
|
||||
bool trigger_enable[MAX_TRIP_COUNT];
|
||||
u8 max_trigger_level;
|
||||
u8 non_hw_trigger_levels;
|
||||
u8 gain;
|
||||
u8 reference_voltage;
|
||||
u8 noise_cancel_mode;
|
||||
|
@ -295,9 +224,9 @@ struct exynos_tmu_platform_data {
|
|||
u8 second_point_trim;
|
||||
u8 default_temp_offset;
|
||||
u8 test_mux;
|
||||
u8 triminfo_reload[MAX_TRIMINFO_CTRL_REG];
|
||||
|
||||
enum calibration_type cal_type;
|
||||
enum calibration_mode cal_mode;
|
||||
enum soc_type type;
|
||||
struct freq_clip_table freq_tab[4];
|
||||
unsigned int freq_tab_count;
|
||||
|
|
|
@ -27,14 +27,7 @@
|
|||
#if defined(CONFIG_CPU_EXYNOS4210)
|
||||
static const struct exynos_tmu_registers exynos4210_tmu_registers = {
|
||||
.triminfo_data = EXYNOS_TMU_REG_TRIMINFO,
|
||||
.triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT,
|
||||
.triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT,
|
||||
.tmu_ctrl = EXYNOS_TMU_REG_CONTROL,
|
||||
.buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT,
|
||||
.buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK,
|
||||
.buf_slope_sel_shift = EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT,
|
||||
.buf_slope_sel_mask = EXYNOS_TMU_BUF_SLOPE_SEL_MASK,
|
||||
.core_en_shift = EXYNOS_TMU_CORE_EN_SHIFT,
|
||||
.tmu_status = EXYNOS_TMU_REG_STATUS,
|
||||
.tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP,
|
||||
.threshold_temp = EXYNOS4210_TMU_REG_THRESHOLD_TEMP,
|
||||
|
@ -46,7 +39,6 @@ static const struct exynos_tmu_registers exynos4210_tmu_registers = {
|
|||
.inten_rise3_shift = EXYNOS_TMU_INTEN_RISE3_SHIFT,
|
||||
.tmu_intstat = EXYNOS_TMU_REG_INTSTAT,
|
||||
.tmu_intclear = EXYNOS_TMU_REG_INTCLEAR,
|
||||
.intclr_rise_mask = EXYNOS4210_TMU_TRIG_LEVEL_MASK,
|
||||
};
|
||||
|
||||
struct exynos_tmu_init_data const exynos4210_default_tmu_data = {
|
||||
|
@ -64,6 +56,7 @@ struct exynos_tmu_init_data const exynos4210_default_tmu_data = {
|
|||
.trigger_type[1] = THROTTLE_ACTIVE,
|
||||
.trigger_type[2] = SW_TRIP,
|
||||
.max_trigger_level = 4,
|
||||
.non_hw_trigger_levels = 3,
|
||||
.gain = 15,
|
||||
.reference_voltage = 7,
|
||||
.cal_type = TYPE_ONE_POINT_TRIMMING,
|
||||
|
@ -93,18 +86,14 @@ struct exynos_tmu_init_data const exynos4210_default_tmu_data = {
|
|||
#if defined(CONFIG_SOC_EXYNOS3250)
|
||||
static const struct exynos_tmu_registers exynos3250_tmu_registers = {
|
||||
.triminfo_data = EXYNOS_TMU_REG_TRIMINFO,
|
||||
.triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT,
|
||||
.triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT,
|
||||
.triminfo_ctrl[0] = EXYNOS_TMU_TRIMINFO_CON1,
|
||||
.triminfo_ctrl[1] = EXYNOS_TMU_TRIMINFO_CON2,
|
||||
.triminfo_ctrl_count = 2,
|
||||
.tmu_ctrl = EXYNOS_TMU_REG_CONTROL,
|
||||
.test_mux_addr_shift = EXYNOS4412_MUX_ADDR_SHIFT,
|
||||
.buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT,
|
||||
.buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK,
|
||||
.therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT,
|
||||
.therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK,
|
||||
.therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT,
|
||||
.buf_slope_sel_shift = EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT,
|
||||
.buf_slope_sel_mask = EXYNOS_TMU_BUF_SLOPE_SEL_MASK,
|
||||
.core_en_shift = EXYNOS_TMU_CORE_EN_SHIFT,
|
||||
.tmu_status = EXYNOS_TMU_REG_STATUS,
|
||||
.tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP,
|
||||
.threshold_th0 = EXYNOS_THD_TEMP_RISE,
|
||||
|
@ -116,14 +105,9 @@ static const struct exynos_tmu_registers exynos3250_tmu_registers = {
|
|||
.inten_fall0_shift = EXYNOS_TMU_INTEN_FALL0_SHIFT,
|
||||
.tmu_intstat = EXYNOS_TMU_REG_INTSTAT,
|
||||
.tmu_intclear = EXYNOS_TMU_REG_INTCLEAR,
|
||||
.intclr_fall_shift = EXYNOS_TMU_CLEAR_FALL_INT_SHIFT,
|
||||
.intclr_rise_shift = EXYNOS_TMU_RISE_INT_SHIFT,
|
||||
.intclr_rise_mask = EXYNOS_TMU_RISE_INT_MASK,
|
||||
.intclr_fall_mask = EXYNOS_TMU_FALL_INT_MASK,
|
||||
.emul_con = EXYNOS_EMUL_CON,
|
||||
.emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT,
|
||||
.emul_time_shift = EXYNOS_EMUL_TIME_SHIFT,
|
||||
.emul_time_mask = EXYNOS_EMUL_TIME_MASK,
|
||||
};
|
||||
|
||||
#define EXYNOS3250_TMU_DATA \
|
||||
|
@ -141,6 +125,7 @@ static const struct exynos_tmu_registers exynos3250_tmu_registers = {
|
|||
.trigger_type[2] = SW_TRIP, \
|
||||
.trigger_type[3] = HW_TRIP, \
|
||||
.max_trigger_level = 4, \
|
||||
.non_hw_trigger_levels = 3, \
|
||||
.gain = 8, \
|
||||
.reference_voltage = 16, \
|
||||
.noise_cancel_mode = 4, \
|
||||
|
@ -160,8 +145,10 @@ static const struct exynos_tmu_registers exynos3250_tmu_registers = {
|
|||
.temp_level = 95, \
|
||||
}, \
|
||||
.freq_tab_count = 2, \
|
||||
.triminfo_reload[0] = EXYNOS_TRIMINFO_RELOAD_ENABLE, \
|
||||
.triminfo_reload[1] = EXYNOS_TRIMINFO_RELOAD_ENABLE, \
|
||||
.registers = &exynos3250_tmu_registers, \
|
||||
.features = (TMU_SUPPORT_EMULATION | \
|
||||
.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
|
||||
TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
|
||||
TMU_SUPPORT_EMUL_TIME)
|
||||
#endif
|
||||
|
@ -182,20 +169,13 @@ struct exynos_tmu_init_data const exynos3250_default_tmu_data = {
|
|||
#if defined(CONFIG_SOC_EXYNOS4412) || defined(CONFIG_SOC_EXYNOS5250)
|
||||
static const struct exynos_tmu_registers exynos4412_tmu_registers = {
|
||||
.triminfo_data = EXYNOS_TMU_REG_TRIMINFO,
|
||||
.triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT,
|
||||
.triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT,
|
||||
.triminfo_ctrl = EXYNOS_TMU_TRIMINFO_CON,
|
||||
.triminfo_reload_shift = EXYNOS_TRIMINFO_RELOAD_SHIFT,
|
||||
.triminfo_ctrl[0] = EXYNOS_TMU_TRIMINFO_CON2,
|
||||
.triminfo_ctrl_count = 1,
|
||||
.tmu_ctrl = EXYNOS_TMU_REG_CONTROL,
|
||||
.test_mux_addr_shift = EXYNOS4412_MUX_ADDR_SHIFT,
|
||||
.buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT,
|
||||
.buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK,
|
||||
.therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT,
|
||||
.therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK,
|
||||
.therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT,
|
||||
.buf_slope_sel_shift = EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT,
|
||||
.buf_slope_sel_mask = EXYNOS_TMU_BUF_SLOPE_SEL_MASK,
|
||||
.core_en_shift = EXYNOS_TMU_CORE_EN_SHIFT,
|
||||
.tmu_status = EXYNOS_TMU_REG_STATUS,
|
||||
.tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP,
|
||||
.threshold_th0 = EXYNOS_THD_TEMP_RISE,
|
||||
|
@ -208,14 +188,9 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
|
|||
.inten_fall0_shift = EXYNOS_TMU_INTEN_FALL0_SHIFT,
|
||||
.tmu_intstat = EXYNOS_TMU_REG_INTSTAT,
|
||||
.tmu_intclear = EXYNOS_TMU_REG_INTCLEAR,
|
||||
.intclr_fall_shift = EXYNOS_TMU_CLEAR_FALL_INT_SHIFT,
|
||||
.intclr_rise_shift = EXYNOS_TMU_RISE_INT_SHIFT,
|
||||
.intclr_rise_mask = EXYNOS_TMU_RISE_INT_MASK,
|
||||
.intclr_fall_mask = EXYNOS_TMU_FALL_INT_MASK,
|
||||
.emul_con = EXYNOS_EMUL_CON,
|
||||
.emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT,
|
||||
.emul_time_shift = EXYNOS_EMUL_TIME_SHIFT,
|
||||
.emul_time_mask = EXYNOS_EMUL_TIME_MASK,
|
||||
};
|
||||
|
||||
#define EXYNOS4412_TMU_DATA \
|
||||
|
@ -233,6 +208,7 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
|
|||
.trigger_type[2] = SW_TRIP, \
|
||||
.trigger_type[3] = HW_TRIP, \
|
||||
.max_trigger_level = 4, \
|
||||
.non_hw_trigger_levels = 3, \
|
||||
.gain = 8, \
|
||||
.reference_voltage = 16, \
|
||||
.noise_cancel_mode = 4, \
|
||||
|
@ -252,6 +228,7 @@ static const struct exynos_tmu_registers exynos4412_tmu_registers = {
|
|||
.temp_level = 95, \
|
||||
}, \
|
||||
.freq_tab_count = 2, \
|
||||
.triminfo_reload[0] = EXYNOS_TRIMINFO_RELOAD_ENABLE, \
|
||||
.registers = &exynos4412_tmu_registers, \
|
||||
.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
|
||||
TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
|
||||
|
@ -286,18 +263,11 @@ struct exynos_tmu_init_data const exynos5250_default_tmu_data = {
|
|||
#if defined(CONFIG_SOC_EXYNOS5260)
|
||||
static const struct exynos_tmu_registers exynos5260_tmu_registers = {
|
||||
.triminfo_data = EXYNOS_TMU_REG_TRIMINFO,
|
||||
.triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT,
|
||||
.triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT,
|
||||
.tmu_ctrl = EXYNOS_TMU_REG_CONTROL,
|
||||
.tmu_ctrl = EXYNOS_TMU_REG_CONTROL1,
|
||||
.buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT,
|
||||
.buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK,
|
||||
.therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT,
|
||||
.therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK,
|
||||
.therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT,
|
||||
.buf_slope_sel_shift = EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT,
|
||||
.buf_slope_sel_mask = EXYNOS_TMU_BUF_SLOPE_SEL_MASK,
|
||||
.core_en_shift = EXYNOS_TMU_CORE_EN_SHIFT,
|
||||
.tmu_status = EXYNOS_TMU_REG_STATUS,
|
||||
.tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP,
|
||||
.threshold_th0 = EXYNOS_THD_TEMP_RISE,
|
||||
|
@ -310,14 +280,9 @@ static const struct exynos_tmu_registers exynos5260_tmu_registers = {
|
|||
.inten_fall0_shift = EXYNOS_TMU_INTEN_FALL0_SHIFT,
|
||||
.tmu_intstat = EXYNOS5260_TMU_REG_INTSTAT,
|
||||
.tmu_intclear = EXYNOS5260_TMU_REG_INTCLEAR,
|
||||
.intclr_fall_shift = EXYNOS5420_TMU_CLEAR_FALL_INT_SHIFT,
|
||||
.intclr_rise_shift = EXYNOS_TMU_RISE_INT_SHIFT,
|
||||
.intclr_rise_mask = EXYNOS5260_TMU_RISE_INT_MASK,
|
||||
.intclr_fall_mask = EXYNOS5260_TMU_FALL_INT_MASK,
|
||||
.emul_con = EXYNOS5260_EMUL_CON,
|
||||
.emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT,
|
||||
.emul_time_shift = EXYNOS_EMUL_TIME_SHIFT,
|
||||
.emul_time_mask = EXYNOS_EMUL_TIME_MASK,
|
||||
};
|
||||
|
||||
#define __EXYNOS5260_TMU_DATA \
|
||||
|
@ -335,6 +300,7 @@ static const struct exynos_tmu_registers exynos5260_tmu_registers = {
|
|||
.trigger_type[2] = SW_TRIP, \
|
||||
.trigger_type[3] = HW_TRIP, \
|
||||
.max_trigger_level = 4, \
|
||||
.non_hw_trigger_levels = 3, \
|
||||
.gain = 8, \
|
||||
.reference_voltage = 16, \
|
||||
.noise_cancel_mode = 4, \
|
||||
|
@ -359,9 +325,8 @@ static const struct exynos_tmu_registers exynos5260_tmu_registers = {
|
|||
#define EXYNOS5260_TMU_DATA \
|
||||
__EXYNOS5260_TMU_DATA \
|
||||
.type = SOC_ARCH_EXYNOS5260, \
|
||||
.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
|
||||
TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
|
||||
TMU_SUPPORT_EMUL_TIME)
|
||||
.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_FALLING_TRIP | \
|
||||
TMU_SUPPORT_READY_STATUS | TMU_SUPPORT_EMUL_TIME)
|
||||
|
||||
struct exynos_tmu_init_data const exynos5260_default_tmu_data = {
|
||||
.tmu_data = {
|
||||
|
@ -378,17 +343,10 @@ struct exynos_tmu_init_data const exynos5260_default_tmu_data = {
|
|||
#if defined(CONFIG_SOC_EXYNOS5420)
|
||||
static const struct exynos_tmu_registers exynos5420_tmu_registers = {
|
||||
.triminfo_data = EXYNOS_TMU_REG_TRIMINFO,
|
||||
.triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT,
|
||||
.triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT,
|
||||
.tmu_ctrl = EXYNOS_TMU_REG_CONTROL,
|
||||
.buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT,
|
||||
.buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK,
|
||||
.therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT,
|
||||
.therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK,
|
||||
.therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT,
|
||||
.buf_slope_sel_shift = EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT,
|
||||
.buf_slope_sel_mask = EXYNOS_TMU_BUF_SLOPE_SEL_MASK,
|
||||
.core_en_shift = EXYNOS_TMU_CORE_EN_SHIFT,
|
||||
.tmu_status = EXYNOS_TMU_REG_STATUS,
|
||||
.tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP,
|
||||
.threshold_th0 = EXYNOS_THD_TEMP_RISE,
|
||||
|
@ -402,14 +360,9 @@ static const struct exynos_tmu_registers exynos5420_tmu_registers = {
|
|||
.inten_fall0_shift = EXYNOS_TMU_INTEN_FALL0_SHIFT,
|
||||
.tmu_intstat = EXYNOS_TMU_REG_INTSTAT,
|
||||
.tmu_intclear = EXYNOS_TMU_REG_INTCLEAR,
|
||||
.intclr_fall_shift = EXYNOS5420_TMU_CLEAR_FALL_INT_SHIFT,
|
||||
.intclr_rise_shift = EXYNOS_TMU_RISE_INT_SHIFT,
|
||||
.intclr_rise_mask = EXYNOS_TMU_RISE_INT_MASK,
|
||||
.intclr_fall_mask = EXYNOS_TMU_FALL_INT_MASK,
|
||||
.emul_con = EXYNOS_EMUL_CON,
|
||||
.emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT,
|
||||
.emul_time_shift = EXYNOS_EMUL_TIME_SHIFT,
|
||||
.emul_time_mask = EXYNOS_EMUL_TIME_MASK,
|
||||
};
|
||||
|
||||
#define __EXYNOS5420_TMU_DATA \
|
||||
|
@ -427,6 +380,7 @@ static const struct exynos_tmu_registers exynos5420_tmu_registers = {
|
|||
.trigger_type[2] = SW_TRIP, \
|
||||
.trigger_type[3] = HW_TRIP, \
|
||||
.max_trigger_level = 4, \
|
||||
.non_hw_trigger_levels = 3, \
|
||||
.gain = 8, \
|
||||
.reference_voltage = 16, \
|
||||
.noise_cancel_mode = 4, \
|
||||
|
@ -451,16 +405,15 @@ static const struct exynos_tmu_registers exynos5420_tmu_registers = {
|
|||
#define EXYNOS5420_TMU_DATA \
|
||||
__EXYNOS5420_TMU_DATA \
|
||||
.type = SOC_ARCH_EXYNOS5250, \
|
||||
.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
|
||||
TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
|
||||
TMU_SUPPORT_EMUL_TIME)
|
||||
.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_FALLING_TRIP | \
|
||||
TMU_SUPPORT_READY_STATUS | TMU_SUPPORT_EMUL_TIME)
|
||||
|
||||
#define EXYNOS5420_TMU_DATA_SHARED \
|
||||
__EXYNOS5420_TMU_DATA \
|
||||
.type = SOC_ARCH_EXYNOS5420_TRIMINFO, \
|
||||
.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_TRIM_RELOAD | \
|
||||
TMU_SUPPORT_FALLING_TRIP | TMU_SUPPORT_READY_STATUS | \
|
||||
TMU_SUPPORT_EMUL_TIME | TMU_SUPPORT_ADDRESS_MULTIPLE)
|
||||
.features = (TMU_SUPPORT_EMULATION | TMU_SUPPORT_FALLING_TRIP | \
|
||||
TMU_SUPPORT_READY_STATUS | TMU_SUPPORT_EMUL_TIME | \
|
||||
TMU_SUPPORT_ADDRESS_MULTIPLE)
|
||||
|
||||
struct exynos_tmu_init_data const exynos5420_default_tmu_data = {
|
||||
.tmu_data = {
|
||||
|
@ -477,19 +430,10 @@ struct exynos_tmu_init_data const exynos5420_default_tmu_data = {
|
|||
#if defined(CONFIG_SOC_EXYNOS5440)
|
||||
static const struct exynos_tmu_registers exynos5440_tmu_registers = {
|
||||
.triminfo_data = EXYNOS5440_TMU_S0_7_TRIM,
|
||||
.triminfo_25_shift = EXYNOS_TRIMINFO_25_SHIFT,
|
||||
.triminfo_85_shift = EXYNOS_TRIMINFO_85_SHIFT,
|
||||
.tmu_ctrl = EXYNOS5440_TMU_S0_7_CTRL,
|
||||
.buf_vref_sel_shift = EXYNOS_TMU_REF_VOLTAGE_SHIFT,
|
||||
.buf_vref_sel_mask = EXYNOS_TMU_REF_VOLTAGE_MASK,
|
||||
.therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT,
|
||||
.therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK,
|
||||
.therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT,
|
||||
.buf_slope_sel_shift = EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT,
|
||||
.buf_slope_sel_mask = EXYNOS_TMU_BUF_SLOPE_SEL_MASK,
|
||||
.calib_mode_shift = EXYNOS_TMU_CALIB_MODE_SHIFT,
|
||||
.calib_mode_mask = EXYNOS_TMU_CALIB_MODE_MASK,
|
||||
.core_en_shift = EXYNOS_TMU_CORE_EN_SHIFT,
|
||||
.tmu_status = EXYNOS5440_TMU_S0_7_STATUS,
|
||||
.tmu_cur_temp = EXYNOS5440_TMU_S0_7_TEMP,
|
||||
.threshold_th0 = EXYNOS5440_TMU_S0_7_TH0,
|
||||
|
@ -504,10 +448,6 @@ static const struct exynos_tmu_registers exynos5440_tmu_registers = {
|
|||
.inten_fall0_shift = EXYNOS5440_TMU_INTEN_FALL0_SHIFT,
|
||||
.tmu_intstat = EXYNOS5440_TMU_S0_7_IRQ,
|
||||
.tmu_intclear = EXYNOS5440_TMU_S0_7_IRQ,
|
||||
.intclr_fall_shift = EXYNOS5440_TMU_CLEAR_FALL_INT_SHIFT,
|
||||
.intclr_rise_shift = EXYNOS5440_TMU_RISE_INT_SHIFT,
|
||||
.intclr_rise_mask = EXYNOS5440_TMU_RISE_INT_MASK,
|
||||
.intclr_fall_mask = EXYNOS5440_TMU_FALL_INT_MASK,
|
||||
.tmu_irqstatus = EXYNOS5440_TMU_IRQ_STATUS,
|
||||
.emul_con = EXYNOS5440_TMU_S0_7_DEBUG,
|
||||
.emul_temp_shift = EXYNOS_EMUL_DATA_SHIFT,
|
||||
|
@ -521,11 +461,11 @@ static const struct exynos_tmu_registers exynos5440_tmu_registers = {
|
|||
.trigger_type[0] = SW_TRIP, \
|
||||
.trigger_type[4] = HW_TRIP, \
|
||||
.max_trigger_level = 5, \
|
||||
.non_hw_trigger_levels = 1, \
|
||||
.gain = 5, \
|
||||
.reference_voltage = 16, \
|
||||
.noise_cancel_mode = 4, \
|
||||
.cal_type = TYPE_ONE_POINT_TRIMMING, \
|
||||
.cal_mode = 0, \
|
||||
.efuse_value = 0x5b2d, \
|
||||
.min_efuse_value = 16, \
|
||||
.max_efuse_value = 76, \
|
||||
|
|
|
@ -39,55 +39,31 @@
|
|||
#define EXYNOS_TMU_BUF_SLOPE_SEL_SHIFT 8
|
||||
#define EXYNOS_TMU_CORE_EN_SHIFT 0
|
||||
|
||||
/* Exynos3250 specific registers */
|
||||
#define EXYNOS_TMU_TRIMINFO_CON1 0x10
|
||||
|
||||
/* Exynos4210 specific registers */
|
||||
#define EXYNOS4210_TMU_REG_THRESHOLD_TEMP 0x44
|
||||
#define EXYNOS4210_TMU_REG_TRIG_LEVEL0 0x50
|
||||
#define EXYNOS4210_TMU_REG_TRIG_LEVEL1 0x54
|
||||
#define EXYNOS4210_TMU_REG_TRIG_LEVEL2 0x58
|
||||
#define EXYNOS4210_TMU_REG_TRIG_LEVEL3 0x5C
|
||||
#define EXYNOS4210_TMU_REG_PAST_TEMP0 0x60
|
||||
#define EXYNOS4210_TMU_REG_PAST_TEMP1 0x64
|
||||
#define EXYNOS4210_TMU_REG_PAST_TEMP2 0x68
|
||||
#define EXYNOS4210_TMU_REG_PAST_TEMP3 0x6C
|
||||
|
||||
#define EXYNOS4210_TMU_TRIG_LEVEL0_MASK 0x1
|
||||
#define EXYNOS4210_TMU_TRIG_LEVEL1_MASK 0x10
|
||||
#define EXYNOS4210_TMU_TRIG_LEVEL2_MASK 0x100
|
||||
#define EXYNOS4210_TMU_TRIG_LEVEL3_MASK 0x1000
|
||||
#define EXYNOS4210_TMU_TRIG_LEVEL_MASK 0x1111
|
||||
#define EXYNOS4210_TMU_INTCLEAR_VAL 0x1111
|
||||
|
||||
/* Exynos5250 and Exynos4412 specific registers */
|
||||
#define EXYNOS_TMU_TRIMINFO_CON 0x14
|
||||
/* Exynos5250, Exynos4412, Exynos3250 specific registers */
|
||||
#define EXYNOS_TMU_TRIMINFO_CON2 0x14
|
||||
#define EXYNOS_THD_TEMP_RISE 0x50
|
||||
#define EXYNOS_THD_TEMP_FALL 0x54
|
||||
#define EXYNOS_EMUL_CON 0x80
|
||||
|
||||
#define EXYNOS_TRIMINFO_RELOAD_SHIFT 1
|
||||
#define EXYNOS_TRIMINFO_RELOAD_ENABLE 1
|
||||
#define EXYNOS_TRIMINFO_25_SHIFT 0
|
||||
#define EXYNOS_TRIMINFO_85_SHIFT 8
|
||||
#define EXYNOS_TMU_RISE_INT_MASK 0x111
|
||||
#define EXYNOS_TMU_RISE_INT_SHIFT 0
|
||||
#define EXYNOS_TMU_FALL_INT_MASK 0x111
|
||||
#define EXYNOS_TMU_CLEAR_RISE_INT 0x111
|
||||
#define EXYNOS_TMU_CLEAR_FALL_INT (0x111 << 12)
|
||||
#define EXYNOS_TMU_CLEAR_FALL_INT_SHIFT 12
|
||||
#define EXYNOS5420_TMU_CLEAR_FALL_INT_SHIFT 16
|
||||
#define EXYNOS5440_TMU_CLEAR_FALL_INT_SHIFT 4
|
||||
#define EXYNOS_TMU_TRIP_MODE_SHIFT 13
|
||||
#define EXYNOS_TMU_TRIP_MODE_MASK 0x7
|
||||
#define EXYNOS_TMU_THERM_TRIP_EN_SHIFT 12
|
||||
#define EXYNOS_TMU_CALIB_MODE_SHIFT 4
|
||||
#define EXYNOS_TMU_CALIB_MODE_MASK 0x3
|
||||
|
||||
#define EXYNOS_TMU_INTEN_RISE0_SHIFT 0
|
||||
#define EXYNOS_TMU_INTEN_RISE1_SHIFT 4
|
||||
#define EXYNOS_TMU_INTEN_RISE2_SHIFT 8
|
||||
#define EXYNOS_TMU_INTEN_RISE3_SHIFT 12
|
||||
#define EXYNOS_TMU_INTEN_FALL0_SHIFT 16
|
||||
#define EXYNOS_TMU_INTEN_FALL1_SHIFT 20
|
||||
#define EXYNOS_TMU_INTEN_FALL2_SHIFT 24
|
||||
#define EXYNOS_TMU_INTEN_FALL3_SHIFT 28
|
||||
|
||||
#define EXYNOS_EMUL_TIME 0x57F0
|
||||
#define EXYNOS_EMUL_TIME_MASK 0xffff
|
||||
|
@ -103,10 +79,6 @@
|
|||
#define EXYNOS5260_TMU_REG_INTEN 0xC0
|
||||
#define EXYNOS5260_TMU_REG_INTSTAT 0xC4
|
||||
#define EXYNOS5260_TMU_REG_INTCLEAR 0xC8
|
||||
#define EXYNOS5260_TMU_CLEAR_RISE_INT 0x1111
|
||||
#define EXYNOS5260_TMU_CLEAR_FALL_INT (0x1111 << 16)
|
||||
#define EXYNOS5260_TMU_RISE_INT_MASK 0x1111
|
||||
#define EXYNOS5260_TMU_FALL_INT_MASK 0x1111
|
||||
#define EXYNOS5260_EMUL_CON 0x100
|
||||
|
||||
/* Exynos4412 specific */
|
||||
|
@ -122,29 +94,17 @@
|
|||
#define EXYNOS5440_TMU_S0_7_TH0 0x110
|
||||
#define EXYNOS5440_TMU_S0_7_TH1 0x130
|
||||
#define EXYNOS5440_TMU_S0_7_TH2 0x150
|
||||
#define EXYNOS5440_TMU_S0_7_EVTEN 0x1F0
|
||||
#define EXYNOS5440_TMU_S0_7_IRQEN 0x210
|
||||
#define EXYNOS5440_TMU_S0_7_IRQ 0x230
|
||||
/* exynos5440 common registers */
|
||||
#define EXYNOS5440_TMU_IRQ_STATUS 0x000
|
||||
#define EXYNOS5440_TMU_PMIN 0x004
|
||||
#define EXYNOS5440_TMU_TEMP 0x008
|
||||
|
||||
#define EXYNOS5440_TMU_RISE_INT_MASK 0xf
|
||||
#define EXYNOS5440_TMU_RISE_INT_SHIFT 0
|
||||
#define EXYNOS5440_TMU_FALL_INT_MASK 0xf
|
||||
#define EXYNOS5440_TMU_INTEN_RISE0_SHIFT 0
|
||||
#define EXYNOS5440_TMU_INTEN_RISE1_SHIFT 1
|
||||
#define EXYNOS5440_TMU_INTEN_RISE2_SHIFT 2
|
||||
#define EXYNOS5440_TMU_INTEN_RISE3_SHIFT 3
|
||||
#define EXYNOS5440_TMU_INTEN_FALL0_SHIFT 4
|
||||
#define EXYNOS5440_TMU_INTEN_FALL1_SHIFT 5
|
||||
#define EXYNOS5440_TMU_INTEN_FALL2_SHIFT 6
|
||||
#define EXYNOS5440_TMU_INTEN_FALL3_SHIFT 7
|
||||
#define EXYNOS5440_TMU_TH_RISE0_SHIFT 0
|
||||
#define EXYNOS5440_TMU_TH_RISE1_SHIFT 8
|
||||
#define EXYNOS5440_TMU_TH_RISE2_SHIFT 16
|
||||
#define EXYNOS5440_TMU_TH_RISE3_SHIFT 24
|
||||
#define EXYNOS5440_TMU_TH_RISE4_SHIFT 24
|
||||
#define EXYNOS5440_EFUSE_SWAP_OFFSET 8
|
||||
|
||||
|
|
|
@ -1575,8 +1575,7 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
|
|||
|
||||
thermal_zone_device_update(tz);
|
||||
|
||||
if (!result)
|
||||
return tz;
|
||||
return tz;
|
||||
|
||||
unregister:
|
||||
release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id);
|
||||
|
|
Loading…
Reference in a new issue