void ev3_output_port_unregister(struct lego_port_device *port)
{
	struct ev3_output_port_data *data;

	/* port can be null if disabled via module parameter */
	if (!port)
		return;

	data = container_of(port, struct ev3_output_port_data, out_port);
	pwm_disable(data->pwm);
	pwm_put(data->pwm);
	hrtimer_cancel(&data->timer);
	cancel_work_sync(&data->change_uevent_work);
	cancel_work_sync(&data->work);
	if (data->motor)
		ev3_output_port_unregister_motor(&data->work);
	if (port->mode == EV3_OUTPUT_PORT_MODE_RAW)
		ev3_output_port_disable_raw_mode(data);
	lego_port_unregister(&data->out_port);
	ev3_output_port_float(data);
	gpio_free_array(data->gpio, ARRAY_SIZE(data->gpio));
	put_legoev3_analog(data->analog);
	dev_set_drvdata(&port->dev, NULL);
	kfree(data);
}
Ejemplo n.º 2
0
int ms_nxtmmx_register_out_port(struct ms_nxtmmx_data *mmx)
{
	struct lego_port_device *port = &mmx->port;
	int err;

	port->name = ms_nxtmmx_out_port_type.name;
	strncpy(port->address, mmx->address, LEGO_NAME_SIZE);
	port->num_modes = NUM_MS_NXTMMX_OUT_PORT_MODES;
	port->supported_modes = LEGO_PORT_ALL_MODES;
	port->mode_info = ms_nxtmmx_out_port_mode_info;
	port->set_mode = ms_nxtmmx_out_port_set_mode;
	port->tacho_motor_ops = &ms_nxtmmx_tacho_motor_ops;
	port->context = mmx;

	err = lego_port_register(port, &ms_nxtmmx_out_port_type, &mmx->i2c_client->dev);
	if (err)
		return err;
	err = ms_nxtmmx_out_port_set_mode(mmx, MS_NXTMMX_OUT_PORT_MODE_TACHO_MOTOR);
	if (err) {
		lego_port_unregister(port);
		return err;
	}

	return 0;
}
Ejemplo n.º 3
0
int brickpi_register_in_ports(struct brickpi_channel_data *ch_data,
			      struct device *parent)
{
	int i, err;

	for (i = 0; i < NUM_BRICKPI_PORT; i++) {
		struct lego_port_device *port = &ch_data->in_port[i].port;
		port->name = brickpi_in_port_type.name;
		snprintf(port->port_name, LEGO_PORT_NAME_SIZE, "%s:in%d",
			 dev_name(parent), ch_data->address * 2 + i - 1);
		port->num_modes = NUM_BRICKPI_IN_PORT_MODES;
		port->mode_info = brickpi_in_port_mode_info;
		port->set_mode = brickpi_in_port_set_mode;
		port->set_device = brickpi_in_port_set_device;
		port->context = &ch_data->in_port[i];
		port->nxt_analog_ops = &brickpi_in_port_nxt_analog_ops;
		//port->nxt_i2c_ops = &brickpi_in_port_nxt_i2c_ops;

		err = lego_port_register(port, &brickpi_in_port_type, parent);
		if (err) {
			dev_err(parent,
				"Failed to register BrickPi input port. (%d)\n",
				err);
			for (i--; i >= 0; i--)
				lego_port_unregister(port);
			return err;
		}
	}

	return 0;
}
Ejemplo n.º 4
0
void brickpi_unregister_in_ports(struct brickpi_channel_data *ch_data)
{
	int i;

	for (i = 0; i < NUM_BRICKPI_PORT; i++) {
		brickpi_in_port_unregister_sensor(&ch_data->in_port[i]);
		lego_port_unregister(&ch_data->in_port[i].port);
	}
}
Ejemplo n.º 5
0
int brickpi_register_in_ports(struct brickpi_channel_data *ch_data,
			      struct device *parent)
{
	int i, err;

	for (i = 0; i < NUM_BRICKPI_PORT; i++) {
		struct lego_port_device *port = &ch_data->in_port[i].port;
		port->name = brickpi_in_port_type.name;
		snprintf(port->address, LEGO_NAME_SIZE, "%s:S%d",
			 dev_name(parent), ch_data->address * 2 + i - 1);
		port->num_modes = NUM_BRICKPI_IN_PORT_MODES;
		port->supported_modes = BIT(BRICKPI_IN_PORT_MODE_NONE)
				      | BIT(BRICKPI_IN_PORT_MODE_NXT_ANALOG)
				      | BIT(BRICKPI_IN_PORT_MODE_NXT_COLOR)
				      | BIT(BRICKPI_IN_PORT_MODE_NXT_I2C);
		/* only firmware version 2 supports EV3 sensors */
		if (ch_data->fw_version >= 2) {
			port->supported_modes |= BIT(BRICKPI_IN_PORT_MODE_EV3_ANALOG)
					       | BIT(BRICKPI_IN_PORT_MODE_EV3_UART);
		}
		port->mode_info = brickpi_in_port_mode_info;
		port->set_mode = brickpi_in_port_set_mode;
		port->set_device = brickpi_in_port_set_device;
		port->ev3_uart_ops = &brickpi_ev3_uart_ops;
		port->context = &ch_data->in_port[i];
		port->nxt_analog_ops = &brickpi_in_port_nxt_analog_ops;
		//port->nxt_i2c_ops = &brickpi_in_port_nxt_i2c_ops;

		err = lego_port_register(port, &brickpi_in_port_type, parent);
		if (err) {
			dev_err(parent,
				"Failed to register BrickPi input port. (%d)\n",
				err);
			for (i--; i >= 0; i--)
				lego_port_unregister(port);
			return err;
		}
	}

	return 0;
}
Ejemplo n.º 6
0
void ms_nxtmmx_unregister_out_port(struct ms_nxtmmx_data *mmx)
{
	ms_nxtmmx_out_port_unregister_motor(mmx);
	lego_port_unregister(&mmx->port);
}