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

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input

Pull input subsystem updates from Dmitry Torokhov:

- updated support for Synaptics RMI4 devices, including support for
SMBus controllers, firmware update support, sensor tuning, and PS/2
guest support

- ALPS driver now supports tracksticks on SS5 controllers

- i8042 now uses chassis info to skip selftest on Asus laptops as list
of individual models became too unwieldy

- miscellaneous fixes to other drivers

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (67 commits)
Input: imx6ul_tsc - generalize the averaging property
Input: drv260x - use generic device properties
Input: drv260x - use temporary for &client->dev
Input: drv260x - fix input device's parent assignment
Input: synaptics-rmi4 - add support for F34 V7 bootloader
Input: drv260x - fix initializing overdrive voltage
Input: ALPS - fix protcol -> protocol
Input: i8042 - comment #else/#endif of CONFIG_PNP
Input: lpc32xx-keys - fix invalid error handling of a requested irq
Input: synaptics-rmi4 - fix debug for sensor clip
Input: synaptics-rmi4 - store the attn data in the driver
Input: synaptics-rmi4 - allow to add attention data
Input: synaptics-rmi4 - f03 - grab data passed by transport device
Input: synaptics-rmi4 - add support for F03
Input: imx6ul_tsc - convert int to u32
Input: imx6ul_tsc - add mask when set REG_ADC_CFG
Input: synaptics-rmi4 - have only one struct platform data
Input: synaptics-rmi4 - remove EXPORT_SYMBOL_GPL for internal functions
Input: synaptics-rmi4 - remove mutex calls while updating the firmware
Input: drv2667 - fix misuse of regmap_update_bits
...

+4227 -778
+30 -15
Documentation/devicetree/bindings/input/da9062-onkey.txt
··· 1 - * Dialog DA9062/63 OnKey Module 1 + * Dialog DA9061/62/63 OnKey Module 2 2 3 - This module is part of the DA9062/DA9063. For more details about entire 4 - chips see Documentation/devicetree/bindings/mfd/da9062.txt and 5 - Documentation/devicetree/bindings/mfd/da9063.txt 3 + This module is part of the DA9061/DA9062/DA9063. For more details about entire 4 + DA9062 and DA9061 chips see Documentation/devicetree/bindings/mfd/da9062.txt 5 + For DA9063 see Documentation/devicetree/bindings/mfd/da9063.txt 6 6 7 - This module provides KEY_POWER, KEY_SLEEP and events. 7 + This module provides the KEY_POWER event. 8 8 9 9 Required properties: 10 10 11 - - compatible: should be one of: 12 - dlg,da9062-onkey 13 - dlg,da9063-onkey 11 + - compatible: should be one of the following valid compatible string lines: 12 + "dlg,da9061-onkey", "dlg,da9062-onkey" 13 + "dlg,da9062-onkey" 14 + "dlg,da9063-onkey" 14 15 15 16 Optional properties: 16 17 17 - - dlg,disable-key-power : Disable power-down using a long key-press. If this 18 + - dlg,disable-key-power : Disable power-down using a long key-press. If this 18 19 entry exists the OnKey driver will remove support for the KEY_POWER key 19 - press. If this entry does not exist then by default the key-press 20 - triggered power down is enabled and the OnKey will support both KEY_POWER 21 - and KEY_SLEEP. 20 + press when triggered using a long press of the OnKey. 22 21 23 - Example: 22 + Example: DA9063 24 23 25 - pmic0: da9062@58 { 26 - 24 + pmic0: da9063@58 { 27 25 onkey { 28 26 compatible = "dlg,da9063-onkey"; 29 27 dlg,disable-key-power; 30 28 }; 29 + }; 31 30 31 + Example: DA9062 32 + 33 + pmic0: da9062@58 { 34 + onkey { 35 + compatible = "dlg,da9062-onkey"; 36 + dlg,disable-key-power; 37 + }; 38 + }; 39 + 40 + Example: DA9061 using a fall-back compatible for the DA9062 onkey driver 41 + 42 + pmic0: da9061@58 { 43 + onkey { 44 + compatible = "dlg,da9061-onkey", "dlg,da9062-onkey"; 45 + dlg,disable-key-power; 46 + }; 32 47 };
+3
Documentation/devicetree/bindings/input/touchscreen/imx6ul_tsc.txt
··· 17 17 This value depends on the touch screen. 18 18 - pre-charge-time: the touch screen need some time to precharge. 19 19 This value depends on the touch screen. 20 + - touchscreen-average-samples: Number of data samples which are averaged for 21 + each read. Valid values are 1, 4, 8, 16 and 32. 20 22 21 23 Example: 22 24 tsc: tsc@02040000 { ··· 34 32 xnur-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>; 35 33 measure-delay-time = <0xfff>; 36 34 pre-charge-time = <0xffff>; 35 + touchscreen-average-samples = <32>; 37 36 status = "okay"; 38 37 };
+2
Documentation/devicetree/bindings/input/touchscreen/silead_gsl1680.txt
··· 18 18 - touchscreen-inverted-y : See touchscreen.txt 19 19 - touchscreen-swapped-x-y : See touchscreen.txt 20 20 - silead,max-fingers : maximum number of fingers the touchscreen can detect 21 + - vddio-supply : regulator phandle for controller VDDIO 22 + - avdd-supply : regulator phandle for controller AVDD 21 23 22 24 Example: 23 25
+3
Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt
··· 14 14 - touchscreen-fuzz-pressure : pressure noise value of the absolute input 15 15 device (arbitrary range dependent on the 16 16 controller) 17 + - touchscreen-average-samples : Number of data samples which are averaged 18 + for each read (valid values dependent on the 19 + controller) 17 20 - touchscreen-inverted-x : X axis is inverted (boolean) 18 21 - touchscreen-inverted-y : Y axis is inverted (boolean) 19 22 - touchscreen-swapped-x-y : X and Y axis are swapped (boolean)
+4 -3
drivers/input/joystick/xpad.c
··· 134 134 { 0x045e, 0x02d1, "Microsoft X-Box One pad", 0, XTYPE_XBOXONE }, 135 135 { 0x045e, 0x02dd, "Microsoft X-Box One pad (Firmware 2015)", 0, XTYPE_XBOXONE }, 136 136 { 0x045e, 0x02e3, "Microsoft X-Box One Elite pad", 0, XTYPE_XBOXONE }, 137 + { 0x045e, 0x02ea, "Microsoft X-Box One S pad", 0, XTYPE_XBOXONE }, 137 138 { 0x045e, 0x0291, "Xbox 360 Wireless Receiver (XBOX)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W }, 138 139 { 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W }, 139 140 { 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX }, ··· 1045 1044 packet->data[7] = 0x00; 1046 1045 packet->data[8] = strong / 512; /* left actuator */ 1047 1046 packet->data[9] = weak / 512; /* right actuator */ 1048 - packet->data[10] = 0xFF; 1049 - packet->data[11] = 0x00; 1050 - packet->data[12] = 0x00; 1047 + packet->data[10] = 0xFF; /* on period */ 1048 + packet->data[11] = 0x00; /* off period */ 1049 + packet->data[12] = 0xFF; /* repeat count */ 1051 1050 packet->len = 13; 1052 1051 packet->pending = true; 1053 1052 break;
+105 -85
drivers/input/keyboard/gpio_keys.c
··· 26 26 #include <linux/gpio_keys.h> 27 27 #include <linux/workqueue.h> 28 28 #include <linux/gpio.h> 29 + #include <linux/gpio/consumer.h> 29 30 #include <linux/of.h> 30 - #include <linux/of_platform.h> 31 - #include <linux/of_gpio.h> 32 31 #include <linux/of_irq.h> 33 32 #include <linux/spinlock.h> 34 33 35 34 struct gpio_button_data { 36 35 const struct gpio_keys_button *button; 37 36 struct input_dev *input; 37 + struct gpio_desc *gpiod; 38 38 39 39 struct timer_list release_timer; 40 40 unsigned int release_delay; /* in msecs, for IRQ-only buttons */ ··· 140 140 */ 141 141 disable_irq(bdata->irq); 142 142 143 - if (gpio_is_valid(bdata->button->gpio)) 143 + if (bdata->gpiod) 144 144 cancel_delayed_work_sync(&bdata->work); 145 145 else 146 146 del_timer_sync(&bdata->release_timer); ··· 358 358 const struct gpio_keys_button *button = bdata->button; 359 359 struct input_dev *input = bdata->input; 360 360 unsigned int type = button->type ?: EV_KEY; 361 - int state = gpio_get_value_cansleep(button->gpio); 361 + int state; 362 362 363 + state = gpiod_get_value_cansleep(bdata->gpiod); 363 364 if (state < 0) { 364 - dev_err(input->dev.parent, "failed to get gpio state\n"); 365 + dev_err(input->dev.parent, 366 + "failed to get gpio state: %d\n", state); 365 367 return; 366 368 } 367 369 368 - state = (state ? 1 : 0) ^ button->active_low; 369 370 if (type == EV_ABS) { 370 371 if (state) 371 372 input_event(input, type, button->code, button->value); 372 373 } else { 373 - input_event(input, type, button->code, !!state); 374 + input_event(input, type, button->code, state); 374 375 } 375 376 input_sync(input); 376 377 } ··· 457 456 { 458 457 struct gpio_button_data *bdata = data; 459 458 460 - if (gpio_is_valid(bdata->button->gpio)) 459 + if (bdata->gpiod) 461 460 cancel_delayed_work_sync(&bdata->work); 462 461 else 463 462 del_timer_sync(&bdata->release_timer); ··· 466 465 static int gpio_keys_setup_key(struct platform_device *pdev, 467 466 struct input_dev *input, 468 467 struct gpio_button_data *bdata, 469 - const struct gpio_keys_button *button) 468 + const struct gpio_keys_button *button, 469 + struct fwnode_handle *child) 470 470 { 471 471 const char *desc = button->desc ? button->desc : "gpio_keys"; 472 472 struct device *dev = &pdev->dev; ··· 480 478 bdata->button = button; 481 479 spin_lock_init(&bdata->lock); 482 480 483 - if (gpio_is_valid(button->gpio)) { 481 + if (child) { 482 + bdata->gpiod = devm_get_gpiod_from_child(dev, NULL, child); 483 + if (IS_ERR(bdata->gpiod)) { 484 + error = PTR_ERR(bdata->gpiod); 485 + if (error == -ENOENT) { 486 + /* 487 + * GPIO is optional, we may be dealing with 488 + * purely interrupt-driven setup. 489 + */ 490 + bdata->gpiod = NULL; 491 + } else { 492 + if (error != -EPROBE_DEFER) 493 + dev_err(dev, "failed to get gpio: %d\n", 494 + error); 495 + return error; 496 + } 497 + } else { 498 + error = gpiod_direction_input(bdata->gpiod); 499 + if (error) { 500 + dev_err(dev, "Failed to configure GPIO %d as input: %d\n", 501 + desc_to_gpio(bdata->gpiod), error); 502 + return error; 503 + } 504 + } 505 + } else if (gpio_is_valid(button->gpio)) { 506 + /* 507 + * Legacy GPIO number, so request the GPIO here and 508 + * convert it to descriptor. 509 + */ 510 + unsigned flags = GPIOF_IN; 484 511 485 - error = devm_gpio_request_one(&pdev->dev, button->gpio, 486 - GPIOF_IN, desc); 512 + if (button->active_low) 513 + flags |= GPIOF_ACTIVE_LOW; 514 + 515 + error = devm_gpio_request_one(&pdev->dev, button->gpio, flags, 516 + desc); 487 517 if (error < 0) { 488 518 dev_err(dev, "Failed to request GPIO %d, error %d\n", 489 519 button->gpio, error); 490 520 return error; 491 521 } 492 522 523 + bdata->gpiod = gpio_to_desc(button->gpio); 524 + if (!bdata->gpiod) 525 + return -EINVAL; 526 + } 527 + 528 + if (bdata->gpiod) { 493 529 if (button->debounce_interval) { 494 - error = gpio_set_debounce(button->gpio, 530 + error = gpiod_set_debounce(bdata->gpiod, 495 531 button->debounce_interval * 1000); 496 532 /* use timer if gpiolib doesn't provide debounce */ 497 533 if (error < 0) ··· 540 500 if (button->irq) { 541 501 bdata->irq = button->irq; 542 502 } else { 543 - irq = gpio_to_irq(button->gpio); 503 + irq = gpiod_to_irq(bdata->gpiod); 544 504 if (irq < 0) { 545 505 error = irq; 546 506 dev_err(dev, ··· 558 518 559 519 } else { 560 520 if (!button->irq) { 561 - dev_err(dev, "No IRQ specified\n"); 521 + dev_err(dev, "Found button without gpio or irq\n"); 562 522 return -EINVAL; 563 523 } 524 + 564 525 bdata->irq = button->irq; 565 526 566 527 if (button->type && button->type != EV_KEY) { ··· 616 575 617 576 for (i = 0; i < ddata->pdata->nbuttons; i++) { 618 577 struct gpio_button_data *bdata = &ddata->data[i]; 619 - if (gpio_is_valid(bdata->button->gpio)) 578 + if (bdata->gpiod) 620 579 gpio_keys_gpio_report_event(bdata); 621 580 } 622 581 input_sync(input); ··· 653 612 * Handlers for alternative sources of platform_data 654 613 */ 655 614 656 - #ifdef CONFIG_OF 657 615 /* 658 - * Translate OpenFirmware node properties into platform_data 616 + * Translate properties into platform_data 659 617 */ 660 618 static struct gpio_keys_platform_data * 661 619 gpio_keys_get_devtree_pdata(struct device *dev) 662 620 { 663 - struct device_node *node, *pp; 664 621 struct gpio_keys_platform_data *pdata; 665 622 struct gpio_keys_button *button; 666 - int error; 623 + struct fwnode_handle *child; 667 624 int nbuttons; 668 - int i; 669 625 670 - node = dev->of_node; 671 - if (!node) 672 - return ERR_PTR(-ENODEV); 673 - 674 - nbuttons = of_get_available_child_count(node); 626 + nbuttons = device_get_child_node_count(dev); 675 627 if (nbuttons == 0) 676 628 return ERR_PTR(-ENODEV); 677 629 ··· 674 640 if (!pdata) 675 641 return ERR_PTR(-ENOMEM); 676 642 677 - pdata->buttons = (struct gpio_keys_button *)(pdata + 1); 643 + button = (struct gpio_keys_button *)(pdata + 1); 644 + 645 + pdata->buttons = button; 678 646 pdata->nbuttons = nbuttons; 679 647 680 - pdata->rep = !!of_get_property(node, "autorepeat", NULL); 648 + pdata->rep = device_property_read_bool(dev, "autorepeat"); 681 649 682 - of_property_read_string(node, "label", &pdata->name); 650 + device_property_read_string(dev, "label", &pdata->name); 683 651 684 - i = 0; 685 - for_each_available_child_of_node(node, pp) { 686 - enum of_gpio_flags flags; 652 + device_for_each_child_node(dev, child) { 653 + if (is_of_node(child)) 654 + button->irq = 655 + irq_of_parse_and_map(to_of_node(child), 0); 687 656 688 - button = &pdata->buttons[i++]; 689 - 690 - button->gpio = of_get_gpio_flags(pp, 0, &flags); 691 - if (button->gpio < 0) { 692 - error = button->gpio; 693 - if (error != -ENOENT) { 694 - if (error != -EPROBE_DEFER) 695 - dev_err(dev, 696 - "Failed to get gpio flags, error: %d\n", 697 - error); 698 - return ERR_PTR(error); 699 - } 700 - } else { 701 - button->active_low = flags & OF_GPIO_ACTIVE_LOW; 702 - } 703 - 704 - button->irq = irq_of_parse_and_map(pp, 0); 705 - 706 - if (!gpio_is_valid(button->gpio) && !button->irq) { 707 - dev_err(dev, "Found button without gpios or irqs\n"); 657 + if (fwnode_property_read_u32(child, "linux,code", 658 + &button->code)) { 659 + dev_err(dev, "Button without keycode\n"); 660 + fwnode_handle_put(child); 708 661 return ERR_PTR(-EINVAL); 709 662 } 710 663 711 - if (of_property_read_u32(pp, "linux,code", &button->code)) { 712 - dev_err(dev, "Button without keycode: 0x%x\n", 713 - button->gpio); 714 - return ERR_PTR(-EINVAL); 715 - } 664 + fwnode_property_read_string(child, "label", &button->desc); 716 665 717 - button->desc = of_get_property(pp, "label", NULL); 718 - 719 - if (of_property_read_u32(pp, "linux,input-type", &button->type)) 666 + if (fwnode_property_read_u32(child, "linux,input-type", 667 + &button->type)) 720 668 button->type = EV_KEY; 721 669 722 - button->wakeup = of_property_read_bool(pp, "wakeup-source") || 723 - /* legacy name */ 724 - of_property_read_bool(pp, "gpio-key,wakeup"); 670 + button->wakeup = 671 + fwnode_property_read_bool(child, "wakeup-source") || 672 + /* legacy name */ 673 + fwnode_property_read_bool(child, "gpio-key,wakeup"); 725 674 726 - button->can_disable = !!of_get_property(pp, "linux,can-disable", NULL); 675 + button->can_disable = 676 + fwnode_property_read_bool(child, "linux,can-disable"); 727 677 728 - if (of_property_read_u32(pp, "debounce-interval", 678 + if (fwnode_property_read_u32(child, "debounce-interval", 729 679 &button->debounce_interval)) 730 680 button->debounce_interval = 5; 731 - } 732 681 733 - if (pdata->nbuttons == 0) 734 - return ERR_PTR(-EINVAL); 682 + button++; 683 + } 735 684 736 685 return pdata; 737 686 } ··· 725 708 }; 726 709 MODULE_DEVICE_TABLE(of, gpio_keys_of_match); 727 710 728 - #else 729 - 730 - static inline struct gpio_keys_platform_data * 731 - gpio_keys_get_devtree_pdata(struct device *dev) 732 - { 733 - return ERR_PTR(-ENODEV); 734 - } 735 - 736 - #endif 737 - 738 711 static int gpio_keys_probe(struct platform_device *pdev) 739 712 { 740 713 struct device *dev = &pdev->dev; 741 714 const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev); 715 + struct fwnode_handle *child = NULL; 742 716 struct gpio_keys_drvdata *ddata; 743 717 struct input_dev *input; 744 718 size_t size; ··· 782 774 const struct gpio_keys_button *button = &pdata->buttons[i]; 783 775 struct gpio_button_data *bdata = &ddata->data[i]; 784 776 785 - error = gpio_keys_setup_key(pdev, input, bdata, button); 786 - if (error) 777 + if (!dev_get_platdata(dev)) { 778 + child = device_get_next_child_node(&pdev->dev, child); 779 + if (!child) { 780 + dev_err(&pdev->dev, 781 + "missing child device node for entry %d\n", 782 + i); 783 + return -EINVAL; 784 + } 785 + } 786 + 787 + error = gpio_keys_setup_key(pdev, input, bdata, button, child); 788 + if (error) { 789 + fwnode_handle_put(child); 787 790 return error; 791 + } 788 792 789 793 if (button->wakeup) 790 794 wakeup = 1; 791 795 } 796 + 797 + fwnode_handle_put(child); 792 798 793 799 error = sysfs_create_group(&pdev->dev.kobj, &gpio_keys_attr_group); 794 800 if (error) { ··· 836 814 return 0; 837 815 } 838 816 839 - #ifdef CONFIG_PM_SLEEP 840 - static int gpio_keys_suspend(struct device *dev) 817 + static int __maybe_unused gpio_keys_suspend(struct device *dev) 841 818 { 842 819 struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); 843 820 struct input_dev *input = ddata->input; ··· 858 837 return 0; 859 838 } 860 839 861 - static int gpio_keys_resume(struct device *dev) 840 + static int __maybe_unused gpio_keys_resume(struct device *dev) 862 841 { 863 842 struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); 864 843 struct input_dev *input = ddata->input; ··· 884 863 gpio_keys_report_state(ddata); 885 864 return 0; 886 865 } 887 - #endif 888 866 889 867 static SIMPLE_DEV_PM_OPS(gpio_keys_pm_ops, gpio_keys_suspend, gpio_keys_resume); 890 868 ··· 893 873 .driver = { 894 874 .name = "gpio-keys", 895 875 .pm = &gpio_keys_pm_ops, 896 - .of_match_table = of_match_ptr(gpio_keys_of_match), 876 + .of_match_table = gpio_keys_of_match, 897 877 } 898 878 }; 899 879
+73 -55
drivers/input/keyboard/gpio_keys_polled.c
··· 30 30 #define DRV_NAME "gpio-keys-polled" 31 31 32 32 struct gpio_keys_button_data { 33 + struct gpio_desc *gpiod; 33 34 int last_state; 34 35 int count; 35 36 int threshold; 36 - int can_sleep; 37 37 }; 38 38 39 39 struct gpio_keys_polled_dev { ··· 46 46 }; 47 47 48 48 static void gpio_keys_button_event(struct input_polled_dev *dev, 49 - struct gpio_keys_button *button, 49 + const struct gpio_keys_button *button, 50 50 int state) 51 51 { 52 52 struct gpio_keys_polled_dev *bdev = dev->private; ··· 70 70 } 71 71 72 72 static void gpio_keys_polled_check_state(struct input_polled_dev *dev, 73 - struct gpio_keys_button *button, 73 + const struct gpio_keys_button *button, 74 74 struct gpio_keys_button_data *bdata) 75 75 { 76 76 int state; 77 77 78 - if (bdata->can_sleep) 79 - state = !!gpiod_get_value_cansleep(button->gpiod); 80 - else 81 - state = !!gpiod_get_value(button->gpiod); 78 + state = gpiod_get_value_cansleep(bdata->gpiod); 79 + if (state < 0) { 80 + dev_err(dev->input->dev.parent, 81 + "failed to get gpio state: %d\n", state); 82 + } else { 83 + gpio_keys_button_event(dev, button, state); 82 84 83 - gpio_keys_button_event(dev, button, state); 84 - 85 - if (state != bdata->last_state) { 86 - bdata->count = 0; 87 - bdata->last_state = state; 85 + if (state != bdata->last_state) { 86 + bdata->count = 0; 87 + bdata->last_state = state; 88 + } 88 89 } 89 90 } 90 91 ··· 143 142 pdata->disable(bdev->dev); 144 143 } 145 144 146 - static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct device *dev) 145 + static struct gpio_keys_platform_data * 146 + gpio_keys_polled_get_devtree_pdata(struct device *dev) 147 147 { 148 148 struct gpio_keys_platform_data *pdata; 149 149 struct gpio_keys_button *button; 150 150 struct fwnode_handle *child; 151 - int error; 152 151 int nbuttons; 153 152 154 153 nbuttons = device_get_child_node_count(dev); 155 154 if (nbuttons == 0) 156 - return NULL; 155 + return ERR_PTR(-EINVAL); 157 156 158 157 pdata = devm_kzalloc(dev, sizeof(*pdata) + nbuttons * sizeof(*button), 159 158 GFP_KERNEL); 160 159 if (!pdata) 161 160 return ERR_PTR(-ENOMEM); 162 161 163 - pdata->buttons = (struct gpio_keys_button *)(pdata + 1); 162 + button = (struct gpio_keys_button *)(pdata + 1); 163 + 164 + pdata->buttons = button; 165 + pdata->nbuttons = nbuttons; 164 166 165 167 pdata->rep = device_property_present(dev, "autorepeat"); 166 168 device_property_read_u32(dev, "poll-interval", &pdata->poll_interval); 167 169 168 170 device_for_each_child_node(dev, child) { 169 - struct gpio_desc *desc; 170 - 171 - desc = devm_get_gpiod_from_child(dev, NULL, child); 172 - if (IS_ERR(desc)) { 173 - error = PTR_ERR(desc); 174 - if (error != -EPROBE_DEFER) 175 - dev_err(dev, 176 - "Failed to get gpio flags, error: %d\n", 177 - error); 178 - fwnode_handle_put(child); 179 - return ERR_PTR(error); 180 - } 181 - 182 - button = &pdata->buttons[pdata->nbuttons++]; 183 - button->gpiod = desc; 184 - 185 - if (fwnode_property_read_u32(child, "linux,code", &button->code)) { 186 - dev_err(dev, "Button without keycode: %d\n", 187 - pdata->nbuttons - 1); 171 + if (fwnode_property_read_u32(child, "linux,code", 172 + &button->code)) { 173 + dev_err(dev, "button without keycode\n"); 188 174 fwnode_handle_put(child); 189 175 return ERR_PTR(-EINVAL); 190 176 } ··· 194 206 if (fwnode_property_read_u32(child, "debounce-interval", 195 207 &button->debounce_interval)) 196 208 button->debounce_interval = 5; 197 - } 198 209 199 - if (pdata->nbuttons == 0) 200 - return ERR_PTR(-EINVAL); 210 + button++; 211 + } 201 212 202 213 return pdata; 203 214 } ··· 207 220 int i, min = 0, max = 0; 208 221 209 222 for (i = 0; i < pdata->nbuttons; i++) { 210 - struct gpio_keys_button *button = &pdata->buttons[i]; 223 + const struct gpio_keys_button *button = &pdata->buttons[i]; 211 224 212 225 if (button->type != EV_ABS || button->code != code) 213 226 continue; ··· 217 230 if (button->value > max) 218 231 max = button->value; 219 232 } 233 + 220 234 input_set_abs_params(input, code, min, max, 0, 0); 221 235 } 222 236 ··· 230 242 static int gpio_keys_polled_probe(struct platform_device *pdev) 231 243 { 232 244 struct device *dev = &pdev->dev; 245 + struct fwnode_handle *child = NULL; 233 246 const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev); 234 247 struct gpio_keys_polled_dev *bdev; 235 248 struct input_polled_dev *poll_dev; ··· 243 254 pdata = gpio_keys_polled_get_devtree_pdata(dev); 244 255 if (IS_ERR(pdata)) 245 256 return PTR_ERR(pdata); 246 - if (!pdata) { 247 - dev_err(dev, "missing platform data\n"); 248 - return -EINVAL; 249 - } 250 257 } 251 258 252 259 if (!pdata->poll_interval) { ··· 285 300 __set_bit(EV_REP, input->evbit); 286 301 287 302 for (i = 0; i < pdata->nbuttons; i++) { 288 - struct gpio_keys_button *button = &pdata->buttons[i]; 303 + const struct gpio_keys_button *button = &pdata->buttons[i]; 289 304 struct gpio_keys_button_data *bdata = &bdev->data[i]; 290 305 unsigned int type = button->type ?: EV_KEY; 291 306 292 307 if (button->wakeup) { 293 308 dev_err(dev, DRV_NAME " does not support wakeup\n"); 309 + fwnode_handle_put(child); 294 310 return -EINVAL; 295 311 } 296 312 297 - /* 298 - * Legacy GPIO number so request the GPIO here and 299 - * convert it to descriptor. 300 - */ 301 - if (!button->gpiod && gpio_is_valid(button->gpio)) { 313 + if (!dev_get_platdata(dev)) { 314 + /* No legacy static platform data */ 315 + child = device_get_next_child_node(dev, child); 316 + if (!child) { 317 + dev_err(dev, "missing child device node\n"); 318 + return -EINVAL; 319 + } 320 + 321 + bdata->gpiod = devm_get_gpiod_from_child(dev, NULL, 322 + child); 323 + if (IS_ERR(bdata->gpiod)) { 324 + error = PTR_ERR(bdata->gpiod); 325 + if (error != -EPROBE_DEFER) 326 + dev_err(dev, 327 + "failed to get gpio: %d\n", 328 + error); 329 + fwnode_handle_put(child); 330 + return error; 331 + } 332 + 333 + error = gpiod_direction_input(bdata->gpiod); 334 + if (error) { 335 + dev_err(dev, "Failed to configure GPIO %d as input: %d\n", 336 + desc_to_gpio(bdata->gpiod), error); 337 + fwnode_handle_put(child); 338 + return error; 339 + } 340 + } else if (gpio_is_valid(button->gpio)) { 341 + /* 342 + * Legacy GPIO number so request the GPIO here and 343 + * convert it to descriptor. 344 + */ 302 345 unsigned flags = GPIOF_IN; 303 346 304 347 if (button->active_low) ··· 335 322 error = devm_gpio_request_one(&pdev->dev, button->gpio, 336 323 flags, button->desc ? : DRV_NAME); 337 324 if (error) { 338 - dev_err(dev, "unable to claim gpio %u, err=%d\n", 325 + dev_err(dev, 326 + "unable to claim gpio %u, err=%d\n", 339 327 button->gpio, error); 340 328 return error; 341 329 } 342 330 343 - button->gpiod = gpio_to_desc(button->gpio); 331 + bdata->gpiod = gpio_to_desc(button->gpio); 332 + if (!bdata->gpiod) { 333 + dev_err(dev, 334 + "unable to convert gpio %u to descriptor\n", 335 + button->gpio); 336 + return -EINVAL; 337 + } 344 338 } 345 339 346 - if (IS_ERR(button->gpiod)) 347 - return PTR_ERR(button->gpiod); 348 - 349 - bdata->can_sleep = gpiod_cansleep(button->gpiod); 350 340 bdata->last_state = -1; 351 341 bdata->threshold = DIV_ROUND_UP(button->debounce_interval, 352 342 pdata->poll_interval); ··· 359 343 gpio_keys_polled_set_abs_params(input, pdata, 360 344 button->code); 361 345 } 346 + 347 + fwnode_handle_put(child); 362 348 363 349 bdev->poll_dev = poll_dev; 364 350 bdev->dev = dev;
+1 -1
drivers/input/keyboard/lpc32xx-keys.c
··· 182 182 } 183 183 184 184 irq = platform_get_irq(pdev, 0); 185 - if (irq < 0 || irq >= NR_IRQS) { 185 + if (irq < 0) { 186 186 dev_err(&pdev->dev, "failed to get platform irq\n"); 187 187 return -EINVAL; 188 188 }
+1 -1
drivers/input/keyboard/pxa27x_keypad.c
··· 316 316 error = of_property_read_u32(np, "marvell,debounce-interval", 317 317 &pdata->debounce_interval); 318 318 if (error) { 319 - dev_err(dev, "failed to parse debpunce-interval\n"); 319 + dev_err(dev, "failed to parse debounce-interval\n"); 320 320 return error; 321 321 } 322 322
+12 -9
drivers/input/keyboard/tca8418_keypad.c
··· 164 164 int error, col, row; 165 165 u8 reg, state, code; 166 166 167 - /* Initial read of the key event FIFO */ 168 - error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, &reg); 167 + do { 168 + error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, &reg); 169 + if (error < 0) { 170 + dev_err(&keypad_data->client->dev, 171 + "unable to read REG_KEY_EVENT_A\n"); 172 + break; 173 + } 169 174 170 - /* Assume that key code 0 signifies empty FIFO */ 171 - while (error >= 0 && reg > 0) { 175 + /* Assume that key code 0 signifies empty FIFO */ 176 + if (reg <= 0) 177 + break; 178 + 172 179 state = reg & KEY_EVENT_VALUE; 173 180 code = reg & KEY_EVENT_CODE; 174 181 ··· 191 184 192 185 /* Read for next loop */ 193 186 error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, &reg); 194 - } 195 - 196 - if (error < 0) 197 - dev_err(&keypad_data->client->dev, 198 - "unable to read REG_KEY_EVENT_A\n"); 187 + } while (1); 199 188 200 189 input_sync(input); 201 190 }
+4 -3
drivers/input/misc/Kconfig
··· 625 625 will be called da9055_onkey. 626 626 627 627 config INPUT_DA9063_ONKEY 628 - tristate "Dialog DA9062/63 OnKey" 628 + tristate "Dialog DA9063/62/61 OnKey" 629 629 depends on MFD_DA9063 || MFD_DA9062 630 630 help 631 - Support the ONKEY of Dialog DA9063 and DA9062 Power Management ICs 632 - as an input device capable of reporting the power button status. 631 + Support the ONKEY of Dialog DA9063, DA9062 and DA9061 Power 632 + Management ICs as an input device capable of reporting the 633 + power button status. 633 634 634 635 To compile this driver as a module, choose M here: the module 635 636 will be called da9063_onkey.
+8 -1
drivers/input/misc/bma150.c
··· 538 538 return -EIO; 539 539 } 540 540 541 + /* 542 + * Note if the IIO CONFIG_BMA180 driver is enabled we want to fail 543 + * the probe for the bma180 as the iio driver is preferred. 544 + */ 541 545 chip_id = i2c_smbus_read_byte_data(client, BMA150_CHIP_ID_REG); 542 - if (chip_id != BMA150_CHIP_ID && chip_id != BMA180_CHIP_ID) { 546 + if (chip_id != BMA150_CHIP_ID && 547 + (IS_ENABLED(CONFIG_BMA180) || chip_id != BMA180_CHIP_ID)) { 543 548 dev_err(&client->dev, "BMA150 chip id error: %d\n", chip_id); 544 549 return -EINVAL; 545 550 } ··· 648 643 649 644 static const struct i2c_device_id bma150_id[] = { 650 645 { "bma150", 0 }, 646 + #if !IS_ENABLED(CONFIG_BMA180) 651 647 { "bma180", 0 }, 648 + #endif 652 649 { "smb380", 0 }, 653 650 { "bma023", 0 }, 654 651 { }
+5 -4
drivers/input/misc/da9063_onkey.c
··· 1 1 /* 2 - * OnKey device driver for DA9063 and DA9062 PMICs 2 + * OnKey device driver for DA9063, DA9062 and DA9061 PMICs 3 3 * Copyright (C) 2015 Dialog Semiconductor Ltd. 4 4 * 5 5 * This program is free software; you can redistribute it and/or ··· 87 87 { .compatible = "dlg,da9062-onkey", .data = &da9062_regs }, 88 88 { }, 89 89 }; 90 + MODULE_DEVICE_TABLE(of, da9063_compatible_reg_id_table); 90 91 91 92 static void da9063_poll_on(struct work_struct *work) 92 93 { ··· 150 149 * and then send shutdown command 151 150 */ 152 151 dev_dbg(&onkey->input->dev, 153 - "Sending SHUTDOWN to DA9063 ...\n"); 152 + "Sending SHUTDOWN to PMIC ...\n"); 154 153 error = regmap_write(onkey->regmap, 155 154 config->onkey_shutdown, 156 155 config->onkey_shutdown_mask); 157 156 if (error) 158 157 dev_err(&onkey->input->dev, 159 - "Cannot SHUTDOWN DA9063: %d\n", 158 + "Cannot SHUTDOWN PMIC: %d\n", 160 159 error); 161 160 } 162 161 } ··· 301 300 module_platform_driver(da9063_onkey_driver); 302 301 303 302 MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>"); 304 - MODULE_DESCRIPTION("Onkey device driver for Dialog DA9063 and DA9062"); 303 + MODULE_DESCRIPTION("Onkey device driver for Dialog DA9063, DA9062 and DA9061"); 305 304 MODULE_LICENSE("GPL"); 306 305 MODULE_ALIAS("platform:" DA9063_DRVNAME_ONKEY);
+33 -86
drivers/input/misc/drv260x.c
··· 18 18 #include <linux/i2c.h> 19 19 #include <linux/input.h> 20 20 #include <linux/module.h> 21 - #include <linux/of_gpio.h> 22 - #include <linux/platform_device.h> 23 21 #include <linux/regmap.h> 24 22 #include <linux/slab.h> 25 23 #include <linux/delay.h> ··· 25 27 #include <linux/regulator/consumer.h> 26 28 27 29 #include <dt-bindings/input/ti-drv260x.h> 28 - #include <linux/platform_data/drv260x-pdata.h> 29 30 30 31 #define DRV260X_STATUS 0x0 31 32 #define DRV260X_MODE 0x1 ··· 465 468 .cache_type = REGCACHE_NONE, 466 469 }; 467 470 468 - #ifdef CONFIG_OF 469 - static int drv260x_parse_dt(struct device *dev, 470 - struct drv260x_data *haptics) 471 - { 472 - struct device_node *np = dev->of_node; 473 - unsigned int voltage; 474 - int error; 475 - 476 - error = of_property_read_u32(np, "mode", &haptics->mode); 477 - if (error) { 478 - dev_err(dev, "%s: No entry for mode\n", __func__); 479 - return error; 480 - } 481 - 482 - error = of_property_read_u32(np, "library-sel", &haptics->library); 483 - if (error) { 484 - dev_err(dev, "%s: No entry for library selection\n", 485 - __func__); 486 - return error; 487 - } 488 - 489 - error = of_property_read_u32(np, "vib-rated-mv", &voltage); 490 - if (!error) 491 - haptics->rated_voltage = drv260x_calculate_voltage(voltage); 492 - 493 - 494 - error = of_property_read_u32(np, "vib-overdrive-mv", &voltage); 495 - if (!error) 496 - haptics->overdrive_voltage = drv260x_calculate_voltage(voltage); 497 - 498 - return 0; 499 - } 500 - #else 501 - static inline int drv260x_parse_dt(struct device *dev, 502 - struct drv260x_data *haptics) 503 - { 504 - dev_err(dev, "no platform data defined\n"); 505 - 506 - return -EINVAL; 507 - } 508 - #endif 509 - 510 471 static int drv260x_probe(struct i2c_client *client, 511 472 const struct i2c_device_id *id) 512 473 { 513 - const struct drv260x_platform_data *pdata = dev_get_platdata(&client->dev); 474 + struct device *dev = &client->dev; 514 475 struct drv260x_data *haptics; 476 + u32 voltage; 515 477 int error; 516 478 517 - haptics = devm_kzalloc(&client->dev, sizeof(*haptics), GFP_KERNEL); 479 + haptics = devm_kzalloc(dev, sizeof(*haptics), GFP_KERNEL); 518 480 if (!haptics) 519 481 return -ENOMEM; 520 482 521 - haptics->rated_voltage = DRV260X_DEF_OD_CLAMP_VOLT; 522 - haptics->rated_voltage = DRV260X_DEF_RATED_VOLT; 523 - 524 - if (pdata) { 525 - haptics->mode = pdata->mode; 526 - haptics->library = pdata->library_selection; 527 - if (pdata->vib_overdrive_voltage) 528 - haptics->overdrive_voltage = drv260x_calculate_voltage(pdata->vib_overdrive_voltage); 529 - if (pdata->vib_rated_voltage) 530 - haptics->rated_voltage = drv260x_calculate_voltage(pdata->vib_rated_voltage); 531 - } else if (client->dev.of_node) { 532 - error = drv260x_parse_dt(&client->dev, haptics); 533 - if (error) 534 - return error; 535 - } else { 536 - dev_err(&client->dev, "Platform data not set\n"); 537 - return -ENODEV; 483 + error = device_property_read_u32(dev, "mode", &haptics->mode); 484 + if (error) { 485 + dev_err(dev, "Can't fetch 'mode' property: %d\n", error); 486 + return error; 538 487 } 539 - 540 488 541 489 if (haptics->mode < DRV260X_LRA_MODE || 542 490 haptics->mode > DRV260X_ERM_MODE) { 543 - dev_err(&client->dev, 544 - "Vibrator mode is invalid: %i\n", 545 - haptics->mode); 491 + dev_err(dev, "Vibrator mode is invalid: %i\n", haptics->mode); 546 492 return -EINVAL; 493 + } 494 + 495 + error = device_property_read_u32(dev, "library-sel", &haptics->library); 496 + if (error) { 497 + dev_err(dev, "Can't fetch 'library-sel' property: %d\n", error); 498 + return error; 547 499 } 548 500 549 501 if (haptics->library < DRV260X_LIB_EMPTY || 550 502 haptics->library > DRV260X_ERM_LIB_F) { 551 - dev_err(&client->dev, 503 + dev_err(dev, 552 504 "Library value is invalid: %i\n", haptics->library); 553 505 return -EINVAL; 554 506 } ··· 505 559 if (haptics->mode == DRV260X_LRA_MODE && 506 560 haptics->library != DRV260X_LIB_EMPTY && 507 561 haptics->library != DRV260X_LIB_LRA) { 508 - dev_err(&client->dev, 509 - "LRA Mode with ERM Library mismatch\n"); 562 + dev_err(dev, "LRA Mode with ERM Library mismatch\n"); 510 563 return -EINVAL; 511 564 } 512 565 513 566 if (haptics->mode == DRV260X_ERM_MODE && 514 567 (haptics->library == DRV260X_LIB_EMPTY || 515 568 haptics->library == DRV260X_LIB_LRA)) { 516 - dev_err(&client->dev, 517 - "ERM Mode with LRA Library mismatch\n"); 569 + dev_err(dev, "ERM Mode with LRA Library mismatch\n"); 518 570 return -EINVAL; 519 571 } 520 572 521 - haptics->regulator = devm_regulator_get(&client->dev, "vbat"); 573 + error = device_property_read_u32(dev, "vib-rated-mv", &voltage); 574 + haptics->rated_voltage = error ? DRV260X_DEF_RATED_VOLT : 575 + drv260x_calculate_voltage(voltage); 576 + 577 + error = device_property_read_u32(dev, "vib-overdrive-mv", &voltage); 578 + haptics->overdrive_voltage = error ? DRV260X_DEF_OD_CLAMP_VOLT : 579 + drv260x_calculate_voltage(voltage); 580 + 581 + haptics->regulator = devm_regulator_get(dev, "vbat"); 522 582 if (IS_ERR(haptics->regulator)) { 523 583 error = PTR_ERR(haptics->regulator); 524 - dev_err(&client->dev, 525 - "unable to get regulator, error: %d\n", error); 584 + dev_err(dev, "unable to get regulator, error: %d\n", error); 526 585 return error; 527 586 } 528 587 529 - haptics->enable_gpio = devm_gpiod_get_optional(&client->dev, "enable", 588 + haptics->enable_gpio = devm_gpiod_get_optional(dev, "enable", 530 589 GPIOD_OUT_HIGH); 531 590 if (IS_ERR(haptics->enable_gpio)) 532 591 return PTR_ERR(haptics->enable_gpio); 533 592 534 - haptics->input_dev = devm_input_allocate_device(&client->dev); 593 + haptics->input_dev = devm_input_allocate_device(dev); 535 594 if (!haptics->input_dev) { 536 595 dev_err(&client->dev, "Failed to allocate input device\n"); 537 596 return -ENOMEM; 538 597 } 539 598 540 599 haptics->input_dev->name = "drv260x:haptics"; 541 - haptics->input_dev->dev.parent = client->dev.parent; 542 600 haptics->input_dev->close = drv260x_close; 543 601 input_set_drvdata(haptics->input_dev, haptics); 544 602 input_set_capability(haptics->input_dev, EV_FF, FF_RUMBLE); ··· 550 600 error = input_ff_create_memless(haptics->input_dev, NULL, 551 601 drv260x_haptics_play); 552 602 if (error) { 553 - dev_err(&client->dev, "input_ff_create() failed: %d\n", 554 - error); 603 + dev_err(dev, "input_ff_create() failed: %d\n", error); 555 604 return error; 556 605 } 557 606 ··· 562 613 haptics->regmap = devm_regmap_init_i2c(client, &drv260x_regmap_config); 563 614 if (IS_ERR(haptics->regmap)) { 564 615 error = PTR_ERR(haptics->regmap); 565 - dev_err(&client->dev, "Failed to allocate register map: %d\n", 566 - error); 616 + dev_err(dev, "Failed to allocate register map: %d\n", error); 567 617 return error; 568 618 } 569 619 570 620 error = drv260x_init(haptics); 571 621 if (error) { 572 - dev_err(&client->dev, "Device init failed: %d\n", error); 622 + dev_err(dev, "Device init failed: %d\n", error); 573 623 return error; 574 624 } 575 625 576 626 error = input_register_device(haptics->input_dev); 577 627 if (error) { 578 - dev_err(&client->dev, "couldn't register input device: %d\n", 579 - error); 628 + dev_err(dev, "couldn't register input device: %d\n", error); 580 629 return error; 581 630 } 582 631
+3 -3
drivers/input/misc/drv2665.c
··· 125 125 126 126 cancel_work_sync(&haptics->work); 127 127 128 - error = regmap_update_bits(haptics->regmap, 129 - DRV2665_CTRL_2, DRV2665_STANDBY, 1); 128 + error = regmap_update_bits(haptics->regmap, DRV2665_CTRL_2, 129 + DRV2665_STANDBY, DRV2665_STANDBY); 130 130 if (error) 131 131 dev_err(&haptics->client->dev, 132 132 "Failed to enter standby mode: %d\n", error); ··· 240 240 241 241 if (haptics->input_dev->users) { 242 242 ret = regmap_update_bits(haptics->regmap, DRV2665_CTRL_2, 243 - DRV2665_STANDBY, 1); 243 + DRV2665_STANDBY, DRV2665_STANDBY); 244 244 if (ret) { 245 245 dev_err(dev, "Failed to set standby mode\n"); 246 246 regulator_disable(haptics->regulator);
+2 -2
drivers/input/misc/drv2667.c
··· 256 256 cancel_work_sync(&haptics->work); 257 257 258 258 error = regmap_update_bits(haptics->regmap, DRV2667_CTRL_2, 259 - DRV2667_STANDBY, 1); 259 + DRV2667_STANDBY, DRV2667_STANDBY); 260 260 if (error) 261 261 dev_err(&haptics->client->dev, 262 262 "Failed to enter standby mode: %d\n", error); ··· 415 415 416 416 if (haptics->input_dev->users) { 417 417 ret = regmap_update_bits(haptics->regmap, DRV2667_CTRL_2, 418 - DRV2667_STANDBY, 1); 418 + DRV2667_STANDBY, DRV2667_STANDBY); 419 419 if (ret) { 420 420 dev_err(dev, "Failed to set standby mode\n"); 421 421 regulator_disable(haptics->regulator);
+7 -1
drivers/input/misc/soc_button_array.c
··· 17 17 #include <linux/acpi.h> 18 18 #include <linux/gpio/consumer.h> 19 19 #include <linux/gpio_keys.h> 20 + #include <linux/gpio.h> 20 21 #include <linux/platform_device.h> 21 22 22 23 /* ··· 93 92 continue; 94 93 95 94 gpio = soc_button_lookup_gpio(&pdev->dev, info->acpi_index); 96 - if (gpio < 0) 95 + if (!gpio_is_valid(gpio)) 97 96 continue; 98 97 99 98 gpio_keys[n_buttons].type = info->event_type; ··· 166 165 return -ENODEV; 167 166 168 167 button_info = (struct soc_button_info *)id->driver_data; 168 + 169 + if (gpiod_count(&pdev->dev, KBUILD_MODNAME) <= 0) { 170 + dev_dbg(&pdev->dev, "no GPIO attached, ignoring...\n"); 171 + return -ENODEV; 172 + } 169 173 170 174 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); 171 175 if (!priv)
+31 -25
drivers/input/mouse/alps.c
··· 1153 1153 alps_process_touchpad_packet_v7(psmouse); 1154 1154 } 1155 1155 1156 - static unsigned char alps_get_pkt_id_ss4_v2(unsigned char *byte) 1156 + static enum SS4_PACKET_ID alps_get_pkt_id_ss4_v2(unsigned char *byte) 1157 1157 { 1158 - unsigned char pkt_id = SS4_PACKET_ID_IDLE; 1158 + enum SS4_PACKET_ID pkt_id = SS4_PACKET_ID_IDLE; 1159 1159 1160 1160 switch (byte[3] & 0x30) { 1161 1161 case 0x00: 1162 - if (byte[0] == 0x18 && byte[1] == 0x10 && byte[2] == 0x00 && 1163 - (byte[3] & 0x88) == 0x08 && byte[4] == 0x10 && 1164 - byte[5] == 0x00) { 1162 + if (SS4_IS_IDLE_V2(byte)) { 1165 1163 pkt_id = SS4_PACKET_ID_IDLE; 1166 1164 } else { 1167 1165 pkt_id = SS4_PACKET_ID_ONE; ··· 1186 1188 unsigned char *p, struct psmouse *psmouse) 1187 1189 { 1188 1190 struct alps_data *priv = psmouse->private; 1189 - unsigned char pkt_id; 1191 + enum SS4_PACKET_ID pkt_id; 1190 1192 unsigned int no_data_x, no_data_y; 1191 1193 1192 1194 pkt_id = alps_get_pkt_id_ss4_v2(p); ··· 1265 1267 break; 1266 1268 1267 1269 case SS4_PACKET_ID_STICK: 1268 - if (!(priv->flags & ALPS_DUALPOINT)) { 1269 - psmouse_warn(psmouse, 1270 - "Rejected trackstick packet from non DualPoint device"); 1271 - } else { 1272 - int x = (s8)(((p[0] & 1) << 7) | (p[1] & 0x7f)); 1273 - int y = (s8)(((p[3] & 1) << 7) | (p[2] & 0x7f)); 1274 - int pressure = (s8)(p[4] & 0x7f); 1275 - 1276 - input_report_rel(priv->dev2, REL_X, x); 1277 - input_report_rel(priv->dev2, REL_Y, -y); 1278 - input_report_abs(priv->dev2, ABS_PRESSURE, pressure); 1279 - } 1270 + /* 1271 + * x, y, and pressure are decoded in 1272 + * alps_process_packet_ss4_v2() 1273 + */ 1274 + f->first_mp = 0; 1275 + f->is_mp = 0; 1280 1276 break; 1281 1277 1282 1278 case SS4_PACKET_ID_IDLE: ··· 1338 1346 1339 1347 priv->multi_packet = 0; 1340 1348 1349 + /* Report trackstick */ 1350 + if (alps_get_pkt_id_ss4_v2(packet) == SS4_PACKET_ID_STICK) { 1351 + if (!(priv->flags & ALPS_DUALPOINT)) { 1352 + psmouse_warn(psmouse, 1353 + "Rejected trackstick packet from non DualPoint device"); 1354 + return; 1355 + } 1356 + 1357 + input_report_rel(dev2, REL_X, SS4_TS_X_V2(packet)); 1358 + input_report_rel(dev2, REL_Y, SS4_TS_Y_V2(packet)); 1359 + input_report_abs(dev2, ABS_PRESSURE, SS4_TS_Z_V2(packet)); 1360 + 1361 + input_report_key(dev2, BTN_LEFT, f->ts_left); 1362 + input_report_key(dev2, BTN_RIGHT, f->ts_right); 1363 + input_report_key(dev2, BTN_MIDDLE, f->ts_middle); 1364 + 1365 + input_sync(dev2); 1366 + return; 1367 + } 1368 + 1369 + /* Report touchpad */ 1341 1370 alps_report_mt_data(psmouse, (f->fingers <= 4) ? f->fingers : 4); 1342 1371 1343 1372 input_mt_report_finger_count(dev, f->fingers); ··· 1369 1356 1370 1357 input_report_abs(dev, ABS_PRESSURE, f->pressure); 1371 1358 input_sync(dev); 1372 - 1373 - if (priv->flags & ALPS_DUALPOINT) { 1374 - input_report_key(dev2, BTN_LEFT, f->ts_left); 1375 - input_report_key(dev2, BTN_RIGHT, f->ts_right); 1376 - input_report_key(dev2, BTN_MIDDLE, f->ts_middle); 1377 - input_sync(dev2); 1378 - } 1379 1359 } 1380 1360 1381 1361 static bool alps_is_valid_package_ss4_v2(struct psmouse *psmouse)
+22 -2
drivers/input/mouse/alps.h
··· 54 54 55 55 #define SS4_MASK_NORMAL_BUTTONS 0x07 56 56 57 - #define SS4_1F_X_V2(_b) ((_b[0] & 0x0007) | \ 57 + #define SS4_IS_IDLE_V2(_b) (((_b[0]) == 0x18) && \ 58 + ((_b[1]) == 0x10) && \ 59 + ((_b[2]) == 0x00) && \ 60 + ((_b[3] & 0x88) == 0x08) && \ 61 + ((_b[4]) == 0x10) && \ 62 + ((_b[5]) == 0x00) \ 63 + ) 64 + 65 + #define SS4_1F_X_V2(_b) (((_b[0]) & 0x0007) | \ 58 66 ((_b[1] << 3) & 0x0078) | \ 59 67 ((_b[1] << 2) & 0x0380) | \ 60 68 ((_b[2] << 5) & 0x1C00) \ ··· 109 101 #define SS4_IS_MF_CONTINUE(_b) ((_b[2] & 0x10) == 0x10) 110 102 #define SS4_IS_5F_DETECTED(_b) ((_b[2] & 0x10) == 0x10) 111 103 104 + #define SS4_TS_X_V2(_b) (s8)( \ 105 + ((_b[0] & 0x01) << 7) | \ 106 + (_b[1] & 0x7F) \ 107 + ) 108 + 109 + #define SS4_TS_Y_V2(_b) (s8)( \ 110 + ((_b[3] & 0x01) << 7) | \ 111 + (_b[2] & 0x7F) \ 112 + ) 113 + 114 + #define SS4_TS_Z_V2(_b) (s8)(_b[4] & 0x7F) 115 + 112 116 113 117 #define SS4_MFPACKET_NO_AX 8160 /* X-Coordinate value */ 114 118 #define SS4_MFPACKET_NO_AY 4080 /* Y-Coordinate value */ ··· 166 146 * (aka command mode response) identifies the firmware minor version. This 167 147 * can be used to distinguish different hardware models which are not 168 148 * uniquely identifiable through their E7 responses. 169 - * @protocol_info: information about protcol used by the device. 149 + * @protocol_info: information about protocol used by the device. 170 150 * 171 151 * Many (but not all) ALPS touchpads can be identified by looking at the 172 152 * values returned in the "E7 report" and/or the "EC report." This table
+8 -9
drivers/input/mouse/elan_i2c_core.c
··· 1093 1093 if (error) 1094 1094 return error; 1095 1095 1096 + dev_info(&client->dev, 1097 + "Elan Touchpad: Module ID: 0x%04x, Firmware: 0x%04x, Sample: 0x%04x, IAP: 0x%04x\n", 1098 + data->product_id, 1099 + data->fw_version, 1100 + data->sm_version, 1101 + data->iap_version); 1102 + 1096 1103 dev_dbg(&client->dev, 1097 - "Elan Touchpad Information:\n" 1098 - " Module product ID: 0x%04x\n" 1099 - " Firmware Version: 0x%04x\n" 1100 - " Sample Version: 0x%04x\n" 1101 - " IAP Version: 0x%04x\n" 1104 + "Elan Touchpad Extra Information:\n" 1102 1105 " Max ABS X,Y: %d,%d\n" 1103 1106 " Width X,Y: %d,%d\n" 1104 1107 " Resolution X,Y: %d,%d (dots/mm)\n", 1105 - data->product_id, 1106 - data->fw_version, 1107 - data->sm_version, 1108 - data->iap_version, 1109 1108 data->max_x, data->max_y, 1110 1109 data->width_x, data->width_y, 1111 1110 data->x_res, data->y_res);
+42
drivers/input/rmi4/Kconfig
··· 27 27 28 28 If unsure, say N. 29 29 30 + config RMI4_SMB 31 + tristate "RMI4 SMB Support" 32 + depends on RMI4_CORE && I2C 33 + help 34 + Say Y here if you want to support RMI4 devices connected to an SMB 35 + bus. 36 + 37 + If unsure, say N. 38 + 39 + To compile this driver as a module, choose M here: the module will be 40 + called rmi_smbus. 41 + 42 + config RMI4_F03 43 + bool "RMI4 Function 03 (PS2 Guest)" 44 + depends on RMI4_CORE && SERIO 45 + help 46 + Say Y here if you want to add support for RMI4 function 03. 47 + 48 + Function 03 provides PS2 guest support for RMI4 devices. This 49 + includes support for TrackPoints on TouchPads. 50 + 30 51 config RMI4_2D_SENSOR 31 52 bool 32 53 depends on RMI4_CORE ··· 83 62 Function 30 provides GPIO and LED support for RMI4 devices. This 84 63 includes support for buttons on TouchPads and ClickPads. 85 64 65 + config RMI4_F34 66 + bool "RMI4 Function 34 (Device reflash)" 67 + depends on RMI4_CORE 68 + select FW_LOADER 69 + help 70 + Say Y here if you want to add support for RMI4 function 34. 71 + 72 + Function 34 provides support for upgrading the firmware on the RMI4 73 + device via the firmware loader interface. This is triggered using a 74 + sysfs attribute. 75 + 86 76 config RMI4_F54 87 77 bool "RMI4 Function 54 (Analog diagnostics)" 88 78 depends on RMI4_CORE 89 79 depends on VIDEO_V4L2=y || (RMI4_CORE=m && VIDEO_V4L2=m) 90 80 select VIDEOBUF2_VMALLOC 81 + select RMI4_F55 91 82 help 92 83 Say Y here if you want to add support for RMI4 function 54 93 84 94 85 Function 54 provides access to various diagnostic features in certain 95 86 RMI4 touch sensors. 87 + 88 + config RMI4_F55 89 + bool "RMI4 Function 55 (Sensor tuning)" 90 + depends on RMI4_CORE 91 + help 92 + Say Y here if you want to add support for RMI4 function 55 93 + 94 + Function 55 provides access to the RMI4 touch sensor tuning 95 + mechanism.
+4
drivers/input/rmi4/Makefile
··· 4 4 rmi_core-$(CONFIG_RMI4_2D_SENSOR) += rmi_2d_sensor.o 5 5 6 6 # Function drivers 7 + rmi_core-$(CONFIG_RMI4_F03) += rmi_f03.o 7 8 rmi_core-$(CONFIG_RMI4_F11) += rmi_f11.o 8 9 rmi_core-$(CONFIG_RMI4_F12) += rmi_f12.o 9 10 rmi_core-$(CONFIG_RMI4_F30) += rmi_f30.o 11 + rmi_core-$(CONFIG_RMI4_F34) += rmi_f34.o rmi_f34v7.o 10 12 rmi_core-$(CONFIG_RMI4_F54) += rmi_f54.o 13 + rmi_core-$(CONFIG_RMI4_F55) += rmi_f55.o 11 14 12 15 # Transports 13 16 obj-$(CONFIG_RMI4_I2C) += rmi_i2c.o 14 17 obj-$(CONFIG_RMI4_SPI) += rmi_spi.o 18 + obj-$(CONFIG_RMI4_SMB) += rmi_smbus.o
+6 -4
drivers/input/rmi4/rmi_2d_sensor.c
··· 177 177 sensor->dmax = DMAX * res_x; 178 178 } 179 179 180 - input_set_abs_params(input, ABS_MT_PRESSURE, 0, 0xff, 0, 0); 181 - input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 0x0f, 0, 0); 182 - input_set_abs_params(input, ABS_MT_TOUCH_MINOR, 0, 0x0f, 0, 0); 183 - input_set_abs_params(input, ABS_MT_ORIENTATION, 0, 1, 0, 0); 180 + input_set_abs_params(input, ABS_MT_PRESSURE, 0, 0xff, 0, 0); 181 + input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 0x0f, 0, 0); 182 + input_set_abs_params(input, ABS_MT_TOUCH_MINOR, 0, 0x0f, 0, 0); 183 + input_set_abs_params(input, ABS_MT_ORIENTATION, 0, 1, 0, 0); 184 + input_set_abs_params(input, ABS_MT_TOOL_TYPE, 185 + 0, MT_TOOL_MAX, 0, 0); 184 186 185 187 if (sensor->sensor_type == rmi_sensor_touchpad) 186 188 input_flags = INPUT_MT_POINTER;
+2
drivers/input/rmi4/rmi_2d_sensor.h
··· 67 67 u8 report_rel; 68 68 u8 x_mm; 69 69 u8 y_mm; 70 + enum rmi_reg_state dribble; 71 + enum rmi_reg_state palm_detect; 70 72 }; 71 73 72 74 int rmi_2d_sensor_of_probe(struct device *dev,
+12
drivers/input/rmi4/rmi_bus.c
··· 230 230 231 231 void rmi_unregister_function(struct rmi_function *fn) 232 232 { 233 + rmi_dbg(RMI_DEBUG_CORE, &fn->dev, "Unregistering F%02X.\n", 234 + fn->fd.function_number); 235 + 233 236 device_del(&fn->dev); 234 237 of_node_put(fn->dev.of_node); 235 238 put_device(&fn->dev); ··· 305 302 306 303 static struct rmi_function_handler *fn_handlers[] = { 307 304 &rmi_f01_handler, 305 + #ifdef CONFIG_RMI4_F03 306 + &rmi_f03_handler, 307 + #endif 308 308 #ifdef CONFIG_RMI4_F11 309 309 &rmi_f11_handler, 310 310 #endif ··· 317 311 #ifdef CONFIG_RMI4_F30 318 312 &rmi_f30_handler, 319 313 #endif 314 + #ifdef CONFIG_RMI4_F34 315 + &rmi_f34_handler, 316 + #endif 320 317 #ifdef CONFIG_RMI4_F54 321 318 &rmi_f54_handler, 319 + #endif 320 + #ifdef CONFIG_RMI4_F55 321 + &rmi_f55_handler, 322 322 #endif 323 323 }; 324 324
+12
drivers/input/rmi4/rmi_bus.h
··· 105 105 bool rmi_is_physical_device(struct device *dev); 106 106 107 107 /** 108 + * rmi_reset - reset a RMI4 device 109 + * @d: Pointer to an RMI device 110 + * 111 + * Calls for a reset of each function implemented by a specific device. 112 + * Returns 0 on success or a negative error code. 113 + */ 114 + static inline int rmi_reset(struct rmi_device *d) 115 + { 116 + return d->driver->reset_handler(d); 117 + } 118 + 119 + /** 108 120 * rmi_read - read a single byte 109 121 * @d: Pointer to an RMI device 110 122 * @addr: The address to read from
+319 -101
drivers/input/rmi4/rmi_driver.c
··· 17 17 #include <linux/bitmap.h> 18 18 #include <linux/delay.h> 19 19 #include <linux/fs.h> 20 + #include <linux/irq.h> 20 21 #include <linux/pm.h> 21 22 #include <linux/slab.h> 22 23 #include <linux/of.h> ··· 34 33 #define RMI_DEVICE_RESET_CMD 0x01 35 34 #define DEFAULT_RESET_DELAY_MS 100 36 35 37 - static void rmi_free_function_list(struct rmi_device *rmi_dev) 36 + void rmi_free_function_list(struct rmi_device *rmi_dev) 38 37 { 39 38 struct rmi_function *fn, *tmp; 40 39 struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev); 41 40 41 + rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, "Freeing function list\n"); 42 + 43 + devm_kfree(&rmi_dev->dev, data->irq_memory); 44 + data->irq_memory = NULL; 45 + data->irq_status = NULL; 46 + data->fn_irq_bits = NULL; 47 + data->current_irq_mask = NULL; 48 + data->new_irq_mask = NULL; 49 + 42 50 data->f01_container = NULL; 51 + data->f34_container = NULL; 43 52 44 53 /* Doing it in the reverse order so F01 will be removed last */ 45 54 list_for_each_entry_safe_reverse(fn, tmp, ··· 144 133 } 145 134 } 146 135 147 - int rmi_process_interrupt_requests(struct rmi_device *rmi_dev) 136 + static int rmi_process_interrupt_requests(struct rmi_device *rmi_dev) 148 137 { 149 138 struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev); 150 139 struct device *dev = &rmi_dev->dev; ··· 154 143 if (!data) 155 144 return 0; 156 145 157 - if (!rmi_dev->xport->attn_data) { 146 + if (!data->attn_data.data) { 158 147 error = rmi_read_block(rmi_dev, 159 148 data->f01_container->fd.data_base_addr + 1, 160 149 data->irq_status, data->num_of_irq_regs); ··· 189 178 190 179 return 0; 191 180 } 192 - EXPORT_SYMBOL_GPL(rmi_process_interrupt_requests); 181 + 182 + void rmi_set_attn_data(struct rmi_device *rmi_dev, unsigned long irq_status, 183 + void *data, size_t size) 184 + { 185 + struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev); 186 + struct rmi4_attn_data attn_data; 187 + void *fifo_data; 188 + 189 + if (!drvdata->enabled) 190 + return; 191 + 192 + fifo_data = kmemdup(data, size, GFP_ATOMIC); 193 + if (!fifo_data) 194 + return; 195 + 196 + attn_data.irq_status = irq_status; 197 + attn_data.size = size; 198 + attn_data.data = fifo_data; 199 + 200 + kfifo_put(&drvdata->attn_fifo, attn_data); 201 + } 202 + EXPORT_SYMBOL_GPL(rmi_set_attn_data); 203 + 204 + static irqreturn_t rmi_irq_fn(int irq, void *dev_id) 205 + { 206 + struct rmi_device *rmi_dev = dev_id; 207 + struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev); 208 + struct rmi4_attn_data attn_data = {0}; 209 + int ret, count; 210 + 211 + count = kfifo_get(&drvdata->attn_fifo, &attn_data); 212 + if (count) { 213 + *(drvdata->irq_status) = attn_data.irq_status; 214 + drvdata->attn_data = attn_data; 215 + } 216 + 217 + ret = rmi_process_interrupt_requests(rmi_dev); 218 + if (ret) 219 + rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, 220 + "Failed to process interrupt request: %d\n", ret); 221 + 222 + if (count) 223 + kfree(attn_data.data); 224 + 225 + if (!kfifo_is_empty(&drvdata->attn_fifo)) 226 + return rmi_irq_fn(irq, dev_id); 227 + 228 + return IRQ_HANDLED; 229 + } 230 + 231 + static int rmi_irq_init(struct rmi_device *rmi_dev) 232 + { 233 + struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev); 234 + struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev); 235 + int irq_flags = irq_get_trigger_type(pdata->irq); 236 + int ret; 237 + 238 + if (!irq_flags) 239 + irq_flags = IRQF_TRIGGER_LOW; 240 + 241 + ret = devm_request_threaded_irq(&rmi_dev->dev, pdata->irq, NULL, 242 + rmi_irq_fn, irq_flags | IRQF_ONESHOT, 243 + dev_name(rmi_dev->xport->dev), 244 + rmi_dev); 245 + if (ret < 0) { 246 + dev_err(&rmi_dev->dev, "Failed to register interrupt %d\n", 247 + pdata->irq); 248 + 249 + return ret; 250 + } 251 + 252 + data->enabled = true; 253 + 254 + return 0; 255 + } 193 256 194 257 static int suspend_one_function(struct rmi_function *fn) 195 258 { ··· 333 248 return 0; 334 249 } 335 250 336 - static int enable_sensor(struct rmi_device *rmi_dev) 251 + int rmi_enable_sensor(struct rmi_device *rmi_dev) 337 252 { 338 253 int retval = 0; 339 254 ··· 464 379 return 0; 465 380 } 466 381 467 - int rmi_read_pdt_entry(struct rmi_device *rmi_dev, struct pdt_entry *entry, 468 - u16 pdt_address) 382 + static int rmi_read_pdt_entry(struct rmi_device *rmi_dev, 383 + struct pdt_entry *entry, u16 pdt_address) 469 384 { 470 385 u8 buf[RMI_PDT_ENTRY_SIZE]; 471 386 int error; ··· 488 403 489 404 return 0; 490 405 } 491 - EXPORT_SYMBOL_GPL(rmi_read_pdt_entry); 492 406 493 407 static void rmi_driver_copy_pdt_to_fd(const struct pdt_entry *pdt, 494 408 struct rmi_function_descriptor *fd) ··· 506 422 507 423 static int rmi_scan_pdt_page(struct rmi_device *rmi_dev, 508 424 int page, 425 + int *empty_pages, 509 426 void *ctx, 510 427 int (*callback)(struct rmi_device *rmi_dev, 511 428 void *ctx, ··· 534 449 return retval; 535 450 } 536 451 537 - return (data->f01_bootloader_mode || addr == pdt_start) ? 452 + /* 453 + * Count number of empty PDT pages. If a gap of two pages 454 + * or more is found, stop scanning. 455 + */ 456 + if (addr == pdt_start) 457 + ++*empty_pages; 458 + else 459 + *empty_pages = 0; 460 + 461 + return (data->bootloader_mode || *empty_pages >= 2) ? 538 462 RMI_SCAN_DONE : RMI_SCAN_CONTINUE; 539 463 } 540 464 541 - static int rmi_scan_pdt(struct rmi_device *rmi_dev, void *ctx, 542 - int (*callback)(struct rmi_device *rmi_dev, 543 - void *ctx, 544 - const struct pdt_entry *entry)) 465 + int rmi_scan_pdt(struct rmi_device *rmi_dev, void *ctx, 466 + int (*callback)(struct rmi_device *rmi_dev, 467 + void *ctx, const struct pdt_entry *entry)) 545 468 { 546 469 int page; 470 + int empty_pages = 0; 547 471 int retval = RMI_SCAN_DONE; 548 472 549 473 for (page = 0; page <= RMI4_MAX_PAGE; page++) { 550 - retval = rmi_scan_pdt_page(rmi_dev, page, ctx, callback); 474 + retval = rmi_scan_pdt_page(rmi_dev, page, &empty_pages, 475 + ctx, callback); 551 476 if (retval != RMI_SCAN_CONTINUE) 552 477 break; 553 478 } ··· 695 600 kfree(struct_buf); 696 601 return ret; 697 602 } 698 - EXPORT_SYMBOL_GPL(rmi_read_register_desc); 699 603 700 604 const struct rmi_register_desc_item *rmi_get_register_desc_item( 701 605 struct rmi_register_descriptor *rdesc, u16 reg) ··· 710 616 711 617 return NULL; 712 618 } 713 - EXPORT_SYMBOL_GPL(rmi_get_register_desc_item); 714 619 715 620 size_t rmi_register_desc_calc_size(struct rmi_register_descriptor *rdesc) 716 621 { ··· 723 630 } 724 631 return size; 725 632 } 726 - EXPORT_SYMBOL_GPL(rmi_register_desc_calc_size); 727 633 728 634 /* Compute the register offset relative to the base address */ 729 635 int rmi_register_desc_calc_reg_offset( ··· 740 648 } 741 649 return -1; 742 650 } 743 - EXPORT_SYMBOL_GPL(rmi_register_desc_calc_reg_offset); 744 651 745 652 bool rmi_register_desc_has_subpacket(const struct rmi_register_desc_item *item, 746 653 u8 subpacket) ··· 748 657 subpacket) == subpacket; 749 658 } 750 659 751 - /* Indicates that flash programming is enabled (bootloader mode). */ 752 - #define RMI_F01_STATUS_BOOTLOADER(status) (!!((status) & 0x40)) 753 - 754 - /* 755 - * Given the PDT entry for F01, read the device status register to determine 756 - * if we're stuck in bootloader mode or not. 757 - * 758 - */ 759 660 static int rmi_check_bootloader_mode(struct rmi_device *rmi_dev, 760 661 const struct pdt_entry *pdt) 761 662 { 762 - int error; 763 - u8 device_status; 663 + struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev); 664 + int ret; 665 + u8 status; 764 666 765 - error = rmi_read(rmi_dev, pdt->data_base_addr + pdt->page_start, 766 - &device_status); 767 - if (error) { 768 - dev_err(&rmi_dev->dev, 769 - "Failed to read device status: %d.\n", error); 770 - return error; 667 + if (pdt->function_number == 0x34 && pdt->function_version > 1) { 668 + ret = rmi_read(rmi_dev, pdt->data_base_addr, &status); 669 + if (ret) { 670 + dev_err(&rmi_dev->dev, 671 + "Failed to read F34 status: %d.\n", ret); 672 + return ret; 673 + } 674 + 675 + if (status & BIT(7)) 676 + data->bootloader_mode = true; 677 + } else if (pdt->function_number == 0x01) { 678 + ret = rmi_read(rmi_dev, pdt->data_base_addr, &status); 679 + if (ret) { 680 + dev_err(&rmi_dev->dev, 681 + "Failed to read F01 status: %d.\n", ret); 682 + return ret; 683 + } 684 + 685 + if (status & BIT(6)) 686 + data->bootloader_mode = true; 771 687 } 772 688 773 - return RMI_F01_STATUS_BOOTLOADER(device_status); 689 + return 0; 774 690 } 775 691 776 692 static int rmi_count_irqs(struct rmi_device *rmi_dev, 777 693 void *ctx, const struct pdt_entry *pdt) 778 694 { 779 - struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev); 780 695 int *irq_count = ctx; 696 + int ret; 781 697 782 698 *irq_count += pdt->interrupt_source_count; 783 - if (pdt->function_number == 0x01) { 784 - data->f01_bootloader_mode = 785 - rmi_check_bootloader_mode(rmi_dev, pdt); 786 - if (data->f01_bootloader_mode) 787 - dev_warn(&rmi_dev->dev, 788 - "WARNING: RMI4 device is in bootloader mode!\n"); 789 - } 699 + 700 + ret = rmi_check_bootloader_mode(rmi_dev, pdt); 701 + if (ret < 0) 702 + return ret; 790 703 791 704 return RMI_SCAN_CONTINUE; 792 705 } 793 706 794 - static int rmi_initial_reset(struct rmi_device *rmi_dev, 795 - void *ctx, const struct pdt_entry *pdt) 707 + int rmi_initial_reset(struct rmi_device *rmi_dev, void *ctx, 708 + const struct pdt_entry *pdt) 796 709 { 797 710 int error; 798 711 ··· 815 720 return RMI_SCAN_DONE; 816 721 } 817 722 723 + rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, "Sending reset\n"); 818 724 error = rmi_write_block(rmi_dev, cmd_addr, &cmd_buf, 1); 819 725 if (error) { 820 726 dev_err(&rmi_dev->dev, ··· 872 776 873 777 if (pdt->function_number == 0x01) 874 778 data->f01_container = fn; 779 + else if (pdt->function_number == 0x34) 780 + data->f34_container = fn; 875 781 876 782 list_add_tail(&fn->node, &data->function_list); 877 783 ··· 884 786 return error; 885 787 } 886 788 887 - int rmi_driver_suspend(struct rmi_device *rmi_dev) 789 + void rmi_enable_irq(struct rmi_device *rmi_dev, bool clear_wake) 888 790 { 889 - int retval = 0; 791 + struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev); 792 + struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev); 793 + int irq = pdata->irq; 794 + int irq_flags; 795 + int retval; 796 + 797 + mutex_lock(&data->enabled_mutex); 798 + 799 + if (data->enabled) 800 + goto out; 801 + 802 + enable_irq(irq); 803 + data->enabled = true; 804 + if (clear_wake && device_may_wakeup(rmi_dev->xport->dev)) { 805 + retval = disable_irq_wake(irq); 806 + if (!retval) 807 + dev_warn(&rmi_dev->dev, 808 + "Failed to disable irq for wake: %d\n", 809 + retval); 810 + } 811 + 812 + /* 813 + * Call rmi_process_interrupt_requests() after enabling irq, 814 + * otherwise we may lose interrupt on edge-triggered systems. 815 + */ 816 + irq_flags = irq_get_trigger_type(pdata->irq); 817 + if (irq_flags & IRQ_TYPE_EDGE_BOTH) 818 + rmi_process_interrupt_requests(rmi_dev); 819 + 820 + out: 821 + mutex_unlock(&data->enabled_mutex); 822 + } 823 + 824 + void rmi_disable_irq(struct rmi_device *rmi_dev, bool enable_wake) 825 + { 826 + struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev); 827 + struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev); 828 + struct rmi4_attn_data attn_data = {0}; 829 + int irq = pdata->irq; 830 + int retval, count; 831 + 832 + mutex_lock(&data->enabled_mutex); 833 + 834 + if (!data->enabled) 835 + goto out; 836 + 837 + data->enabled = false; 838 + disable_irq(irq); 839 + if (enable_wake && device_may_wakeup(rmi_dev->xport->dev)) { 840 + retval = enable_irq_wake(irq); 841 + if (!retval) 842 + dev_warn(&rmi_dev->dev, 843 + "Failed to enable irq for wake: %d\n", 844 + retval); 845 + } 846 + 847 + /* make sure the fifo is clean */ 848 + while (!kfifo_is_empty(&data->attn_fifo)) { 849 + count = kfifo_get(&data->attn_fifo, &attn_data); 850 + if (count) 851 + kfree(attn_data.data); 852 + } 853 + 854 + out: 855 + mutex_unlock(&data->enabled_mutex); 856 + } 857 + 858 + int rmi_driver_suspend(struct rmi_device *rmi_dev, bool enable_wake) 859 + { 860 + int retval; 890 861 891 862 retval = rmi_suspend_functions(rmi_dev); 892 863 if (retval) 893 864 dev_warn(&rmi_dev->dev, "Failed to suspend functions: %d\n", 894 865 retval); 895 866 867 + rmi_disable_irq(rmi_dev, enable_wake); 896 868 return retval; 897 869 } 898 870 EXPORT_SYMBOL_GPL(rmi_driver_suspend); 899 871 900 - int rmi_driver_resume(struct rmi_device *rmi_dev) 872 + int rmi_driver_resume(struct rmi_device *rmi_dev, bool clear_wake) 901 873 { 902 874 int retval; 875 + 876 + rmi_enable_irq(rmi_dev, clear_wake); 903 877 904 878 retval = rmi_resume_functions(rmi_dev); 905 879 if (retval) ··· 986 816 { 987 817 struct rmi_device *rmi_dev = to_rmi_device(dev); 988 818 819 + rmi_disable_irq(rmi_dev, false); 820 + 821 + rmi_f34_remove_sysfs(rmi_dev); 989 822 rmi_free_function_list(rmi_dev); 990 823 991 824 return 0; ··· 1015 842 } 1016 843 #endif 1017 844 845 + int rmi_probe_interrupts(struct rmi_driver_data *data) 846 + { 847 + struct rmi_device *rmi_dev = data->rmi_dev; 848 + struct device *dev = &rmi_dev->dev; 849 + int irq_count; 850 + size_t size; 851 + int retval; 852 + 853 + /* 854 + * We need to count the IRQs and allocate their storage before scanning 855 + * the PDT and creating the function entries, because adding a new 856 + * function can trigger events that result in the IRQ related storage 857 + * being accessed. 858 + */ 859 + rmi_dbg(RMI_DEBUG_CORE, dev, "%s: Counting IRQs.\n", __func__); 860 + irq_count = 0; 861 + data->bootloader_mode = false; 862 + 863 + retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_count_irqs); 864 + if (retval < 0) { 865 + dev_err(dev, "IRQ counting failed with code %d.\n", retval); 866 + return retval; 867 + } 868 + 869 + if (data->bootloader_mode) 870 + dev_warn(&rmi_dev->dev, "Device in bootloader mode.\n"); 871 + 872 + data->irq_count = irq_count; 873 + data->num_of_irq_regs = (data->irq_count + 7) / 8; 874 + 875 + size = BITS_TO_LONGS(data->irq_count) * sizeof(unsigned long); 876 + data->irq_memory = devm_kzalloc(dev, size * 4, GFP_KERNEL); 877 + if (!data->irq_memory) { 878 + dev_err(dev, "Failed to allocate memory for irq masks.\n"); 879 + return retval; 880 + } 881 + 882 + data->irq_status = data->irq_memory + size * 0; 883 + data->fn_irq_bits = data->irq_memory + size * 1; 884 + data->current_irq_mask = data->irq_memory + size * 2; 885 + data->new_irq_mask = data->irq_memory + size * 3; 886 + 887 + return retval; 888 + } 889 + 890 + int rmi_init_functions(struct rmi_driver_data *data) 891 + { 892 + struct rmi_device *rmi_dev = data->rmi_dev; 893 + struct device *dev = &rmi_dev->dev; 894 + int irq_count; 895 + int retval; 896 + 897 + irq_count = 0; 898 + rmi_dbg(RMI_DEBUG_CORE, dev, "%s: Creating functions.\n", __func__); 899 + retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_create_function); 900 + if (retval < 0) { 901 + dev_err(dev, "Function creation failed with code %d.\n", 902 + retval); 903 + goto err_destroy_functions; 904 + } 905 + 906 + if (!data->f01_container) { 907 + dev_err(dev, "Missing F01 container!\n"); 908 + retval = -EINVAL; 909 + goto err_destroy_functions; 910 + } 911 + 912 + retval = rmi_read_block(rmi_dev, 913 + data->f01_container->fd.control_base_addr + 1, 914 + data->current_irq_mask, data->num_of_irq_regs); 915 + if (retval < 0) { 916 + dev_err(dev, "%s: Failed to read current IRQ mask.\n", 917 + __func__); 918 + goto err_destroy_functions; 919 + } 920 + 921 + return 0; 922 + 923 + err_destroy_functions: 924 + rmi_free_function_list(rmi_dev); 925 + return retval; 926 + } 927 + 1018 928 static int rmi_driver_probe(struct device *dev) 1019 929 { 1020 930 struct rmi_driver *rmi_driver; 1021 931 struct rmi_driver_data *data; 1022 932 struct rmi_device_platform_data *pdata; 1023 933 struct rmi_device *rmi_dev; 1024 - size_t size; 1025 - void *irq_memory; 1026 - int irq_count; 1027 934 int retval; 1028 935 1029 936 rmi_dbg(RMI_DEBUG_CORE, dev, "%s: Starting probe.\n", ··· 1169 916 PDT_PROPERTIES_LOCATION, retval); 1170 917 } 1171 918 1172 - /* 1173 - * We need to count the IRQs and allocate their storage before scanning 1174 - * the PDT and creating the function entries, because adding a new 1175 - * function can trigger events that result in the IRQ related storage 1176 - * being accessed. 1177 - */ 1178 - rmi_dbg(RMI_DEBUG_CORE, dev, "Counting IRQs.\n"); 1179 - irq_count = 0; 1180 - retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_count_irqs); 1181 - if (retval < 0) { 1182 - dev_err(dev, "IRQ counting failed with code %d.\n", retval); 1183 - goto err; 1184 - } 1185 - data->irq_count = irq_count; 1186 - data->num_of_irq_regs = (data->irq_count + 7) / 8; 1187 - 1188 919 mutex_init(&data->irq_mutex); 920 + mutex_init(&data->enabled_mutex); 1189 921 1190 - size = BITS_TO_LONGS(data->irq_count) * sizeof(unsigned long); 1191 - irq_memory = devm_kzalloc(dev, size * 4, GFP_KERNEL); 1192 - if (!irq_memory) { 1193 - dev_err(dev, "Failed to allocate memory for irq masks.\n"); 922 + retval = rmi_probe_interrupts(data); 923 + if (retval) 1194 924 goto err; 1195 - } 1196 - 1197 - data->irq_status = irq_memory + size * 0; 1198 - data->fn_irq_bits = irq_memory + size * 1; 1199 - data->current_irq_mask = irq_memory + size * 2; 1200 - data->new_irq_mask = irq_memory + size * 3; 1201 925 1202 926 if (rmi_dev->xport->input) { 1203 927 /* ··· 1191 961 dev_err(dev, "%s: Failed to allocate input device.\n", 1192 962 __func__); 1193 963 retval = -ENOMEM; 1194 - goto err_destroy_functions; 964 + goto err; 1195 965 } 1196 966 rmi_driver_set_input_params(rmi_dev, data->input); 1197 967 data->input->phys = devm_kasprintf(dev, GFP_KERNEL, 1198 968 "%s/input0", dev_name(dev)); 1199 969 } 1200 970 1201 - irq_count = 0; 1202 - rmi_dbg(RMI_DEBUG_CORE, dev, "Creating functions."); 1203 - retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_create_function); 1204 - if (retval < 0) { 1205 - dev_err(dev, "Function creation failed with code %d.\n", 1206 - retval); 1207 - goto err_destroy_functions; 1208 - } 971 + retval = rmi_init_functions(data); 972 + if (retval) 973 + goto err; 1209 974 1210 - if (!data->f01_container) { 1211 - dev_err(dev, "Missing F01 container!\n"); 1212 - retval = -EINVAL; 1213 - goto err_destroy_functions; 1214 - } 1215 - 1216 - retval = rmi_read_block(rmi_dev, 1217 - data->f01_container->fd.control_base_addr + 1, 1218 - data->current_irq_mask, data->num_of_irq_regs); 1219 - if (retval < 0) { 1220 - dev_err(dev, "%s: Failed to read current IRQ mask.\n", 1221 - __func__); 1222 - goto err_destroy_functions; 1223 - } 975 + retval = rmi_f34_create_sysfs(rmi_dev); 976 + if (retval) 977 + goto err; 1224 978 1225 979 if (data->input) { 1226 980 rmi_driver_set_input_name(rmi_dev, data->input); ··· 1217 1003 } 1218 1004 } 1219 1005 1006 + retval = rmi_irq_init(rmi_dev); 1007 + if (retval < 0) 1008 + goto err_destroy_functions; 1009 + 1220 1010 if (data->f01_container->dev.driver) 1221 1011 /* Driver already bound, so enable ATTN now. */ 1222 - return enable_sensor(rmi_dev); 1012 + return rmi_enable_sensor(rmi_dev); 1223 1013 1224 1014 return 0; 1225 1015
+28 -3
drivers/input/rmi4/rmi_driver.h
··· 51 51 u8 function_number; 52 52 }; 53 53 54 - int rmi_read_pdt_entry(struct rmi_device *rmi_dev, struct pdt_entry *entry, 55 - u16 pdt_address); 56 - 57 54 #define RMI_REG_DESC_PRESENSE_BITS (32 * BITS_PER_BYTE) 58 55 #define RMI_REG_DESC_SUBPACKET_BITS (37 * BITS_PER_BYTE) 59 56 ··· 92 95 bool rmi_is_physical_driver(struct device_driver *); 93 96 int rmi_register_physical_driver(void); 94 97 void rmi_unregister_physical_driver(void); 98 + void rmi_free_function_list(struct rmi_device *rmi_dev); 99 + int rmi_enable_sensor(struct rmi_device *rmi_dev); 100 + int rmi_scan_pdt(struct rmi_device *rmi_dev, void *ctx, 101 + int (*callback)(struct rmi_device *rmi_dev, void *ctx, 102 + const struct pdt_entry *entry)); 103 + int rmi_probe_interrupts(struct rmi_driver_data *data); 104 + void rmi_enable_irq(struct rmi_device *rmi_dev, bool clear_wake); 105 + void rmi_disable_irq(struct rmi_device *rmi_dev, bool enable_wake); 106 + int rmi_init_functions(struct rmi_driver_data *data); 107 + int rmi_initial_reset(struct rmi_device *rmi_dev, void *ctx, 108 + const struct pdt_entry *pdt); 95 109 96 110 char *rmi_f01_get_product_ID(struct rmi_function *fn); 97 111 112 + #ifdef CONFIG_RMI4_F34 113 + int rmi_f34_create_sysfs(struct rmi_device *rmi_dev); 114 + void rmi_f34_remove_sysfs(struct rmi_device *rmi_dev); 115 + #else 116 + static inline int rmi_f34_create_sysfs(struct rmi_device *rmi_dev) 117 + { 118 + return 0; 119 + } 120 + 121 + static inline void rmi_f34_remove_sysfs(struct rmi_device *rmi_dev) 122 + { 123 + } 124 + #endif /* CONFIG_RMI_F34 */ 125 + 98 126 extern struct rmi_function_handler rmi_f01_handler; 127 + extern struct rmi_function_handler rmi_f03_handler; 99 128 extern struct rmi_function_handler rmi_f11_handler; 100 129 extern struct rmi_function_handler rmi_f12_handler; 101 130 extern struct rmi_function_handler rmi_f30_handler; 131 + extern struct rmi_function_handler rmi_f34_handler; 102 132 extern struct rmi_function_handler rmi_f54_handler; 133 + extern struct rmi_function_handler rmi_f55_handler; 103 134 #endif
+9 -3
drivers/input/rmi4/rmi_f01.c
··· 62 62 #define RMI_F01_STATUS_CODE(status) ((status) & 0x0f) 63 63 /* The device has lost its configuration for some reason. */ 64 64 #define RMI_F01_STATUS_UNCONFIGURED(status) (!!((status) & 0x80)) 65 + /* The device is in bootloader mode */ 66 + #define RMI_F01_STATUS_BOOTLOADER(status) ((status) & 0x40) 65 67 66 68 /* Control register bits */ 67 69 ··· 328 326 } 329 327 330 328 switch (pdata->power_management.nosleep) { 331 - case RMI_F01_NOSLEEP_DEFAULT: 329 + case RMI_REG_STATE_DEFAULT: 332 330 break; 333 - case RMI_F01_NOSLEEP_OFF: 331 + case RMI_REG_STATE_OFF: 334 332 f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_NOSLEEP_BIT; 335 333 break; 336 - case RMI_F01_NOSLEEP_ON: 334 + case RMI_REG_STATE_ON: 337 335 f01->device_control.ctrl0 |= RMI_F01_CTRL0_NOSLEEP_BIT; 338 336 break; 339 337 } ··· 594 592 "Failed to read device status: %d.\n", error); 595 593 return error; 596 594 } 595 + 596 + if (RMI_F01_STATUS_BOOTLOADER(device_status)) 597 + dev_warn(&fn->dev, 598 + "Device in bootloader mode, please update firmware\n"); 597 599 598 600 if (RMI_F01_STATUS_UNCONFIGURED(device_status)) { 599 601 dev_warn(&fn->dev, "Device reset detected.\n");
+250
drivers/input/rmi4/rmi_f03.c
··· 1 + /* 2 + * Copyright (C) 2015-2016 Red Hat 3 + * Copyright (C) 2015 Lyude Paul <thatslyude@gmail.com> 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms of the GNU General Public License version 2 as published by 7 + * the Free Software Foundation. 8 + */ 9 + 10 + #include <linux/kernel.h> 11 + #include <linux/slab.h> 12 + #include <linux/serio.h> 13 + #include <linux/notifier.h> 14 + #include "rmi_driver.h" 15 + 16 + #define RMI_F03_RX_DATA_OFB 0x01 17 + #define RMI_F03_OB_SIZE 2 18 + 19 + #define RMI_F03_OB_OFFSET 2 20 + #define RMI_F03_OB_DATA_OFFSET 1 21 + #define RMI_F03_OB_FLAG_TIMEOUT BIT(6) 22 + #define RMI_F03_OB_FLAG_PARITY BIT(7) 23 + 24 + #define RMI_F03_DEVICE_COUNT 0x07 25 + #define RMI_F03_BYTES_PER_DEVICE 0x07 26 + #define RMI_F03_BYTES_PER_DEVICE_SHIFT 4 27 + #define RMI_F03_QUEUE_LENGTH 0x0F 28 + 29 + struct f03_data { 30 + struct rmi_function *fn; 31 + 32 + struct serio *serio; 33 + 34 + u8 device_count; 35 + u8 rx_queue_length; 36 + }; 37 + 38 + static int rmi_f03_pt_write(struct serio *id, unsigned char val) 39 + { 40 + struct f03_data *f03 = id->port_data; 41 + int error; 42 + 43 + rmi_dbg(RMI_DEBUG_FN, &f03->fn->dev, 44 + "%s: Wrote %.2hhx to PS/2 passthrough address", 45 + __func__, val); 46 + 47 + error = rmi_write(f03->fn->rmi_dev, f03->fn->fd.data_base_addr, val); 48 + if (error) { 49 + dev_err(&f03->fn->dev, 50 + "%s: Failed to write to F03 TX register (%d).\n", 51 + __func__, error); 52 + return error; 53 + } 54 + 55 + return 0; 56 + } 57 + 58 + static int rmi_f03_initialize(struct f03_data *f03) 59 + { 60 + struct rmi_function *fn = f03->fn; 61 + struct device *dev = &fn->dev; 62 + int error; 63 + u8 bytes_per_device; 64 + u8 query1; 65 + u8 query2[RMI_F03_DEVICE_COUNT * RMI_F03_BYTES_PER_DEVICE]; 66 + size_t query2_len; 67 + 68 + error = rmi_read(fn->rmi_dev, fn->fd.query_base_addr, &query1); 69 + if (error) { 70 + dev_err(dev, "Failed to read query register (%d).\n", error); 71 + return error; 72 + } 73 + 74 + f03->device_count = query1 & RMI_F03_DEVICE_COUNT; 75 + bytes_per_device = (query1 >> RMI_F03_BYTES_PER_DEVICE_SHIFT) & 76 + RMI_F03_BYTES_PER_DEVICE; 77 + 78 + query2_len = f03->device_count * bytes_per_device; 79 + 80 + /* 81 + * The first generation of image sensors don't have a second part to 82 + * their f03 query, as such we have to set some of these values manually 83 + */ 84 + if (query2_len < 1) { 85 + f03->device_count = 1; 86 + f03->rx_queue_length = 7; 87 + } else { 88 + error = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr + 1, 89 + query2, query2_len); 90 + if (error) { 91 + dev_err(dev, 92 + "Failed to read second set of query registers (%d).\n", 93 + error); 94 + return error; 95 + } 96 + 97 + f03->rx_queue_length = query2[0] & RMI_F03_QUEUE_LENGTH; 98 + } 99 + 100 + return 0; 101 + } 102 + 103 + static int rmi_f03_register_pt(struct f03_data *f03) 104 + { 105 + struct serio *serio; 106 + 107 + serio = kzalloc(sizeof(struct serio), GFP_KERNEL); 108 + if (!serio) 109 + return -ENOMEM; 110 + 111 + serio->id.type = SERIO_8042; 112 + serio->write = rmi_f03_pt_write; 113 + serio->port_data = f03; 114 + 115 + strlcpy(serio->name, "Synaptics RMI4 PS/2 pass-through", 116 + sizeof(serio->name)); 117 + strlcpy(serio->phys, "synaptics-rmi4-pt/serio1", 118 + sizeof(serio->phys)); 119 + serio->dev.parent = &f03->fn->dev; 120 + 121 + f03->serio = serio; 122 + 123 + serio_register_port(serio); 124 + 125 + return 0; 126 + } 127 + 128 + static int rmi_f03_probe(struct rmi_function *fn) 129 + { 130 + struct device *dev = &fn->dev; 131 + struct f03_data *f03; 132 + int error; 133 + 134 + f03 = devm_kzalloc(dev, sizeof(struct f03_data), GFP_KERNEL); 135 + if (!f03) 136 + return -ENOMEM; 137 + 138 + f03->fn = fn; 139 + 140 + error = rmi_f03_initialize(f03); 141 + if (error < 0) 142 + return error; 143 + 144 + if (f03->device_count != 1) 145 + dev_warn(dev, "found %d devices on PS/2 passthrough", 146 + f03->device_count); 147 + 148 + dev_set_drvdata(dev, f03); 149 + 150 + error = rmi_f03_register_pt(f03); 151 + if (error) 152 + return error; 153 + 154 + return 0; 155 + } 156 + 157 + static int rmi_f03_config(struct rmi_function *fn) 158 + { 159 + fn->rmi_dev->driver->set_irq_bits(fn->rmi_dev, fn->irq_mask); 160 + 161 + return 0; 162 + } 163 + 164 + static int rmi_f03_attention(struct rmi_function *fn, unsigned long *irq_bits) 165 + { 166 + struct rmi_device *rmi_dev = fn->rmi_dev; 167 + struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev); 168 + struct f03_data *f03 = dev_get_drvdata(&fn->dev); 169 + u16 data_addr = fn->fd.data_base_addr; 170 + const u8 ob_len = f03->rx_queue_length * RMI_F03_OB_SIZE; 171 + u8 obs[RMI_F03_QUEUE_LENGTH * RMI_F03_OB_SIZE]; 172 + u8 ob_status; 173 + u8 ob_data; 174 + unsigned int serio_flags; 175 + int i; 176 + int error; 177 + 178 + if (!rmi_dev) 179 + return -ENODEV; 180 + 181 + if (drvdata->attn_data.data) { 182 + /* First grab the data passed by the transport device */ 183 + if (drvdata->attn_data.size < ob_len) { 184 + dev_warn(&fn->dev, "F03 interrupted, but data is missing!\n"); 185 + return 0; 186 + } 187 + 188 + memcpy(obs, drvdata->attn_data.data, ob_len); 189 + 190 + drvdata->attn_data.data += ob_len; 191 + drvdata->attn_data.size -= ob_len; 192 + } else { 193 + /* Grab all of the data registers, and check them for data */ 194 + error = rmi_read_block(fn->rmi_dev, data_addr + RMI_F03_OB_OFFSET, 195 + &obs, ob_len); 196 + if (error) { 197 + dev_err(&fn->dev, 198 + "%s: Failed to read F03 output buffers: %d\n", 199 + __func__, error); 200 + serio_interrupt(f03->serio, 0, SERIO_TIMEOUT); 201 + return error; 202 + } 203 + } 204 + 205 + for (i = 0; i < ob_len; i += RMI_F03_OB_SIZE) { 206 + ob_status = obs[i]; 207 + ob_data = obs[i + RMI_F03_OB_DATA_OFFSET]; 208 + serio_flags = 0; 209 + 210 + if (!(ob_status & RMI_F03_RX_DATA_OFB)) 211 + continue; 212 + 213 + if (ob_status & RMI_F03_OB_FLAG_TIMEOUT) 214 + serio_flags |= SERIO_TIMEOUT; 215 + if (ob_status & RMI_F03_OB_FLAG_PARITY) 216 + serio_flags |= SERIO_PARITY; 217 + 218 + rmi_dbg(RMI_DEBUG_FN, &fn->dev, 219 + "%s: Received %.2hhx from PS2 guest T: %c P: %c\n", 220 + __func__, ob_data, 221 + serio_flags & SERIO_TIMEOUT ? 'Y' : 'N', 222 + serio_flags & SERIO_PARITY ? 'Y' : 'N'); 223 + 224 + serio_interrupt(f03->serio, ob_data, serio_flags); 225 + } 226 + 227 + return 0; 228 + } 229 + 230 + static void rmi_f03_remove(struct rmi_function *fn) 231 + { 232 + struct f03_data *f03 = dev_get_drvdata(&fn->dev); 233 + 234 + serio_unregister_port(f03->serio); 235 + } 236 + 237 + struct rmi_function_handler rmi_f03_handler = { 238 + .driver = { 239 + .name = "rmi4_f03", 240 + }, 241 + .func = 0x03, 242 + .probe = rmi_f03_probe, 243 + .config = rmi_f03_config, 244 + .attention = rmi_f03_attention, 245 + .remove = rmi_f03_remove, 246 + }; 247 + 248 + MODULE_AUTHOR("Lyude Paul <thatslyude@gmail.com>"); 249 + MODULE_DESCRIPTION("RMI F03 module"); 250 + MODULE_LICENSE("GPL");
+74 -24
drivers/input/rmi4/rmi_f11.c
··· 571 571 572 572 static void rmi_f11_finger_handler(struct f11_data *f11, 573 573 struct rmi_2d_sensor *sensor, 574 - unsigned long *irq_bits, int num_irq_regs) 574 + unsigned long *irq_bits, int num_irq_regs, 575 + int size) 575 576 { 576 577 const u8 *f_state = f11->data.f_state; 577 578 u8 finger_state; 578 579 u8 i; 580 + int abs_fingers; 581 + int rel_fingers; 582 + int abs_size = sensor->nbr_fingers * RMI_F11_ABS_BYTES; 579 583 580 584 int abs_bits = bitmap_and(f11->result_bits, irq_bits, f11->abs_mask, 581 585 num_irq_regs * 8); 582 586 int rel_bits = bitmap_and(f11->result_bits, irq_bits, f11->rel_mask, 583 587 num_irq_regs * 8); 584 588 585 - for (i = 0; i < sensor->nbr_fingers; i++) { 586 - /* Possible of having 4 fingers per f_statet register */ 587 - finger_state = rmi_f11_parse_finger_state(f_state, i); 588 - if (finger_state == F11_RESERVED) { 589 - pr_err("Invalid finger state[%d]: 0x%02x", i, 590 - finger_state); 591 - continue; 592 - } 589 + if (abs_bits) { 590 + if (abs_size > size) 591 + abs_fingers = size / RMI_F11_ABS_BYTES; 592 + else 593 + abs_fingers = sensor->nbr_fingers; 593 594 594 - if (abs_bits) 595 + for (i = 0; i < abs_fingers; i++) { 596 + /* Possible of having 4 fingers per f_state register */ 597 + finger_state = rmi_f11_parse_finger_state(f_state, i); 598 + if (finger_state == F11_RESERVED) { 599 + pr_err("Invalid finger state[%d]: 0x%02x", i, 600 + finger_state); 601 + continue; 602 + } 603 + 595 604 rmi_f11_abs_pos_process(f11, sensor, &sensor->objs[i], 596 605 finger_state, i); 606 + } 607 + } 597 608 598 - if (rel_bits) 609 + if (rel_bits) { 610 + if ((abs_size + sensor->nbr_fingers * RMI_F11_REL_BYTES) > size) 611 + rel_fingers = (size - abs_size) / RMI_F11_REL_BYTES; 612 + else 613 + rel_fingers = sensor->nbr_fingers; 614 + 615 + for (i = 0; i < rel_fingers; i++) 599 616 rmi_f11_rel_pos_report(f11, i); 600 617 } 601 618 ··· 628 611 sensor->nbr_fingers, 629 612 sensor->dmax); 630 613 631 - for (i = 0; i < sensor->nbr_fingers; i++) { 614 + for (i = 0; i < abs_fingers; i++) { 632 615 finger_state = rmi_f11_parse_finger_state(f_state, i); 633 616 if (finger_state == F11_RESERVED) 634 617 /* no need to send twice the error */ ··· 1079 1062 rc = rmi_2d_sensor_of_probe(&fn->dev, &f11->sensor_pdata); 1080 1063 if (rc) 1081 1064 return rc; 1082 - } else if (pdata->sensor_pdata) { 1083 - f11->sensor_pdata = *pdata->sensor_pdata; 1065 + } else { 1066 + f11->sensor_pdata = pdata->sensor_pdata; 1084 1067 } 1085 1068 1086 1069 f11->rezero_wait_ms = f11->sensor_pdata.rezero_wait; ··· 1141 1124 sensor->topbuttonpad = f11->sensor_pdata.topbuttonpad; 1142 1125 sensor->kernel_tracking = f11->sensor_pdata.kernel_tracking; 1143 1126 sensor->dmax = f11->sensor_pdata.dmax; 1127 + sensor->dribble = f11->sensor_pdata.dribble; 1128 + sensor->palm_detect = f11->sensor_pdata.palm_detect; 1144 1129 1145 1130 if (f11->sens_query.has_physical_props) { 1146 1131 sensor->x_mm = f11->sens_query.x_sensor_size_mm; ··· 1210 1191 ctrl->ctrl0_11[RMI_F11_DELTA_Y_THRESHOLD] = 1211 1192 sensor->axis_align.delta_y_threshold; 1212 1193 1213 - if (f11->sens_query.has_dribble) 1214 - ctrl->ctrl0_11[0] = ctrl->ctrl0_11[0] & ~BIT(6); 1194 + if (f11->sens_query.has_dribble) { 1195 + switch (sensor->dribble) { 1196 + case RMI_REG_STATE_OFF: 1197 + ctrl->ctrl0_11[0] &= ~BIT(6); 1198 + break; 1199 + case RMI_REG_STATE_ON: 1200 + ctrl->ctrl0_11[0] |= BIT(6); 1201 + break; 1202 + case RMI_REG_STATE_DEFAULT: 1203 + default: 1204 + break; 1205 + } 1206 + } 1215 1207 1216 - if (f11->sens_query.has_palm_det) 1217 - ctrl->ctrl0_11[11] = ctrl->ctrl0_11[11] & ~BIT(0); 1208 + if (f11->sens_query.has_palm_det) { 1209 + switch (sensor->palm_detect) { 1210 + case RMI_REG_STATE_OFF: 1211 + ctrl->ctrl0_11[11] &= ~BIT(0); 1212 + break; 1213 + case RMI_REG_STATE_ON: 1214 + ctrl->ctrl0_11[11] |= BIT(0); 1215 + break; 1216 + case RMI_REG_STATE_DEFAULT: 1217 + default: 1218 + break; 1219 + } 1220 + } 1218 1221 1219 1222 rc = f11_write_control_regs(fn, &f11->sens_query, 1220 1223 &f11->dev_controls, fn->fd.query_base_addr); ··· 1282 1241 struct f11_data *f11 = dev_get_drvdata(&fn->dev); 1283 1242 u16 data_base_addr = fn->fd.data_base_addr; 1284 1243 int error; 1244 + int valid_bytes = f11->sensor.pkt_size; 1285 1245 1286 - if (rmi_dev->xport->attn_data) { 1287 - memcpy(f11->sensor.data_pkt, rmi_dev->xport->attn_data, 1288 - f11->sensor.attn_size); 1289 - rmi_dev->xport->attn_data += f11->sensor.attn_size; 1290 - rmi_dev->xport->attn_size -= f11->sensor.attn_size; 1246 + if (drvdata->attn_data.data) { 1247 + /* 1248 + * The valid data in the attention report is less then 1249 + * expected. Only process the complete fingers. 1250 + */ 1251 + if (f11->sensor.attn_size > drvdata->attn_data.size) 1252 + valid_bytes = drvdata->attn_data.size; 1253 + else 1254 + valid_bytes = f11->sensor.attn_size; 1255 + memcpy(f11->sensor.data_pkt, drvdata->attn_data.data, 1256 + valid_bytes); 1257 + drvdata->attn_data.data += f11->sensor.attn_size; 1258 + drvdata->attn_data.size -= f11->sensor.attn_size; 1291 1259 } else { 1292 1260 error = rmi_read_block(rmi_dev, 1293 1261 data_base_addr, f11->sensor.data_pkt, ··· 1306 1256 } 1307 1257 1308 1258 rmi_f11_finger_handler(f11, &f11->sensor, irq_bits, 1309 - drvdata->num_of_irq_regs); 1259 + drvdata->num_of_irq_regs, valid_bytes); 1310 1260 1311 1261 return 0; 1312 1262 }
+111 -33
drivers/input/rmi4/rmi_f12.c
··· 26 26 RMI_F12_OBJECT_SMALL_OBJECT = 0x0D, 27 27 }; 28 28 29 + #define F12_DATA1_BYTES_PER_OBJ 8 30 + 29 31 struct f12_data { 30 32 struct rmi_2d_sensor sensor; 31 33 struct rmi_2d_sensor_platform_data sensor_pdata; 34 + bool has_dribble; 32 35 33 36 u16 data_addr; 34 37 ··· 71 68 u8 buf[15]; 72 69 int pitch_x = 0; 73 70 int pitch_y = 0; 74 - int clip_x_low = 0; 75 - int clip_x_high = 0; 76 - int clip_y_low = 0; 77 - int clip_y_high = 0; 78 71 int rx_receivers = 0; 79 72 int tx_receivers = 0; 80 73 int sensor_flags = 0; ··· 123 124 } 124 125 125 126 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s: x low: %d x high: %d y low: %d y high: %d\n", 126 - __func__, clip_x_low, clip_x_high, clip_y_low, clip_y_high); 127 + __func__, 128 + sensor->axis_align.clip_x_low, sensor->axis_align.clip_x_high, 129 + sensor->axis_align.clip_y_low, sensor->axis_align.clip_y_high); 127 130 128 131 if (rmi_register_desc_has_subpacket(item, 3)) { 129 132 rx_receivers = buf[offset]; ··· 147 146 return 0; 148 147 } 149 148 150 - static void rmi_f12_process_objects(struct f12_data *f12, u8 *data1) 149 + static void rmi_f12_process_objects(struct f12_data *f12, u8 *data1, int size) 151 150 { 152 151 int i; 153 152 struct rmi_2d_sensor *sensor = &f12->sensor; 153 + int objects = f12->data1->num_subpackets; 154 154 155 - for (i = 0; i < f12->data1->num_subpackets; i++) { 155 + if ((f12->data1->num_subpackets * F12_DATA1_BYTES_PER_OBJ) > size) 156 + objects = size / F12_DATA1_BYTES_PER_OBJ; 157 + 158 + for (i = 0; i < objects; i++) { 156 159 struct rmi_2d_sensor_abs_object *obj = &sensor->objs[i]; 157 160 158 161 obj->type = RMI_2D_OBJECT_NONE; ··· 187 182 188 183 rmi_2d_sensor_abs_process(sensor, obj, i); 189 184 190 - data1 += 8; 185 + data1 += F12_DATA1_BYTES_PER_OBJ; 191 186 } 192 187 193 188 if (sensor->kernel_tracking) ··· 197 192 sensor->nbr_fingers, 198 193 sensor->dmax); 199 194 200 - for (i = 0; i < sensor->nbr_fingers; i++) 195 + for (i = 0; i < objects; i++) 201 196 rmi_2d_sensor_abs_report(sensor, &sensor->objs[i], i); 202 197 } 203 198 ··· 206 201 { 207 202 int retval; 208 203 struct rmi_device *rmi_dev = fn->rmi_dev; 204 + struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev); 209 205 struct f12_data *f12 = dev_get_drvdata(&fn->dev); 210 206 struct rmi_2d_sensor *sensor = &f12->sensor; 207 + int valid_bytes = sensor->pkt_size; 211 208 212 - if (rmi_dev->xport->attn_data) { 213 - memcpy(sensor->data_pkt, rmi_dev->xport->attn_data, 214 - sensor->attn_size); 215 - rmi_dev->xport->attn_data += sensor->attn_size; 216 - rmi_dev->xport->attn_size -= sensor->attn_size; 209 + if (drvdata->attn_data.data) { 210 + if (sensor->attn_size > drvdata->attn_data.size) 211 + valid_bytes = drvdata->attn_data.size; 212 + else 213 + valid_bytes = sensor->attn_size; 214 + memcpy(sensor->data_pkt, drvdata->attn_data.data, 215 + valid_bytes); 216 + drvdata->attn_data.data += sensor->attn_size; 217 + drvdata->attn_data.size -= sensor->attn_size; 217 218 } else { 218 219 retval = rmi_read_block(rmi_dev, f12->data_addr, 219 220 sensor->data_pkt, sensor->pkt_size); ··· 232 221 233 222 if (f12->data1) 234 223 rmi_f12_process_objects(f12, 235 - &sensor->data_pkt[f12->data1_offset]); 224 + &sensor->data_pkt[f12->data1_offset], valid_bytes); 236 225 237 226 input_mt_sync_frame(sensor->input); 238 227 239 228 return 0; 240 229 } 241 230 231 + static int rmi_f12_write_control_regs(struct rmi_function *fn) 232 + { 233 + int ret; 234 + const struct rmi_register_desc_item *item; 235 + struct rmi_device *rmi_dev = fn->rmi_dev; 236 + struct f12_data *f12 = dev_get_drvdata(&fn->dev); 237 + int control_size; 238 + char buf[3]; 239 + u16 control_offset = 0; 240 + u8 subpacket_offset = 0; 241 + 242 + if (f12->has_dribble 243 + && (f12->sensor.dribble != RMI_REG_STATE_DEFAULT)) { 244 + item = rmi_get_register_desc_item(&f12->control_reg_desc, 20); 245 + if (item) { 246 + control_offset = rmi_register_desc_calc_reg_offset( 247 + &f12->control_reg_desc, 20); 248 + 249 + /* 250 + * The byte containing the EnableDribble bit will be 251 + * in either byte 0 or byte 2 of control 20. Depending 252 + * on the existence of subpacket 0. If control 20 is 253 + * larger then 3 bytes, just read the first 3. 254 + */ 255 + control_size = min(item->reg_size, 3UL); 256 + 257 + ret = rmi_read_block(rmi_dev, fn->fd.control_base_addr 258 + + control_offset, buf, control_size); 259 + if (ret) 260 + return ret; 261 + 262 + if (rmi_register_desc_has_subpacket(item, 0)) 263 + subpacket_offset += 1; 264 + 265 + switch (f12->sensor.dribble) { 266 + case RMI_REG_STATE_OFF: 267 + buf[subpacket_offset] &= ~BIT(2); 268 + break; 269 + case RMI_REG_STATE_ON: 270 + buf[subpacket_offset] |= BIT(2); 271 + break; 272 + case RMI_REG_STATE_DEFAULT: 273 + default: 274 + break; 275 + } 276 + 277 + ret = rmi_write_block(rmi_dev, 278 + fn->fd.control_base_addr + control_offset, 279 + buf, control_size); 280 + if (ret) 281 + return ret; 282 + } 283 + } 284 + 285 + return 0; 286 + 287 + } 288 + 242 289 static int rmi_f12_config(struct rmi_function *fn) 243 290 { 244 291 struct rmi_driver *drv = fn->rmi_dev->driver; 292 + int ret; 245 293 246 294 drv->set_irq_bits(fn->rmi_dev, fn->irq_mask); 295 + 296 + ret = rmi_f12_write_control_regs(fn); 297 + if (ret) 298 + dev_warn(&fn->dev, 299 + "Failed to write F12 control registers: %d\n", ret); 247 300 248 301 return 0; 249 302 } ··· 322 247 const struct rmi_register_desc_item *item; 323 248 struct rmi_2d_sensor *sensor; 324 249 struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev); 325 - struct rmi_transport_dev *xport = rmi_dev->xport; 250 + struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev); 326 251 u16 data_offset = 0; 327 252 328 253 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s\n", __func__); ··· 335 260 } 336 261 ++query_addr; 337 262 338 - if (!(buf & 0x1)) { 263 + if (!(buf & BIT(0))) { 339 264 dev_err(&fn->dev, 340 265 "Behavior of F12 without register descriptors is undefined.\n"); 341 266 return -ENODEV; ··· 345 270 if (!f12) 346 271 return -ENOMEM; 347 272 273 + f12->has_dribble = !!(buf & BIT(3)); 274 + 348 275 if (fn->dev.of_node) { 349 276 ret = rmi_2d_sensor_of_probe(&fn->dev, &f12->sensor_pdata); 350 277 if (ret) 351 278 return ret; 352 - } else if (pdata->sensor_pdata) { 353 - f12->sensor_pdata = *pdata->sensor_pdata; 279 + } else { 280 + f12->sensor_pdata = pdata->sensor_pdata; 354 281 } 355 282 356 283 ret = rmi_read_register_desc(rmi_dev, query_addr, ··· 395 318 396 319 sensor->x_mm = f12->sensor_pdata.x_mm; 397 320 sensor->y_mm = f12->sensor_pdata.y_mm; 321 + sensor->dribble = f12->sensor_pdata.dribble; 398 322 399 323 if (sensor->sensor_type == rmi_sensor_default) 400 324 sensor->sensor_type = ··· 421 343 * HID attention reports. 422 344 */ 423 345 item = rmi_get_register_desc_item(&f12->data_reg_desc, 0); 424 - if (item && !xport->attn_data) 346 + if (item && !drvdata->attn_data.data) 425 347 data_offset += item->reg_size; 426 348 427 349 item = rmi_get_register_desc_item(&f12->data_reg_desc, 1); ··· 435 357 } 436 358 437 359 item = rmi_get_register_desc_item(&f12->data_reg_desc, 2); 438 - if (item && !xport->attn_data) 360 + if (item && !drvdata->attn_data.data) 439 361 data_offset += item->reg_size; 440 362 441 363 item = rmi_get_register_desc_item(&f12->data_reg_desc, 3); 442 - if (item && !xport->attn_data) 364 + if (item && !drvdata->attn_data.data) 443 365 data_offset += item->reg_size; 444 366 445 367 item = rmi_get_register_desc_item(&f12->data_reg_desc, 4); 446 - if (item && !xport->attn_data) 368 + if (item && !drvdata->attn_data.data) 447 369 data_offset += item->reg_size; 448 370 449 371 item = rmi_get_register_desc_item(&f12->data_reg_desc, 5); ··· 455 377 } 456 378 457 379 item = rmi_get_register_desc_item(&f12->data_reg_desc, 6); 458 - if (item && !xport->attn_data) { 380 + if (item && !drvdata->attn_data.data) { 459 381 f12->data6 = item; 460 382 f12->data6_offset = data_offset; 461 383 data_offset += item->reg_size; 462 384 } 463 385 464 386 item = rmi_get_register_desc_item(&f12->data_reg_desc, 7); 465 - if (item && !xport->attn_data) 387 + if (item && !drvdata->attn_data.data) 466 388 data_offset += item->reg_size; 467 389 468 390 item = rmi_get_register_desc_item(&f12->data_reg_desc, 8); 469 - if (item && !xport->attn_data) 391 + if (item && !drvdata->attn_data.data) 470 392 data_offset += item->reg_size; 471 393 472 394 item = rmi_get_register_desc_item(&f12->data_reg_desc, 9); 473 - if (item && !xport->attn_data) { 395 + if (item && !drvdata->attn_data.data) { 474 396 f12->data9 = item; 475 397 f12->data9_offset = data_offset; 476 398 data_offset += item->reg_size; ··· 479 401 } 480 402 481 403 item = rmi_get_register_desc_item(&f12->data_reg_desc, 10); 482 - if (item && !xport->attn_data) 404 + if (item && !drvdata->attn_data.data) 483 405 data_offset += item->reg_size; 484 406 485 407 item = rmi_get_register_desc_item(&f12->data_reg_desc, 11); 486 - if (item && !xport->attn_data) 408 + if (item && !drvdata->attn_data.data) 487 409 data_offset += item->reg_size; 488 410 489 411 item = rmi_get_register_desc_item(&f12->data_reg_desc, 12); 490 - if (item && !xport->attn_data) 412 + if (item && !drvdata->attn_data.data) 491 413 data_offset += item->reg_size; 492 414 493 415 item = rmi_get_register_desc_item(&f12->data_reg_desc, 13); 494 - if (item && !xport->attn_data) 416 + if (item && !drvdata->attn_data.data) 495 417 data_offset += item->reg_size; 496 418 497 419 item = rmi_get_register_desc_item(&f12->data_reg_desc, 14); 498 - if (item && !xport->attn_data) 420 + if (item && !drvdata->attn_data.data) 499 421 data_offset += item->reg_size; 500 422 501 423 item = rmi_get_register_desc_item(&f12->data_reg_desc, 15); 502 - if (item && !xport->attn_data) { 424 + if (item && !drvdata->attn_data.data) { 503 425 f12->data15 = item; 504 426 f12->data15_offset = data_offset; 505 427 data_offset += item->reg_size;
+13 -9
drivers/input/rmi4/rmi_f30.c
··· 99 99 { 100 100 struct f30_data *f30 = dev_get_drvdata(&fn->dev); 101 101 struct rmi_device *rmi_dev = fn->rmi_dev; 102 + struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev); 102 103 int retval; 103 104 int gpiled = 0; 104 105 int value = 0; ··· 110 109 return 0; 111 110 112 111 /* Read the gpi led data. */ 113 - if (rmi_dev->xport->attn_data) { 114 - memcpy(f30->data_regs, rmi_dev->xport->attn_data, 112 + if (drvdata->attn_data.data) { 113 + if (drvdata->attn_data.size < f30->register_count) { 114 + dev_warn(&fn->dev, "F30 interrupted, but data is missing\n"); 115 + return 0; 116 + } 117 + memcpy(f30->data_regs, drvdata->attn_data.data, 115 118 f30->register_count); 116 - rmi_dev->xport->attn_data += f30->register_count; 117 - rmi_dev->xport->attn_size -= f30->register_count; 119 + drvdata->attn_data.data += f30->register_count; 120 + drvdata->attn_data.size -= f30->register_count; 118 121 } else { 119 122 retval = rmi_read_block(rmi_dev, fn->fd.data_base_addr, 120 123 f30->data_regs, f30->register_count); ··· 197 192 rmi_get_platform_data(fn->rmi_dev); 198 193 int error; 199 194 200 - if (pdata->f30_data && pdata->f30_data->disable) { 195 + if (pdata->f30_data.disable) { 201 196 drv->clear_irq_bits(fn->rmi_dev, fn->irq_mask); 202 197 } else { 203 198 /* Write Control Register values back to device */ ··· 356 351 f30->gpioled_key_map = (u16 *)map_memory; 357 352 358 353 pdata = rmi_get_platform_data(rmi_dev); 359 - if (pdata && f30->has_gpio) { 354 + if (f30->has_gpio) { 360 355 button = BTN_LEFT; 361 356 for (i = 0; i < f30->gpioled_count; i++) { 362 357 if (rmi_f30_is_valid_button(i, f30->ctrl)) { ··· 367 362 * f30->has_mech_mouse_btns, but I am 368 363 * not sure, so use only the pdata info 369 364 */ 370 - if (pdata->f30_data && 371 - pdata->f30_data->buttonpad) 365 + if (pdata->f30_data.buttonpad) 372 366 break; 373 367 } 374 368 } ··· 382 378 const struct rmi_device_platform_data *pdata = 383 379 rmi_get_platform_data(fn->rmi_dev); 384 380 385 - if (pdata->f30_data && pdata->f30_data->disable) 381 + if (pdata->f30_data.disable) 386 382 return 0; 387 383 388 384 rc = rmi_f30_initialize(fn);
+516
drivers/input/rmi4/rmi_f34.c
··· 1 + /* 2 + * Copyright (c) 2007-2016, Synaptics Incorporated 3 + * Copyright (C) 2016 Zodiac Inflight Innovations 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms of the GNU General Public License version 2 as published by 7 + * the Free Software Foundation. 8 + */ 9 + 10 + #include <linux/kernel.h> 11 + #include <linux/rmi.h> 12 + #include <linux/firmware.h> 13 + #include <asm/unaligned.h> 14 + #include <asm/unaligned.h> 15 + #include <linux/bitops.h> 16 + 17 + #include "rmi_driver.h" 18 + #include "rmi_f34.h" 19 + 20 + static int rmi_f34_write_bootloader_id(struct f34_data *f34) 21 + { 22 + struct rmi_function *fn = f34->fn; 23 + struct rmi_device *rmi_dev = fn->rmi_dev; 24 + u8 bootloader_id[F34_BOOTLOADER_ID_LEN]; 25 + int ret; 26 + 27 + ret = rmi_read_block(rmi_dev, fn->fd.query_base_addr, 28 + bootloader_id, sizeof(bootloader_id)); 29 + if (ret) { 30 + dev_err(&fn->dev, "%s: Reading bootloader ID failed: %d\n", 31 + __func__, ret); 32 + return ret; 33 + } 34 + 35 + rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s: writing bootloader id '%c%c'\n", 36 + __func__, bootloader_id[0], bootloader_id[1]); 37 + 38 + ret = rmi_write_block(rmi_dev, 39 + fn->fd.data_base_addr + F34_BLOCK_DATA_OFFSET, 40 + bootloader_id, sizeof(bootloader_id)); 41 + if (ret) { 42 + dev_err(&fn->dev, "Failed to write bootloader ID: %d\n", ret); 43 + return ret; 44 + } 45 + 46 + return 0; 47 + } 48 + 49 + static int rmi_f34_command(struct f34_data *f34, u8 command, 50 + unsigned int timeout, bool write_bl_id) 51 + { 52 + struct rmi_function *fn = f34->fn; 53 + struct rmi_device *rmi_dev = fn->rmi_dev; 54 + int ret; 55 + 56 + if (write_bl_id) { 57 + ret = rmi_f34_write_bootloader_id(f34); 58 + if (ret) 59 + return ret; 60 + } 61 + 62 + init_completion(&f34->v5.cmd_done); 63 + 64 + ret = rmi_read(rmi_dev, f34->v5.ctrl_address, &f34->v5.status); 65 + if (ret) { 66 + dev_err(&f34->fn->dev, 67 + "%s: Failed to read cmd register: %d (command %#02x)\n", 68 + __func__, ret, command); 69 + return ret; 70 + } 71 + 72 + f34->v5.status |= command & 0x0f; 73 + 74 + ret = rmi_write(rmi_dev, f34->v5.ctrl_address, f34->v5.status); 75 + if (ret < 0) { 76 + dev_err(&f34->fn->dev, 77 + "Failed to write F34 command %#02x: %d\n", 78 + command, ret); 79 + return ret; 80 + } 81 + 82 + if (!wait_for_completion_timeout(&f34->v5.cmd_done, 83 + msecs_to_jiffies(timeout))) { 84 + 85 + ret = rmi_read(rmi_dev, f34->v5.ctrl_address, &f34->v5.status); 86 + if (ret) { 87 + dev_err(&f34->fn->dev, 88 + "%s: cmd %#02x timed out: %d\n", 89 + __func__, command, ret); 90 + return ret; 91 + } 92 + 93 + if (f34->v5.status & 0x7f) { 94 + dev_err(&f34->fn->dev, 95 + "%s: cmd %#02x timed out, status: %#02x\n", 96 + __func__, command, f34->v5.status); 97 + return -ETIMEDOUT; 98 + } 99 + } 100 + 101 + return 0; 102 + } 103 + 104 + static int rmi_f34_attention(struct rmi_function *fn, unsigned long *irq_bits) 105 + { 106 + struct f34_data *f34 = dev_get_drvdata(&fn->dev); 107 + int ret; 108 + 109 + if (f34->bl_version != 5) 110 + return 0; 111 + 112 + ret = rmi_read(f34->fn->rmi_dev, f34->v5.ctrl_address, &f34->v5.status); 113 + rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s: status: %#02x, ret: %d\n", 114 + __func__, f34->v5.status, ret); 115 + 116 + if (!ret && !(f34->v5.status & 0x7f)) 117 + complete(&f34->v5.cmd_done); 118 + 119 + return 0; 120 + } 121 + 122 + static int rmi_f34_write_blocks(struct f34_data *f34, const void *data, 123 + int block_count, u8 command) 124 + { 125 + struct rmi_function *fn = f34->fn; 126 + struct rmi_device *rmi_dev = fn->rmi_dev; 127 + u16 address = fn->fd.data_base_addr + F34_BLOCK_DATA_OFFSET; 128 + u8 start_address[] = { 0, 0 }; 129 + int i; 130 + int ret; 131 + 132 + ret = rmi_write_block(rmi_dev, fn->fd.data_base_addr, 133 + start_address, sizeof(start_address)); 134 + if (ret) { 135 + dev_err(&fn->dev, "Failed to write initial zeros: %d\n", ret); 136 + return ret; 137 + } 138 + 139 + for (i = 0; i < block_count; i++) { 140 + ret = rmi_write_block(rmi_dev, address, 141 + data, f34->v5.block_size); 142 + if (ret) { 143 + dev_err(&fn->dev, 144 + "failed to write block #%d: %d\n", i, ret); 145 + return ret; 146 + } 147 + 148 + ret = rmi_f34_command(f34, command, F34_IDLE_WAIT_MS, false); 149 + if (ret) { 150 + dev_err(&fn->dev, 151 + "Failed to write command for block #%d: %d\n", 152 + i, ret); 153 + return ret; 154 + } 155 + 156 + rmi_dbg(RMI_DEBUG_FN, &fn->dev, "wrote block %d of %d\n", 157 + i + 1, block_count); 158 + 159 + data += f34->v5.block_size; 160 + } 161 + 162 + return 0; 163 + } 164 + 165 + static int rmi_f34_write_firmware(struct f34_data *f34, const void *data) 166 + { 167 + return rmi_f34_write_blocks(f34, data, f34->v5.fw_blocks, 168 + F34_WRITE_FW_BLOCK); 169 + } 170 + 171 + static int rmi_f34_write_config(struct f34_data *f34, const void *data) 172 + { 173 + return rmi_f34_write_blocks(f34, data, f34->v5.config_blocks, 174 + F34_WRITE_CONFIG_BLOCK); 175 + } 176 + 177 + int rmi_f34_enable_flash(struct f34_data *f34) 178 + { 179 + return rmi_f34_command(f34, F34_ENABLE_FLASH_PROG, 180 + F34_ENABLE_WAIT_MS, true); 181 + } 182 + 183 + static int rmi_f34_flash_firmware(struct f34_data *f34, 184 + const struct rmi_f34_firmware *syn_fw) 185 + { 186 + struct rmi_function *fn = f34->fn; 187 + int ret; 188 + 189 + if (syn_fw->image_size) { 190 + dev_info(&fn->dev, "Erasing firmware...\n"); 191 + ret = rmi_f34_command(f34, F34_ERASE_ALL, 192 + F34_ERASE_WAIT_MS, true); 193 + if (ret) 194 + return ret; 195 + 196 + dev_info(&fn->dev, "Writing firmware (%d bytes)...\n", 197 + syn_fw->image_size); 198 + ret = rmi_f34_write_firmware(f34, syn_fw->data); 199 + if (ret) 200 + return ret; 201 + } 202 + 203 + if (syn_fw->config_size) { 204 + /* 205 + * We only need to erase config if we haven't updated 206 + * firmware. 207 + */ 208 + if (!syn_fw->image_size) { 209 + dev_info(&fn->dev, "Erasing config...\n"); 210 + ret = rmi_f34_command(f34, F34_ERASE_CONFIG, 211 + F34_ERASE_WAIT_MS, true); 212 + if (ret) 213 + return ret; 214 + } 215 + 216 + dev_info(&fn->dev, "Writing config (%d bytes)...\n", 217 + syn_fw->config_size); 218 + ret = rmi_f34_write_config(f34, 219 + &syn_fw->data[syn_fw->image_size]); 220 + if (ret) 221 + return ret; 222 + } 223 + 224 + return 0; 225 + } 226 + 227 + int rmi_f34_update_firmware(struct f34_data *f34, const struct firmware *fw) 228 + { 229 + const struct rmi_f34_firmware *syn_fw; 230 + int ret; 231 + 232 + syn_fw = (const struct rmi_f34_firmware *)fw->data; 233 + BUILD_BUG_ON(offsetof(struct rmi_f34_firmware, data) != 234 + F34_FW_IMAGE_OFFSET); 235 + 236 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 237 + "FW size:%d, checksum:%08x, image_size:%d, config_size:%d\n", 238 + (int)fw->size, 239 + le32_to_cpu(syn_fw->checksum), 240 + le32_to_cpu(syn_fw->image_size), 241 + le32_to_cpu(syn_fw->config_size)); 242 + 243 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 244 + "FW bootloader_id:%02x, product_id:%.*s, info: %02x%02x\n", 245 + syn_fw->bootloader_version, 246 + (int)sizeof(syn_fw->product_id), syn_fw->product_id, 247 + syn_fw->product_info[0], syn_fw->product_info[1]); 248 + 249 + if (syn_fw->image_size && 250 + syn_fw->image_size != f34->v5.fw_blocks * f34->v5.block_size) { 251 + dev_err(&f34->fn->dev, 252 + "Bad firmware image: fw size %d, expected %d\n", 253 + syn_fw->image_size, 254 + f34->v5.fw_blocks * f34->v5.block_size); 255 + ret = -EILSEQ; 256 + goto out; 257 + } 258 + 259 + if (syn_fw->config_size && 260 + syn_fw->config_size != f34->v5.config_blocks * f34->v5.block_size) { 261 + dev_err(&f34->fn->dev, 262 + "Bad firmware image: config size %d, expected %d\n", 263 + syn_fw->config_size, 264 + f34->v5.config_blocks * f34->v5.block_size); 265 + ret = -EILSEQ; 266 + goto out; 267 + } 268 + 269 + if (syn_fw->image_size && !syn_fw->config_size) { 270 + dev_err(&f34->fn->dev, "Bad firmware image: no config data\n"); 271 + ret = -EILSEQ; 272 + goto out; 273 + } 274 + 275 + dev_info(&f34->fn->dev, "Firmware image OK\n"); 276 + mutex_lock(&f34->v5.flash_mutex); 277 + 278 + ret = rmi_f34_flash_firmware(f34, syn_fw); 279 + 280 + mutex_unlock(&f34->v5.flash_mutex); 281 + 282 + out: 283 + return ret; 284 + } 285 + 286 + static int rmi_firmware_update(struct rmi_driver_data *data, 287 + const struct firmware *fw) 288 + { 289 + struct rmi_device *rmi_dev = data->rmi_dev; 290 + struct device *dev = &rmi_dev->dev; 291 + struct f34_data *f34; 292 + int ret; 293 + 294 + if (!data->f34_container) { 295 + dev_warn(dev, "%s: No F34 present!\n", __func__); 296 + return -EINVAL; 297 + } 298 + 299 + f34 = dev_get_drvdata(&data->f34_container->dev); 300 + 301 + if (f34->bl_version == 7) { 302 + if (data->pdt_props & HAS_BSR) { 303 + dev_err(dev, "%s: LTS not supported\n", __func__); 304 + return -ENODEV; 305 + } 306 + } else if (f34->bl_version != 5) { 307 + dev_warn(dev, "F34 V%d not supported!\n", 308 + data->f34_container->fd.function_version); 309 + return -ENODEV; 310 + } 311 + 312 + /* Enter flash mode */ 313 + if (f34->bl_version == 7) 314 + ret = rmi_f34v7_start_reflash(f34, fw); 315 + else 316 + ret = rmi_f34_enable_flash(f34); 317 + if (ret) 318 + return ret; 319 + 320 + rmi_disable_irq(rmi_dev, false); 321 + 322 + /* Tear down functions and re-probe */ 323 + rmi_free_function_list(rmi_dev); 324 + 325 + ret = rmi_probe_interrupts(data); 326 + if (ret) 327 + return ret; 328 + 329 + ret = rmi_init_functions(data); 330 + if (ret) 331 + return ret; 332 + 333 + if (!data->bootloader_mode || !data->f34_container) { 334 + dev_warn(dev, "%s: No F34 present or not in bootloader!\n", 335 + __func__); 336 + return -EINVAL; 337 + } 338 + 339 + rmi_enable_irq(rmi_dev, false); 340 + 341 + f34 = dev_get_drvdata(&data->f34_container->dev); 342 + 343 + /* Perform firmware update */ 344 + if (f34->bl_version == 7) 345 + ret = rmi_f34v7_do_reflash(f34, fw); 346 + else 347 + ret = rmi_f34_update_firmware(f34, fw); 348 + 349 + dev_info(&f34->fn->dev, "Firmware update complete, status:%d\n", ret); 350 + 351 + rmi_disable_irq(rmi_dev, false); 352 + 353 + /* Re-probe */ 354 + rmi_dbg(RMI_DEBUG_FN, dev, "Re-probing device\n"); 355 + rmi_free_function_list(rmi_dev); 356 + 357 + ret = rmi_scan_pdt(rmi_dev, NULL, rmi_initial_reset); 358 + if (ret < 0) 359 + dev_warn(dev, "RMI reset failed!\n"); 360 + 361 + ret = rmi_probe_interrupts(data); 362 + if (ret) 363 + return ret; 364 + 365 + ret = rmi_init_functions(data); 366 + if (ret) 367 + return ret; 368 + 369 + rmi_enable_irq(rmi_dev, false); 370 + 371 + if (data->f01_container->dev.driver) 372 + /* Driver already bound, so enable ATTN now. */ 373 + return rmi_enable_sensor(rmi_dev); 374 + 375 + rmi_dbg(RMI_DEBUG_FN, dev, "%s complete\n", __func__); 376 + 377 + return ret; 378 + } 379 + 380 + static int rmi_firmware_update(struct rmi_driver_data *data, 381 + const struct firmware *fw); 382 + 383 + static ssize_t rmi_driver_update_fw_store(struct device *dev, 384 + struct device_attribute *dattr, 385 + const char *buf, size_t count) 386 + { 387 + struct rmi_driver_data *data = dev_get_drvdata(dev); 388 + char fw_name[NAME_MAX]; 389 + const struct firmware *fw; 390 + size_t copy_count = count; 391 + int ret; 392 + 393 + if (count == 0 || count >= NAME_MAX) 394 + return -EINVAL; 395 + 396 + if (buf[count - 1] == '\0' || buf[count - 1] == '\n') 397 + copy_count -= 1; 398 + 399 + strncpy(fw_name, buf, copy_count); 400 + fw_name[copy_count] = '\0'; 401 + 402 + ret = request_firmware(&fw, fw_name, dev); 403 + if (ret) 404 + return ret; 405 + 406 + dev_info(dev, "Flashing %s\n", fw_name); 407 + 408 + ret = rmi_firmware_update(data, fw); 409 + 410 + release_firmware(fw); 411 + 412 + return ret ?: count; 413 + } 414 + 415 + static DEVICE_ATTR(update_fw, 0200, NULL, rmi_driver_update_fw_store); 416 + 417 + static struct attribute *rmi_firmware_attrs[] = { 418 + &dev_attr_update_fw.attr, 419 + NULL 420 + }; 421 + 422 + static struct attribute_group rmi_firmware_attr_group = { 423 + .attrs = rmi_firmware_attrs, 424 + }; 425 + 426 + static int rmi_f34_probe(struct rmi_function *fn) 427 + { 428 + struct f34_data *f34; 429 + unsigned char f34_queries[9]; 430 + bool has_config_id; 431 + u8 version = fn->fd.function_version; 432 + int ret; 433 + 434 + f34 = devm_kzalloc(&fn->dev, sizeof(struct f34_data), GFP_KERNEL); 435 + if (!f34) 436 + return -ENOMEM; 437 + 438 + f34->fn = fn; 439 + dev_set_drvdata(&fn->dev, f34); 440 + 441 + /* v5 code only supported version 0, try V7 probe */ 442 + if (version > 0) 443 + return rmi_f34v7_probe(f34); 444 + else if (version != 0) 445 + return -ENODEV; 446 + 447 + f34->bl_version = 5; 448 + 449 + ret = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr, 450 + f34_queries, sizeof(f34_queries)); 451 + if (ret) { 452 + dev_err(&fn->dev, "%s: Failed to query properties\n", 453 + __func__); 454 + return ret; 455 + } 456 + 457 + snprintf(f34->bootloader_id, sizeof(f34->bootloader_id), 458 + "%c%c", f34_queries[0], f34_queries[1]); 459 + 460 + mutex_init(&f34->v5.flash_mutex); 461 + init_completion(&f34->v5.cmd_done); 462 + 463 + f34->v5.block_size = get_unaligned_le16(&f34_queries[3]); 464 + f34->v5.fw_blocks = get_unaligned_le16(&f34_queries[5]); 465 + f34->v5.config_blocks = get_unaligned_le16(&f34_queries[7]); 466 + f34->v5.ctrl_address = fn->fd.data_base_addr + F34_BLOCK_DATA_OFFSET + 467 + f34->v5.block_size; 468 + has_config_id = f34_queries[2] & (1 << 2); 469 + 470 + rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Bootloader ID: %s\n", 471 + f34->bootloader_id); 472 + rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Block size: %d\n", 473 + f34->v5.block_size); 474 + rmi_dbg(RMI_DEBUG_FN, &fn->dev, "FW blocks: %d\n", 475 + f34->v5.fw_blocks); 476 + rmi_dbg(RMI_DEBUG_FN, &fn->dev, "CFG blocks: %d\n", 477 + f34->v5.config_blocks); 478 + 479 + if (has_config_id) { 480 + ret = rmi_read_block(fn->rmi_dev, fn->fd.control_base_addr, 481 + f34_queries, sizeof(f34_queries)); 482 + if (ret) { 483 + dev_err(&fn->dev, "Failed to read F34 config ID\n"); 484 + return ret; 485 + } 486 + 487 + snprintf(f34->configuration_id, sizeof(f34->configuration_id), 488 + "%02x%02x%02x%02x", 489 + f34_queries[0], f34_queries[1], 490 + f34_queries[2], f34_queries[3]); 491 + 492 + rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Configuration ID: %s\n", 493 + f34->configuration_id); 494 + } 495 + 496 + return 0; 497 + } 498 + 499 + int rmi_f34_create_sysfs(struct rmi_device *rmi_dev) 500 + { 501 + return sysfs_create_group(&rmi_dev->dev.kobj, &rmi_firmware_attr_group); 502 + } 503 + 504 + void rmi_f34_remove_sysfs(struct rmi_device *rmi_dev) 505 + { 506 + sysfs_remove_group(&rmi_dev->dev.kobj, &rmi_firmware_attr_group); 507 + } 508 + 509 + struct rmi_function_handler rmi_f34_handler = { 510 + .driver = { 511 + .name = "rmi4_f34", 512 + }, 513 + .func = 0x34, 514 + .probe = rmi_f34_probe, 515 + .attention = rmi_f34_attention, 516 + };
+314
drivers/input/rmi4/rmi_f34.h
··· 1 + /* 2 + * Copyright (c) 2007-2016, Synaptics Incorporated 3 + * Copyright (C) 2016 Zodiac Inflight Innovations 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms of the GNU General Public License version 2 as published by 7 + * the Free Software Foundation. 8 + */ 9 + 10 + #ifndef _RMI_F34_H 11 + #define _RMI_F34_H 12 + 13 + /* F34 image file offsets. */ 14 + #define F34_FW_IMAGE_OFFSET 0x100 15 + 16 + /* F34 register offsets. */ 17 + #define F34_BLOCK_DATA_OFFSET 2 18 + 19 + /* F34 commands */ 20 + #define F34_WRITE_FW_BLOCK 0x2 21 + #define F34_ERASE_ALL 0x3 22 + #define F34_READ_CONFIG_BLOCK 0x5 23 + #define F34_WRITE_CONFIG_BLOCK 0x6 24 + #define F34_ERASE_CONFIG 0x7 25 + #define F34_ENABLE_FLASH_PROG 0xf 26 + 27 + #define F34_STATUS_IN_PROGRESS 0xff 28 + #define F34_STATUS_IDLE 0x80 29 + 30 + #define F34_IDLE_WAIT_MS 500 31 + #define F34_ENABLE_WAIT_MS 300 32 + #define F34_ERASE_WAIT_MS 5000 33 + 34 + #define F34_BOOTLOADER_ID_LEN 2 35 + 36 + /* F34 V7 defines */ 37 + #define V7_FLASH_STATUS_OFFSET 0 38 + #define V7_PARTITION_ID_OFFSET 1 39 + #define V7_BLOCK_NUMBER_OFFSET 2 40 + #define V7_TRANSFER_LENGTH_OFFSET 3 41 + #define V7_COMMAND_OFFSET 4 42 + #define V7_PAYLOAD_OFFSET 5 43 + #define V7_BOOTLOADER_ID_OFFSET 1 44 + 45 + #define IMAGE_HEADER_VERSION_10 0x10 46 + 47 + #define CONFIG_ID_SIZE 32 48 + #define PRODUCT_ID_SIZE 10 49 + 50 + #define ENABLE_WAIT_MS (1 * 1000) 51 + #define WRITE_WAIT_MS (3 * 1000) 52 + 53 + #define MIN_SLEEP_TIME_US 50 54 + #define MAX_SLEEP_TIME_US 100 55 + 56 + #define HAS_BSR BIT(5) 57 + #define HAS_CONFIG_ID BIT(3) 58 + #define HAS_GUEST_CODE BIT(6) 59 + #define HAS_DISP_CFG BIT(5) 60 + 61 + /* F34 V7 commands */ 62 + #define CMD_V7_IDLE 0 63 + #define CMD_V7_ENTER_BL 1 64 + #define CMD_V7_READ 2 65 + #define CMD_V7_WRITE 3 66 + #define CMD_V7_ERASE 4 67 + #define CMD_V7_ERASE_AP 5 68 + #define CMD_V7_SENSOR_ID 6 69 + 70 + #define v7_CMD_IDLE 0 71 + #define v7_CMD_WRITE_FW 1 72 + #define v7_CMD_WRITE_CONFIG 2 73 + #define v7_CMD_WRITE_LOCKDOWN 3 74 + #define v7_CMD_WRITE_GUEST_CODE 4 75 + #define v7_CMD_READ_CONFIG 5 76 + #define v7_CMD_ERASE_ALL 6 77 + #define v7_CMD_ERASE_UI_FIRMWARE 7 78 + #define v7_CMD_ERASE_UI_CONFIG 8 79 + #define v7_CMD_ERASE_BL_CONFIG 9 80 + #define v7_CMD_ERASE_DISP_CONFIG 10 81 + #define v7_CMD_ERASE_FLASH_CONFIG 11 82 + #define v7_CMD_ERASE_GUEST_CODE 12 83 + #define v7_CMD_ENABLE_FLASH_PROG 13 84 + 85 + #define v7_UI_CONFIG_AREA 0 86 + #define v7_PM_CONFIG_AREA 1 87 + #define v7_BL_CONFIG_AREA 2 88 + #define v7_DP_CONFIG_AREA 3 89 + #define v7_FLASH_CONFIG_AREA 4 90 + 91 + /* F34 V7 partition IDs */ 92 + #define BOOTLOADER_PARTITION 1 93 + #define DEVICE_CONFIG_PARTITION 2 94 + #define FLASH_CONFIG_PARTITION 3 95 + #define MANUFACTURING_BLOCK_PARTITION 4 96 + #define GUEST_SERIALIZATION_PARTITION 5 97 + #define GLOBAL_PARAMETERS_PARTITION 6 98 + #define CORE_CODE_PARTITION 7 99 + #define CORE_CONFIG_PARTITION 8 100 + #define GUEST_CODE_PARTITION 9 101 + #define DISPLAY_CONFIG_PARTITION 10 102 + 103 + /* F34 V7 container IDs */ 104 + #define TOP_LEVEL_CONTAINER 0 105 + #define UI_CONTAINER 1 106 + #define UI_CONFIG_CONTAINER 2 107 + #define BL_CONTAINER 3 108 + #define BL_IMAGE_CONTAINER 4 109 + #define BL_CONFIG_CONTAINER 5 110 + #define BL_LOCKDOWN_INFO_CONTAINER 6 111 + #define PERMANENT_CONFIG_CONTAINER 7 112 + #define GUEST_CODE_CONTAINER 8 113 + #define BL_PROTOCOL_DESCRIPTOR_CONTAINER 9 114 + #define UI_PROTOCOL_DESCRIPTOR_CONTAINER 10 115 + #define RMI_SELF_DISCOVERY_CONTAINER 11 116 + #define RMI_PAGE_CONTENT_CONTAINER 12 117 + #define GENERAL_INFORMATION_CONTAINER 13 118 + #define DEVICE_CONFIG_CONTAINER 14 119 + #define FLASH_CONFIG_CONTAINER 15 120 + #define GUEST_SERIALIZATION_CONTAINER 16 121 + #define GLOBAL_PARAMETERS_CONTAINER 17 122 + #define CORE_CODE_CONTAINER 18 123 + #define CORE_CONFIG_CONTAINER 19 124 + #define DISPLAY_CONFIG_CONTAINER 20 125 + 126 + struct f34v7_query_1_7 { 127 + u8 bl_minor_revision; /* query 1 */ 128 + u8 bl_major_revision; 129 + __le32 bl_fw_id; /* query 2 */ 130 + u8 minimum_write_size; /* query 3 */ 131 + __le16 block_size; 132 + __le16 flash_page_size; 133 + __le16 adjustable_partition_area_size; /* query 4 */ 134 + __le16 flash_config_length; /* query 5 */ 135 + __le16 payload_length; /* query 6 */ 136 + u8 partition_support[4]; /* query 7 */ 137 + } __packed; 138 + 139 + struct f34v7_data_1_5 { 140 + u8 partition_id; 141 + __le16 block_offset; 142 + __le16 transfer_length; 143 + u8 command; 144 + u8 payload[2]; 145 + } __packed; 146 + 147 + struct block_data { 148 + const void *data; 149 + int size; 150 + }; 151 + 152 + struct partition_table { 153 + u8 partition_id; 154 + u8 byte_1_reserved; 155 + __le16 partition_length; 156 + __le16 start_physical_address; 157 + __le16 partition_properties; 158 + } __packed; 159 + 160 + struct physical_address { 161 + u16 ui_firmware; 162 + u16 ui_config; 163 + u16 dp_config; 164 + u16 guest_code; 165 + }; 166 + 167 + struct container_descriptor { 168 + __le32 content_checksum; 169 + __le16 container_id; 170 + u8 minor_version; 171 + u8 major_version; 172 + u8 reserved_08; 173 + u8 reserved_09; 174 + u8 reserved_0a; 175 + u8 reserved_0b; 176 + u8 container_option_flags[4]; 177 + __le32 content_options_length; 178 + __le32 content_options_address; 179 + __le32 content_length; 180 + __le32 content_address; 181 + } __packed; 182 + 183 + struct block_count { 184 + u16 ui_firmware; 185 + u16 ui_config; 186 + u16 dp_config; 187 + u16 fl_config; 188 + u16 pm_config; 189 + u16 bl_config; 190 + u16 lockdown; 191 + u16 guest_code; 192 + }; 193 + 194 + struct image_header_10 { 195 + __le32 checksum; 196 + u8 reserved_04; 197 + u8 reserved_05; 198 + u8 minor_header_version; 199 + u8 major_header_version; 200 + u8 reserved_08; 201 + u8 reserved_09; 202 + u8 reserved_0a; 203 + u8 reserved_0b; 204 + __le32 top_level_container_start_addr; 205 + }; 206 + 207 + struct image_metadata { 208 + bool contains_firmware_id; 209 + bool contains_bootloader; 210 + bool contains_display_cfg; 211 + bool contains_guest_code; 212 + bool contains_flash_config; 213 + unsigned int firmware_id; 214 + unsigned int checksum; 215 + unsigned int bootloader_size; 216 + unsigned int display_cfg_offset; 217 + unsigned char bl_version; 218 + unsigned char product_id[PRODUCT_ID_SIZE + 1]; 219 + unsigned char cstmr_product_id[PRODUCT_ID_SIZE + 1]; 220 + struct block_data bootloader; 221 + struct block_data ui_firmware; 222 + struct block_data ui_config; 223 + struct block_data dp_config; 224 + struct block_data fl_config; 225 + struct block_data bl_config; 226 + struct block_data guest_code; 227 + struct block_data lockdown; 228 + struct block_count blkcount; 229 + struct physical_address phyaddr; 230 + }; 231 + 232 + struct register_offset { 233 + u8 properties; 234 + u8 properties_2; 235 + u8 block_size; 236 + u8 block_count; 237 + u8 gc_block_count; 238 + u8 flash_status; 239 + u8 partition_id; 240 + u8 block_number; 241 + u8 transfer_length; 242 + u8 flash_cmd; 243 + u8 payload; 244 + }; 245 + 246 + struct rmi_f34_firmware { 247 + __le32 checksum; 248 + u8 pad1[3]; 249 + u8 bootloader_version; 250 + __le32 image_size; 251 + __le32 config_size; 252 + u8 product_id[10]; 253 + u8 product_info[2]; 254 + u8 pad2[228]; 255 + u8 data[]; 256 + }; 257 + 258 + struct f34v5_data { 259 + u16 block_size; 260 + u16 fw_blocks; 261 + u16 config_blocks; 262 + u16 ctrl_address; 263 + u8 status; 264 + 265 + struct completion cmd_done; 266 + struct mutex flash_mutex; 267 + }; 268 + 269 + struct f34v7_data { 270 + bool has_display_cfg; 271 + bool has_guest_code; 272 + bool force_update; 273 + bool in_bl_mode; 274 + u8 *read_config_buf; 275 + size_t read_config_buf_size; 276 + u8 command; 277 + u8 flash_status; 278 + u16 block_size; 279 + u16 config_block_count; 280 + u16 config_size; 281 + u16 config_area; 282 + u16 flash_config_length; 283 + u16 payload_length; 284 + u8 partitions; 285 + u16 partition_table_bytes; 286 + bool new_partition_table; 287 + 288 + struct register_offset off; 289 + struct block_count blkcount; 290 + struct physical_address phyaddr; 291 + struct image_metadata img; 292 + 293 + const void *config_data; 294 + const void *image; 295 + }; 296 + 297 + struct f34_data { 298 + struct rmi_function *fn; 299 + 300 + u8 bl_version; 301 + unsigned char bootloader_id[5]; 302 + unsigned char configuration_id[CONFIG_ID_SIZE*2 + 1]; 303 + 304 + union { 305 + struct f34v5_data v5; 306 + struct f34v7_data v7; 307 + }; 308 + }; 309 + 310 + int rmi_f34v7_start_reflash(struct f34_data *f34, const struct firmware *fw); 311 + int rmi_f34v7_do_reflash(struct f34_data *f34, const struct firmware *fw); 312 + int rmi_f34v7_probe(struct f34_data *f34); 313 + 314 + #endif /* _RMI_F34_H */
+1372
drivers/input/rmi4/rmi_f34v7.c
··· 1 + /* 2 + * Copyright (c) 2016, Zodiac Inflight Innovations 3 + * Copyright (c) 2007-2016, Synaptics Incorporated 4 + * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com> 5 + * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com> 6 + * 7 + * This program is free software; you can redistribute it and/or modify it 8 + * under the terms of the GNU General Public License version 2 as published by 9 + * the Free Software Foundation. 10 + */ 11 + 12 + #include <linux/kernel.h> 13 + #include <linux/rmi.h> 14 + #include <linux/firmware.h> 15 + #include <asm/unaligned.h> 16 + #include <linux/delay.h> 17 + #include <linux/slab.h> 18 + 19 + #include "rmi_driver.h" 20 + #include "rmi_f34.h" 21 + 22 + static int rmi_f34v7_read_flash_status(struct f34_data *f34) 23 + { 24 + u8 status; 25 + u8 command; 26 + int ret; 27 + 28 + ret = rmi_read_block(f34->fn->rmi_dev, 29 + f34->fn->fd.data_base_addr + f34->v7.off.flash_status, 30 + &status, 31 + sizeof(status)); 32 + if (ret < 0) { 33 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 34 + "%s: Failed to read flash status\n", __func__); 35 + return ret; 36 + } 37 + 38 + f34->v7.in_bl_mode = status >> 7; 39 + f34->v7.flash_status = status & 0x1f; 40 + 41 + if (f34->v7.flash_status != 0x00) { 42 + dev_err(&f34->fn->dev, "%s: status=%d, command=0x%02x\n", 43 + __func__, f34->v7.flash_status, f34->v7.command); 44 + } 45 + 46 + ret = rmi_read_block(f34->fn->rmi_dev, 47 + f34->fn->fd.data_base_addr + f34->v7.off.flash_cmd, 48 + &command, 49 + sizeof(command)); 50 + if (ret < 0) { 51 + dev_err(&f34->fn->dev, "%s: Failed to read flash command\n", 52 + __func__); 53 + return ret; 54 + } 55 + 56 + f34->v7.command = command; 57 + 58 + return 0; 59 + } 60 + 61 + static int rmi_f34v7_wait_for_idle(struct f34_data *f34, int timeout_ms) 62 + { 63 + int count = 0; 64 + int timeout_count = ((timeout_ms * 1000) / MAX_SLEEP_TIME_US) + 1; 65 + 66 + do { 67 + usleep_range(MIN_SLEEP_TIME_US, MAX_SLEEP_TIME_US); 68 + 69 + count++; 70 + 71 + rmi_f34v7_read_flash_status(f34); 72 + 73 + if ((f34->v7.command == v7_CMD_IDLE) 74 + && (f34->v7.flash_status == 0x00)) { 75 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 76 + "Idle status detected\n"); 77 + return 0; 78 + } 79 + } while (count < timeout_count); 80 + 81 + dev_err(&f34->fn->dev, 82 + "%s: Timed out waiting for idle status\n", __func__); 83 + 84 + return -ETIMEDOUT; 85 + } 86 + 87 + static int rmi_f34v7_write_command_single_transaction(struct f34_data *f34, 88 + u8 cmd) 89 + { 90 + int ret; 91 + u8 base; 92 + struct f34v7_data_1_5 data_1_5; 93 + 94 + base = f34->fn->fd.data_base_addr; 95 + 96 + memset(&data_1_5, 0, sizeof(data_1_5)); 97 + 98 + switch (cmd) { 99 + case v7_CMD_ERASE_ALL: 100 + data_1_5.partition_id = CORE_CODE_PARTITION; 101 + data_1_5.command = CMD_V7_ERASE_AP; 102 + break; 103 + case v7_CMD_ERASE_UI_FIRMWARE: 104 + data_1_5.partition_id = CORE_CODE_PARTITION; 105 + data_1_5.command = CMD_V7_ERASE; 106 + break; 107 + case v7_CMD_ERASE_BL_CONFIG: 108 + data_1_5.partition_id = GLOBAL_PARAMETERS_PARTITION; 109 + data_1_5.command = CMD_V7_ERASE; 110 + break; 111 + case v7_CMD_ERASE_UI_CONFIG: 112 + data_1_5.partition_id = CORE_CONFIG_PARTITION; 113 + data_1_5.command = CMD_V7_ERASE; 114 + break; 115 + case v7_CMD_ERASE_DISP_CONFIG: 116 + data_1_5.partition_id = DISPLAY_CONFIG_PARTITION; 117 + data_1_5.command = CMD_V7_ERASE; 118 + break; 119 + case v7_CMD_ERASE_FLASH_CONFIG: 120 + data_1_5.partition_id = FLASH_CONFIG_PARTITION; 121 + data_1_5.command = CMD_V7_ERASE; 122 + break; 123 + case v7_CMD_ERASE_GUEST_CODE: 124 + data_1_5.partition_id = GUEST_CODE_PARTITION; 125 + data_1_5.command = CMD_V7_ERASE; 126 + break; 127 + case v7_CMD_ENABLE_FLASH_PROG: 128 + data_1_5.partition_id = BOOTLOADER_PARTITION; 129 + data_1_5.command = CMD_V7_ENTER_BL; 130 + break; 131 + } 132 + 133 + data_1_5.payload[0] = f34->bootloader_id[0]; 134 + data_1_5.payload[1] = f34->bootloader_id[1]; 135 + 136 + ret = rmi_write_block(f34->fn->rmi_dev, 137 + base + f34->v7.off.partition_id, 138 + &data_1_5, sizeof(data_1_5)); 139 + if (ret < 0) { 140 + dev_err(&f34->fn->dev, 141 + "%s: Failed to write single transaction command\n", 142 + __func__); 143 + return ret; 144 + } 145 + 146 + return 0; 147 + } 148 + 149 + static int rmi_f34v7_write_command(struct f34_data *f34, u8 cmd) 150 + { 151 + int ret; 152 + u8 base; 153 + u8 command; 154 + 155 + base = f34->fn->fd.data_base_addr; 156 + 157 + switch (cmd) { 158 + case v7_CMD_WRITE_FW: 159 + case v7_CMD_WRITE_CONFIG: 160 + case v7_CMD_WRITE_GUEST_CODE: 161 + command = CMD_V7_WRITE; 162 + break; 163 + case v7_CMD_READ_CONFIG: 164 + command = CMD_V7_READ; 165 + break; 166 + case v7_CMD_ERASE_ALL: 167 + command = CMD_V7_ERASE_AP; 168 + break; 169 + case v7_CMD_ERASE_UI_FIRMWARE: 170 + case v7_CMD_ERASE_BL_CONFIG: 171 + case v7_CMD_ERASE_UI_CONFIG: 172 + case v7_CMD_ERASE_DISP_CONFIG: 173 + case v7_CMD_ERASE_FLASH_CONFIG: 174 + case v7_CMD_ERASE_GUEST_CODE: 175 + command = CMD_V7_ERASE; 176 + break; 177 + case v7_CMD_ENABLE_FLASH_PROG: 178 + command = CMD_V7_ENTER_BL; 179 + break; 180 + default: 181 + dev_err(&f34->fn->dev, "%s: Invalid command 0x%02x\n", 182 + __func__, cmd); 183 + return -EINVAL; 184 + } 185 + 186 + f34->v7.command = command; 187 + 188 + switch (cmd) { 189 + case v7_CMD_ERASE_ALL: 190 + case v7_CMD_ERASE_UI_FIRMWARE: 191 + case v7_CMD_ERASE_BL_CONFIG: 192 + case v7_CMD_ERASE_UI_CONFIG: 193 + case v7_CMD_ERASE_DISP_CONFIG: 194 + case v7_CMD_ERASE_FLASH_CONFIG: 195 + case v7_CMD_ERASE_GUEST_CODE: 196 + case v7_CMD_ENABLE_FLASH_PROG: 197 + ret = rmi_f34v7_write_command_single_transaction(f34, cmd); 198 + if (ret < 0) 199 + return ret; 200 + else 201 + return 0; 202 + default: 203 + break; 204 + } 205 + 206 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: writing cmd %02X\n", 207 + __func__, command); 208 + 209 + ret = rmi_write_block(f34->fn->rmi_dev, 210 + base + f34->v7.off.flash_cmd, 211 + &command, sizeof(command)); 212 + if (ret < 0) { 213 + dev_err(&f34->fn->dev, "%s: Failed to write flash command\n", 214 + __func__); 215 + return ret; 216 + } 217 + 218 + return 0; 219 + } 220 + 221 + static int rmi_f34v7_write_partition_id(struct f34_data *f34, u8 cmd) 222 + { 223 + int ret; 224 + u8 base; 225 + u8 partition; 226 + 227 + base = f34->fn->fd.data_base_addr; 228 + 229 + switch (cmd) { 230 + case v7_CMD_WRITE_FW: 231 + partition = CORE_CODE_PARTITION; 232 + break; 233 + case v7_CMD_WRITE_CONFIG: 234 + case v7_CMD_READ_CONFIG: 235 + if (f34->v7.config_area == v7_UI_CONFIG_AREA) 236 + partition = CORE_CONFIG_PARTITION; 237 + else if (f34->v7.config_area == v7_DP_CONFIG_AREA) 238 + partition = DISPLAY_CONFIG_PARTITION; 239 + else if (f34->v7.config_area == v7_PM_CONFIG_AREA) 240 + partition = GUEST_SERIALIZATION_PARTITION; 241 + else if (f34->v7.config_area == v7_BL_CONFIG_AREA) 242 + partition = GLOBAL_PARAMETERS_PARTITION; 243 + else if (f34->v7.config_area == v7_FLASH_CONFIG_AREA) 244 + partition = FLASH_CONFIG_PARTITION; 245 + break; 246 + case v7_CMD_WRITE_GUEST_CODE: 247 + partition = GUEST_CODE_PARTITION; 248 + break; 249 + case v7_CMD_ERASE_ALL: 250 + partition = CORE_CODE_PARTITION; 251 + break; 252 + case v7_CMD_ERASE_BL_CONFIG: 253 + partition = GLOBAL_PARAMETERS_PARTITION; 254 + break; 255 + case v7_CMD_ERASE_UI_CONFIG: 256 + partition = CORE_CONFIG_PARTITION; 257 + break; 258 + case v7_CMD_ERASE_DISP_CONFIG: 259 + partition = DISPLAY_CONFIG_PARTITION; 260 + break; 261 + case v7_CMD_ERASE_FLASH_CONFIG: 262 + partition = FLASH_CONFIG_PARTITION; 263 + break; 264 + case v7_CMD_ERASE_GUEST_CODE: 265 + partition = GUEST_CODE_PARTITION; 266 + break; 267 + case v7_CMD_ENABLE_FLASH_PROG: 268 + partition = BOOTLOADER_PARTITION; 269 + break; 270 + default: 271 + dev_err(&f34->fn->dev, "%s: Invalid command 0x%02x\n", 272 + __func__, cmd); 273 + return -EINVAL; 274 + } 275 + 276 + ret = rmi_write_block(f34->fn->rmi_dev, 277 + base + f34->v7.off.partition_id, 278 + &partition, sizeof(partition)); 279 + if (ret < 0) { 280 + dev_err(&f34->fn->dev, "%s: Failed to write partition ID\n", 281 + __func__); 282 + return ret; 283 + } 284 + 285 + return 0; 286 + } 287 + 288 + static int rmi_f34v7_read_f34v7_partition_table(struct f34_data *f34) 289 + { 290 + int ret; 291 + u8 base; 292 + __le16 length; 293 + u16 block_number = 0; 294 + 295 + base = f34->fn->fd.data_base_addr; 296 + 297 + f34->v7.config_area = v7_FLASH_CONFIG_AREA; 298 + 299 + ret = rmi_f34v7_write_partition_id(f34, v7_CMD_READ_CONFIG); 300 + if (ret < 0) 301 + return ret; 302 + 303 + ret = rmi_write_block(f34->fn->rmi_dev, 304 + base + f34->v7.off.block_number, 305 + &block_number, sizeof(block_number)); 306 + if (ret < 0) { 307 + dev_err(&f34->fn->dev, "%s: Failed to write block number\n", 308 + __func__); 309 + return ret; 310 + } 311 + 312 + put_unaligned_le16(f34->v7.flash_config_length, &length); 313 + 314 + ret = rmi_write_block(f34->fn->rmi_dev, 315 + base + f34->v7.off.transfer_length, 316 + &length, sizeof(length)); 317 + if (ret < 0) { 318 + dev_err(&f34->fn->dev, "%s: Failed to write transfer length\n", 319 + __func__); 320 + return ret; 321 + } 322 + 323 + ret = rmi_f34v7_write_command(f34, v7_CMD_READ_CONFIG); 324 + if (ret < 0) { 325 + dev_err(&f34->fn->dev, "%s: Failed to write command\n", 326 + __func__); 327 + return ret; 328 + } 329 + 330 + ret = rmi_f34v7_wait_for_idle(f34, WRITE_WAIT_MS); 331 + if (ret < 0) { 332 + dev_err(&f34->fn->dev, "%s: Failed to wait for idle status\n", 333 + __func__); 334 + return ret; 335 + } 336 + 337 + ret = rmi_read_block(f34->fn->rmi_dev, 338 + base + f34->v7.off.payload, 339 + f34->v7.read_config_buf, 340 + f34->v7.partition_table_bytes); 341 + if (ret < 0) { 342 + dev_err(&f34->fn->dev, "%s: Failed to read block data\n", 343 + __func__); 344 + return ret; 345 + } 346 + 347 + return 0; 348 + } 349 + 350 + static void rmi_f34v7_parse_partition_table(struct f34_data *f34, 351 + const void *partition_table, 352 + struct block_count *blkcount, 353 + struct physical_address *phyaddr) 354 + { 355 + int i; 356 + int index; 357 + u16 partition_length; 358 + u16 physical_address; 359 + const struct partition_table *ptable; 360 + 361 + for (i = 0; i < f34->v7.partitions; i++) { 362 + index = i * 8 + 2; 363 + ptable = partition_table + index; 364 + partition_length = le16_to_cpu(ptable->partition_length); 365 + physical_address = le16_to_cpu(ptable->start_physical_address); 366 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 367 + "%s: Partition entry %d: %*ph\n", 368 + __func__, i, sizeof(struct partition_table), ptable); 369 + switch (ptable->partition_id & 0x1f) { 370 + case CORE_CODE_PARTITION: 371 + blkcount->ui_firmware = partition_length; 372 + phyaddr->ui_firmware = physical_address; 373 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 374 + "%s: Core code block count: %d\n", 375 + __func__, blkcount->ui_firmware); 376 + break; 377 + case CORE_CONFIG_PARTITION: 378 + blkcount->ui_config = partition_length; 379 + phyaddr->ui_config = physical_address; 380 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 381 + "%s: Core config block count: %d\n", 382 + __func__, blkcount->ui_config); 383 + break; 384 + case DISPLAY_CONFIG_PARTITION: 385 + blkcount->dp_config = partition_length; 386 + phyaddr->dp_config = physical_address; 387 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 388 + "%s: Display config block count: %d\n", 389 + __func__, blkcount->dp_config); 390 + break; 391 + case FLASH_CONFIG_PARTITION: 392 + blkcount->fl_config = partition_length; 393 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 394 + "%s: Flash config block count: %d\n", 395 + __func__, blkcount->fl_config); 396 + break; 397 + case GUEST_CODE_PARTITION: 398 + blkcount->guest_code = partition_length; 399 + phyaddr->guest_code = physical_address; 400 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 401 + "%s: Guest code block count: %d\n", 402 + __func__, blkcount->guest_code); 403 + break; 404 + case GUEST_SERIALIZATION_PARTITION: 405 + blkcount->pm_config = partition_length; 406 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 407 + "%s: Guest serialization block count: %d\n", 408 + __func__, blkcount->pm_config); 409 + break; 410 + case GLOBAL_PARAMETERS_PARTITION: 411 + blkcount->bl_config = partition_length; 412 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 413 + "%s: Global parameters block count: %d\n", 414 + __func__, blkcount->bl_config); 415 + break; 416 + case DEVICE_CONFIG_PARTITION: 417 + blkcount->lockdown = partition_length; 418 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 419 + "%s: Device config block count: %d\n", 420 + __func__, blkcount->lockdown); 421 + break; 422 + } 423 + } 424 + } 425 + 426 + static int rmi_f34v7_read_queries_bl_version(struct f34_data *f34) 427 + { 428 + int ret; 429 + u8 base; 430 + int offset; 431 + u8 query_0; 432 + struct f34v7_query_1_7 query_1_7; 433 + 434 + base = f34->fn->fd.query_base_addr; 435 + 436 + ret = rmi_read_block(f34->fn->rmi_dev, 437 + base, 438 + &query_0, 439 + sizeof(query_0)); 440 + if (ret < 0) { 441 + dev_err(&f34->fn->dev, 442 + "%s: Failed to read query 0\n", __func__); 443 + return ret; 444 + } 445 + 446 + offset = (query_0 & 0x7) + 1; 447 + 448 + ret = rmi_read_block(f34->fn->rmi_dev, 449 + base + offset, 450 + &query_1_7, 451 + sizeof(query_1_7)); 452 + if (ret < 0) { 453 + dev_err(&f34->fn->dev, "%s: Failed to read queries 1 to 7\n", 454 + __func__); 455 + return ret; 456 + } 457 + 458 + f34->bootloader_id[0] = query_1_7.bl_minor_revision; 459 + f34->bootloader_id[1] = query_1_7.bl_major_revision; 460 + 461 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Bootloader V%d.%d\n", 462 + f34->bootloader_id[1], f34->bootloader_id[0]); 463 + 464 + return 0; 465 + } 466 + 467 + static int rmi_f34v7_read_queries(struct f34_data *f34) 468 + { 469 + int ret; 470 + int i, j; 471 + u8 base; 472 + int offset; 473 + u8 *ptable; 474 + u8 query_0; 475 + struct f34v7_query_1_7 query_1_7; 476 + 477 + base = f34->fn->fd.query_base_addr; 478 + 479 + ret = rmi_read_block(f34->fn->rmi_dev, 480 + base, 481 + &query_0, 482 + sizeof(query_0)); 483 + if (ret < 0) { 484 + dev_err(&f34->fn->dev, 485 + "%s: Failed to read query 0\n", __func__); 486 + return ret; 487 + } 488 + 489 + offset = (query_0 & 0x07) + 1; 490 + 491 + ret = rmi_read_block(f34->fn->rmi_dev, 492 + base + offset, 493 + &query_1_7, 494 + sizeof(query_1_7)); 495 + if (ret < 0) { 496 + dev_err(&f34->fn->dev, "%s: Failed to read queries 1 to 7\n", 497 + __func__); 498 + return ret; 499 + } 500 + 501 + f34->bootloader_id[0] = query_1_7.bl_minor_revision; 502 + f34->bootloader_id[1] = query_1_7.bl_major_revision; 503 + 504 + f34->v7.block_size = le16_to_cpu(query_1_7.block_size); 505 + f34->v7.flash_config_length = 506 + le16_to_cpu(query_1_7.flash_config_length); 507 + f34->v7.payload_length = le16_to_cpu(query_1_7.payload_length); 508 + 509 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: f34->v7.block_size = %d\n", 510 + __func__, f34->v7.block_size); 511 + 512 + f34->v7.off.flash_status = V7_FLASH_STATUS_OFFSET; 513 + f34->v7.off.partition_id = V7_PARTITION_ID_OFFSET; 514 + f34->v7.off.block_number = V7_BLOCK_NUMBER_OFFSET; 515 + f34->v7.off.transfer_length = V7_TRANSFER_LENGTH_OFFSET; 516 + f34->v7.off.flash_cmd = V7_COMMAND_OFFSET; 517 + f34->v7.off.payload = V7_PAYLOAD_OFFSET; 518 + 519 + f34->v7.has_display_cfg = query_1_7.partition_support[1] & HAS_DISP_CFG; 520 + f34->v7.has_guest_code = 521 + query_1_7.partition_support[1] & HAS_GUEST_CODE; 522 + 523 + if (query_0 & HAS_CONFIG_ID) { 524 + char f34_ctrl[CONFIG_ID_SIZE]; 525 + int i = 0; 526 + u8 *p = f34->configuration_id; 527 + *p = '\0'; 528 + 529 + ret = rmi_read_block(f34->fn->rmi_dev, 530 + f34->fn->fd.control_base_addr, 531 + f34_ctrl, 532 + sizeof(f34_ctrl)); 533 + if (ret) 534 + return ret; 535 + 536 + /* Eat leading zeros */ 537 + while (i < sizeof(f34_ctrl) && !f34_ctrl[i]) 538 + i++; 539 + 540 + for (; i < sizeof(f34_ctrl); i++) 541 + p += snprintf(p, f34->configuration_id 542 + + sizeof(f34->configuration_id) - p, 543 + "%02X", f34_ctrl[i]); 544 + 545 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Configuration ID: %s\n", 546 + f34->configuration_id); 547 + } 548 + 549 + f34->v7.partitions = 0; 550 + for (i = 0; i < sizeof(query_1_7.partition_support); i++) 551 + for (j = 0; j < 8; j++) 552 + if (query_1_7.partition_support[i] & (1 << j)) 553 + f34->v7.partitions++; 554 + 555 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: Supported partitions: %*ph\n", 556 + __func__, sizeof(query_1_7.partition_support), 557 + query_1_7.partition_support); 558 + 559 + 560 + f34->v7.partition_table_bytes = f34->v7.partitions * 8 + 2; 561 + 562 + f34->v7.read_config_buf = devm_kzalloc(&f34->fn->dev, 563 + f34->v7.partition_table_bytes, 564 + GFP_KERNEL); 565 + if (!f34->v7.read_config_buf) { 566 + f34->v7.read_config_buf_size = 0; 567 + return -ENOMEM; 568 + } 569 + 570 + f34->v7.read_config_buf_size = f34->v7.partition_table_bytes; 571 + ptable = f34->v7.read_config_buf; 572 + 573 + ret = rmi_f34v7_read_f34v7_partition_table(f34); 574 + if (ret < 0) { 575 + dev_err(&f34->fn->dev, "%s: Failed to read partition table\n", 576 + __func__); 577 + return ret; 578 + } 579 + 580 + rmi_f34v7_parse_partition_table(f34, ptable, 581 + &f34->v7.blkcount, &f34->v7.phyaddr); 582 + 583 + return 0; 584 + } 585 + 586 + static int rmi_f34v7_check_ui_firmware_size(struct f34_data *f34) 587 + { 588 + u16 block_count; 589 + 590 + block_count = f34->v7.img.ui_firmware.size / f34->v7.block_size; 591 + 592 + if (block_count != f34->v7.blkcount.ui_firmware) { 593 + dev_err(&f34->fn->dev, 594 + "UI firmware size mismatch: %d != %d\n", 595 + block_count, f34->v7.blkcount.ui_firmware); 596 + return -EINVAL; 597 + } 598 + 599 + return 0; 600 + } 601 + 602 + static int rmi_f34v7_check_ui_config_size(struct f34_data *f34) 603 + { 604 + u16 block_count; 605 + 606 + block_count = f34->v7.img.ui_config.size / f34->v7.block_size; 607 + 608 + if (block_count != f34->v7.blkcount.ui_config) { 609 + dev_err(&f34->fn->dev, "UI config size mismatch\n"); 610 + return -EINVAL; 611 + } 612 + 613 + return 0; 614 + } 615 + 616 + static int rmi_f34v7_check_dp_config_size(struct f34_data *f34) 617 + { 618 + u16 block_count; 619 + 620 + block_count = f34->v7.img.dp_config.size / f34->v7.block_size; 621 + 622 + if (block_count != f34->v7.blkcount.dp_config) { 623 + dev_err(&f34->fn->dev, "Display config size mismatch\n"); 624 + return -EINVAL; 625 + } 626 + 627 + return 0; 628 + } 629 + 630 + static int rmi_f34v7_check_guest_code_size(struct f34_data *f34) 631 + { 632 + u16 block_count; 633 + 634 + block_count = f34->v7.img.guest_code.size / f34->v7.block_size; 635 + if (block_count != f34->v7.blkcount.guest_code) { 636 + dev_err(&f34->fn->dev, "Guest code size mismatch\n"); 637 + return -EINVAL; 638 + } 639 + 640 + return 0; 641 + } 642 + 643 + static int rmi_f34v7_check_bl_config_size(struct f34_data *f34) 644 + { 645 + u16 block_count; 646 + 647 + block_count = f34->v7.img.bl_config.size / f34->v7.block_size; 648 + 649 + if (block_count != f34->v7.blkcount.bl_config) { 650 + dev_err(&f34->fn->dev, "Bootloader config size mismatch\n"); 651 + return -EINVAL; 652 + } 653 + 654 + return 0; 655 + } 656 + 657 + static int rmi_f34v7_erase_config(struct f34_data *f34) 658 + { 659 + int ret; 660 + 661 + dev_info(&f34->fn->dev, "Erasing config...\n"); 662 + 663 + switch (f34->v7.config_area) { 664 + case v7_UI_CONFIG_AREA: 665 + ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_UI_CONFIG); 666 + if (ret < 0) 667 + return ret; 668 + break; 669 + case v7_DP_CONFIG_AREA: 670 + ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_DISP_CONFIG); 671 + if (ret < 0) 672 + return ret; 673 + break; 674 + case v7_BL_CONFIG_AREA: 675 + ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_BL_CONFIG); 676 + if (ret < 0) 677 + return ret; 678 + break; 679 + } 680 + 681 + ret = rmi_f34v7_wait_for_idle(f34, ENABLE_WAIT_MS); 682 + if (ret < 0) 683 + return ret; 684 + 685 + return ret; 686 + } 687 + 688 + static int rmi_f34v7_erase_guest_code(struct f34_data *f34) 689 + { 690 + int ret; 691 + 692 + dev_info(&f34->fn->dev, "Erasing guest code...\n"); 693 + 694 + ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_GUEST_CODE); 695 + if (ret < 0) 696 + return ret; 697 + 698 + ret = rmi_f34v7_wait_for_idle(f34, ENABLE_WAIT_MS); 699 + if (ret < 0) 700 + return ret; 701 + 702 + return 0; 703 + } 704 + 705 + static int rmi_f34v7_erase_all(struct f34_data *f34) 706 + { 707 + int ret; 708 + 709 + dev_info(&f34->fn->dev, "Erasing firmware...\n"); 710 + 711 + ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_UI_FIRMWARE); 712 + if (ret < 0) 713 + return ret; 714 + 715 + ret = rmi_f34v7_wait_for_idle(f34, ENABLE_WAIT_MS); 716 + if (ret < 0) 717 + return ret; 718 + 719 + f34->v7.config_area = v7_UI_CONFIG_AREA; 720 + ret = rmi_f34v7_erase_config(f34); 721 + if (ret < 0) 722 + return ret; 723 + 724 + if (f34->v7.has_display_cfg) { 725 + f34->v7.config_area = v7_DP_CONFIG_AREA; 726 + ret = rmi_f34v7_erase_config(f34); 727 + if (ret < 0) 728 + return ret; 729 + } 730 + 731 + if (f34->v7.new_partition_table && f34->v7.has_guest_code) { 732 + ret = rmi_f34v7_erase_guest_code(f34); 733 + if (ret < 0) 734 + return ret; 735 + } 736 + 737 + return 0; 738 + } 739 + 740 + static int rmi_f34v7_read_f34v7_blocks(struct f34_data *f34, u16 block_cnt, 741 + u8 command) 742 + { 743 + int ret; 744 + u8 base; 745 + __le16 length; 746 + u16 transfer; 747 + u16 max_transfer; 748 + u16 remaining = block_cnt; 749 + u16 block_number = 0; 750 + u16 index = 0; 751 + 752 + base = f34->fn->fd.data_base_addr; 753 + 754 + ret = rmi_f34v7_write_partition_id(f34, command); 755 + if (ret < 0) 756 + return ret; 757 + 758 + ret = rmi_write_block(f34->fn->rmi_dev, 759 + base + f34->v7.off.block_number, 760 + &block_number, sizeof(block_number)); 761 + if (ret < 0) { 762 + dev_err(&f34->fn->dev, "%s: Failed to write block number\n", 763 + __func__); 764 + return ret; 765 + } 766 + 767 + max_transfer = min(f34->v7.payload_length, 768 + (u16)(PAGE_SIZE / f34->v7.block_size)); 769 + 770 + do { 771 + transfer = min(remaining, max_transfer); 772 + put_unaligned_le16(transfer, &length); 773 + 774 + ret = rmi_write_block(f34->fn->rmi_dev, 775 + base + f34->v7.off.transfer_length, 776 + &length, sizeof(length)); 777 + if (ret < 0) { 778 + dev_err(&f34->fn->dev, 779 + "%s: Write transfer length fail (%d remaining)\n", 780 + __func__, remaining); 781 + return ret; 782 + } 783 + 784 + ret = rmi_f34v7_write_command(f34, command); 785 + if (ret < 0) 786 + return ret; 787 + 788 + ret = rmi_f34v7_wait_for_idle(f34, ENABLE_WAIT_MS); 789 + if (ret < 0) { 790 + dev_err(&f34->fn->dev, 791 + "%s: Wait for idle failed (%d blks remaining)\n", 792 + __func__, remaining); 793 + return ret; 794 + } 795 + 796 + ret = rmi_read_block(f34->fn->rmi_dev, 797 + base + f34->v7.off.payload, 798 + &f34->v7.read_config_buf[index], 799 + transfer * f34->v7.block_size); 800 + if (ret < 0) { 801 + dev_err(&f34->fn->dev, 802 + "%s: Read block failed (%d blks remaining)\n", 803 + __func__, remaining); 804 + return ret; 805 + } 806 + 807 + index += (transfer * f34->v7.block_size); 808 + remaining -= transfer; 809 + } while (remaining); 810 + 811 + return 0; 812 + } 813 + 814 + static int rmi_f34v7_write_f34v7_blocks(struct f34_data *f34, 815 + const void *block_ptr, u16 block_cnt, 816 + u8 command) 817 + { 818 + int ret; 819 + u8 base; 820 + __le16 length; 821 + u16 transfer; 822 + u16 max_transfer; 823 + u16 remaining = block_cnt; 824 + u16 block_number = 0; 825 + 826 + base = f34->fn->fd.data_base_addr; 827 + 828 + ret = rmi_f34v7_write_partition_id(f34, command); 829 + if (ret < 0) 830 + return ret; 831 + 832 + ret = rmi_write_block(f34->fn->rmi_dev, 833 + base + f34->v7.off.block_number, 834 + &block_number, sizeof(block_number)); 835 + if (ret < 0) { 836 + dev_err(&f34->fn->dev, "%s: Failed to write block number\n", 837 + __func__); 838 + return ret; 839 + } 840 + 841 + if (f34->v7.payload_length > (PAGE_SIZE / f34->v7.block_size)) 842 + max_transfer = PAGE_SIZE / f34->v7.block_size; 843 + else 844 + max_transfer = f34->v7.payload_length; 845 + 846 + do { 847 + transfer = min(remaining, max_transfer); 848 + put_unaligned_le16(transfer, &length); 849 + 850 + ret = rmi_write_block(f34->fn->rmi_dev, 851 + base + f34->v7.off.transfer_length, 852 + &length, sizeof(length)); 853 + if (ret < 0) { 854 + dev_err(&f34->fn->dev, 855 + "%s: Write transfer length fail (%d remaining)\n", 856 + __func__, remaining); 857 + return ret; 858 + } 859 + 860 + ret = rmi_f34v7_write_command(f34, command); 861 + if (ret < 0) 862 + return ret; 863 + 864 + ret = rmi_write_block(f34->fn->rmi_dev, 865 + base + f34->v7.off.payload, 866 + block_ptr, transfer * f34->v7.block_size); 867 + if (ret < 0) { 868 + dev_err(&f34->fn->dev, 869 + "%s: Failed writing data (%d blks remaining)\n", 870 + __func__, remaining); 871 + return ret; 872 + } 873 + 874 + ret = rmi_f34v7_wait_for_idle(f34, ENABLE_WAIT_MS); 875 + if (ret < 0) { 876 + dev_err(&f34->fn->dev, 877 + "%s: Failed wait for idle (%d blks remaining)\n", 878 + __func__, remaining); 879 + return ret; 880 + } 881 + 882 + block_ptr += (transfer * f34->v7.block_size); 883 + remaining -= transfer; 884 + } while (remaining); 885 + 886 + return 0; 887 + } 888 + 889 + static int rmi_f34v7_write_config(struct f34_data *f34) 890 + { 891 + return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.config_data, 892 + f34->v7.config_block_count, 893 + v7_CMD_WRITE_CONFIG); 894 + } 895 + 896 + static int rmi_f34v7_write_ui_config(struct f34_data *f34) 897 + { 898 + f34->v7.config_area = v7_UI_CONFIG_AREA; 899 + f34->v7.config_data = f34->v7.img.ui_config.data; 900 + f34->v7.config_size = f34->v7.img.ui_config.size; 901 + f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size; 902 + 903 + return rmi_f34v7_write_config(f34); 904 + } 905 + 906 + static int rmi_f34v7_write_dp_config(struct f34_data *f34) 907 + { 908 + f34->v7.config_area = v7_DP_CONFIG_AREA; 909 + f34->v7.config_data = f34->v7.img.dp_config.data; 910 + f34->v7.config_size = f34->v7.img.dp_config.size; 911 + f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size; 912 + 913 + return rmi_f34v7_write_config(f34); 914 + } 915 + 916 + static int rmi_f34v7_write_guest_code(struct f34_data *f34) 917 + { 918 + return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.img.guest_code.data, 919 + f34->v7.img.guest_code.size / 920 + f34->v7.block_size, 921 + v7_CMD_WRITE_GUEST_CODE); 922 + } 923 + 924 + static int rmi_f34v7_write_flash_config(struct f34_data *f34) 925 + { 926 + int ret; 927 + 928 + f34->v7.config_area = v7_FLASH_CONFIG_AREA; 929 + f34->v7.config_data = f34->v7.img.fl_config.data; 930 + f34->v7.config_size = f34->v7.img.fl_config.size; 931 + f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size; 932 + 933 + if (f34->v7.config_block_count != f34->v7.blkcount.fl_config) { 934 + dev_err(&f34->fn->dev, "%s: Flash config size mismatch\n", 935 + __func__); 936 + return -EINVAL; 937 + } 938 + 939 + ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_FLASH_CONFIG); 940 + if (ret < 0) 941 + return ret; 942 + 943 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 944 + "%s: Erase flash config command written\n", __func__); 945 + 946 + ret = rmi_f34v7_wait_for_idle(f34, ENABLE_WAIT_MS); 947 + if (ret < 0) 948 + return ret; 949 + 950 + ret = rmi_f34v7_write_config(f34); 951 + if (ret < 0) 952 + return ret; 953 + 954 + return 0; 955 + } 956 + 957 + static int rmi_f34v7_write_partition_table(struct f34_data *f34) 958 + { 959 + u16 block_count; 960 + int ret; 961 + 962 + block_count = f34->v7.blkcount.bl_config; 963 + f34->v7.config_area = v7_BL_CONFIG_AREA; 964 + f34->v7.config_size = f34->v7.block_size * block_count; 965 + devm_kfree(&f34->fn->dev, f34->v7.read_config_buf); 966 + f34->v7.read_config_buf = devm_kzalloc(&f34->fn->dev, 967 + f34->v7.config_size, GFP_KERNEL); 968 + if (!f34->v7.read_config_buf) { 969 + f34->v7.read_config_buf_size = 0; 970 + return -ENOMEM; 971 + } 972 + 973 + f34->v7.read_config_buf_size = f34->v7.config_size; 974 + 975 + ret = rmi_f34v7_read_f34v7_blocks(f34, block_count, v7_CMD_READ_CONFIG); 976 + if (ret < 0) 977 + return ret; 978 + 979 + ret = rmi_f34v7_erase_config(f34); 980 + if (ret < 0) 981 + return ret; 982 + 983 + ret = rmi_f34v7_write_flash_config(f34); 984 + if (ret < 0) 985 + return ret; 986 + 987 + f34->v7.config_area = v7_BL_CONFIG_AREA; 988 + f34->v7.config_data = f34->v7.read_config_buf; 989 + f34->v7.config_size = f34->v7.img.bl_config.size; 990 + f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size; 991 + 992 + ret = rmi_f34v7_write_config(f34); 993 + if (ret < 0) 994 + return ret; 995 + 996 + return 0; 997 + } 998 + 999 + static int rmi_f34v7_write_firmware(struct f34_data *f34) 1000 + { 1001 + u16 blk_count; 1002 + 1003 + blk_count = f34->v7.img.ui_firmware.size / f34->v7.block_size; 1004 + 1005 + return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.img.ui_firmware.data, 1006 + blk_count, v7_CMD_WRITE_FW); 1007 + } 1008 + 1009 + static void rmi_f34v7_compare_partition_tables(struct f34_data *f34) 1010 + { 1011 + if (f34->v7.phyaddr.ui_firmware != f34->v7.img.phyaddr.ui_firmware) { 1012 + f34->v7.new_partition_table = true; 1013 + return; 1014 + } 1015 + 1016 + if (f34->v7.phyaddr.ui_config != f34->v7.img.phyaddr.ui_config) { 1017 + f34->v7.new_partition_table = true; 1018 + return; 1019 + } 1020 + 1021 + if (f34->v7.has_display_cfg && 1022 + f34->v7.phyaddr.dp_config != f34->v7.img.phyaddr.dp_config) { 1023 + f34->v7.new_partition_table = true; 1024 + return; 1025 + } 1026 + 1027 + if (f34->v7.has_guest_code && 1028 + f34->v7.phyaddr.guest_code != f34->v7.img.phyaddr.guest_code) { 1029 + f34->v7.new_partition_table = true; 1030 + return; 1031 + } 1032 + 1033 + f34->v7.new_partition_table = false; 1034 + } 1035 + 1036 + static void rmi_f34v7_parse_img_header_10_bl_container(struct f34_data *f34, 1037 + const void *image) 1038 + { 1039 + int i; 1040 + int num_of_containers; 1041 + unsigned int addr; 1042 + unsigned int container_id; 1043 + unsigned int length; 1044 + const void *content; 1045 + const struct container_descriptor *descriptor; 1046 + 1047 + num_of_containers = f34->v7.img.bootloader.size / 4 - 1; 1048 + 1049 + for (i = 1; i <= num_of_containers; i++) { 1050 + addr = get_unaligned_le32(f34->v7.img.bootloader.data + i * 4); 1051 + descriptor = image + addr; 1052 + container_id = le16_to_cpu(descriptor->container_id); 1053 + content = image + le32_to_cpu(descriptor->content_address); 1054 + length = le32_to_cpu(descriptor->content_length); 1055 + switch (container_id) { 1056 + case BL_CONFIG_CONTAINER: 1057 + case GLOBAL_PARAMETERS_CONTAINER: 1058 + f34->v7.img.bl_config.data = content; 1059 + f34->v7.img.bl_config.size = length; 1060 + break; 1061 + case BL_LOCKDOWN_INFO_CONTAINER: 1062 + case DEVICE_CONFIG_CONTAINER: 1063 + f34->v7.img.lockdown.data = content; 1064 + f34->v7.img.lockdown.size = length; 1065 + break; 1066 + default: 1067 + break; 1068 + } 1069 + } 1070 + } 1071 + 1072 + static void rmi_f34v7_parse_image_header_10(struct f34_data *f34) 1073 + { 1074 + unsigned int i; 1075 + unsigned int num_of_containers; 1076 + unsigned int addr; 1077 + unsigned int offset; 1078 + unsigned int container_id; 1079 + unsigned int length; 1080 + const void *image = f34->v7.image; 1081 + const u8 *content; 1082 + const struct container_descriptor *descriptor; 1083 + const struct image_header_10 *header = image; 1084 + 1085 + f34->v7.img.checksum = le32_to_cpu(header->checksum); 1086 + 1087 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: f34->v7.img.checksum=%X\n", 1088 + __func__, f34->v7.img.checksum); 1089 + 1090 + /* address of top level container */ 1091 + offset = le32_to_cpu(header->top_level_container_start_addr); 1092 + descriptor = image + offset; 1093 + 1094 + /* address of top level container content */ 1095 + offset = le32_to_cpu(descriptor->content_address); 1096 + num_of_containers = le32_to_cpu(descriptor->content_length) / 4; 1097 + 1098 + for (i = 0; i < num_of_containers; i++) { 1099 + addr = get_unaligned_le32(image + offset); 1100 + offset += 4; 1101 + descriptor = image + addr; 1102 + container_id = le16_to_cpu(descriptor->container_id); 1103 + content = image + le32_to_cpu(descriptor->content_address); 1104 + length = le32_to_cpu(descriptor->content_length); 1105 + 1106 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 1107 + "%s: container_id=%d, length=%d\n", __func__, 1108 + container_id, length); 1109 + 1110 + switch (container_id) { 1111 + case UI_CONTAINER: 1112 + case CORE_CODE_CONTAINER: 1113 + f34->v7.img.ui_firmware.data = content; 1114 + f34->v7.img.ui_firmware.size = length; 1115 + break; 1116 + case UI_CONFIG_CONTAINER: 1117 + case CORE_CONFIG_CONTAINER: 1118 + f34->v7.img.ui_config.data = content; 1119 + f34->v7.img.ui_config.size = length; 1120 + break; 1121 + case BL_CONTAINER: 1122 + f34->v7.img.bl_version = *content; 1123 + f34->v7.img.bootloader.data = content; 1124 + f34->v7.img.bootloader.size = length; 1125 + rmi_f34v7_parse_img_header_10_bl_container(f34, image); 1126 + break; 1127 + case GUEST_CODE_CONTAINER: 1128 + f34->v7.img.contains_guest_code = true; 1129 + f34->v7.img.guest_code.data = content; 1130 + f34->v7.img.guest_code.size = length; 1131 + break; 1132 + case DISPLAY_CONFIG_CONTAINER: 1133 + f34->v7.img.contains_display_cfg = true; 1134 + f34->v7.img.dp_config.data = content; 1135 + f34->v7.img.dp_config.size = length; 1136 + break; 1137 + case FLASH_CONFIG_CONTAINER: 1138 + f34->v7.img.contains_flash_config = true; 1139 + f34->v7.img.fl_config.data = content; 1140 + f34->v7.img.fl_config.size = length; 1141 + break; 1142 + case GENERAL_INFORMATION_CONTAINER: 1143 + f34->v7.img.contains_firmware_id = true; 1144 + f34->v7.img.firmware_id = 1145 + get_unaligned_le32(content + 4); 1146 + break; 1147 + default: 1148 + break; 1149 + } 1150 + } 1151 + } 1152 + 1153 + static int rmi_f34v7_parse_image_info(struct f34_data *f34) 1154 + { 1155 + const struct image_header_10 *header = f34->v7.image; 1156 + 1157 + memset(&f34->v7.img, 0x00, sizeof(f34->v7.img)); 1158 + 1159 + rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, 1160 + "%s: header->major_header_version = %d\n", 1161 + __func__, header->major_header_version); 1162 + 1163 + switch (header->major_header_version) { 1164 + case IMAGE_HEADER_VERSION_10: 1165 + rmi_f34v7_parse_image_header_10(f34); 1166 + break; 1167 + default: 1168 + dev_err(&f34->fn->dev, "Unsupported image file format %02X\n", 1169 + header->major_header_version); 1170 + return -EINVAL; 1171 + } 1172 + 1173 + if (!f34->v7.img.contains_flash_config) { 1174 + dev_err(&f34->fn->dev, "%s: No flash config in fw image\n", 1175 + __func__); 1176 + return -EINVAL; 1177 + } 1178 + 1179 + rmi_f34v7_parse_partition_table(f34, f34->v7.img.fl_config.data, 1180 + &f34->v7.img.blkcount, &f34->v7.img.phyaddr); 1181 + 1182 + rmi_f34v7_compare_partition_tables(f34); 1183 + 1184 + return 0; 1185 + } 1186 + 1187 + int rmi_f34v7_do_reflash(struct f34_data *f34, const struct firmware *fw) 1188 + { 1189 + int ret; 1190 + 1191 + rmi_f34v7_read_queries_bl_version(f34); 1192 + 1193 + f34->v7.image = fw->data; 1194 + 1195 + ret = rmi_f34v7_parse_image_info(f34); 1196 + if (ret < 0) 1197 + goto fail; 1198 + 1199 + if (!f34->v7.new_partition_table) { 1200 + ret = rmi_f34v7_check_ui_firmware_size(f34); 1201 + if (ret < 0) 1202 + goto fail; 1203 + 1204 + ret = rmi_f34v7_check_ui_config_size(f34); 1205 + if (ret < 0) 1206 + goto fail; 1207 + 1208 + if (f34->v7.has_display_cfg && 1209 + f34->v7.img.contains_display_cfg) { 1210 + ret = rmi_f34v7_check_dp_config_size(f34); 1211 + if (ret < 0) 1212 + goto fail; 1213 + } 1214 + 1215 + if (f34->v7.has_guest_code && f34->v7.img.contains_guest_code) { 1216 + ret = rmi_f34v7_check_guest_code_size(f34); 1217 + if (ret < 0) 1218 + goto fail; 1219 + } 1220 + } else { 1221 + ret = rmi_f34v7_check_bl_config_size(f34); 1222 + if (ret < 0) 1223 + goto fail; 1224 + } 1225 + 1226 + ret = rmi_f34v7_erase_all(f34); 1227 + if (ret < 0) 1228 + goto fail; 1229 + 1230 + if (f34->v7.new_partition_table) { 1231 + ret = rmi_f34v7_write_partition_table(f34); 1232 + if (ret < 0) 1233 + goto fail; 1234 + dev_info(&f34->fn->dev, "%s: Partition table programmed\n", 1235 + __func__); 1236 + } 1237 + 1238 + dev_info(&f34->fn->dev, "Writing firmware (%d bytes)...\n", 1239 + f34->v7.img.ui_firmware.size); 1240 + 1241 + ret = rmi_f34v7_write_firmware(f34); 1242 + if (ret < 0) 1243 + goto fail; 1244 + 1245 + dev_info(&f34->fn->dev, "Writing config (%d bytes)...\n", 1246 + f34->v7.img.ui_config.size); 1247 + 1248 + f34->v7.config_area = v7_UI_CONFIG_AREA; 1249 + ret = rmi_f34v7_write_ui_config(f34); 1250 + if (ret < 0) 1251 + goto fail; 1252 + 1253 + if (f34->v7.has_display_cfg && f34->v7.img.contains_display_cfg) { 1254 + dev_info(&f34->fn->dev, "Writing display config...\n"); 1255 + 1256 + ret = rmi_f34v7_write_dp_config(f34); 1257 + if (ret < 0) 1258 + goto fail; 1259 + } 1260 + 1261 + if (f34->v7.new_partition_table) { 1262 + if (f34->v7.has_guest_code && f34->v7.img.contains_guest_code) { 1263 + dev_info(&f34->fn->dev, "Writing guest code...\n"); 1264 + 1265 + ret = rmi_f34v7_write_guest_code(f34); 1266 + if (ret < 0) 1267 + goto fail; 1268 + } 1269 + } 1270 + 1271 + fail: 1272 + return ret; 1273 + } 1274 + 1275 + static int rmi_f34v7_enter_flash_prog(struct f34_data *f34) 1276 + { 1277 + int ret; 1278 + 1279 + ret = rmi_f34v7_read_flash_status(f34); 1280 + if (ret < 0) 1281 + return ret; 1282 + 1283 + if (f34->v7.in_bl_mode) 1284 + return 0; 1285 + 1286 + ret = rmi_f34v7_write_command(f34, v7_CMD_ENABLE_FLASH_PROG); 1287 + if (ret < 0) 1288 + return ret; 1289 + 1290 + ret = rmi_f34v7_wait_for_idle(f34, ENABLE_WAIT_MS); 1291 + if (ret < 0) 1292 + return ret; 1293 + 1294 + if (!f34->v7.in_bl_mode) { 1295 + dev_err(&f34->fn->dev, "%s: BL mode not entered\n", __func__); 1296 + return -EINVAL; 1297 + } 1298 + 1299 + return 0; 1300 + } 1301 + 1302 + int rmi_f34v7_start_reflash(struct f34_data *f34, const struct firmware *fw) 1303 + { 1304 + int ret = 0; 1305 + 1306 + f34->v7.config_area = v7_UI_CONFIG_AREA; 1307 + f34->v7.image = fw->data; 1308 + 1309 + ret = rmi_f34v7_parse_image_info(f34); 1310 + if (ret < 0) 1311 + goto exit; 1312 + 1313 + if (!f34->v7.force_update && f34->v7.new_partition_table) { 1314 + dev_err(&f34->fn->dev, "%s: Partition table mismatch\n", 1315 + __func__); 1316 + ret = -EINVAL; 1317 + goto exit; 1318 + } 1319 + 1320 + dev_info(&f34->fn->dev, "Firmware image OK\n"); 1321 + 1322 + ret = rmi_f34v7_read_flash_status(f34); 1323 + if (ret < 0) 1324 + goto exit; 1325 + 1326 + if (f34->v7.in_bl_mode) { 1327 + dev_info(&f34->fn->dev, "%s: Device in bootloader mode\n", 1328 + __func__); 1329 + } 1330 + 1331 + rmi_f34v7_enter_flash_prog(f34); 1332 + 1333 + return 0; 1334 + 1335 + exit: 1336 + return ret; 1337 + } 1338 + 1339 + int rmi_f34v7_probe(struct f34_data *f34) 1340 + { 1341 + int ret; 1342 + 1343 + /* Read bootloader version */ 1344 + ret = rmi_read_block(f34->fn->rmi_dev, 1345 + f34->fn->fd.query_base_addr + V7_BOOTLOADER_ID_OFFSET, 1346 + f34->bootloader_id, 1347 + sizeof(f34->bootloader_id)); 1348 + if (ret < 0) { 1349 + dev_err(&f34->fn->dev, "%s: Failed to read bootloader ID\n", 1350 + __func__); 1351 + return ret; 1352 + } 1353 + 1354 + if (f34->bootloader_id[1] == '5') { 1355 + f34->bl_version = 5; 1356 + } else if (f34->bootloader_id[1] == '6') { 1357 + f34->bl_version = 6; 1358 + } else if (f34->bootloader_id[1] == 7) { 1359 + f34->bl_version = 7; 1360 + } else { 1361 + dev_err(&f34->fn->dev, "%s: Unrecognized bootloader version\n", 1362 + __func__); 1363 + return -EINVAL; 1364 + } 1365 + 1366 + memset(&f34->v7.blkcount, 0x00, sizeof(f34->v7.blkcount)); 1367 + memset(&f34->v7.phyaddr, 0x00, sizeof(f34->v7.phyaddr)); 1368 + rmi_f34v7_read_queries(f34); 1369 + 1370 + f34->v7.force_update = false; 1371 + return 0; 1372 + }
+13 -6
drivers/input/rmi4/rmi_f54.c
··· 200 200 201 201 error = rmi_write(rmi_dev, fn->fd.command_base_addr, F54_GET_REPORT); 202 202 if (error < 0) 203 - return error; 203 + goto unlock; 204 204 205 205 init_completion(&f54->cmd_done); 206 206 ··· 209 209 210 210 queue_delayed_work(f54->workqueue, &f54->work, 0); 211 211 212 + unlock: 212 213 mutex_unlock(&f54->data_mutex); 213 214 214 - return 0; 215 + return error; 215 216 } 216 217 217 218 static size_t rmi_f54_get_report_size(struct f54_data *f54) 218 219 { 219 - u8 rx = f54->num_rx_electrodes ? : f54->num_rx_electrodes; 220 - u8 tx = f54->num_tx_electrodes ? : f54->num_tx_electrodes; 220 + struct rmi_device *rmi_dev = f54->fn->rmi_dev; 221 + struct rmi_driver_data *drv_data = dev_get_drvdata(&rmi_dev->dev); 222 + u8 rx = drv_data->num_rx_electrodes ? : f54->num_rx_electrodes; 223 + u8 tx = drv_data->num_tx_electrodes ? : f54->num_tx_electrodes; 221 224 size_t size; 222 225 223 226 switch (rmi_f54_get_reptype(f54, f54->input)) { ··· 404 401 405 402 static int rmi_f54_set_input(struct f54_data *f54, unsigned int i) 406 403 { 404 + struct rmi_device *rmi_dev = f54->fn->rmi_dev; 405 + struct rmi_driver_data *drv_data = dev_get_drvdata(&rmi_dev->dev); 406 + u8 rx = drv_data->num_rx_electrodes ? : f54->num_rx_electrodes; 407 + u8 tx = drv_data->num_tx_electrodes ? : f54->num_tx_electrodes; 407 408 struct v4l2_pix_format *f = &f54->format; 408 409 enum rmi_f54_report_type reptype; 409 410 int ret; ··· 422 415 423 416 f54->input = i; 424 417 425 - f->width = f54->num_rx_electrodes; 426 - f->height = f54->num_tx_electrodes; 418 + f->width = rx; 419 + f->height = tx; 427 420 f->field = V4L2_FIELD_NONE; 428 421 f->colorspace = V4L2_COLORSPACE_RAW; 429 422 f->bytesperline = f->width * sizeof(u16);
+131
drivers/input/rmi4/rmi_f55.c
··· 1 + /* 2 + * Copyright (c) 2012-2015 Synaptics Incorporated 3 + * Copyright (C) 2016 Zodiac Inflight Innovations 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms of the GNU General Public License version 2 as published by 7 + * the Free Software Foundation. 8 + */ 9 + 10 + #include <linux/bitops.h> 11 + #include <linux/kernel.h> 12 + #include <linux/rmi.h> 13 + #include <linux/slab.h> 14 + #include "rmi_driver.h" 15 + 16 + #define F55_NAME "rmi4_f55" 17 + 18 + /* F55 data offsets */ 19 + #define F55_NUM_RX_OFFSET 0 20 + #define F55_NUM_TX_OFFSET 1 21 + #define F55_PHYS_CHAR_OFFSET 2 22 + 23 + /* Only read required query registers */ 24 + #define F55_QUERY_LEN 3 25 + 26 + /* F55 capabilities */ 27 + #define F55_CAP_SENSOR_ASSIGN BIT(0) 28 + 29 + struct f55_data { 30 + struct rmi_function *fn; 31 + 32 + u8 qry[F55_QUERY_LEN]; 33 + u8 num_rx_electrodes; 34 + u8 cfg_num_rx_electrodes; 35 + u8 num_tx_electrodes; 36 + u8 cfg_num_tx_electrodes; 37 + }; 38 + 39 + static int rmi_f55_detect(struct rmi_function *fn) 40 + { 41 + struct rmi_device *rmi_dev = fn->rmi_dev; 42 + struct rmi_driver_data *drv_data = dev_get_drvdata(&rmi_dev->dev); 43 + struct f55_data *f55; 44 + int error; 45 + 46 + f55 = dev_get_drvdata(&fn->dev); 47 + 48 + error = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr, 49 + &f55->qry, sizeof(f55->qry)); 50 + if (error) { 51 + dev_err(&fn->dev, "%s: Failed to query F55 properties\n", 52 + __func__); 53 + return error; 54 + } 55 + 56 + f55->num_rx_electrodes = f55->qry[F55_NUM_RX_OFFSET]; 57 + f55->num_tx_electrodes = f55->qry[F55_NUM_TX_OFFSET]; 58 + 59 + f55->cfg_num_rx_electrodes = f55->num_rx_electrodes; 60 + f55->cfg_num_tx_electrodes = f55->num_rx_electrodes; 61 + 62 + drv_data->num_rx_electrodes = f55->cfg_num_rx_electrodes; 63 + drv_data->num_tx_electrodes = f55->cfg_num_rx_electrodes; 64 + 65 + if (f55->qry[F55_PHYS_CHAR_OFFSET] & F55_CAP_SENSOR_ASSIGN) { 66 + int i, total; 67 + u8 buf[256]; 68 + 69 + /* 70 + * Calculate the number of enabled receive and transmit 71 + * electrodes by reading F55:Ctrl1 (sensor receiver assignment) 72 + * and F55:Ctrl2 (sensor transmitter assignment). The number of 73 + * enabled electrodes is the sum of all field entries with a 74 + * value other than 0xff. 75 + */ 76 + error = rmi_read_block(fn->rmi_dev, 77 + fn->fd.control_base_addr + 1, 78 + buf, f55->num_rx_electrodes); 79 + if (!error) { 80 + total = 0; 81 + for (i = 0; i < f55->num_rx_electrodes; i++) { 82 + if (buf[i] != 0xff) 83 + total++; 84 + } 85 + f55->cfg_num_rx_electrodes = total; 86 + drv_data->num_rx_electrodes = total; 87 + } 88 + 89 + error = rmi_read_block(fn->rmi_dev, 90 + fn->fd.control_base_addr + 2, 91 + buf, f55->num_tx_electrodes); 92 + if (!error) { 93 + total = 0; 94 + for (i = 0; i < f55->num_tx_electrodes; i++) { 95 + if (buf[i] != 0xff) 96 + total++; 97 + } 98 + f55->cfg_num_tx_electrodes = total; 99 + drv_data->num_tx_electrodes = total; 100 + } 101 + } 102 + 103 + rmi_dbg(RMI_DEBUG_FN, &fn->dev, "F55 num_rx_electrodes: %d (raw %d)\n", 104 + f55->cfg_num_rx_electrodes, f55->num_rx_electrodes); 105 + rmi_dbg(RMI_DEBUG_FN, &fn->dev, "F55 num_tx_electrodes: %d (raw %d)\n", 106 + f55->cfg_num_tx_electrodes, f55->num_tx_electrodes); 107 + 108 + return 0; 109 + } 110 + 111 + static int rmi_f55_probe(struct rmi_function *fn) 112 + { 113 + struct f55_data *f55; 114 + 115 + f55 = devm_kzalloc(&fn->dev, sizeof(struct f55_data), GFP_KERNEL); 116 + if (!f55) 117 + return -ENOMEM; 118 + 119 + f55->fn = fn; 120 + dev_set_drvdata(&fn->dev, f55); 121 + 122 + return rmi_f55_detect(fn); 123 + } 124 + 125 + struct rmi_function_handler rmi_f55_handler = { 126 + .driver = { 127 + .name = F55_NAME, 128 + }, 129 + .func = 0x55, 130 + .probe = rmi_f55_probe, 131 + };
+5 -69
drivers/input/rmi4/rmi_i2c.c
··· 9 9 10 10 #include <linux/i2c.h> 11 11 #include <linux/rmi.h> 12 - #include <linux/irq.h> 13 12 #include <linux/of.h> 14 13 #include <linux/delay.h> 15 14 #include <linux/regulator/consumer.h> ··· 33 34 34 35 struct mutex page_mutex; 35 36 int page; 36 - 37 - int irq; 38 37 39 38 u8 *tx_buf; 40 39 size_t tx_buf_size; ··· 174 177 .read_block = rmi_i2c_read_block, 175 178 }; 176 179 177 - static irqreturn_t rmi_i2c_irq(int irq, void *dev_id) 178 - { 179 - struct rmi_i2c_xport *rmi_i2c = dev_id; 180 - struct rmi_device *rmi_dev = rmi_i2c->xport.rmi_dev; 181 - int ret; 182 - 183 - ret = rmi_process_interrupt_requests(rmi_dev); 184 - if (ret) 185 - rmi_dbg(RMI_DEBUG_XPORT, &rmi_dev->dev, 186 - "Failed to process interrupt request: %d\n", ret); 187 - 188 - return IRQ_HANDLED; 189 - } 190 - 191 - static int rmi_i2c_init_irq(struct i2c_client *client) 192 - { 193 - struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client); 194 - int irq_flags = irqd_get_trigger_type(irq_get_irq_data(rmi_i2c->irq)); 195 - int ret; 196 - 197 - if (!irq_flags) 198 - irq_flags = IRQF_TRIGGER_LOW; 199 - 200 - ret = devm_request_threaded_irq(&client->dev, rmi_i2c->irq, NULL, 201 - rmi_i2c_irq, irq_flags | IRQF_ONESHOT, client->name, 202 - rmi_i2c); 203 - if (ret < 0) { 204 - dev_warn(&client->dev, "Failed to register interrupt %d\n", 205 - rmi_i2c->irq); 206 - 207 - return ret; 208 - } 209 - 210 - return 0; 211 - } 212 - 213 180 #ifdef CONFIG_OF 214 181 static const struct of_device_id rmi_i2c_of_match[] = { 215 182 { .compatible = "syna,rmi4-i2c" }, ··· 216 255 if (!client->dev.of_node && client_pdata) 217 256 *pdata = *client_pdata; 218 257 219 - if (client->irq > 0) 220 - rmi_i2c->irq = client->irq; 258 + pdata->irq = client->irq; 221 259 222 260 rmi_dbg(RMI_DEBUG_XPORT, &client->dev, "Probing %s.\n", 223 261 dev_name(&client->dev)); ··· 281 321 if (retval) 282 322 return retval; 283 323 284 - retval = rmi_i2c_init_irq(client); 285 - if (retval < 0) 286 - return retval; 287 - 288 324 dev_info(&client->dev, "registered rmi i2c driver at %#04x.\n", 289 325 client->addr); 290 326 return 0; ··· 293 337 struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client); 294 338 int ret; 295 339 296 - ret = rmi_driver_suspend(rmi_i2c->xport.rmi_dev); 340 + ret = rmi_driver_suspend(rmi_i2c->xport.rmi_dev, true); 297 341 if (ret) 298 342 dev_warn(dev, "Failed to resume device: %d\n", ret); 299 - 300 - disable_irq(rmi_i2c->irq); 301 - if (device_may_wakeup(&client->dev)) { 302 - ret = enable_irq_wake(rmi_i2c->irq); 303 - if (!ret) 304 - dev_warn(dev, "Failed to enable irq for wake: %d\n", 305 - ret); 306 - } 307 343 308 344 regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), 309 345 rmi_i2c->supplies); ··· 316 368 317 369 msleep(rmi_i2c->startup_delay); 318 370 319 - enable_irq(rmi_i2c->irq); 320 - if (device_may_wakeup(&client->dev)) { 321 - ret = disable_irq_wake(rmi_i2c->irq); 322 - if (!ret) 323 - dev_warn(dev, "Failed to disable irq for wake: %d\n", 324 - ret); 325 - } 326 - 327 - ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev); 371 + ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev, true); 328 372 if (ret) 329 373 dev_warn(dev, "Failed to resume device: %d\n", ret); 330 374 ··· 331 391 struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client); 332 392 int ret; 333 393 334 - ret = rmi_driver_suspend(rmi_i2c->xport.rmi_dev); 394 + ret = rmi_driver_suspend(rmi_i2c->xport.rmi_dev, false); 335 395 if (ret) 336 396 dev_warn(dev, "Failed to resume device: %d\n", ret); 337 - 338 - disable_irq(rmi_i2c->irq); 339 397 340 398 regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), 341 399 rmi_i2c->supplies); ··· 354 416 355 417 msleep(rmi_i2c->startup_delay); 356 418 357 - enable_irq(rmi_i2c->irq); 358 - 359 - ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev); 419 + ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev, false); 360 420 if (ret) 361 421 dev_warn(dev, "Failed to resume device: %d\n", ret); 362 422
+447
drivers/input/rmi4/rmi_smbus.c
··· 1 + /* 2 + * Copyright (c) 2015 - 2016 Red Hat, Inc 3 + * Copyright (c) 2011, 2012 Synaptics Incorporated 4 + * Copyright (c) 2011 Unixphere 5 + * 6 + * This program is free software; you can redistribute it and/or modify it 7 + * under the terms of the GNU General Public License version 2 as published by 8 + * the Free Software Foundation. 9 + */ 10 + 11 + #include <linux/kernel.h> 12 + #include <linux/delay.h> 13 + #include <linux/i2c.h> 14 + #include <linux/interrupt.h> 15 + #include <linux/kconfig.h> 16 + #include <linux/lockdep.h> 17 + #include <linux/module.h> 18 + #include <linux/pm.h> 19 + #include <linux/rmi.h> 20 + #include <linux/slab.h> 21 + #include "rmi_driver.h" 22 + 23 + #define SMB_PROTOCOL_VERSION_ADDRESS 0xfd 24 + #define SMB_MAX_COUNT 32 25 + #define RMI_SMB2_MAP_SIZE 8 /* 8 entry of 4 bytes each */ 26 + #define RMI_SMB2_MAP_FLAGS_WE 0x01 27 + 28 + struct mapping_table_entry { 29 + __le16 rmiaddr; 30 + u8 readcount; 31 + u8 flags; 32 + }; 33 + 34 + struct rmi_smb_xport { 35 + struct rmi_transport_dev xport; 36 + struct i2c_client *client; 37 + 38 + struct mutex page_mutex; 39 + int page; 40 + u8 table_index; 41 + struct mutex mappingtable_mutex; 42 + struct mapping_table_entry mapping_table[RMI_SMB2_MAP_SIZE]; 43 + }; 44 + 45 + static int rmi_smb_get_version(struct rmi_smb_xport *rmi_smb) 46 + { 47 + struct i2c_client *client = rmi_smb->client; 48 + int retval; 49 + 50 + /* Check if for SMBus new version device by reading version byte. */ 51 + retval = i2c_smbus_read_byte_data(client, SMB_PROTOCOL_VERSION_ADDRESS); 52 + if (retval < 0) { 53 + dev_err(&client->dev, "failed to get SMBus version number!\n"); 54 + return retval; 55 + } 56 + return retval + 1; 57 + } 58 + 59 + /* SMB block write - wrapper over ic2_smb_write_block */ 60 + static int smb_block_write(struct rmi_transport_dev *xport, 61 + u8 commandcode, const void *buf, size_t len) 62 + { 63 + struct rmi_smb_xport *rmi_smb = 64 + container_of(xport, struct rmi_smb_xport, xport); 65 + struct i2c_client *client = rmi_smb->client; 66 + int retval; 67 + 68 + retval = i2c_smbus_write_block_data(client, commandcode, len, buf); 69 + 70 + rmi_dbg(RMI_DEBUG_XPORT, &client->dev, 71 + "wrote %zd bytes at %#04x: %d (%*ph)\n", 72 + len, commandcode, retval, (int)len, buf); 73 + 74 + return retval; 75 + } 76 + 77 + /* 78 + * The function to get command code for smbus operations and keeps 79 + * records to the driver mapping table 80 + */ 81 + static int rmi_smb_get_command_code(struct rmi_transport_dev *xport, 82 + u16 rmiaddr, int bytecount, bool isread, u8 *commandcode) 83 + { 84 + struct rmi_smb_xport *rmi_smb = 85 + container_of(xport, struct rmi_smb_xport, xport); 86 + int i; 87 + int retval; 88 + struct mapping_table_entry mapping_data[1]; 89 + 90 + mutex_lock(&rmi_smb->mappingtable_mutex); 91 + for (i = 0; i < RMI_SMB2_MAP_SIZE; i++) { 92 + if (rmi_smb->mapping_table[i].rmiaddr == rmiaddr) { 93 + if (isread) { 94 + if (rmi_smb->mapping_table[i].readcount 95 + == bytecount) { 96 + *commandcode = i; 97 + retval = 0; 98 + goto exit; 99 + } 100 + } else { 101 + if (rmi_smb->mapping_table[i].flags & 102 + RMI_SMB2_MAP_FLAGS_WE) { 103 + *commandcode = i; 104 + retval = 0; 105 + goto exit; 106 + } 107 + } 108 + } 109 + } 110 + i = rmi_smb->table_index; 111 + rmi_smb->table_index = (i + 1) % RMI_SMB2_MAP_SIZE; 112 + 113 + /* constructs mapping table data entry. 4 bytes each entry */ 114 + memset(mapping_data, 0, sizeof(mapping_data)); 115 + 116 + mapping_data[0].rmiaddr = cpu_to_le16(rmiaddr); 117 + mapping_data[0].readcount = bytecount; 118 + mapping_data[0].flags = !isread ? RMI_SMB2_MAP_FLAGS_WE : 0; 119 + 120 + retval = smb_block_write(xport, i + 0x80, mapping_data, 121 + sizeof(mapping_data)); 122 + 123 + if (retval < 0) { 124 + /* 125 + * if not written to device mapping table 126 + * clear the driver mapping table records 127 + */ 128 + rmi_smb->mapping_table[i].rmiaddr = 0x0000; 129 + rmi_smb->mapping_table[i].readcount = 0; 130 + rmi_smb->mapping_table[i].flags = 0; 131 + goto exit; 132 + } 133 + /* save to the driver level mapping table */ 134 + rmi_smb->mapping_table[i].rmiaddr = rmiaddr; 135 + rmi_smb->mapping_table[i].readcount = bytecount; 136 + rmi_smb->mapping_table[i].flags = !isread ? RMI_SMB2_MAP_FLAGS_WE : 0; 137 + *commandcode = i; 138 + 139 + exit: 140 + mutex_unlock(&rmi_smb->mappingtable_mutex); 141 + 142 + return retval; 143 + } 144 + 145 + static int rmi_smb_write_block(struct rmi_transport_dev *xport, u16 rmiaddr, 146 + const void *databuff, size_t len) 147 + { 148 + int retval = 0; 149 + u8 commandcode; 150 + struct rmi_smb_xport *rmi_smb = 151 + container_of(xport, struct rmi_smb_xport, xport); 152 + int cur_len = (int)len; 153 + 154 + mutex_lock(&rmi_smb->page_mutex); 155 + 156 + while (cur_len > 0) { 157 + /* 158 + * break into 32 bytes chunks to write get command code 159 + */ 160 + int block_len = min_t(int, len, SMB_MAX_COUNT); 161 + 162 + retval = rmi_smb_get_command_code(xport, rmiaddr, block_len, 163 + false, &commandcode); 164 + if (retval < 0) 165 + goto exit; 166 + 167 + retval = smb_block_write(xport, commandcode, 168 + databuff, block_len); 169 + if (retval < 0) 170 + goto exit; 171 + 172 + /* prepare to write next block of bytes */ 173 + cur_len -= SMB_MAX_COUNT; 174 + databuff += SMB_MAX_COUNT; 175 + rmiaddr += SMB_MAX_COUNT; 176 + } 177 + exit: 178 + mutex_unlock(&rmi_smb->page_mutex); 179 + return retval; 180 + } 181 + 182 + /* SMB block read - wrapper over ic2_smb_read_block */ 183 + static int smb_block_read(struct rmi_transport_dev *xport, 184 + u8 commandcode, void *buf, size_t len) 185 + { 186 + struct rmi_smb_xport *rmi_smb = 187 + container_of(xport, struct rmi_smb_xport, xport); 188 + struct i2c_client *client = rmi_smb->client; 189 + int retval; 190 + 191 + retval = i2c_smbus_read_block_data(client, commandcode, buf); 192 + if (retval < 0) 193 + return retval; 194 + 195 + return retval; 196 + } 197 + 198 + static int rmi_smb_read_block(struct rmi_transport_dev *xport, u16 rmiaddr, 199 + void *databuff, size_t len) 200 + { 201 + struct rmi_smb_xport *rmi_smb = 202 + container_of(xport, struct rmi_smb_xport, xport); 203 + int retval; 204 + u8 commandcode; 205 + int cur_len = (int)len; 206 + 207 + mutex_lock(&rmi_smb->page_mutex); 208 + memset(databuff, 0, len); 209 + 210 + while (cur_len > 0) { 211 + /* break into 32 bytes chunks to write get command code */ 212 + int block_len = min_t(int, cur_len, SMB_MAX_COUNT); 213 + 214 + retval = rmi_smb_get_command_code(xport, rmiaddr, block_len, 215 + true, &commandcode); 216 + if (retval < 0) 217 + goto exit; 218 + 219 + retval = smb_block_read(xport, commandcode, 220 + databuff, block_len); 221 + if (retval < 0) 222 + goto exit; 223 + 224 + /* prepare to read next block of bytes */ 225 + cur_len -= SMB_MAX_COUNT; 226 + databuff += SMB_MAX_COUNT; 227 + rmiaddr += SMB_MAX_COUNT; 228 + } 229 + 230 + retval = 0; 231 + 232 + exit: 233 + mutex_unlock(&rmi_smb->page_mutex); 234 + return retval; 235 + } 236 + 237 + static void rmi_smb_clear_state(struct rmi_smb_xport *rmi_smb) 238 + { 239 + /* the mapping table has been flushed, discard the current one */ 240 + mutex_lock(&rmi_smb->mappingtable_mutex); 241 + memset(rmi_smb->mapping_table, 0, sizeof(rmi_smb->mapping_table)); 242 + mutex_unlock(&rmi_smb->mappingtable_mutex); 243 + } 244 + 245 + static int rmi_smb_enable_smbus_mode(struct rmi_smb_xport *rmi_smb) 246 + { 247 + int retval; 248 + 249 + /* we need to get the smbus version to activate the touchpad */ 250 + retval = rmi_smb_get_version(rmi_smb); 251 + if (retval < 0) 252 + return retval; 253 + 254 + return 0; 255 + } 256 + 257 + static int rmi_smb_reset(struct rmi_transport_dev *xport, u16 reset_addr) 258 + { 259 + struct rmi_smb_xport *rmi_smb = 260 + container_of(xport, struct rmi_smb_xport, xport); 261 + 262 + rmi_smb_clear_state(rmi_smb); 263 + 264 + /* 265 + * we do not call the actual reset command, it has to be handled in 266 + * PS/2 or there will be races between PS/2 and SMBus. 267 + * PS/2 should ensure that a psmouse_reset is called before 268 + * intializing the device and after it has been removed to be in a known 269 + * state. 270 + */ 271 + return rmi_smb_enable_smbus_mode(rmi_smb); 272 + } 273 + 274 + static const struct rmi_transport_ops rmi_smb_ops = { 275 + .write_block = rmi_smb_write_block, 276 + .read_block = rmi_smb_read_block, 277 + .reset = rmi_smb_reset, 278 + }; 279 + 280 + static int rmi_smb_probe(struct i2c_client *client, 281 + const struct i2c_device_id *id) 282 + { 283 + struct rmi_device_platform_data *pdata = dev_get_platdata(&client->dev); 284 + struct rmi_smb_xport *rmi_smb; 285 + int retval; 286 + int smbus_version; 287 + 288 + if (!i2c_check_functionality(client->adapter, 289 + I2C_FUNC_SMBUS_READ_BLOCK_DATA | 290 + I2C_FUNC_SMBUS_HOST_NOTIFY)) { 291 + dev_err(&client->dev, 292 + "adapter does not support required functionality.\n"); 293 + return -ENODEV; 294 + } 295 + 296 + if (client->irq <= 0) { 297 + dev_err(&client->dev, "no IRQ provided, giving up.\n"); 298 + return client->irq ? client->irq : -ENODEV; 299 + } 300 + 301 + rmi_smb = devm_kzalloc(&client->dev, sizeof(struct rmi_smb_xport), 302 + GFP_KERNEL); 303 + if (!rmi_smb) 304 + return -ENOMEM; 305 + 306 + if (!pdata) { 307 + dev_err(&client->dev, "no platform data, aborting\n"); 308 + return -ENOMEM; 309 + } 310 + 311 + rmi_dbg(RMI_DEBUG_XPORT, &client->dev, "Probing %s.\n", 312 + dev_name(&client->dev)); 313 + 314 + rmi_smb->client = client; 315 + mutex_init(&rmi_smb->page_mutex); 316 + mutex_init(&rmi_smb->mappingtable_mutex); 317 + 318 + rmi_smb->xport.dev = &client->dev; 319 + rmi_smb->xport.pdata = *pdata; 320 + rmi_smb->xport.pdata.irq = client->irq; 321 + rmi_smb->xport.proto_name = "smb2"; 322 + rmi_smb->xport.ops = &rmi_smb_ops; 323 + 324 + retval = rmi_smb_get_version(rmi_smb); 325 + if (retval < 0) 326 + return retval; 327 + 328 + smbus_version = retval; 329 + rmi_dbg(RMI_DEBUG_XPORT, &client->dev, "Smbus version is %d", 330 + smbus_version); 331 + 332 + if (smbus_version != 2) { 333 + dev_err(&client->dev, "Unrecognized SMB version %d.\n", 334 + smbus_version); 335 + return -ENODEV; 336 + } 337 + 338 + i2c_set_clientdata(client, rmi_smb); 339 + 340 + retval = rmi_register_transport_device(&rmi_smb->xport); 341 + if (retval) { 342 + dev_err(&client->dev, "Failed to register transport driver at 0x%.2X.\n", 343 + client->addr); 344 + i2c_set_clientdata(client, NULL); 345 + return retval; 346 + } 347 + 348 + dev_info(&client->dev, "registered rmi smb driver at %#04x.\n", 349 + client->addr); 350 + return 0; 351 + 352 + } 353 + 354 + static int rmi_smb_remove(struct i2c_client *client) 355 + { 356 + struct rmi_smb_xport *rmi_smb = i2c_get_clientdata(client); 357 + 358 + rmi_unregister_transport_device(&rmi_smb->xport); 359 + 360 + return 0; 361 + } 362 + 363 + static int __maybe_unused rmi_smb_suspend(struct device *dev) 364 + { 365 + struct i2c_client *client = to_i2c_client(dev); 366 + struct rmi_smb_xport *rmi_smb = i2c_get_clientdata(client); 367 + int ret; 368 + 369 + ret = rmi_driver_suspend(rmi_smb->xport.rmi_dev, true); 370 + if (ret) 371 + dev_warn(dev, "Failed to suspend device: %d\n", ret); 372 + 373 + return ret; 374 + } 375 + 376 + static int __maybe_unused rmi_smb_runtime_suspend(struct device *dev) 377 + { 378 + struct i2c_client *client = to_i2c_client(dev); 379 + struct rmi_smb_xport *rmi_smb = i2c_get_clientdata(client); 380 + int ret; 381 + 382 + ret = rmi_driver_suspend(rmi_smb->xport.rmi_dev, false); 383 + if (ret) 384 + dev_warn(dev, "Failed to suspend device: %d\n", ret); 385 + 386 + return ret; 387 + } 388 + 389 + static int __maybe_unused rmi_smb_resume(struct device *dev) 390 + { 391 + struct i2c_client *client = container_of(dev, struct i2c_client, dev); 392 + struct rmi_smb_xport *rmi_smb = i2c_get_clientdata(client); 393 + struct rmi_device *rmi_dev = rmi_smb->xport.rmi_dev; 394 + int ret; 395 + 396 + rmi_smb_reset(&rmi_smb->xport, 0); 397 + 398 + rmi_reset(rmi_dev); 399 + 400 + ret = rmi_driver_resume(rmi_smb->xport.rmi_dev, true); 401 + if (ret) 402 + dev_warn(dev, "Failed to resume device: %d\n", ret); 403 + 404 + return 0; 405 + } 406 + 407 + static int __maybe_unused rmi_smb_runtime_resume(struct device *dev) 408 + { 409 + struct i2c_client *client = to_i2c_client(dev); 410 + struct rmi_smb_xport *rmi_smb = i2c_get_clientdata(client); 411 + int ret; 412 + 413 + ret = rmi_driver_resume(rmi_smb->xport.rmi_dev, false); 414 + if (ret) 415 + dev_warn(dev, "Failed to resume device: %d\n", ret); 416 + 417 + return 0; 418 + } 419 + 420 + static const struct dev_pm_ops rmi_smb_pm = { 421 + SET_SYSTEM_SLEEP_PM_OPS(rmi_smb_suspend, rmi_smb_resume) 422 + SET_RUNTIME_PM_OPS(rmi_smb_runtime_suspend, rmi_smb_runtime_resume, 423 + NULL) 424 + }; 425 + 426 + static const struct i2c_device_id rmi_id[] = { 427 + { "rmi4_smbus", 0 }, 428 + { } 429 + }; 430 + MODULE_DEVICE_TABLE(i2c, rmi_id); 431 + 432 + static struct i2c_driver rmi_smb_driver = { 433 + .driver = { 434 + .name = "rmi4_smbus", 435 + .pm = &rmi_smb_pm, 436 + }, 437 + .id_table = rmi_id, 438 + .probe = rmi_smb_probe, 439 + .remove = rmi_smb_remove, 440 + }; 441 + 442 + module_i2c_driver(rmi_smb_driver); 443 + 444 + MODULE_AUTHOR("Andrew Duggan <aduggan@synaptics.com>"); 445 + MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@redhat.com>"); 446 + MODULE_DESCRIPTION("RMI4 SMBus driver"); 447 + MODULE_LICENSE("GPL");
+5 -67
drivers/input/rmi4/rmi_spi.c
··· 12 12 #include <linux/rmi.h> 13 13 #include <linux/slab.h> 14 14 #include <linux/spi/spi.h> 15 - #include <linux/irq.h> 16 15 #include <linux/of.h> 17 16 #include "rmi_driver.h" 18 17 ··· 42 43 43 44 struct mutex page_mutex; 44 45 int page; 45 - 46 - int irq; 47 46 48 47 u8 *rx_buf; 49 48 u8 *tx_buf; ··· 323 326 .read_block = rmi_spi_read_block, 324 327 }; 325 328 326 - static irqreturn_t rmi_spi_irq(int irq, void *dev_id) 327 - { 328 - struct rmi_spi_xport *rmi_spi = dev_id; 329 - struct rmi_device *rmi_dev = rmi_spi->xport.rmi_dev; 330 - int ret; 331 - 332 - ret = rmi_process_interrupt_requests(rmi_dev); 333 - if (ret) 334 - rmi_dbg(RMI_DEBUG_XPORT, &rmi_dev->dev, 335 - "Failed to process interrupt request: %d\n", ret); 336 - 337 - return IRQ_HANDLED; 338 - } 339 - 340 - static int rmi_spi_init_irq(struct spi_device *spi) 341 - { 342 - struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi); 343 - int irq_flags = irqd_get_trigger_type(irq_get_irq_data(rmi_spi->irq)); 344 - int ret; 345 - 346 - if (!irq_flags) 347 - irq_flags = IRQF_TRIGGER_LOW; 348 - 349 - ret = devm_request_threaded_irq(&spi->dev, rmi_spi->irq, NULL, 350 - rmi_spi_irq, irq_flags | IRQF_ONESHOT, 351 - dev_name(&spi->dev), rmi_spi); 352 - if (ret < 0) { 353 - dev_warn(&spi->dev, "Failed to register interrupt %d\n", 354 - rmi_spi->irq); 355 - return ret; 356 - } 357 - 358 - return 0; 359 - } 360 - 361 329 #ifdef CONFIG_OF 362 330 static int rmi_spi_of_probe(struct spi_device *spi, 363 331 struct rmi_device_platform_data *pdata) ··· 402 440 return retval; 403 441 } 404 442 405 - if (spi->irq > 0) 406 - rmi_spi->irq = spi->irq; 443 + pdata->irq = spi->irq; 407 444 408 445 rmi_spi->spi = spi; 409 446 mutex_init(&rmi_spi->page_mutex); ··· 438 477 if (retval) 439 478 return retval; 440 479 441 - retval = rmi_spi_init_irq(spi); 442 - if (retval < 0) 443 - return retval; 444 - 445 480 dev_info(&spi->dev, "registered RMI SPI driver\n"); 446 481 return 0; 447 482 } ··· 449 492 struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi); 450 493 int ret; 451 494 452 - ret = rmi_driver_suspend(rmi_spi->xport.rmi_dev); 495 + ret = rmi_driver_suspend(rmi_spi->xport.rmi_dev, true); 453 496 if (ret) 454 497 dev_warn(dev, "Failed to resume device: %d\n", ret); 455 498 456 - disable_irq(rmi_spi->irq); 457 - if (device_may_wakeup(&spi->dev)) { 458 - ret = enable_irq_wake(rmi_spi->irq); 459 - if (!ret) 460 - dev_warn(dev, "Failed to enable irq for wake: %d\n", 461 - ret); 462 - } 463 499 return ret; 464 500 } 465 501 ··· 462 512 struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi); 463 513 int ret; 464 514 465 - enable_irq(rmi_spi->irq); 466 - if (device_may_wakeup(&spi->dev)) { 467 - ret = disable_irq_wake(rmi_spi->irq); 468 - if (!ret) 469 - dev_warn(dev, "Failed to disable irq for wake: %d\n", 470 - ret); 471 - } 472 - 473 - ret = rmi_driver_resume(rmi_spi->xport.rmi_dev); 515 + ret = rmi_driver_resume(rmi_spi->xport.rmi_dev, true); 474 516 if (ret) 475 517 dev_warn(dev, "Failed to resume device: %d\n", ret); 476 518 ··· 477 535 struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi); 478 536 int ret; 479 537 480 - ret = rmi_driver_suspend(rmi_spi->xport.rmi_dev); 538 + ret = rmi_driver_suspend(rmi_spi->xport.rmi_dev, false); 481 539 if (ret) 482 540 dev_warn(dev, "Failed to resume device: %d\n", ret); 483 - 484 - disable_irq(rmi_spi->irq); 485 541 486 542 return 0; 487 543 } ··· 490 550 struct rmi_spi_xport *rmi_spi = spi_get_drvdata(spi); 491 551 int ret; 492 552 493 - enable_irq(rmi_spi->irq); 494 - 495 - ret = rmi_driver_resume(rmi_spi->xport.rmi_dev); 553 + ret = rmi_driver_resume(rmi_spi->xport.rmi_dev, false); 496 554 if (ret) 497 555 dev_warn(dev, "Failed to resume device: %d\n", ret); 498 556
+3 -75
drivers/input/serio/i8042-x86ia64io.h
··· 517 517 { 518 518 .matches = { 519 519 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 520 - DMI_MATCH(DMI_PRODUCT_NAME, "A455LD"), 521 - }, 522 - }, 523 - { 524 - .matches = { 525 - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 526 - DMI_MATCH(DMI_PRODUCT_NAME, "K401LB"), 527 - }, 528 - }, 529 - { 530 - .matches = { 531 - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 532 - DMI_MATCH(DMI_PRODUCT_NAME, "K501LB"), 533 - }, 534 - }, 535 - { 536 - .matches = { 537 - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 538 - DMI_MATCH(DMI_PRODUCT_NAME, "K501LX"), 539 - }, 540 - }, 541 - { 542 - .matches = { 543 - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 544 - DMI_MATCH(DMI_PRODUCT_NAME, "R409L"), 545 - }, 546 - }, 547 - { 548 - .matches = { 549 - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 550 - DMI_MATCH(DMI_PRODUCT_NAME, "V502LX"), 551 - }, 552 - }, 553 - { 554 - .matches = { 555 - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 556 - DMI_MATCH(DMI_PRODUCT_NAME, "X302LA"), 557 - }, 558 - }, 559 - { 560 - .matches = { 561 - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 562 - DMI_MATCH(DMI_PRODUCT_NAME, "X450LCP"), 563 - }, 564 - }, 565 - { 566 - .matches = { 567 - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 568 - DMI_MATCH(DMI_PRODUCT_NAME, "X450LD"), 569 - }, 570 - }, 571 - { 572 - .matches = { 573 - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 574 - DMI_MATCH(DMI_PRODUCT_NAME, "X455LAB"), 575 - }, 576 - }, 577 - { 578 - .matches = { 579 - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 580 - DMI_MATCH(DMI_PRODUCT_NAME, "X455LDB"), 581 - }, 582 - }, 583 - { 584 - .matches = { 585 - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 586 - DMI_MATCH(DMI_PRODUCT_NAME, "X455LF"), 587 - }, 588 - }, 589 - { 590 - .matches = { 591 - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), 592 - DMI_MATCH(DMI_PRODUCT_NAME, "Z450LA"), 520 + DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */ 593 521 }, 594 522 }, 595 523 { } ··· 1059 1131 return 0; 1060 1132 } 1061 1133 1062 - #else 1134 + #else /* !CONFIG_PNP */ 1063 1135 static inline int i8042_pnp_init(void) { return 0; } 1064 1136 static inline void i8042_pnp_exit(void) { } 1065 - #endif 1137 + #endif /* CONFIG_PNP */ 1066 1138 1067 1139 static int __init i8042_platform_init(void) 1068 1140 {
+1 -1
drivers/input/serio/i8042.c
··· 387 387 388 388 389 389 /* 390 - * i8042_aux_close attempts to clear AUX or KBD port state by disabling 390 + * i8042_port_close attempts to clear AUX or KBD port state by disabling 391 391 * and then re-enabling it. 392 392 */ 393 393
+1
drivers/input/touchscreen/fsl-imx25-tcq.c
··· 55 55 { .compatible = "fsl,imx25-tcq", }, 56 56 { /* Sentinel */ } 57 57 }; 58 + MODULE_DEVICE_TABLE(of, mx25_tcq_ids); 58 59 59 60 #define TSC_4WIRE_PRE_INDEX 0 60 61 #define TSC_4WIRE_X_INDEX 1
+63 -20
drivers/input/touchscreen/imx6ul_tsc.c
··· 21 21 #include <linux/platform_device.h> 22 22 #include <linux/clk.h> 23 23 #include <linux/io.h> 24 + #include <linux/log2.h> 24 25 25 26 /* ADC configuration registers field define */ 26 27 #define ADC_AIEN (0x1 << 7) 27 28 #define ADC_CONV_DISABLE 0x1F 29 + #define ADC_AVGE (0x1 << 5) 28 30 #define ADC_CAL (0x1 << 7) 29 31 #define ADC_CALF 0x2 30 32 #define ADC_12BIT_MODE (0x2 << 2) 33 + #define ADC_CONV_MODE_MASK (0x3 << 2) 31 34 #define ADC_IPG_CLK 0x00 35 + #define ADC_INPUT_CLK_MASK 0x3 32 36 #define ADC_CLK_DIV_8 (0x03 << 5) 37 + #define ADC_CLK_DIV_MASK (0x3 << 5) 33 38 #define ADC_SHORT_SAMPLE_MODE (0x0 << 4) 39 + #define ADC_SAMPLE_MODE_MASK (0x1 << 4) 34 40 #define ADC_HARDWARE_TRIGGER (0x1 << 13) 41 + #define ADC_AVGS_SHIFT 14 42 + #define ADC_AVGS_MASK (0x3 << 14) 35 43 #define SELECT_CHANNEL_4 0x04 36 44 #define SELECT_CHANNEL_1 0x01 37 45 #define DISABLE_CONVERSION_INT (0x0 << 7) ··· 92 84 struct clk *adc_clk; 93 85 struct gpio_desc *xnur_gpio; 94 86 95 - int measure_delay_time; 96 - int pre_charge_time; 87 + u32 measure_delay_time; 88 + u32 pre_charge_time; 89 + bool average_enable; 90 + u32 average_select; 97 91 98 92 struct completion completion; 99 93 }; ··· 106 96 */ 107 97 static int imx6ul_adc_init(struct imx6ul_tsc *tsc) 108 98 { 109 - int adc_hc = 0; 110 - int adc_gc; 111 - int adc_gs; 112 - int adc_cfg; 113 - int timeout; 99 + u32 adc_hc = 0; 100 + u32 adc_gc; 101 + u32 adc_gs; 102 + u32 adc_cfg; 103 + unsigned long timeout; 114 104 115 105 reinit_completion(&tsc->completion); 116 106 117 107 adc_cfg = readl(tsc->adc_regs + REG_ADC_CFG); 108 + adc_cfg &= ~(ADC_CONV_MODE_MASK | ADC_INPUT_CLK_MASK); 118 109 adc_cfg |= ADC_12BIT_MODE | ADC_IPG_CLK; 110 + adc_cfg &= ~(ADC_CLK_DIV_MASK | ADC_SAMPLE_MODE_MASK); 119 111 adc_cfg |= ADC_CLK_DIV_8 | ADC_SHORT_SAMPLE_MODE; 112 + if (tsc->average_enable) { 113 + adc_cfg &= ~ADC_AVGS_MASK; 114 + adc_cfg |= (tsc->average_select) << ADC_AVGS_SHIFT; 115 + } 120 116 adc_cfg &= ~ADC_HARDWARE_TRIGGER; 121 117 writel(adc_cfg, tsc->adc_regs + REG_ADC_CFG); 122 118 ··· 134 118 /* start ADC calibration */ 135 119 adc_gc = readl(tsc->adc_regs + REG_ADC_GC); 136 120 adc_gc |= ADC_CAL; 121 + if (tsc->average_enable) 122 + adc_gc |= ADC_AVGE; 137 123 writel(adc_gc, tsc->adc_regs + REG_ADC_GC); 138 124 139 125 timeout = wait_for_completion_timeout ··· 166 148 */ 167 149 static void imx6ul_tsc_channel_config(struct imx6ul_tsc *tsc) 168 150 { 169 - int adc_hc0, adc_hc1, adc_hc2, adc_hc3, adc_hc4; 151 + u32 adc_hc0, adc_hc1, adc_hc2, adc_hc3, adc_hc4; 170 152 171 153 adc_hc0 = DISABLE_CONVERSION_INT; 172 154 writel(adc_hc0, tsc->adc_regs + REG_ADC_HC0); ··· 191 173 */ 192 174 static void imx6ul_tsc_set(struct imx6ul_tsc *tsc) 193 175 { 194 - int basic_setting = 0; 195 - int start; 176 + u32 basic_setting = 0; 177 + u32 start; 196 178 197 179 basic_setting |= tsc->measure_delay_time << 8; 198 180 basic_setting |= DETECT_4_WIRE_MODE | AUTO_MEASURE; ··· 227 209 228 210 static void imx6ul_tsc_disable(struct imx6ul_tsc *tsc) 229 211 { 230 - int tsc_flow; 231 - int adc_cfg; 212 + u32 tsc_flow; 213 + u32 adc_cfg; 232 214 233 215 /* TSC controller enters to idle status */ 234 216 tsc_flow = readl(tsc->tsc_regs + REG_TSC_FLOW_CONTROL); ··· 245 227 static bool tsc_wait_detect_mode(struct imx6ul_tsc *tsc) 246 228 { 247 229 unsigned long timeout = jiffies + msecs_to_jiffies(2); 248 - int state_machine; 249 - int debug_mode2; 230 + u32 state_machine; 231 + u32 debug_mode2; 250 232 251 233 do { 252 234 if (time_after(jiffies, timeout)) ··· 264 246 static irqreturn_t tsc_irq_fn(int irq, void *dev_id) 265 247 { 266 248 struct imx6ul_tsc *tsc = dev_id; 267 - int status; 268 - int value; 269 - int x, y; 270 - int start; 249 + u32 status; 250 + u32 value; 251 + u32 x, y; 252 + u32 start; 271 253 272 254 status = readl(tsc->tsc_regs + REG_TSC_INT_STATUS); 273 255 ··· 307 289 static irqreturn_t adc_irq_fn(int irq, void *dev_id) 308 290 { 309 291 struct imx6ul_tsc *tsc = dev_id; 310 - int coco; 311 - int value; 292 + u32 coco; 293 + u32 value; 312 294 313 295 coco = readl(tsc->adc_regs + REG_ADC_HS); 314 296 if (coco & 0x01) { ··· 364 346 int err; 365 347 int tsc_irq; 366 348 int adc_irq; 349 + u32 average_samples; 367 350 368 351 tsc = devm_kzalloc(&pdev->dev, sizeof(*tsc), GFP_KERNEL); 369 352 if (!tsc) ··· 468 449 &tsc->pre_charge_time); 469 450 if (err) 470 451 tsc->pre_charge_time = 0xfff; 452 + 453 + err = of_property_read_u32(np, "touchscreen-average-samples", 454 + &average_samples); 455 + if (err) 456 + average_samples = 1; 457 + 458 + switch (average_samples) { 459 + case 1: 460 + tsc->average_enable = false; 461 + tsc->average_select = 0; /* value unused; initialize anyway */ 462 + break; 463 + case 4: 464 + case 8: 465 + case 16: 466 + case 32: 467 + tsc->average_enable = true; 468 + tsc->average_select = ilog2(average_samples) - 2; 469 + break; 470 + default: 471 + dev_err(&pdev->dev, 472 + "touchscreen-average-samples (%u) must be 1, 4, 8, 16 or 32\n", 473 + average_samples); 474 + return -EINVAL; 475 + } 471 476 472 477 err = input_register_device(tsc->input); 473 478 if (err) {
+47 -4
drivers/input/touchscreen/melfas_mip4.c
··· 33 33 34 34 /***************************************************************** 35 35 * Protocol 36 - * Version : MIP 4.0 Rev 4.6 36 + * Version : MIP 4.0 Rev 5.4 37 37 *****************************************************************/ 38 38 39 39 /* Address */ ··· 81 81 #define MIP4_R1_INFO_IC_HW_CATEGORY 0x77 82 82 #define MIP4_R1_INFO_CONTACT_THD_SCR 0x78 83 83 #define MIP4_R1_INFO_CONTACT_THD_KEY 0x7A 84 + #define MIP4_R1_INFO_PID 0x7C 85 + #define MIP4_R1_INFO_VID 0x7E 86 + #define MIP4_R1_INFO_SLAVE_ADDR 0x80 84 87 85 88 #define MIP4_R0_EVENT 0x02 86 89 #define MIP4_R1_EVENT_SUPPORTED_FUNC 0x00 ··· 160 157 161 158 char phys[32]; 162 159 char product_name[16]; 160 + u16 product_id; 163 161 char ic_name[4]; 162 + char fw_name[32]; 164 163 165 164 unsigned int max_x; 166 165 unsigned int max_y; ··· 268 263 else 269 264 dev_dbg(&ts->client->dev, "product name: %.*s\n", 270 265 (int)sizeof(ts->product_name), ts->product_name); 266 + 267 + /* Product ID */ 268 + cmd[0] = MIP4_R0_INFO; 269 + cmd[1] = MIP4_R1_INFO_PID; 270 + error = mip4_i2c_xfer(ts, cmd, sizeof(cmd), buf, 2); 271 + if (error) { 272 + dev_warn(&ts->client->dev, 273 + "Failed to retrieve product id: %d\n", error); 274 + } else { 275 + ts->product_id = get_unaligned_le16(&buf[0]); 276 + dev_dbg(&ts->client->dev, "product id: %04X\n", ts->product_id); 277 + } 278 + 279 + /* Firmware name */ 280 + snprintf(ts->fw_name, sizeof(ts->fw_name), 281 + "melfas_mip4_%04X.fw", ts->product_id); 282 + dev_dbg(&ts->client->dev, "firmware name: %s\n", ts->fw_name); 271 283 272 284 /* IC name */ 273 285 cmd[0] = MIP4_R0_INFO; ··· 1291 1269 const struct firmware *fw; 1292 1270 int error; 1293 1271 1294 - error = request_firmware(&fw, MIP4_FW_NAME, dev); 1272 + error = request_firmware(&fw, ts->fw_name, dev); 1295 1273 if (error) { 1296 1274 dev_err(&ts->client->dev, 1297 1275 "Failed to retrieve firmware %s: %d\n", 1298 - MIP4_FW_NAME, error); 1276 + ts->fw_name, error); 1299 1277 return error; 1300 1278 } 1301 1279 ··· 1370 1348 1371 1349 static DEVICE_ATTR(hw_version, S_IRUGO, mip4_sysfs_read_hw_version, NULL); 1372 1350 1351 + static ssize_t mip4_sysfs_read_product_id(struct device *dev, 1352 + struct device_attribute *attr, 1353 + char *buf) 1354 + { 1355 + struct i2c_client *client = to_i2c_client(dev); 1356 + struct mip4_ts *ts = i2c_get_clientdata(client); 1357 + size_t count; 1358 + 1359 + mutex_lock(&ts->input->mutex); 1360 + 1361 + count = snprintf(buf, PAGE_SIZE, "%04X\n", ts->product_id); 1362 + 1363 + mutex_unlock(&ts->input->mutex); 1364 + 1365 + return count; 1366 + } 1367 + 1368 + static DEVICE_ATTR(product_id, S_IRUGO, mip4_sysfs_read_product_id, NULL); 1369 + 1373 1370 static ssize_t mip4_sysfs_read_ic_name(struct device *dev, 1374 1371 struct device_attribute *attr, 1375 1372 char *buf) ··· 1412 1371 static struct attribute *mip4_attrs[] = { 1413 1372 &dev_attr_fw_version.attr, 1414 1373 &dev_attr_hw_version.attr, 1374 + &dev_attr_product_id.attr, 1415 1375 &dev_attr_ic_name.attr, 1416 1376 &dev_attr_update_fw.attr, 1417 1377 NULL, ··· 1477 1435 1478 1436 input->id.bustype = BUS_I2C; 1479 1437 input->id.vendor = 0x13c5; 1438 + input->id.product = ts->product_id; 1480 1439 1481 1440 input->open = mip4_input_open; 1482 1441 input->close = mip4_input_close; ··· 1615 1572 module_i2c_driver(mip4_driver); 1616 1573 1617 1574 MODULE_DESCRIPTION("MELFAS MIP4 Touchscreen"); 1618 - MODULE_VERSION("2016.09.28"); 1575 + MODULE_VERSION("2016.10.31"); 1619 1576 MODULE_AUTHOR("Sangwon Jee <jeesw@melfas.com>"); 1620 1577 MODULE_LICENSE("GPL");
+1 -1
drivers/input/touchscreen/raydium_i2c_ts.c
··· 669 669 670 670 if (ts->boot_mode == RAYDIUM_TS_MAIN) { 671 671 dev_err(&client->dev, 672 - "failied to jump to boot loader: %d\n", 672 + "failed to jump to boot loader: %d\n", 673 673 error); 674 674 return -EIO; 675 675 }
+29
drivers/input/touchscreen/silead.c
··· 29 29 #include <linux/input/touchscreen.h> 30 30 #include <linux/pm.h> 31 31 #include <linux/irq.h> 32 + #include <linux/regulator/consumer.h> 32 33 33 34 #include <asm/unaligned.h> 34 35 ··· 74 73 struct i2c_client *client; 75 74 struct gpio_desc *gpio_power; 76 75 struct input_dev *input; 76 + struct regulator_bulk_data regulators[2]; 77 77 char fw_name[64]; 78 78 struct touchscreen_properties prop; 79 79 u32 max_fingers; ··· 435 433 } 436 434 #endif 437 435 436 + static void silead_disable_regulator(void *arg) 437 + { 438 + struct silead_ts_data *data = arg; 439 + 440 + regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators); 441 + } 442 + 438 443 static int silead_ts_probe(struct i2c_client *client, 439 444 const struct i2c_device_id *id) 440 445 { ··· 473 464 /* We must have the IRQ provided by DT or ACPI subsytem */ 474 465 if (client->irq <= 0) 475 466 return -ENODEV; 467 + 468 + data->regulators[0].supply = "vddio"; 469 + data->regulators[1].supply = "avdd"; 470 + error = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->regulators), 471 + data->regulators); 472 + if (error) 473 + return error; 474 + 475 + /* 476 + * Enable regulators at probe and disable them at remove, we need 477 + * to keep the chip powered otherwise it forgets its firmware. 478 + */ 479 + error = regulator_bulk_enable(ARRAY_SIZE(data->regulators), 480 + data->regulators); 481 + if (error) 482 + return error; 483 + 484 + error = devm_add_action_or_reset(dev, silead_disable_regulator, data); 485 + if (error) 486 + return error; 476 487 477 488 /* Power GPIO pin */ 478 489 data->gpio_power = devm_gpiod_get_optional(dev, "power", GPIOD_OUT_LOW);
+1 -4
include/linux/gpio_keys.h
··· 2 2 #define _GPIO_KEYS_H 3 3 4 4 struct device; 5 - struct gpio_desc; 6 5 7 6 /** 8 7 * struct gpio_keys_button - configuration parameters ··· 17 18 * disable button via sysfs 18 19 * @value: axis value for %EV_ABS 19 20 * @irq: Irq number in case of interrupt keys 20 - * @gpiod: GPIO descriptor 21 21 */ 22 22 struct gpio_keys_button { 23 23 unsigned int code; ··· 29 31 bool can_disable; 30 32 int value; 31 33 unsigned int irq; 32 - struct gpio_desc *gpiod; 33 34 }; 34 35 35 36 /** ··· 43 46 * @name: input device name 44 47 */ 45 48 struct gpio_keys_platform_data { 46 - struct gpio_keys_button *buttons; 49 + const struct gpio_keys_button *buttons; 47 50 int nbuttons; 48 51 unsigned int poll_interval; 49 52 unsigned int rep:1;
-28
include/linux/platform_data/drv260x-pdata.h
··· 1 - /* 2 - * Platform data for DRV260X haptics driver family 3 - * 4 - * Author: Dan Murphy <dmurphy@ti.com> 5 - * 6 - * Copyright: (C) 2014 Texas Instruments, Inc. 7 - * 8 - * This program is free software; you can redistribute it and/or modify 9 - * it under the terms of the GNU General Public License version 2 as 10 - * published by the Free Software Foundation. 11 - * 12 - * This program is distributed in the hope that it will be useful, but 13 - * WITHOUT ANY WARRANTY; without even the implied warranty of 14 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 - * General Public License for more details. 16 - */ 17 - 18 - #ifndef _LINUX_DRV260X_PDATA_H 19 - #define _LINUX_DRV260X_PDATA_H 20 - 21 - struct drv260x_platform_data { 22 - u32 library_selection; 23 - u32 mode; 24 - u32 vib_rated_voltage; 25 - u32 vib_overdrive_voltage; 26 - }; 27 - 28 - #endif
+39 -21
include/linux/rmi.h
··· 13 13 #include <linux/device.h> 14 14 #include <linux/interrupt.h> 15 15 #include <linux/input.h> 16 + #include <linux/kfifo.h> 16 17 #include <linux/list.h> 17 18 #include <linux/module.h> 18 19 #include <linux/types.h> ··· 100 99 bool topbuttonpad; 101 100 bool kernel_tracking; 102 101 int dmax; 102 + int dribble; 103 + int palm_detect; 103 104 }; 104 105 105 106 /** ··· 109 106 * @buttonpad - the touchpad is a buttonpad, so enable only the first actual 110 107 * button that is found. 111 108 * @trackstick_buttons - Set when the function 30 is handling the physical 112 - * buttons of the trackstick (as a PD/2 passthrough device. 109 + * buttons of the trackstick (as a PS/2 passthrough device). 113 110 * @disable - the touchpad incorrectly reports F30 and it should be ignored. 114 111 * This is a special case which is due to misconfigured firmware. 115 112 */ ··· 119 116 bool disable; 120 117 }; 121 118 122 - /** 123 - * struct rmi_f01_power - override default power management settings. 124 - * 119 + 120 + /* 121 + * Set the state of a register 122 + * DEFAULT - use the default value set by the firmware config 123 + * OFF - explicitly disable the register 124 + * ON - explicitly enable the register 125 125 */ 126 - enum rmi_f01_nosleep { 127 - RMI_F01_NOSLEEP_DEFAULT = 0, 128 - RMI_F01_NOSLEEP_OFF = 1, 129 - RMI_F01_NOSLEEP_ON = 2 126 + enum rmi_reg_state { 127 + RMI_REG_STATE_DEFAULT = 0, 128 + RMI_REG_STATE_OFF = 1, 129 + RMI_REG_STATE_ON = 2 130 130 }; 131 131 132 132 /** ··· 149 143 * when the touch sensor is in doze mode, in units of 10ms. 150 144 */ 151 145 struct rmi_f01_power_management { 152 - enum rmi_f01_nosleep nosleep; 146 + enum rmi_reg_state nosleep; 153 147 u8 wakeup_threshold; 154 148 u8 doze_holdoff; 155 149 u8 doze_interval; ··· 210 204 * @reset_delay_ms - after issuing a reset command to the touch sensor, the 211 205 * driver waits a few milliseconds to give the firmware a chance to 212 206 * to re-initialize. You can override the default wait period here. 207 + * @irq: irq associated with the attn gpio line, or negative 213 208 */ 214 209 struct rmi_device_platform_data { 215 210 int reset_delay_ms; 211 + int irq; 216 212 217 213 struct rmi_device_platform_data_spi spi_data; 218 214 219 215 /* function handler pdata */ 220 - struct rmi_2d_sensor_platform_data *sensor_pdata; 216 + struct rmi_2d_sensor_platform_data sensor_pdata; 221 217 struct rmi_f01_power_management power_management; 222 - struct rmi_f30_data *f30_data; 218 + struct rmi_f30_data f30_data; 223 219 }; 224 220 225 221 /** ··· 272 264 struct rmi_device_platform_data pdata; 273 265 274 266 struct input_dev *input; 275 - 276 - void *attn_data; 277 - int attn_size; 278 267 }; 279 268 280 269 /** ··· 329 324 330 325 }; 331 326 327 + struct rmi4_attn_data { 328 + unsigned long irq_status; 329 + size_t size; 330 + void *data; 331 + }; 332 + 332 333 struct rmi_driver_data { 333 334 struct list_head function_list; 334 335 335 336 struct rmi_device *rmi_dev; 336 337 337 338 struct rmi_function *f01_container; 338 - bool f01_bootloader_mode; 339 + struct rmi_function *f34_container; 340 + bool bootloader_mode; 339 341 340 - u32 attn_count; 341 342 int num_of_irq_regs; 342 343 int irq_count; 344 + void *irq_memory; 343 345 unsigned long *irq_status; 344 346 unsigned long *fn_irq_bits; 345 347 unsigned long *current_irq_mask; ··· 355 343 struct input_dev *input; 356 344 357 345 u8 pdt_props; 358 - u8 bsr; 346 + 347 + u8 num_rx_electrodes; 348 + u8 num_tx_electrodes; 359 349 360 350 bool enabled; 351 + struct mutex enabled_mutex; 361 352 362 - void *data; 353 + struct rmi4_attn_data attn_data; 354 + DECLARE_KFIFO(attn_fifo, struct rmi4_attn_data, 16); 363 355 }; 364 356 365 357 int rmi_register_transport_device(struct rmi_transport_dev *xport); 366 358 void rmi_unregister_transport_device(struct rmi_transport_dev *xport); 367 - int rmi_process_interrupt_requests(struct rmi_device *rmi_dev); 368 359 369 - int rmi_driver_suspend(struct rmi_device *rmi_dev); 370 - int rmi_driver_resume(struct rmi_device *rmi_dev); 360 + void rmi_set_attn_data(struct rmi_device *rmi_dev, unsigned long irq_status, 361 + void *data, size_t size); 362 + 363 + int rmi_driver_suspend(struct rmi_device *rmi_dev, bool enable_wake); 364 + int rmi_driver_resume(struct rmi_device *rmi_dev, bool clear_wake); 371 365 #endif