thermal_zone_device_register
#include
struct thermal_zone_device*
thermal_zone_device_register(
const char *type,
int trips,
int mask,
void *devdata,
struct thermal_zone_device_ops *ops,
struct thermal_zone_params *tzp,
int polling_delay)
* @type: tz设备类型,用来标识不同tz的字符串
* @trips: tz设备支持的触发点个数
* @mask: 要求mask 小于trips个数,一般为0
* @devdata: 设备私有数据
* @ops: tz设备回调函数,trip num大于0 的情况下,ops 中get_trip_type 和 get_trip_temp 必须不为null
* @tzp: tz的特殊参数,可以用于标识控制策略等
* @passive_delay: passive cooling模式间隔ms数,一般设置为0
* @polling_delay: 出发点检测间隔ms数
* 不需要这个tz设备的时候需要调用thermal_zone_device_unregister()来注销
* passive cooling 取决于 the .get_trend()函数的返回值
* 返回一个指向thermal_zone设备的指针,需要使用IS_ERR来判断返回值
if (IS_ERR(thermal)) {
dev_err(&pdev->dev,
"Failed to register thermal zone device\n");
return PTR_ERR(thermal);
}
thermal_cooling_device_register
#include
struct thermal_cooling_device *
thermal_cooling_device_register(char *type, void *devdata,
const struct thermal_cooling_device_ops *ops)
{
return __thermal_cooling_device_register(NULL, type, devdata, ops);
}
EXPORT_SYMBOL_GPL(thermal_cooling_device_register);
实际调用的函数是:__thermal_cooling_device_register
static struct thermal_cooling_device *
__thermal_cooling_device_register(
struct device_node *np,
char *type,
void *devdata,
const struct thermal_cooling_device_ops *ops)
@np: 指向设备数节点的指针
@type: cooling device的设备类型
@devdata: 设备私有数据
@ops: 设备操作的回调函数,ops必须定义并且必须至少包含 get_max_state,get_cur_state,set_cur_state方法
cdev = thermal_cooling_device_register("xxxx", NULL, &xxx_cooling_ops);
if (IS_ERR(cdev)) {
retval = PTR_ERR(cdev);
goto err1;
}
在thermal zone 和 cool device 设备注册的时候会分别调用bind_tz(tz)和bind_cdev(cdev) 进行绑定
这样就可以保证无论两个设备的注册顺序如何都不会出现绑定不成功的意外
绑定规则如下: