This patch implements changes to the synaptics-rmi4 branch of Dmitry's input tree. The base for the patch is commit 8ca01dc61a42b6f7bcba052a8c084000f7057a34. This patch elliminates support for multiple sensors in rmi_f11. This feature has been removed from the RMI4 spec and no devices have every used multiple F11 sensors on a single device. Signed-off-by: Andrew Duggan <aduggan@xxxxxxxxxxxxx> --- drivers/input/rmi4/rmi_f11.c | 374 +++++++++++++++++++------------------------ include/linux/rmi.h | 10 +- 2 files changed, 170 insertions(+), 214 deletions(-) diff --git a/drivers/input/rmi4/rmi_f11.c b/drivers/input/rmi4/rmi_f11.c index 8984054..d3a9ba8 100644 --- a/drivers/input/rmi4/rmi_f11.c +++ b/drivers/input/rmi4/rmi_f11.c @@ -19,7 +19,6 @@ #include <linux/slab.h> #include "rmi_driver.h" -#define F11_MAX_NUM_OF_SENSORS 8 #define F11_MAX_NUM_OF_FINGERS 10 #define F11_MAX_NUM_OF_TOUCH_SHAPES 16 @@ -42,40 +41,23 @@ /** A note about RMI4 F11 register structure. * - * There may be one or more individual 2D touch surfaces associated with an - * instance for F11. For example, a handheld device might have a touchscreen - * display on the front, and a touchpad on the back. F11 represents these touch - * surfaces as individual sensors, up to 7 on a given RMI4 device. - * * The properties for * a given sensor are described by its query registers. The number of query * registers and the layout of their contents are described by the F11 device - * queries as well as the per-sensor query information. The query registers - * for sensor[n+1] immediately follow those for sensor[n], so the start address - * of the sensor[n+1] queries can only be computed if you know the size of the - * sensor[n] queries. Because each of the sensors may have different - * properties, the size of the query registers for each sensor must be - * calculated on a sensor by sensor basis. + * queries as well as the sensor query information. * * Similarly, each sensor has control registers that govern its behavior. The * size and layout of the control registers for a given sensor can be determined - * by parsing that sensors query registers. The control registers for - * sensor[n+1] immediately follow those for sensor[n], so you can only know - * the start address for the sensor[n+1] controls if you know the size (and - * location) of the sensor[n] controls. + * by parsing that sensors query registers. * * And in a likewise fashion, each sensor has data registers where it reports * its touch data and other interesting stuff. The size and layout of a * sensors data registers must be determined by parsing its query registers. - * The data registers for sensor[n+1] immediately follow those for sensor[n], - * so you can only know the start address for the sensor[n+1] controls if you - * know the size (and location) of the sensor[n] controls. * * The short story is that we need to read and parse a lot of query - * registers in order to determine the attributes of a sensor[0]. Then + * registers in order to determine the attributes of a sensor. Then * we need to use that data to compute the size of the control and data - * registers for sensor[0]. Once we have that figured out, we can then do - * the same thing for each subsequent sensor. + * registers for sensor. * * The end result is that we have a number of structs that aren't used to * directly generate the input events, but their size, location and contents @@ -811,7 +793,7 @@ struct f11_data { struct f11_2d_ctrl dev_controls; struct mutex dev_controls_mutex; u16 rezero_wait_ms; - struct f11_2d_sensor sensors[F11_MAX_NUM_OF_SENSORS]; + struct f11_2d_sensor sensor; }; enum finger_state_values { @@ -1519,10 +1501,10 @@ static int rmi_f11_get_query_parameters(struct rmi_device *rmi_dev, /* This operation is done in a number of places, so we have a handy routine * for it. */ -static void f11_set_abs_params(struct rmi_function *fn, int index) +static void f11_set_abs_params(struct rmi_function *fn) { struct f11_data *f11 = fn->data; - struct f11_2d_sensor *sensor = &f11->sensors[index]; + struct f11_2d_sensor *sensor = &f11->sensor; struct input_dev *input = sensor->input; u16 device_x_max = f11->dev_controls.ctrl0_9->sensor_max_x_pos; @@ -1604,8 +1586,8 @@ static int rmi_f11_initialize(struct rmi_function *fn) u16 control_base_addr; u16 max_x_pos, max_y_pos, temp; int rc; - int i; struct rmi_device_platform_data *pdata = to_rmi_platform_data(rmi_dev); + struct f11_2d_sensor *sensor; dev_dbg(&fn->dev, "Initializing F11 values for %s.\n", pdata->sensor_name); @@ -1628,92 +1610,88 @@ static int rmi_f11_initialize(struct rmi_function *fn) return rc; query_offset = (query_base_addr + 1); - /* Increase with one since number of sensors is zero based */ - for (i = 0; i < (f11->dev_query.nbr_of_sensors + 1); i++) { - struct f11_2d_sensor *sensor = &f11->sensors[i]; - sensor->sensor_index = i; - sensor->fn = fn; - - rc = rmi_f11_get_query_parameters(rmi_dev, &f11->dev_query, - &sensor->sens_query, query_offset); - if (rc < 0) - return rc; - query_offset += rc; + sensor = &f11->sensor; + sensor->fn = fn; - rc = f11_allocate_control_regs(fn, - &f11->dev_query, &sensor->sens_query, - &f11->dev_controls, control_base_addr); - if (rc < 0) { - dev_err(&fn->dev, - "Failed to allocate F11 control params.\n"); - return rc; - } + rc = rmi_f11_get_query_parameters(rmi_dev, &f11->dev_query, + &sensor->sens_query, query_offset); + if (rc < 0) + return rc; + query_offset += rc; - rc = f11_read_control_regs(fn, &f11->dev_controls, - control_base_addr); - if (rc < 0) { - dev_err(&fn->dev, - "Failed to read F11 control params.\n"); - return rc; - } + rc = f11_allocate_control_regs(fn, + &f11->dev_query, &sensor->sens_query, + &f11->dev_controls, control_base_addr); + if (rc < 0) { + dev_err(&fn->dev, + "Failed to allocate F11 control params.\n"); + return rc; + } - if (i < pdata->f11_sensor_count) { - sensor->axis_align = - pdata->f11_sensor_data[i].axis_align; - sensor->type_a = pdata->f11_sensor_data[i].type_a; - sensor->sensor_type = - pdata->f11_sensor_data[i].sensor_type; - } + rc = f11_read_control_regs(fn, &f11->dev_controls, + control_base_addr); + if (rc < 0) { + dev_err(&fn->dev, + "Failed to read F11 control params.\n"); + return rc; + } - rc = rmi_read_block(rmi_dev, - control_base_addr + F11_CTRL_SENSOR_MAX_X_POS_OFFSET, - (u8 *)&max_x_pos, sizeof(max_x_pos)); - if (rc < 0) - return rc; + if (pdata->f11_sensor_data) { + sensor->axis_align = + pdata->f11_sensor_data->axis_align; + sensor->type_a = pdata->f11_sensor_data->type_a; + sensor->sensor_type = + pdata->f11_sensor_data->sensor_type; + } - rc = rmi_read_block(rmi_dev, - control_base_addr + F11_CTRL_SENSOR_MAX_Y_POS_OFFSET, - (u8 *)&max_y_pos, sizeof(max_y_pos)); - if (rc < 0) - return rc; + rc = rmi_read_block(rmi_dev, + control_base_addr + F11_CTRL_SENSOR_MAX_X_POS_OFFSET, + (u8 *)&max_x_pos, sizeof(max_x_pos)); + if (rc < 0) + return rc; - if (sensor->axis_align.swap_axes) { - temp = max_x_pos; - max_x_pos = max_y_pos; - max_y_pos = temp; - } - sensor->max_x = max_x_pos; - sensor->max_y = max_y_pos; + rc = rmi_read_block(rmi_dev, + control_base_addr + F11_CTRL_SENSOR_MAX_Y_POS_OFFSET, + (u8 *)&max_y_pos, sizeof(max_y_pos)); + if (rc < 0) + return rc; - rc = f11_2d_construct_data(sensor); - if (rc < 0) - return rc; + if (sensor->axis_align.swap_axes) { + temp = max_x_pos; + max_x_pos = max_y_pos; + max_y_pos = temp; + } + sensor->max_x = max_x_pos; + sensor->max_y = max_y_pos; - ctrl = &f11->dev_controls; - if (sensor->axis_align.delta_x_threshold) { - ctrl->ctrl0_9->delta_x_threshold = - sensor->axis_align.delta_x_threshold; - rc = rmi_write_block(rmi_dev, - ctrl->ctrl0_9_address, - ctrl->ctrl0_9, - sizeof(*ctrl->ctrl0_9)); - if (rc < 0) - dev_warn(&fn->dev, "Failed to write to delta_x_threshold %d. Code: %d.\n", - i, rc); + rc = f11_2d_construct_data(sensor); + if (rc < 0) + return rc; - } + ctrl = &f11->dev_controls; + if (sensor->axis_align.delta_x_threshold) { + ctrl->ctrl0_9->delta_x_threshold = + sensor->axis_align.delta_x_threshold; + rc = rmi_write_block(rmi_dev, + ctrl->ctrl0_9_address, + ctrl->ctrl0_9, + sizeof(*ctrl->ctrl0_9)); + if (rc < 0) + dev_warn(&fn->dev, "Failed to write to delta_x_threshold. Code: %d.\n", + rc); - if (sensor->axis_align.delta_y_threshold) { - ctrl->ctrl0_9->delta_y_threshold = - sensor->axis_align.delta_y_threshold; - rc = rmi_write_block(rmi_dev, - ctrl->ctrl0_9_address, - ctrl->ctrl0_9, - sizeof(*ctrl->ctrl0_9)); - if (rc < 0) - dev_warn(&fn->dev, "Failed to write to delta_y_threshold %d. Code: %d.\n", - i, rc); - } + } + + if (sensor->axis_align.delta_y_threshold) { + ctrl->ctrl0_9->delta_y_threshold = + sensor->axis_align.delta_y_threshold; + rc = rmi_write_block(rmi_dev, + ctrl->ctrl0_9_address, + ctrl->ctrl0_9, + sizeof(*ctrl->ctrl0_9)); + if (rc < 0) + dev_warn(&fn->dev, "Failed to write to delta_y_threshold. Code: %d.\n", + rc); } mutex_init(&f11->dev_controls_mutex); @@ -1728,22 +1706,61 @@ static int rmi_f11_register_devices(struct rmi_function *fn) struct input_dev *input_dev_mouse; struct rmi_driver_data *driver_data = dev_get_drvdata(&rmi_dev->dev); struct rmi_driver *driver = rmi_dev->driver; - int sensors_itertd = 0; - int i; + struct f11_2d_sensor *sensor = &f11->sensor; int rc; - for (i = 0; i < (f11->dev_query.nbr_of_sensors + 1); i++) { - struct f11_2d_sensor *sensor = &f11->sensors[i]; - sensors_itertd = i; - input_dev = input_allocate_device(); - if (!input_dev) { + input_dev = input_allocate_device(); + if (!input_dev) { + rc = -ENOMEM; + goto error_unregister; + } + + sensor->input = input_dev; + if (driver->set_input_params) { + rc = driver->set_input_params(rmi_dev, input_dev); + if (rc < 0) { + dev_err(&fn->dev, + "%s: Error in setting input device.\n", + __func__); + goto error_unregister; + } + } + sprintf(sensor->input_phys, "%s.abs/input0", + dev_name(&fn->dev)); + input_dev->phys = sensor->input_phys; + input_dev->dev.parent = &rmi_dev->dev; + input_set_drvdata(input_dev, f11); + + set_bit(EV_SYN, input_dev->evbit); + set_bit(EV_ABS, input_dev->evbit); + input_set_capability(input_dev, EV_KEY, BTN_TOUCH); + + f11_set_abs_params(fn); + + if (sensor->sens_query.info.has_rel) { + set_bit(EV_REL, input_dev->evbit); + set_bit(REL_X, input_dev->relbit); + set_bit(REL_Y, input_dev->relbit); + } + rc = input_register_device(input_dev); + if (rc < 0) { + input_free_device(input_dev); + sensor->input = NULL; + goto error_unregister; + } + + if (sensor->sens_query.info.has_rel) { + /*create input device for mouse events */ + input_dev_mouse = input_allocate_device(); + if (!input_dev_mouse) { rc = -ENOMEM; goto error_unregister; } - sensor->input = input_dev; + sensor->mouse_input = input_dev_mouse; if (driver->set_input_params) { - rc = driver->set_input_params(rmi_dev, input_dev); + rc = driver->set_input_params(rmi_dev, + input_dev_mouse); if (rc < 0) { dev_err(&fn->dev, "%s: Error in setting input device.\n", @@ -1751,87 +1768,39 @@ static int rmi_f11_register_devices(struct rmi_function *fn) goto error_unregister; } } - sprintf(sensor->input_phys, "%s.abs%d/input0", - dev_name(&fn->dev), i); - input_dev->phys = sensor->input_phys; - input_dev->dev.parent = &rmi_dev->dev; - input_set_drvdata(input_dev, f11); - - set_bit(EV_SYN, input_dev->evbit); - set_bit(EV_ABS, input_dev->evbit); - input_set_capability(input_dev, EV_KEY, BTN_TOUCH); - - f11_set_abs_params(fn, i); - - if (sensor->sens_query.info.has_rel) { - set_bit(EV_REL, input_dev->evbit); - set_bit(REL_X, input_dev->relbit); - set_bit(REL_Y, input_dev->relbit); - } - rc = input_register_device(input_dev); + sprintf(sensor->input_phys_mouse, "%s.rel/input0", + dev_name(&fn->dev)); + set_bit(EV_REL, input_dev_mouse->evbit); + set_bit(REL_X, input_dev_mouse->relbit); + set_bit(REL_Y, input_dev_mouse->relbit); + + set_bit(BTN_MOUSE, input_dev_mouse->evbit); + /* Register device's buttons and keys */ + set_bit(EV_KEY, input_dev_mouse->evbit); + set_bit(BTN_LEFT, input_dev_mouse->keybit); + set_bit(BTN_MIDDLE, input_dev_mouse->keybit); + set_bit(BTN_RIGHT, input_dev_mouse->keybit); + + rc = input_register_device(input_dev_mouse); if (rc < 0) { - input_free_device(input_dev); - sensor->input = NULL; + input_free_device(input_dev_mouse); + sensor->mouse_input = NULL; goto error_unregister; } - if (sensor->sens_query.info.has_rel) { - /*create input device for mouse events */ - input_dev_mouse = input_allocate_device(); - if (!input_dev_mouse) { - rc = -ENOMEM; - goto error_unregister; - } - - sensor->mouse_input = input_dev_mouse; - if (driver->set_input_params) { - rc = driver->set_input_params(rmi_dev, - input_dev_mouse); - if (rc < 0) { - dev_err(&fn->dev, - "%s: Error in setting input device.\n", - __func__); - goto error_unregister; - } - } - sprintf(sensor->input_phys_mouse, "%s.rel%d/input0", - dev_name(&fn->dev), i); - set_bit(EV_REL, input_dev_mouse->evbit); - set_bit(REL_X, input_dev_mouse->relbit); - set_bit(REL_Y, input_dev_mouse->relbit); - - set_bit(BTN_MOUSE, input_dev_mouse->evbit); - /* Register device's buttons and keys */ - set_bit(EV_KEY, input_dev_mouse->evbit); - set_bit(BTN_LEFT, input_dev_mouse->keybit); - set_bit(BTN_MIDDLE, input_dev_mouse->keybit); - set_bit(BTN_RIGHT, input_dev_mouse->keybit); - - rc = input_register_device(input_dev_mouse); - if (rc < 0) { - input_free_device(input_dev_mouse); - sensor->mouse_input = NULL; - goto error_unregister; - } - - set_bit(BTN_RIGHT, input_dev_mouse->keybit); - } - + set_bit(BTN_RIGHT, input_dev_mouse->keybit); } return 0; error_unregister: - for (; sensors_itertd > 0; sensors_itertd--) { - if (f11->sensors[sensors_itertd].input) { - if (f11->sensors[sensors_itertd].mouse_input) { - input_unregister_device( - f11->sensors[sensors_itertd].mouse_input); - f11->sensors[sensors_itertd].mouse_input = NULL; - } - input_unregister_device(f11->sensors[i].input); - f11->sensors[i].input = NULL; + if (f11->sensor.input) { + if (f11->sensor.mouse_input) { + input_unregister_device(f11->sensor.mouse_input); + f11->sensor.mouse_input = NULL; } + input_unregister_device(f11->sensor.input); + f11->sensor.input = NULL; } return rc; @@ -1840,28 +1809,22 @@ error_unregister: static void rmi_f11_free_devices(struct rmi_function *fn) { struct f11_data *f11 = fn->data; - int i; - for (i = 0; i < (f11->dev_query.nbr_of_sensors + 1); i++) { - if (f11->sensors[i].input) - input_unregister_device(f11->sensors[i].input); - if (f11->sensors[i].mouse_input) - input_unregister_device(f11->sensors[i].mouse_input); - } + if (f11->sensor.input) + input_unregister_device(f11->sensor.input); + if (f11->sensor.mouse_input) + input_unregister_device(f11->sensor.mouse_input); } static int rmi_f11_config(struct rmi_function *fn) { struct f11_data *f11 = fn->data; - int i; int rc; - for (i = 0; i < (f11->dev_query.nbr_of_sensors + 1); i++) { - rc = f11_write_control_regs(fn, &f11->sensors[i].sens_query, - &f11->dev_controls, fn->fd.query_base_addr); - if (rc < 0) - return rc; - } + rc = f11_write_control_regs(fn, &f11->sensor.sens_query, + &f11->dev_controls, fn->fd.query_base_addr); + if (rc < 0) + return rc; return 0; } @@ -1874,19 +1837,16 @@ int rmi_f11_attention(struct rmi_function *fn, u16 data_base_addr = fn->fd.data_base_addr; u16 data_base_addr_offset = 0; int error; - int i; - for (i = 0; i < f11->dev_query.nbr_of_sensors + 1; i++) { - error = rmi_read_block(rmi_dev, - data_base_addr + data_base_addr_offset, - f11->sensors[i].data_pkt, - f11->sensors[i].pkt_size); - if (error < 0) - return error; + error = rmi_read_block(rmi_dev, + data_base_addr + data_base_addr_offset, + f11->sensor.data_pkt, + f11->sensor.pkt_size); + if (error < 0) + return error; - rmi_f11_finger_handler(f11, &f11->sensors[i]); - data_base_addr_offset += f11->sensors[i].pkt_size; - } + rmi_f11_finger_handler(f11, &f11->sensor); + data_base_addr_offset += f11->sensor.pkt_size; return 0; } diff --git a/include/linux/rmi.h b/include/linux/rmi.h index dc94dc1..735e978 100644 --- a/include/linux/rmi.h +++ b/include/linux/rmi.h @@ -222,13 +222,10 @@ struct rmi_device_platform_data_spi { * @spi_data - override default settings for SPI delays and SSB management (see * above). * - * @f11_sensor_data - an array of platform data for individual F11 2D sensors. - * @f11_sensor_count - the length of f11_sensor_data array. Extra entries will - * be ignored; if there are too few entries, all settings for the additional - * sensors will be defaulted. + * @f11_sensor_data - platform data for the F11 2D sensor. * @f11_rezero_wait - if non-zero, this is how may milliseconds the F11 2D - * sensor(s) will wait before being be rezeroed on exit from suspend. If - * this value is zero, the F11 2D sensor(s) will not be rezeroed on resume. + * sensor will wait before being be rezeroed on exit from suspend. If + * this value is zero, the F11 2D sensor will not be rezeroed on resume. * @pre_suspend - this will be called before any other suspend operations are * done. * @power_management - overrides default touch sensor doze mode settings (see @@ -266,7 +263,6 @@ struct rmi_device_platform_data { /* function handler pdata */ struct rmi_f11_sensor_data *f11_sensor_data; - u8 f11_sensor_count; u16 f11_rezero_wait; struct rmi_f01_power_management power_management; struct rmi_button_map *f19_button_map; -- 1.8.3.2 -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html