Пример #1
0
static int ev3_motor_probe(struct lego_device *ldev)
{
	struct ev3_motor_data *data;
	int err;

	if (!ldev->port->tacho_motor_ops) {
		dev_err(&ldev->dev, "Port '%s' does not support tacho motor.",
			ldev->port->port_name);
		return -EINVAL;
	}

	data = kzalloc(sizeof(struct ev3_motor_data), GFP_KERNEL);
	if (!data)
		return -ENOMEM;

	data->tm.driver_name = ldev->name;
	data->tm.port_name = ldev->port->port_name;
	data->tm.ops = ldev->port->tacho_motor_ops;
	data->tm.context = ldev->port->context;

	dev_set_drvdata(&ldev->dev, data);

	err = register_tacho_motor(&data->tm, &ldev->dev);
	if (err)
		goto err_register_tacho_motor;

	return 0;

err_register_tacho_motor:
	dev_set_drvdata(&ldev->dev, NULL);
	kfree(data);

	return err;
}
Пример #2
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;
}