Loading Documentation/devicetree/bindings/thermal/qti-qmi-sensor.txt +8 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,14 @@ Subsystem properties: 2. pa1 3. qfe_pa0 4. qfe_wtr0 5. modem_tsens 6. qfe_mmw0 7. qfe_mmw1 8. qfe_mmw2 9. qfe_mmw3 10. xo_therm 11. qfe_pa_mdm 12. qfe_pa_wtr Example: Loading drivers/thermal/qcom/qmi_sensors.c +115 −79 Original line number Diff line number Diff line Loading @@ -42,6 +42,14 @@ enum qmi_ts_sensor { QMI_TS_PA_1, QMI_TS_QFE_PA_0, QMI_TS_QFE_WTR_0, QMI_TS_MODEM_MODEM, QMI_TS_MMW_0, QMI_TS_MMW_1, QMI_TS_MMW_2, QMI_TS_MMW_3, QMI_TS_MODEM_SKIN, QMI_TS_QFE_PA_MDM, QMI_TS_QFE_PA_WTR, QMI_TS_MAX_NR }; Loading Loading @@ -69,6 +77,7 @@ struct qmi_ts_instance { }; static struct qmi_ts_instance *ts_instances; static int ts_inst_cnt; static atomic_t in_suspend; static char sensor_clients[QMI_TS_MAX_NR][QMI_CLIENT_NAME_LENGTH] = { Loading @@ -76,6 +85,14 @@ static char sensor_clients[QMI_TS_MAX_NR][QMI_CLIENT_NAME_LENGTH] = { {"pa_1"}, {"qfe_pa0"}, {"qfe_wtr0"}, {"modem_tsens"}, {"qfe_mmw0"}, {"qfe_mmw1"}, {"qfe_mmw2"}, {"qfe_mmw3"}, {"xo_therm"}, {"qfe_pa_mdm"}, {"qfe_pa_wtr"}, }; static int32_t encode_qmi(int32_t val) Loading Loading @@ -334,7 +351,7 @@ static int qmi_register_sensor_device(struct qmi_sensor *qmi_sens) qmi_sens->tz_dev = thermal_zone_of_sensor_register( qmi_sens->dev, qmi_sens->sens_type, qmi_sens->sens_type + qmi_sens->ts->inst_id, qmi_sens, &qmi_sensor_ops); if (IS_ERR(qmi_sens->tz_dev)) { ret = PTR_ERR(qmi_sens->tz_dev); Loading Loading @@ -496,9 +513,12 @@ static struct qmi_ops thermal_qmi_event_ops = { static void qmi_ts_cleanup(void) { struct qmi_ts_instance *ts = ts_instances; struct qmi_ts_instance *ts; struct qmi_sensor *qmi_sens, *c_next; int idx = 0; for (; idx < ts_inst_cnt; idx++) { ts = &ts_instances[idx]; mutex_lock(&ts->mutex); list_for_each_entry_safe(qmi_sens, c_next, &ts->ts_sensor_list, ts_node) { Loading @@ -513,42 +533,50 @@ static void qmi_ts_cleanup(void) mutex_unlock(&ts->mutex); } ts_inst_cnt = 0; } static int of_get_qmi_ts_platform_data(struct device *dev) { int ret = 0, i = 0; int ret = 0, i = 0, idx = 0; struct device_node *np = dev->of_node; struct device_node *subsys_np; struct qmi_ts_instance *ts; struct qmi_sensor *qmi_sens; int sens_name_max = 0, sens_idx = 0; int sens_name_max = 0, sens_idx = 0, subsys_cnt = 0; subsys_cnt = of_get_available_child_count(np); if (!subsys_cnt) { dev_err(dev, "No child node to process\n"); return -EFAULT; } ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL); ts = devm_kcalloc(dev, subsys_cnt, sizeof(*ts), GFP_KERNEL); if (!ts) return -ENOMEM; subsys_np = of_get_next_child(np, NULL); if (!subsys_np) { dev_err(dev, "No child node\n"); return -EINVAL; } for_each_available_child_of_node(np, subsys_np) { if (idx >= subsys_cnt) break; ret = of_property_read_u32(subsys_np, "qcom,instance-id", &ts->inst_id); &ts[idx].inst_id); if (ret) { dev_err(dev, "error reading qcom,insance-id. ret:%d\n", ret); dev_err(dev, "error reading qcom,insance-id. ret:%d\n", ret); goto data_fetch_err; } ts->dev = dev; mutex_init(&ts->mutex); INIT_LIST_HEAD(&ts->ts_sensor_list); INIT_WORK(&ts->svc_arrive_work, qmi_ts_svc_arrive); ts[idx].dev = dev; mutex_init(&ts[idx].mutex); INIT_LIST_HEAD(&ts[idx].ts_sensor_list); INIT_WORK(&ts[idx].svc_arrive_work, qmi_ts_svc_arrive); sens_name_max = of_property_count_strings(subsys_np, "qcom,qmi-sensor-names"); if (sens_name_max <= 0) { dev_err(dev, "Invalid or no sensor. err:%d\n", sens_name_max); dev_err(dev, "Invalid or no sensor. err:%d\n", sens_name_max); ret = -EINVAL; goto data_fetch_err; } Loading @@ -556,7 +584,8 @@ static int of_get_qmi_ts_platform_data(struct device *dev) for (sens_idx = 0; sens_idx < sens_name_max; sens_idx++) { const char *qmi_name; qmi_sens = devm_kzalloc(dev, sizeof(*qmi_sens), GFP_KERNEL); qmi_sens = devm_kzalloc(dev, sizeof(*qmi_sens), GFP_KERNEL); if (!qmi_sens) { ret = -ENOMEM; goto data_fetch_err; Loading @@ -569,7 +598,8 @@ static int of_get_qmi_ts_platform_data(struct device *dev) QMI_CLIENT_NAME_LENGTH); /* Check for supported qmi sensors */ for (i = 0; i < QMI_TS_MAX_NR; i++) { if (!strcmp(sensor_clients[i], qmi_sens->qmi_name)) if (!strcmp(sensor_clients[i], qmi_sens->qmi_name)) break; } Loading @@ -581,16 +611,19 @@ static int of_get_qmi_ts_platform_data(struct device *dev) } dev_dbg(dev, "QMI sensor:%s available\n", qmi_name); qmi_sens->sens_type = i; qmi_sens->ts = ts; qmi_sens->ts = &ts[idx]; qmi_sens->dev = dev; qmi_sens->last_reading = 0; qmi_sens->high_thresh = INT_MAX; qmi_sens->low_thresh = INT_MIN; INIT_WORK(&qmi_sens->therm_notify_work, qmi_ts_thresh_notify); list_add(&qmi_sens->ts_node, &ts->ts_sensor_list); list_add(&qmi_sens->ts_node, &ts[idx].ts_sensor_list); } idx++; } ts_instances = ts; ts_inst_cnt = subsys_cnt; data_fetch_err: of_node_put(subsys_np); Loading @@ -600,22 +633,24 @@ static int of_get_qmi_ts_platform_data(struct device *dev) static int qmi_sens_device_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; int ret = 0; int ret = 0, idx = 0; struct qmi_ts_instance *ts; ret = of_get_qmi_ts_platform_data(dev); if (ret) goto probe_err; if (!ts_instances) { if (!ts_instances || !ts_inst_cnt) { dev_err(dev, "Empty ts instances\n"); return -EINVAL; } ts = ts_instances; if (list_empty(&ts->ts_sensor_list)) for (; idx < ts_inst_cnt; idx++) { ts = &ts_instances[idx]; if (list_empty(&ts->ts_sensor_list)) { ret = -ENODEV; goto probe_err; } ret = qmi_handle_init(&ts->handle, TS_GET_SENSOR_LIST_RESP_MSG_V01_MAX_MSG_LEN, &thermal_qmi_event_ops, handlers); Loading @@ -631,6 +666,7 @@ static int qmi_sens_device_probe(struct platform_device *pdev) ts->inst_id, ret); goto probe_err; } } atomic_set(&in_suspend, 0); register_pm_notifier(&qmi_sensor_pm_nb); return 0; Loading Loading
Documentation/devicetree/bindings/thermal/qti-qmi-sensor.txt +8 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,14 @@ Subsystem properties: 2. pa1 3. qfe_pa0 4. qfe_wtr0 5. modem_tsens 6. qfe_mmw0 7. qfe_mmw1 8. qfe_mmw2 9. qfe_mmw3 10. xo_therm 11. qfe_pa_mdm 12. qfe_pa_wtr Example: Loading
drivers/thermal/qcom/qmi_sensors.c +115 −79 Original line number Diff line number Diff line Loading @@ -42,6 +42,14 @@ enum qmi_ts_sensor { QMI_TS_PA_1, QMI_TS_QFE_PA_0, QMI_TS_QFE_WTR_0, QMI_TS_MODEM_MODEM, QMI_TS_MMW_0, QMI_TS_MMW_1, QMI_TS_MMW_2, QMI_TS_MMW_3, QMI_TS_MODEM_SKIN, QMI_TS_QFE_PA_MDM, QMI_TS_QFE_PA_WTR, QMI_TS_MAX_NR }; Loading Loading @@ -69,6 +77,7 @@ struct qmi_ts_instance { }; static struct qmi_ts_instance *ts_instances; static int ts_inst_cnt; static atomic_t in_suspend; static char sensor_clients[QMI_TS_MAX_NR][QMI_CLIENT_NAME_LENGTH] = { Loading @@ -76,6 +85,14 @@ static char sensor_clients[QMI_TS_MAX_NR][QMI_CLIENT_NAME_LENGTH] = { {"pa_1"}, {"qfe_pa0"}, {"qfe_wtr0"}, {"modem_tsens"}, {"qfe_mmw0"}, {"qfe_mmw1"}, {"qfe_mmw2"}, {"qfe_mmw3"}, {"xo_therm"}, {"qfe_pa_mdm"}, {"qfe_pa_wtr"}, }; static int32_t encode_qmi(int32_t val) Loading Loading @@ -334,7 +351,7 @@ static int qmi_register_sensor_device(struct qmi_sensor *qmi_sens) qmi_sens->tz_dev = thermal_zone_of_sensor_register( qmi_sens->dev, qmi_sens->sens_type, qmi_sens->sens_type + qmi_sens->ts->inst_id, qmi_sens, &qmi_sensor_ops); if (IS_ERR(qmi_sens->tz_dev)) { ret = PTR_ERR(qmi_sens->tz_dev); Loading Loading @@ -496,9 +513,12 @@ static struct qmi_ops thermal_qmi_event_ops = { static void qmi_ts_cleanup(void) { struct qmi_ts_instance *ts = ts_instances; struct qmi_ts_instance *ts; struct qmi_sensor *qmi_sens, *c_next; int idx = 0; for (; idx < ts_inst_cnt; idx++) { ts = &ts_instances[idx]; mutex_lock(&ts->mutex); list_for_each_entry_safe(qmi_sens, c_next, &ts->ts_sensor_list, ts_node) { Loading @@ -513,42 +533,50 @@ static void qmi_ts_cleanup(void) mutex_unlock(&ts->mutex); } ts_inst_cnt = 0; } static int of_get_qmi_ts_platform_data(struct device *dev) { int ret = 0, i = 0; int ret = 0, i = 0, idx = 0; struct device_node *np = dev->of_node; struct device_node *subsys_np; struct qmi_ts_instance *ts; struct qmi_sensor *qmi_sens; int sens_name_max = 0, sens_idx = 0; int sens_name_max = 0, sens_idx = 0, subsys_cnt = 0; subsys_cnt = of_get_available_child_count(np); if (!subsys_cnt) { dev_err(dev, "No child node to process\n"); return -EFAULT; } ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL); ts = devm_kcalloc(dev, subsys_cnt, sizeof(*ts), GFP_KERNEL); if (!ts) return -ENOMEM; subsys_np = of_get_next_child(np, NULL); if (!subsys_np) { dev_err(dev, "No child node\n"); return -EINVAL; } for_each_available_child_of_node(np, subsys_np) { if (idx >= subsys_cnt) break; ret = of_property_read_u32(subsys_np, "qcom,instance-id", &ts->inst_id); &ts[idx].inst_id); if (ret) { dev_err(dev, "error reading qcom,insance-id. ret:%d\n", ret); dev_err(dev, "error reading qcom,insance-id. ret:%d\n", ret); goto data_fetch_err; } ts->dev = dev; mutex_init(&ts->mutex); INIT_LIST_HEAD(&ts->ts_sensor_list); INIT_WORK(&ts->svc_arrive_work, qmi_ts_svc_arrive); ts[idx].dev = dev; mutex_init(&ts[idx].mutex); INIT_LIST_HEAD(&ts[idx].ts_sensor_list); INIT_WORK(&ts[idx].svc_arrive_work, qmi_ts_svc_arrive); sens_name_max = of_property_count_strings(subsys_np, "qcom,qmi-sensor-names"); if (sens_name_max <= 0) { dev_err(dev, "Invalid or no sensor. err:%d\n", sens_name_max); dev_err(dev, "Invalid or no sensor. err:%d\n", sens_name_max); ret = -EINVAL; goto data_fetch_err; } Loading @@ -556,7 +584,8 @@ static int of_get_qmi_ts_platform_data(struct device *dev) for (sens_idx = 0; sens_idx < sens_name_max; sens_idx++) { const char *qmi_name; qmi_sens = devm_kzalloc(dev, sizeof(*qmi_sens), GFP_KERNEL); qmi_sens = devm_kzalloc(dev, sizeof(*qmi_sens), GFP_KERNEL); if (!qmi_sens) { ret = -ENOMEM; goto data_fetch_err; Loading @@ -569,7 +598,8 @@ static int of_get_qmi_ts_platform_data(struct device *dev) QMI_CLIENT_NAME_LENGTH); /* Check for supported qmi sensors */ for (i = 0; i < QMI_TS_MAX_NR; i++) { if (!strcmp(sensor_clients[i], qmi_sens->qmi_name)) if (!strcmp(sensor_clients[i], qmi_sens->qmi_name)) break; } Loading @@ -581,16 +611,19 @@ static int of_get_qmi_ts_platform_data(struct device *dev) } dev_dbg(dev, "QMI sensor:%s available\n", qmi_name); qmi_sens->sens_type = i; qmi_sens->ts = ts; qmi_sens->ts = &ts[idx]; qmi_sens->dev = dev; qmi_sens->last_reading = 0; qmi_sens->high_thresh = INT_MAX; qmi_sens->low_thresh = INT_MIN; INIT_WORK(&qmi_sens->therm_notify_work, qmi_ts_thresh_notify); list_add(&qmi_sens->ts_node, &ts->ts_sensor_list); list_add(&qmi_sens->ts_node, &ts[idx].ts_sensor_list); } idx++; } ts_instances = ts; ts_inst_cnt = subsys_cnt; data_fetch_err: of_node_put(subsys_np); Loading @@ -600,22 +633,24 @@ static int of_get_qmi_ts_platform_data(struct device *dev) static int qmi_sens_device_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; int ret = 0; int ret = 0, idx = 0; struct qmi_ts_instance *ts; ret = of_get_qmi_ts_platform_data(dev); if (ret) goto probe_err; if (!ts_instances) { if (!ts_instances || !ts_inst_cnt) { dev_err(dev, "Empty ts instances\n"); return -EINVAL; } ts = ts_instances; if (list_empty(&ts->ts_sensor_list)) for (; idx < ts_inst_cnt; idx++) { ts = &ts_instances[idx]; if (list_empty(&ts->ts_sensor_list)) { ret = -ENODEV; goto probe_err; } ret = qmi_handle_init(&ts->handle, TS_GET_SENSOR_LIST_RESP_MSG_V01_MAX_MSG_LEN, &thermal_qmi_event_ops, handlers); Loading @@ -631,6 +666,7 @@ static int qmi_sens_device_probe(struct platform_device *pdev) ts->inst_id, ret); goto probe_err; } } atomic_set(&in_suspend, 0); register_pm_notifier(&qmi_sensor_pm_nb); return 0; Loading