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 ev3_uart_sensor_set_mode(void *context, u8 mode)
{
	struct ev3_uart_sensor_data *data = context;
	struct lego_sensor_mode_info *mode_info = &data->info.mode_info[mode];
#if defined(CONFIG_NXT_I2C_SENSORS) || defined(CONFIG_NXT_I2C_SENSORS_MODULE)
	if (data->ldev->port->dev.type == &ms_ev3_smux_port_type) {
		int ret;

		ret = ms_ev3_smux_set_uart_sensor_mode(data->ldev->port, mode);
		if (ret < 0)
			return ret;
	} else
#endif
#if defined(CONFIG_BRICKPI) || defined(CONFIG_BRICKPI_MODULE)
	if (data->ldev->port->dev.type == &brickpi_in_port_type) {
		int ret;

		ret = brickpi_set_uart_sensor_mode(data->ldev, mode);
		if (ret < 0)
			return ret;
	} else
#endif
		return -EINVAL;

	lego_port_set_raw_data_ptr_and_func(data->ldev->port, mode_info->raw_data,
		lego_sensor_get_raw_data_size(mode_info), NULL, NULL);

	return 0;
}
static int ev3_analog_sensor_set_mode(void *context, u8 mode)
{
	struct ev3_analog_sensor_data *data = context;
	struct lego_sensor_mode_info *mode_info = &data->info.mode_info[mode];

	lego_port_set_raw_data_ptr_and_func(data->ldev->port, mode_info->raw_data,
		lego_sensor_get_raw_data_size(mode_info), NULL, NULL);

	return -EINVAL;
}
static int ht_nxt_smux_i2c_sensor_set_mode(void *context, u8 mode)
{
	struct ht_nxt_smux_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);

	ht_nxt_smux_port_set_i2c_data_reg(port, i2c_mode_info[mode].read_data_reg,
					  size);
	lego_port_set_raw_data_ptr_and_func(port, mode_info->raw_data, size,
					    NULL, NULL);

	return 0;
}
Ejemplo n.º 5
0
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);
}
void nxt_i2c_sensor_poll_work(struct work_struct *work)
{
	struct nxt_i2c_sensor_data *data =
		container_of(work, struct nxt_i2c_sensor_data, poll_work);
	const struct nxt_i2c_sensor_mode_info *i2c_mode_info =
		&data->info->i2c_mode_info[data->sensor.mode];
	struct lego_sensor_mode_info *mode_info =
			&data->sensor.mode_info[data->sensor.mode];

	if (data->info->ops && data->info->ops->poll_cb)
		data->info->ops->poll_cb(data);
	else
		i2c_smbus_read_i2c_block_data(data->client,
			i2c_mode_info->read_data_reg,
			lego_sensor_get_raw_data_size(mode_info),
			mode_info->raw_data);
}
static int ev3_uart_sensor_set_mode(void *context, u8 mode)
{
	struct ev3_uart_sensor_data *data = context;
	struct lego_port_device *port = data->ldev->port;
	struct lego_sensor_mode_info *mode_info = &data->info.mode_info[mode];

	if (port->ev3_uart_ops && port->ev3_uart_ops->set_mode) {
		int ret;

		ret = port->ev3_uart_ops->set_mode(port->context, mode);
		if (ret < 0)
			return ret;
	} else
		return -EOPNOTSUPP;

	lego_port_set_raw_data_ptr_and_func(data->ldev->port, mode_info->raw_data,
		lego_sensor_get_raw_data_size(mode_info), NULL, NULL);

	return 0;
}
Ejemplo n.º 8
0
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;
}