static int brickpi_i2c_sensor_send_command(void *context, u8 mode)
{
	struct brickpi_i2c_sensor_data *data = context;
	struct lego_sensor_mode_info *mode_info = &data->sensor.mode_info[mode];
	const struct nxt_i2c_sensor_cmd_info *i2c_cmd_info = data->info->i2c_cmd_info;
	const struct nxt_i2c_sensor_mode_info *i2c_mode_info = data->info->i2c_mode_info;
	int size = lego_sensor_get_raw_data_size(mode_info);
	int err; /* temporary workaround for ms-absolute-imu (2 of 4) */

	/* set mode function also works for sending command */
	err = brickpi_in_port_set_i2c_mode(data->ldev,
					    i2c_cmd_info[mode].cmd_reg,
					    i2c_cmd_info[mode].cmd_data,
					    i2c_mode_info[mode].read_data_reg,
					    size);

	/* temporary workaround for ms-absolute-imu (3 of 4) */
	if (err)
		return err;

	/* temporary workaround for ms-absolute-imu (4 of 4) */
	if (data->ldev->entry_id->driver_data == MS_ABSOLUTE_IMU &&
	data->info->ops && data->info->ops->send_cmd_post_cb) {
		struct nxt_i2c_sensor_data workaround_sensor;

		workaround_sensor.sensor.mode_info = data->sensor.mode_info;
		data->info->ops->send_cmd_post_cb(&workaround_sensor, mode);
	}

	return err;
}
static int brickpi_i2c_sensor_send_command(void *context, u8 mode)
{
	struct brickpi_i2c_sensor_data *data = context;
	struct lego_sensor_mode_info *mode_info = &data->sensor.mode_info[mode];
	const struct nxt_i2c_sensor_cmd_info *i2c_cmd_info = data->info->i2c_cmd_info;
	const struct nxt_i2c_sensor_mode_info *i2c_mode_info = data->info->i2c_mode_info;
	int size = lego_sensor_get_raw_data_size(mode_info);

	/* set mode function also works for sending command */
	return brickpi_in_port_set_i2c_mode(data->ldev,
					    i2c_cmd_info[mode].cmd_reg,
					    i2c_cmd_info[mode].cmd_data,
					    i2c_mode_info[mode].read_data_reg,
					    size);
}
static int brickpi_i2c_sensor_set_mode(void *context, u8 mode)
{
	struct brickpi_i2c_sensor_data *data = context;
	struct lego_port_device *port = data->ldev->port;
	struct lego_sensor_mode_info *mode_info = &data->sensor.mode_info[mode];
	const struct nxt_i2c_sensor_mode_info *i2c_mode_info = data->info->i2c_mode_info;
	int size = lego_sensor_get_raw_data_size(mode_info);
	int err;

	err = brickpi_in_port_set_i2c_mode(data->ldev,
					   i2c_mode_info[mode].set_mode_reg,
					   i2c_mode_info[mode].set_mode_data,
					   i2c_mode_info[mode].read_data_reg,
					   size);
	if (err < 0)
		return err;

	lego_port_set_raw_data_ptr_and_func(port, mode_info->raw_data, size,
					    NULL, NULL);

	return 0;
}