pd->num_sink_caps = device_property_read_u32_array(parent, "qcom,default-sink-caps", NULL, 0); if (pd->num_sink_caps > 0) { int i; u32 sink_caps[14]; if (pd->num_sink_caps % 2 || pd->num_sink_caps > 14) { ret = -EINVAL; usbpd_err(&pd->dev, "default-sink-caps must be be specified as voltage/current, max 7 pairs\n"); goto put_psy; } ret = device_property_read_u32_array(parent, "qcom,default-sink-caps", sink_caps, pd->num_sink_caps); if (ret) { usbpd_err(&pd->dev, "Error reading default-sink-caps\n"); goto put_psy; } pd->num_sink_caps /= 2; for (i = 0; i < pd->num_sink_caps; i++) { int v = sink_caps[i * 2] / 50; int c = sink_caps[i * 2 + 1] / 10; pd->sink_caps[i] = PD_SNK_PDO_FIXED(0, 0, 0, 0, 0, v, c); } /* First PDO includes additional capabilities */ pd->sink_caps[0] |= PD_SNK_PDO_FIXED(1, 0, 0, 1, 1, 0, 0); } else { memcpy(pd->sink_caps, default_snk_caps, sizeof(default_snk_caps)); pd->num_sink_caps = ARRAY_SIZE(default_snk_caps); }代码分析
时间: 2024-04-02 17:31:13 浏览: 111
这段代码的作用是从设备树中读取默认的sink capabilities(下沉能力),并将其转换为对应的PDO(Power Data Object)格式存储在pd->sink_caps数组中。
首先,代码通过调用device_property_read_u32_array函数读取"qcom,default-sink-caps"属性对应的整型数组,并将其存储在pd->num_sink_caps变量中。如果读取成功,且数组的长度大于0,则进入if语句中处理读取到的sink capabilities。
在if语句中,代码首先检查sink capabilities数组的长度是否为偶数且不超过14,如果不满足条件则返回-EINVAL错误码。然后,代码再次调用device_property_read_u32_array函数,将读取到的sink capabilities存储在sink_caps数组中。如果读取失败,则返回错误码并跳转到put_psy标签处处理。
接下来,代码将pd->num_sink_caps除以2得到sink capabilities的个数,并遍历数组中每一对voltage和current,将其转换为对应的PDO格式存储在pd->sink_caps数组中。
最后,代码为pd->sink_caps数组的第一个PDO设置了额外的capabilities(能力),并将pd->num_sink_caps设置为存储在数组中的PDO的个数。如果从设备树中没有读取到sink capabilities,则代码将默认的sink capabilities存储在pd->sink_caps数组中,并将pd->num_sink_caps设置为默认数组的长度。
阅读全文