static int ev3_uart_sensor_remove(struct lego_device *ldev) { struct ev3_uart_sensor_data *data = dev_get_drvdata(&ldev->dev); lego_port_set_raw_data_ptr_and_func(ldev->port, NULL, 0, NULL, NULL); unregister_lego_sensor(&data->sensor); dev_set_drvdata(&ldev->dev, NULL); kfree(data); return 0; }
static int ht_nxt_smux_i2c_sensor_remove(struct lego_device *ldev) { struct ht_nxt_smux_i2c_sensor_data *data = dev_get_drvdata(&ldev->dev); lego_port_set_raw_data_ptr_and_func(ldev->port, NULL, 0, NULL, NULL); ldev->port->nxt_i2c_ops->set_pin1_gpio(ldev->port->context, LEGO_PORT_GPIO_FLOAT); unregister_lego_sensor(&data->sensor); dev_set_drvdata(&ldev->dev, NULL); kfree(data); return 0; }
static int nxt_i2c_sensor_remove(struct i2c_client *client) { struct nxt_i2c_sensor_data *data = i2c_get_clientdata(client); if (data->info->ops && data->info->ops->remove_cb) data->info->ops->remove_cb(data); data->poll_ms = 0; hrtimer_cancel(&data->poll_timer); cancel_work_sync(&data->poll_work); if (data->in_port && data->in_port->nxt_i2c_ops) data->in_port->nxt_i2c_ops->set_pin1_gpio(data->in_port->context, LEGO_PORT_GPIO_FLOAT); unregister_lego_sensor(&data->sensor); kfree(data->sensor.mode_info); kfree(data); return 0; }
static void ev3_uart_close(struct tty_struct *tty) { struct ev3_uart_port_data *port = tty->disc_data; port->closing = true; if (!completion_done(&port->set_mode_completion)) complete(&port->set_mode_completion); cancel_work_sync(&port->rx_data_work); cancel_delayed_work_sync(&port->send_ack_work); cancel_work_sync(&port->change_bitrate_work); hrtimer_cancel(&port->keep_alive_timer); tasklet_kill(&port->keep_alive_tasklet); if (port->sensor.context) unregister_lego_sensor(&port->sensor); if (port->in_port) put_device(&port->in_port->dev); tty->disc_data = NULL; kfree(port); }