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;
}