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 ft_deviation;
|
||||
int temp_data_base;
|
||||
int (*calibrate)(struct ths_device *tmdev,
|
||||
u16 *caldata, int callen);
|
||||
int (*init)(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;
|
||||
}
|
||||
|
||||
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;
|
||||
u16 *caldata;
|
||||
size_t callen;
|
||||
int ft_temp;
|
||||
int i, ret = 0;
|
||||
int i, ft_temp;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if (!caldata[0] || callen < 2 + 2 * tmdev->chip->sensor_num) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
if (!caldata[0] || callen < 2 + 2 * tmdev->chip->sensor_num)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* 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);
|
||||
out:
|
||||
return ret;
|
||||
|
@ -300,7 +309,7 @@ static int sun8i_ths_resource_init(struct ths_device *tmdev)
|
|||
if (ret)
|
||||
goto bus_disable;
|
||||
|
||||
ret = sun50i_ths_calibrate(tmdev);
|
||||
ret = sun8i_ths_calibrate(tmdev);
|
||||
if (ret)
|
||||
goto ahb_disable;
|
||||
|
||||
|
@ -428,6 +437,7 @@ static const struct ths_thermal_chip sun50i_h6_ths = {
|
|||
.scale = -67,
|
||||
.ft_deviation = SUN50I_H6_FT_DEVIATION,
|
||||
.temp_data_base = SUN50I_H6_THS_TEMP_DATA,
|
||||
.calibrate = sun50i_h6_ths_calibrate,
|
||||
.init = sun50i_thermal_init,
|
||||
.irq_ack = sun50i_h6_irq_ack,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue