예제 #1
0
void ms_nxtmmx_remove_cb(struct nxt_i2c_sensor_data *data)
{
	struct ms_nxtmmx_data *mmx = data->callback_data;

	unregister_tacho_motor(&mmx[1].tm);
	unregister_tacho_motor(&mmx[0].tm);
	data->callback_data = NULL;
	kfree(mmx);
}
예제 #2
0
static int ev3_motor_remove(struct lego_device *ldev)
{
	struct ev3_motor_data *data = dev_get_drvdata(&ldev->dev);

	unregister_tacho_motor(&data->tm);
	dev_set_drvdata(&ldev->dev, NULL);
	kfree(data);

	return 0;
}
예제 #3
0
int ms_nxtmmx_probe_cb(struct nxt_i2c_sensor_data *data)
{
	struct ms_nxtmmx_data *mmx;
	int i, err;

	mmx = kzalloc(sizeof(struct ms_nxtmmx_data) * 2, GFP_KERNEL);
	if (!mmx)
		return -ENOMEM;

	data->callback_data = mmx;

	for (i = 0; i < 2; i++) {
		mmx[i].tm.driver_name = data->info->name;
		snprintf(mmx[i].port_name, LEGO_PORT_NAME_SIZE, "%s:i2c%d:mux%d",
			 data->port_name, data->client->addr, i + 1);
		mmx[i].tm.port_name = mmx[i].port_name;
		mmx[i].tm.ops = &ms_nxtmmx_tacho_motor_ops;
		mmx[i].tm.context = &mmx[i];
		mmx[i].i2c = data;
		mmx[i].index = i;
		mmx[i].command_flags = CMD_FLAGS_DEFAULT_VALUE;
	}

	err = register_tacho_motor(&mmx[0].tm, &data->client->dev);
	if (err)
		goto err_register_tacho_motor0;
	err = register_tacho_motor(&mmx[1].tm, &data->client->dev);
	if (err)
		goto err_register_tacho_motor1;

	data->poll_ms = 1000;

	return 0;

err_register_tacho_motor1:
	unregister_tacho_motor(&mmx[0].tm);
err_register_tacho_motor0:
	data->callback_data = NULL;
	kfree(mmx);

	return err;
}