static int scmi_power_protocol_init(struct scmi_handle *handle) { int domain; u32 version; struct scmi_power_info *pinfo; scmi_version_get(handle, SCMI_PROTOCOL_POWER, &version); dev_dbg(handle->dev, "Power Version %d.%d\n", PROTOCOL_REV_MAJOR(version), PROTOCOL_REV_MINOR(version)); pinfo = devm_kzalloc(handle->dev, sizeof(*pinfo), GFP_KERNEL); if (!pinfo) return -ENOMEM; scmi_power_attributes_get(handle, pinfo); pinfo->dom_info = devm_kcalloc(handle->dev, pinfo->num_domains, sizeof(*pinfo->dom_info), GFP_KERNEL); if (!pinfo->dom_info) return -ENOMEM; for (domain = 0; domain < pinfo->num_domains; domain++) { struct power_dom_info *dom = pinfo->dom_info + domain; scmi_power_domain_attributes_get(handle, domain, dom); } handle->power_ops = &power_ops; handle->power_priv = pinfo; return 0; }
static int scmi_clock_protocol_init(struct scmi_handle *handle) { u32 version; int clkid, ret; struct clock_info *cinfo; scmi_version_get(handle, SCMI_PROTOCOL_CLOCK, &version); dev_dbg(handle->dev, "Clock Version %d.%d\n", PROTOCOL_REV_MAJOR(version), PROTOCOL_REV_MINOR(version)); cinfo = devm_kzalloc(handle->dev, sizeof(*cinfo), GFP_KERNEL); if (!cinfo) return -ENOMEM; scmi_clock_protocol_attributes_get(handle, cinfo); cinfo->clk = devm_kcalloc(handle->dev, cinfo->num_clocks, sizeof(*cinfo->clk), GFP_KERNEL); if (!cinfo->clk) return -ENOMEM; for (clkid = 0; clkid < cinfo->num_clocks; clkid++) { struct scmi_clock_info *clk = cinfo->clk + clkid; ret = scmi_clock_attributes_get(handle, clkid, clk); if (!ret) scmi_clock_describe_rates_get(handle, clkid, clk); } handle->clk_ops = &clk_ops; handle->clk_priv = cinfo; return 0; }
static int scmi_sensors_protocol_init(struct scmi_handle *handle) { u32 version; struct sensors_info *sinfo; scmi_version_get(handle, SCMI_PROTOCOL_SENSOR, &version); dev_dbg(handle->dev, "Sensor Version %d.%d\n", PROTOCOL_REV_MAJOR(version), PROTOCOL_REV_MINOR(version)); sinfo = devm_kzalloc(handle->dev, sizeof(*sinfo), GFP_KERNEL); if (!sinfo) return -ENOMEM; scmi_sensor_attributes_get(handle, sinfo); sinfo->sensors = devm_kcalloc(handle->dev, sinfo->num_sensors, sizeof(*sinfo->sensors), GFP_KERNEL); if (!sinfo->sensors) return -ENOMEM; scmi_sensor_description_get(handle, sinfo); handle->sensor_ops = &sensor_ops; handle->sensor_priv = sinfo; return 0; }