static int tsens_probe(struct platform_device *pdev) { int ret, i; struct device *dev; struct device_node *np; struct tsens_priv *priv; const struct tsens_plat_data *data; const struct of_device_id *id; u32 num_sensors; if (pdev->dev.of_node) dev = &pdev->dev; else dev = pdev->dev.parent; np = dev->of_node; id = of_match_node(tsens_table, np); if (id) data = id->data; else data = &data_8960; num_sensors = data->num_sensors; if (np) of_property_read_u32(np, "#qcom,sensors", &num_sensors); if (num_sensors <= 0) { dev_err(dev, "invalid number of sensors\n"); return -EINVAL; } priv = devm_kzalloc(dev, struct_size(priv, sensor, num_sensors), GFP_KERNEL); if (!priv) return -ENOMEM; priv->dev = dev; priv->num_sensors = num_sensors; priv->ops = data->ops; for (i = 0; i < priv->num_sensors; i++) { if (data->hw_ids) priv->sensor[i].hw_id = data->hw_ids[i]; else priv->sensor[i].hw_id = i; } priv->feat = data->feat; priv->fields = data->fields; if (!priv->ops || !priv->ops->init || !priv->ops->get_temp) return -EINVAL; ret = priv->ops->init(priv); if (ret < 0) { dev_err(dev, "tsens init failed\n"); return ret; } if (priv->ops->calibrate) { ret = priv->ops->calibrate(priv); if (ret < 0) { if (ret != -EPROBE_DEFER) dev_err(dev, "tsens calibration failed\n"); return ret; } } ret = tsens_register(priv); platform_set_drvdata(pdev, priv); return ret; }
static int tsens_probe(struct platform_device *pdev) { int ret, i, num; struct device *dev; struct device_node *np; struct tsens_sensor *s; struct tsens_device *tmdev; const struct of_device_id *id; if (pdev->dev.of_node) dev = &pdev->dev; else dev = pdev->dev.parent; np = dev->of_node; num = of_property_count_u32_elems(np, "qcom,tsens-slopes"); if (num <= 0) { dev_err(dev, "invalid tsens slopes\n"); return -EINVAL; } tmdev = devm_kzalloc(dev, sizeof(*tmdev) + num * sizeof(*s), GFP_KERNEL); if (!tmdev) return -ENOMEM; tmdev->dev = dev; tmdev->num_sensors = num; for (i = 0, s = tmdev->sensor; i < tmdev->num_sensors; i++, s++) of_property_read_u32_index(np, "qcom,tsens-slopes", i, &s->slope); id = of_match_node(tsens_table, np); if (id) tmdev->ops = id->data; else tmdev->ops = &ops_8960; if (!tmdev->ops || !tmdev->ops->init || !tmdev->ops->calibrate || !tmdev->ops->get_temp) return -EINVAL; ret = tmdev->ops->init(tmdev); if (ret < 0) { dev_err(dev, "tsens init failed\n"); return ret; } ret = tmdev->ops->calibrate(tmdev); if (ret < 0) { dev_err(dev, "tsens calibration failed\n"); return ret; } ret = tsens_register(tmdev); platform_set_drvdata(pdev, tmdev); return ret; }