thermal: sun8i: rework for ths calibrate func
Here, we do something to prepare for the subsequent support of multiple platforms. 1) rename sun50i_ths_calibrate to sun8i_ths_calibrate, because this function should be suitable for all platforms now. 2) introduce calibrate callback to mask calibration method differences. Signed-off-by: Yangtao Li <tiny.windzz@gmail.com>alistair/sunxi64-5.4-dsi
parent
0d3c9dfd38
commit
6f520a8b55
|
@ -60,6 +60,8 @@ struct ths_thermal_chip {
|
||||||
int scale;
|
int scale;
|
||||||
int ft_deviation;
|
int ft_deviation;
|
||||||
int temp_data_base;
|
int temp_data_base;
|
||||||
|
int (*calibrate)(struct ths_device *tmdev,
|
||||||
|
u16 *caldata, int callen);
|
||||||
int (*init)(struct ths_device *tmdev);
|
int (*init)(struct ths_device *tmdev);
|
||||||
int (*irq_ack)(struct ths_device *tmdev);
|
int (*irq_ack)(struct ths_device *tmdev);
|
||||||
};
|
};
|
||||||
|
@ -152,45 +154,14 @@ static irqreturn_t sun8i_irq_thread(int irq, void *data)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sun50i_ths_calibrate(struct ths_device *tmdev)
|
static int sun50i_h6_ths_calibrate(struct ths_device *tmdev,
|
||||||
|
u16 *caldata, int callen)
|
||||||
{
|
{
|
||||||
struct nvmem_cell *calcell;
|
|
||||||
struct device *dev = tmdev->dev;
|
struct device *dev = tmdev->dev;
|
||||||
u16 *caldata;
|
int i, ft_temp;
|
||||||
size_t callen;
|
|
||||||
int ft_temp;
|
|
||||||
int i, ret = 0;
|
|
||||||
|
|
||||||
calcell = devm_nvmem_cell_get(dev, "calib");
|
if (!caldata[0] || callen < 2 + 2 * tmdev->chip->sensor_num)
|
||||||
if (IS_ERR(calcell)) {
|
return -EINVAL;
|
||||||
if (PTR_ERR(calcell) == -EPROBE_DEFER)
|
|
||||||
return -EPROBE_DEFER;
|
|
||||||
/*
|
|
||||||
* Even if the external calibration data stored in sid is
|
|
||||||
* not accessible, the THS hardware can still work, although
|
|
||||||
* the data won't be so accurate.
|
|
||||||
*
|
|
||||||
* The default value of calibration register is 0x800 for
|
|
||||||
* every sensor, and the calibration value is usually 0x7xx
|
|
||||||
* or 0x8xx, so they won't be away from the default value
|
|
||||||
* for a lot.
|
|
||||||
*
|
|
||||||
* So here we do not return error if the calibartion data is
|
|
||||||
* not available, except the probe needs deferring.
|
|
||||||
*/
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
caldata = nvmem_cell_read(calcell, &callen);
|
|
||||||
if (IS_ERR(caldata)) {
|
|
||||||
ret = PTR_ERR(caldata);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!caldata[0] || callen < 2 + 2 * tmdev->chip->sensor_num) {
|
|
||||||
ret = -EINVAL;
|
|
||||||
goto out_free;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* efuse layout:
|
* efuse layout:
|
||||||
|
@ -251,7 +222,45 @@ static int sun50i_ths_calibrate(struct ths_device *tmdev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out_free:
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sun8i_ths_calibrate(struct ths_device *tmdev)
|
||||||
|
{
|
||||||
|
struct nvmem_cell *calcell;
|
||||||
|
struct device *dev = tmdev->dev;
|
||||||
|
u16 *caldata;
|
||||||
|
size_t callen;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
calcell = devm_nvmem_cell_get(dev, "calib");
|
||||||
|
if (IS_ERR(calcell)) {
|
||||||
|
if (PTR_ERR(calcell) == -EPROBE_DEFER)
|
||||||
|
return -EPROBE_DEFER;
|
||||||
|
/*
|
||||||
|
* Even if the external calibration data stored in sid is
|
||||||
|
* not accessible, the THS hardware can still work, although
|
||||||
|
* the data won't be so accurate.
|
||||||
|
*
|
||||||
|
* The default value of calibration register is 0x800 for
|
||||||
|
* every sensor, and the calibration value is usually 0x7xx
|
||||||
|
* or 0x8xx, so they won't be away from the default value
|
||||||
|
* for a lot.
|
||||||
|
*
|
||||||
|
* So here we do not return error if the calibartion data is
|
||||||
|
* not available, except the probe needs deferring.
|
||||||
|
*/
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
caldata = nvmem_cell_read(calcell, &callen);
|
||||||
|
if (IS_ERR(caldata)) {
|
||||||
|
ret = PTR_ERR(caldata);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmdev->chip->calibrate(tmdev, caldata, callen);
|
||||||
|
|
||||||
kfree(caldata);
|
kfree(caldata);
|
||||||
out:
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -300,7 +309,7 @@ static int sun8i_ths_resource_init(struct ths_device *tmdev)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto bus_disable;
|
goto bus_disable;
|
||||||
|
|
||||||
ret = sun50i_ths_calibrate(tmdev);
|
ret = sun8i_ths_calibrate(tmdev);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto ahb_disable;
|
goto ahb_disable;
|
||||||
|
|
||||||
|
@ -428,6 +437,7 @@ static const struct ths_thermal_chip sun50i_h6_ths = {
|
||||||
.scale = -67,
|
.scale = -67,
|
||||||
.ft_deviation = SUN50I_H6_FT_DEVIATION,
|
.ft_deviation = SUN50I_H6_FT_DEVIATION,
|
||||||
.temp_data_base = SUN50I_H6_THS_TEMP_DATA,
|
.temp_data_base = SUN50I_H6_THS_TEMP_DATA,
|
||||||
|
.calibrate = sun50i_h6_ths_calibrate,
|
||||||
.init = sun50i_thermal_init,
|
.init = sun50i_thermal_init,
|
||||||
.irq_ack = sun50i_h6_irq_ack,
|
.irq_ack = sun50i_h6_irq_ack,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue