Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: synaptics-rmi4 - clean up F30 implementation

This patch does several cleanup changes to F30 code

- switch to using BIT() macro
- use DIV_ROUND_UP() where appropriate
- factor out code setting up and reporting buttons
- use single loop when reporting buttons: arithmetic is cheap compared to
conditionals and associated branch misprediction.

Tested-By: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

+145 -183
+145 -183
drivers/input/rmi4/rmi_f30.c
··· 16 16 17 17 /* Defs for Query 0 */ 18 18 #define RMI_F30_EXTENDED_PATTERNS 0x01 19 - #define RMI_F30_HAS_MAPPABLE_BUTTONS (1 << 1) 20 - #define RMI_F30_HAS_LED (1 << 2) 21 - #define RMI_F30_HAS_GPIO (1 << 3) 22 - #define RMI_F30_HAS_HAPTIC (1 << 4) 23 - #define RMI_F30_HAS_GPIO_DRV_CTL (1 << 5) 24 - #define RMI_F30_HAS_MECH_MOUSE_BTNS (1 << 6) 19 + #define RMI_F30_HAS_MAPPABLE_BUTTONS BIT(1) 20 + #define RMI_F30_HAS_LED BIT(2) 21 + #define RMI_F30_HAS_GPIO BIT(3) 22 + #define RMI_F30_HAS_HAPTIC BIT(4) 23 + #define RMI_F30_HAS_GPIO_DRV_CTL BIT(5) 24 + #define RMI_F30_HAS_MECH_MOUSE_BTNS BIT(6) 25 25 26 26 /* Defs for Query 1 */ 27 27 #define RMI_F30_GPIO_LED_COUNT 0x1F 28 28 29 29 /* Defs for Control Registers */ 30 30 #define RMI_F30_CTRL_1_GPIO_DEBOUNCE 0x01 31 - #define RMI_F30_CTRL_1_HALT (1 << 4) 32 - #define RMI_F30_CTRL_1_HALTED (1 << 5) 31 + #define RMI_F30_CTRL_1_HALT BIT(4) 32 + #define RMI_F30_CTRL_1_HALTED BIT(5) 33 33 #define RMI_F30_CTRL_10_NUM_MECH_MOUSE_BTNS 0x03 34 34 35 - struct rmi_f30_ctrl_data { 36 - int address; 37 - int length; 38 - u8 *regs; 39 - }; 40 - 41 35 #define RMI_F30_CTRL_MAX_REGS 32 42 - #define RMI_F30_CTRL_MAX_BYTES ((RMI_F30_CTRL_MAX_REGS + 7) >> 3) 36 + #define RMI_F30_CTRL_MAX_BYTES DIV_ROUND_UP(RMI_F30_CTRL_MAX_REGS, 8) 43 37 #define RMI_F30_CTRL_MAX_REG_BLOCKS 11 44 38 45 39 #define RMI_F30_CTRL_REGS_MAX_SIZE (RMI_F30_CTRL_MAX_BYTES \ ··· 47 53 + RMI_F30_CTRL_MAX_BYTES \ 48 54 + 1 \ 49 55 + 1) 56 + 57 + struct rmi_f30_ctrl_data { 58 + int address; 59 + int length; 60 + u8 *regs; 61 + }; 50 62 51 63 struct f30_data { 52 64 /* Query Data */ ··· 81 81 static int rmi_f30_read_control_parameters(struct rmi_function *fn, 82 82 struct f30_data *f30) 83 83 { 84 - struct rmi_device *rmi_dev = fn->rmi_dev; 85 - int error = 0; 84 + int error; 86 85 87 - error = rmi_read_block(rmi_dev, fn->fd.control_base_addr, 88 - f30->ctrl_regs, f30->ctrl_regs_size); 86 + error = rmi_read_block(fn->rmi_dev, fn->fd.control_base_addr, 87 + f30->ctrl_regs, f30->ctrl_regs_size); 89 88 if (error) { 90 - dev_err(&rmi_dev->dev, "%s : Could not read control registers at 0x%x error (%d)\n", 89 + dev_err(&fn->dev, 90 + "%s: Could not read control registers at 0x%x: %d\n", 91 91 __func__, fn->fd.control_base_addr, error); 92 92 return error; 93 93 } ··· 95 95 return 0; 96 96 } 97 97 98 + static void rmi_f30_report_button(struct rmi_function *fn, 99 + struct f30_data *f30, unsigned int button) 100 + { 101 + unsigned int reg_num = button >> 3; 102 + unsigned int bit_num = button & 0x07; 103 + bool key_down = !(f30->data_regs[reg_num] & BIT(bit_num)); 104 + 105 + rmi_dbg(RMI_DEBUG_FN, &fn->dev, 106 + "%s: call input report key (0x%04x) value (0x%02x)", 107 + __func__, f30->gpioled_key_map[button], key_down); 108 + 109 + input_report_key(f30->input, f30->gpioled_key_map[button], key_down); 110 + } 111 + 98 112 static int rmi_f30_attention(struct rmi_function *fn, unsigned long *irq_bits) 99 113 { 100 114 struct f30_data *f30 = dev_get_drvdata(&fn->dev); 101 - struct rmi_device *rmi_dev = fn->rmi_dev; 102 - struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev); 103 - int retval; 104 - int gpiled = 0; 105 - int value = 0; 115 + struct rmi_driver_data *drvdata = dev_get_drvdata(&fn->rmi_dev->dev); 116 + int error; 106 117 int i; 107 - int reg_num; 108 - 109 - if (!f30->input) 110 - return 0; 111 118 112 119 /* Read the gpi led data. */ 113 120 if (drvdata->attn_data.data) { 114 121 if (drvdata->attn_data.size < f30->register_count) { 115 - dev_warn(&fn->dev, "F30 interrupted, but data is missing\n"); 122 + dev_warn(&fn->dev, 123 + "F30 interrupted, but data is missing\n"); 116 124 return 0; 117 125 } 118 126 memcpy(f30->data_regs, drvdata->attn_data.data, ··· 128 120 drvdata->attn_data.data += f30->register_count; 129 121 drvdata->attn_data.size -= f30->register_count; 130 122 } else { 131 - retval = rmi_read_block(rmi_dev, fn->fd.data_base_addr, 132 - f30->data_regs, f30->register_count); 133 - 134 - if (retval) { 135 - dev_err(&fn->dev, "%s: Failed to read F30 data registers.\n", 136 - __func__); 137 - return retval; 123 + error = rmi_read_block(fn->rmi_dev, fn->fd.data_base_addr, 124 + f30->data_regs, f30->register_count); 125 + if (error) { 126 + dev_err(&fn->dev, 127 + "%s: Failed to read F30 data registers: %d\n", 128 + __func__, error); 129 + return error; 138 130 } 139 131 } 140 132 141 - for (reg_num = 0; reg_num < f30->register_count; ++reg_num) { 142 - for (i = 0; gpiled < f30->gpioled_count && i < 8; ++i, 143 - ++gpiled) { 144 - if (f30->gpioled_key_map[gpiled] != 0) { 145 - /* buttons have pull up resistors */ 146 - value = (((f30->data_regs[reg_num] >> i) & 0x01) 147 - == 0); 133 + if (f30->has_gpio) 134 + for (i = 0; i < f30->gpioled_count; i++) 135 + if (f30->gpioled_key_map[i] != KEY_RESERVED) 136 + rmi_f30_report_button(fn, f30, i); 148 137 149 - rmi_dbg(RMI_DEBUG_FN, &fn->dev, 150 - "%s: call input report key (0x%04x) value (0x%02x)", 151 - __func__, 152 - f30->gpioled_key_map[gpiled], value); 153 - input_report_key(f30->input, 154 - f30->gpioled_key_map[gpiled], 155 - value); 156 - } 157 - 158 - } 159 - } 160 - 161 - return 0; 162 - } 163 - 164 - static int rmi_f30_register_device(struct rmi_function *fn) 165 - { 166 - int i; 167 - struct rmi_device *rmi_dev = fn->rmi_dev; 168 - struct rmi_driver_data *drv_data = dev_get_drvdata(&rmi_dev->dev); 169 - struct f30_data *f30 = dev_get_drvdata(&fn->dev); 170 - struct input_dev *input_dev; 171 - int button_count = 0; 172 - 173 - input_dev = drv_data->input; 174 - if (!input_dev) { 175 - dev_info(&fn->dev, "F30: no input device found, ignoring.\n"); 176 - return -EINVAL; 177 - } 178 - 179 - f30->input = input_dev; 180 - 181 - set_bit(EV_KEY, input_dev->evbit); 182 - 183 - input_dev->keycode = f30->gpioled_key_map; 184 - input_dev->keycodesize = sizeof(u16); 185 - input_dev->keycodemax = f30->gpioled_count; 186 - 187 - for (i = 0; i < f30->gpioled_count; i++) { 188 - if (f30->gpioled_key_map[i] != 0) { 189 - input_set_capability(input_dev, EV_KEY, 190 - f30->gpioled_key_map[i]); 191 - button_count++; 192 - } 193 - } 194 - 195 - if (button_count == 1) 196 - __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit); 197 138 return 0; 198 139 } 199 140 ··· 161 204 error = rmi_write_block(fn->rmi_dev, fn->fd.control_base_addr, 162 205 f30->ctrl_regs, f30->ctrl_regs_size); 163 206 if (error) { 164 - dev_err(&fn->rmi_dev->dev, 165 - "%s : Could not write control registers at 0x%x error (%d)\n", 207 + dev_err(&fn->dev, 208 + "%s: Could not write control registers at 0x%x: %d\n", 166 209 __func__, fn->fd.control_base_addr, error); 167 210 return error; 168 211 } 169 212 170 213 drv->set_irq_bits(fn->rmi_dev, fn->irq_mask); 171 214 } 215 + 172 216 return 0; 173 217 } 174 218 175 - static inline void rmi_f30_set_ctrl_data(struct rmi_f30_ctrl_data *ctrl, 176 - int *ctrl_addr, int len, u8 **reg) 219 + static void rmi_f30_set_ctrl_data(struct rmi_f30_ctrl_data *ctrl, 220 + int *ctrl_addr, int len, u8 **reg) 177 221 { 178 222 ctrl->address = *ctrl_addr; 179 223 ctrl->length = len; ··· 183 225 *reg += len; 184 226 } 185 227 186 - static inline bool rmi_f30_is_valid_button(int button, 187 - struct rmi_f30_ctrl_data *ctrl) 228 + static bool rmi_f30_is_valid_button(int button, struct rmi_f30_ctrl_data *ctrl) 188 229 { 189 230 int byte_position = button >> 3; 190 231 int bit_position = button & 0x07; ··· 196 239 (ctrl[3].regs[byte_position] & BIT(bit_position)); 197 240 } 198 241 199 - static inline int rmi_f30_initialize(struct rmi_function *fn) 242 + static int rmi_f30_map_gpios(struct rmi_function *fn, 243 + struct f30_data *f30) 200 244 { 201 - struct f30_data *f30; 202 - struct rmi_device *rmi_dev = fn->rmi_dev; 203 - const struct rmi_device_platform_data *pdata; 204 - int retval = 0; 205 - int control_address; 245 + const struct rmi_device_platform_data *pdata = 246 + rmi_get_platform_data(fn->rmi_dev); 247 + struct input_dev *input = f30->input; 248 + unsigned int button = BTN_LEFT; 206 249 int i; 207 - int button; 208 - u8 buf[RMI_F30_QUERY_SIZE]; 209 - u8 *ctrl_reg; 210 - u8 *map_memory; 211 250 212 - f30 = devm_kzalloc(&fn->dev, sizeof(struct f30_data), 213 - GFP_KERNEL); 214 - if (!f30) 251 + f30->gpioled_key_map = devm_kcalloc(&fn->dev, 252 + f30->gpioled_count, 253 + sizeof(f30->gpioled_key_map[0]), 254 + GFP_KERNEL); 255 + if (!f30->gpioled_key_map) { 256 + dev_err(&fn->dev, "Failed to allocate gpioled map memory.\n"); 215 257 return -ENOMEM; 258 + } 216 259 217 - dev_set_drvdata(&fn->dev, f30); 260 + for (i = 0; i < f30->gpioled_count; i++) { 261 + if (rmi_f30_is_valid_button(i, f30->ctrl)) { 262 + f30->gpioled_key_map[i] = button; 263 + input_set_capability(input, EV_KEY, button++); 218 264 219 - retval = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr, buf, 220 - RMI_F30_QUERY_SIZE); 265 + /* 266 + * buttonpad might be given by 267 + * f30->has_mech_mouse_btns, but I am 268 + * not sure, so use only the pdata info 269 + */ 270 + if (pdata->f30_data.buttonpad) { 271 + __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); 272 + break; 273 + } 274 + } 275 + } 221 276 222 - if (retval) { 223 - dev_err(&fn->dev, "Failed to read query register.\n"); 224 - return retval; 277 + input->keycode = f30->gpioled_key_map; 278 + input->keycodesize = sizeof(f30->gpioled_key_map[0]); 279 + input->keycodemax = f30->gpioled_count; 280 + 281 + return 0; 282 + } 283 + 284 + static int rmi_f30_initialize(struct rmi_function *fn, struct f30_data *f30) 285 + { 286 + u8 *ctrl_reg = f30->ctrl_regs; 287 + int control_address = fn->fd.control_base_addr; 288 + u8 buf[RMI_F30_QUERY_SIZE]; 289 + int error; 290 + 291 + error = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr, 292 + buf, RMI_F30_QUERY_SIZE); 293 + if (error) { 294 + dev_err(&fn->dev, "Failed to read query register\n"); 295 + return error; 225 296 } 226 297 227 298 f30->has_extended_pattern = buf[0] & RMI_F30_EXTENDED_PATTERNS; ··· 261 276 f30->has_mech_mouse_btns = buf[0] & RMI_F30_HAS_MECH_MOUSE_BTNS; 262 277 f30->gpioled_count = buf[1] & RMI_F30_GPIO_LED_COUNT; 263 278 264 - f30->register_count = (f30->gpioled_count + 7) >> 3; 265 - 266 - control_address = fn->fd.control_base_addr; 267 - ctrl_reg = f30->ctrl_regs; 279 + f30->register_count = DIV_ROUND_UP(f30->gpioled_count, 8); 268 280 269 281 if (f30->has_gpio && f30->has_led) 270 282 rmi_f30_set_ctrl_data(&f30->ctrl[0], &control_address, 271 - f30->register_count, &ctrl_reg); 283 + f30->register_count, &ctrl_reg); 272 284 273 - rmi_f30_set_ctrl_data(&f30->ctrl[1], &control_address, sizeof(u8), 274 - &ctrl_reg); 285 + rmi_f30_set_ctrl_data(&f30->ctrl[1], &control_address, 286 + sizeof(u8), &ctrl_reg); 275 287 276 288 if (f30->has_gpio) { 277 289 rmi_f30_set_ctrl_data(&f30->ctrl[2], &control_address, 278 - f30->register_count, &ctrl_reg); 290 + f30->register_count, &ctrl_reg); 279 291 280 292 rmi_f30_set_ctrl_data(&f30->ctrl[3], &control_address, 281 - f30->register_count, &ctrl_reg); 293 + f30->register_count, &ctrl_reg); 282 294 } 283 295 284 296 if (f30->has_led) { 285 - int ctrl5_len; 286 - 287 297 rmi_f30_set_ctrl_data(&f30->ctrl[4], &control_address, 288 - f30->register_count, &ctrl_reg); 289 - 290 - if (f30->has_extended_pattern) 291 - ctrl5_len = 6; 292 - else 293 - ctrl5_len = 2; 298 + f30->register_count, &ctrl_reg); 294 299 295 300 rmi_f30_set_ctrl_data(&f30->ctrl[5], &control_address, 296 - ctrl5_len, &ctrl_reg); 301 + f30->has_extended_pattern ? 6 : 2, 302 + &ctrl_reg); 297 303 } 298 304 299 305 if (f30->has_led || f30->has_gpio_driver_control) { 300 306 /* control 6 uses a byte per gpio/led */ 301 307 rmi_f30_set_ctrl_data(&f30->ctrl[6], &control_address, 302 - f30->gpioled_count, &ctrl_reg); 308 + f30->gpioled_count, &ctrl_reg); 303 309 } 304 310 305 311 if (f30->has_mappable_buttons) { 306 312 /* control 7 uses a byte per gpio/led */ 307 313 rmi_f30_set_ctrl_data(&f30->ctrl[7], &control_address, 308 - f30->gpioled_count, &ctrl_reg); 314 + f30->gpioled_count, &ctrl_reg); 309 315 } 310 316 311 317 if (f30->has_haptic) { 312 318 rmi_f30_set_ctrl_data(&f30->ctrl[8], &control_address, 313 - f30->register_count, &ctrl_reg); 319 + f30->register_count, &ctrl_reg); 314 320 315 321 rmi_f30_set_ctrl_data(&f30->ctrl[9], &control_address, 316 - sizeof(u8), &ctrl_reg); 322 + sizeof(u8), &ctrl_reg); 317 323 } 318 324 319 325 if (f30->has_mech_mouse_btns) 320 326 rmi_f30_set_ctrl_data(&f30->ctrl[10], &control_address, 321 - sizeof(u8), &ctrl_reg); 327 + sizeof(u8), &ctrl_reg); 322 328 323 - f30->ctrl_regs_size = ctrl_reg - f30->ctrl_regs 324 - ?: RMI_F30_CTRL_REGS_MAX_SIZE; 329 + f30->ctrl_regs_size = ctrl_reg - 330 + f30->ctrl_regs ?: RMI_F30_CTRL_REGS_MAX_SIZE; 325 331 326 - retval = rmi_f30_read_control_parameters(fn, f30); 327 - if (retval < 0) { 332 + error = rmi_f30_read_control_parameters(fn, f30); 333 + if (error) { 328 334 dev_err(&fn->dev, 329 - "Failed to initialize F19 control params.\n"); 330 - return retval; 335 + "Failed to initialize F30 control params: %d\n", 336 + error); 337 + return error; 331 338 } 332 339 333 - map_memory = devm_kzalloc(&fn->dev, 334 - (f30->gpioled_count * (sizeof(u16))), 335 - GFP_KERNEL); 336 - if (!map_memory) { 337 - dev_err(&fn->dev, "Failed to allocate gpioled map memory.\n"); 338 - return -ENOMEM; 339 - } 340 - 341 - f30->gpioled_key_map = (u16 *)map_memory; 342 - 343 - pdata = rmi_get_platform_data(rmi_dev); 344 340 if (f30->has_gpio) { 345 - button = BTN_LEFT; 346 - for (i = 0; i < f30->gpioled_count; i++) { 347 - if (rmi_f30_is_valid_button(i, f30->ctrl)) { 348 - f30->gpioled_key_map[i] = button++; 349 - 350 - /* 351 - * buttonpad might be given by 352 - * f30->has_mech_mouse_btns, but I am 353 - * not sure, so use only the pdata info 354 - */ 355 - if (pdata->f30_data.buttonpad) 356 - break; 357 - } 358 - } 341 + error = rmi_f30_map_gpios(fn, f30); 342 + if (error) 343 + return error; 359 344 } 360 345 361 346 return 0; ··· 333 378 334 379 static int rmi_f30_probe(struct rmi_function *fn) 335 380 { 336 - int rc; 381 + struct rmi_device *rmi_dev = fn->rmi_dev; 337 382 const struct rmi_device_platform_data *pdata = 338 - rmi_get_platform_data(fn->rmi_dev); 383 + rmi_get_platform_data(rmi_dev); 384 + struct rmi_driver_data *drv_data = dev_get_drvdata(&rmi_dev->dev); 385 + struct f30_data *f30; 386 + int error; 339 387 340 388 if (pdata->f30_data.disable) 341 389 return 0; 342 390 343 - rc = rmi_f30_initialize(fn); 344 - if (rc < 0) 345 - goto error_exit; 391 + if (!drv_data->input) { 392 + dev_info(&fn->dev, "F30: no input device found, ignoring\n"); 393 + return -ENXIO; 394 + } 346 395 347 - rc = rmi_f30_register_device(fn); 348 - if (rc < 0) 349 - goto error_exit; 396 + f30 = devm_kzalloc(&fn->dev, sizeof(*f30), GFP_KERNEL); 397 + if (!f30) 398 + return -ENOMEM; 350 399 400 + f30->input = drv_data->input; 401 + 402 + error = rmi_f30_initialize(fn, f30); 403 + if (error) 404 + return error; 405 + 406 + dev_set_drvdata(&fn->dev, f30); 351 407 return 0; 352 - 353 - error_exit: 354 - return rc; 355 - 356 408 } 357 409 358 410 struct rmi_function_handler rmi_f30_handler = {