static int ht_nxt_smux_i2c_sensor_probe(struct lego_device *ldev) { struct ht_nxt_smux_i2c_sensor_data *data; const struct nxt_i2c_sensor_info *sensor_info; struct ht_nxt_smux_i2c_sensor_platform_data *pdata = ldev->dev.platform_data; size_t mode_info_size; int err, i; if (WARN_ON(!ldev->entry_id)) return -EINVAL; if (WARN_ON(!pdata)) return -EINVAL; sensor_info = &nxt_i2c_sensor_defs[ldev->entry_id->driver_data]; if (sensor_info->ops) { dev_err(&ldev->dev, "The '%s' driver requires special operations" " that are not supported in the '%s' module.", ldev->entry_id->name, "ht-nxt-smux-i2c-sensor"); return -EINVAL; } data = kzalloc(sizeof(struct ht_nxt_smux_i2c_sensor_data), GFP_KERNEL); if (!data) return -ENOMEM; mode_info_size = sizeof(struct nxt_i2c_sensor_info) * sensor_info->num_modes; if (!data->sensor.mode_info) { err = -ENOMEM; goto err_kalloc_mode_info; } data->ldev = ldev; data->type = ldev->entry_id->driver_data; data->info = sensor_info; data->sensor.name = ldev->entry_id->name; data->sensor.port_name = data->ldev->port->port_name; if (data->info->num_read_only_modes) data->sensor.num_modes = data->info->num_read_only_modes; else data->sensor.num_modes = data->info->num_modes; data->sensor.num_view_modes = 1; memcpy(data->sensor.mode_info, data->info->mode_info, mode_info_size); data->sensor.set_mode = ht_nxt_smux_i2c_sensor_set_mode; data->sensor.context = data; for (i = 0; i < data->sensor.num_modes; i++) { struct lego_sensor_mode_info *minfo = &data->sensor.mode_info[i]; if (!minfo->raw_min && !minfo->raw_max) minfo->raw_max = 255; if (!minfo->pct_min && !minfo->pct_max) minfo->pct_max = 100; if (!minfo->si_min && !minfo->si_max) minfo->si_max = 255; if (!minfo->data_sets) minfo->data_sets = 1; if (!minfo->figures) minfo->figures = 5; } dev_set_drvdata(&ldev->dev, data); err = register_lego_sensor(&data->sensor, &ldev->dev); if (err) { dev_err(&ldev->dev, "could not register sensor!\n"); goto err_register_lego_sensor; } ldev->port->nxt_i2c_ops->set_pin1_gpio(ldev->port->context, data->info->pin1_state); ht_nxt_smux_port_set_i2c_addr(data->ldev->port, pdata->address, data->info->slow); ht_nxt_smux_i2c_sensor_set_mode(data, 0); return 0; err_register_lego_sensor: kfree(data->sensor.mode_info); err_kalloc_mode_info: kfree(data); return err; }
static int ht_nxt_smux_i2c_sensor_probe(struct lego_device *ldev) { struct ht_nxt_smux_i2c_sensor_data *data; const struct nxt_i2c_sensor_info *sensor_info; struct ht_nxt_smux_i2c_sensor_platform_data *pdata = ldev->dev.platform_data; int err, i; if (WARN_ON(!ldev->entry_id)) return -EINVAL; if (WARN_ON(!pdata)) return -EINVAL; sensor_info = &nxt_i2c_sensor_defs[ldev->entry_id->driver_data]; data = kzalloc(sizeof(struct ht_nxt_smux_i2c_sensor_data), GFP_KERNEL); if (!data) return -ENOMEM; data->ldev = ldev; data->type = ldev->entry_id->driver_data; memcpy(&data->info, sensor_info, sizeof(struct nxt_i2c_sensor_info)); data->sensor.name = ldev->entry_id->name; data->sensor.port_name = data->ldev->port->port_name; if (data->info.num_read_only_modes) data->sensor.num_modes = data->info.num_read_only_modes; else data->sensor.num_modes = data->info.num_modes; data->sensor.num_view_modes = 1; data->sensor.mode_info = data->info.mode_info; data->sensor.set_mode = ht_nxt_smux_i2c_sensor_set_mode; data->sensor.context = data; for (i = 0; i < data->sensor.num_modes; i++) { struct lego_sensor_mode_info *minfo = &data->info.mode_info[i]; if (!minfo->raw_min && !minfo->raw_max) minfo->raw_max = 255; if (!minfo->pct_min && !minfo->pct_max) minfo->pct_max = 100; if (!minfo->si_min && !minfo->si_max) minfo->si_max = 255; if (!minfo->data_sets) minfo->data_sets = 1; if (!minfo->figures) minfo->figures = 5; } dev_set_drvdata(&ldev->dev, data); err = register_lego_sensor(&data->sensor, &ldev->dev); if (err) { dev_err(&ldev->dev, "could not register sensor!\n"); goto err_register_lego_sensor; } ldev->port->nxt_i2c_ops->set_pin1_gpio(ldev->port->context, data->info.pin1_state); ht_nxt_smux_port_set_i2c_addr(data->ldev->port, pdata->address, data->info.slow); ht_nxt_smux_i2c_sensor_set_mode(data, 0); return 0; err_register_lego_sensor: kfree(data); return err; }