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