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

Configure Feed

Select the types of activity you want to include in your feed.

Revert "Input: atmel_mxt_ts - use deep sleep mode when stopped"

This reverts commit 9d469d033d135d80742a4e39e6bbb4519dd5eee1.

It breaks the Chromebook Pixel touchpad (and touchscreen).

Reported-by: Dirk Hohndel <dirk@hohndel.org>
Bisected-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Nick Dyer <nick.dyer@itdev.co.uk>
Cc: Benson Leung <bleung@chromium.org>
Cc: Yufeng Shen <miletus@chromium.org>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: stable@vger.kernel.org # v3.16+
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

+26 -73
+26 -73
drivers/input/touchscreen/atmel_mxt_ts.c
··· 99 99 #define MXT_T6_STATUS_COMSERR (1 << 2) 100 100 101 101 /* MXT_GEN_POWER_T7 field */ 102 - struct t7_config { 103 - u8 idle; 104 - u8 active; 105 - } __packed; 106 - 107 - #define MXT_POWER_CFG_RUN 0 108 - #define MXT_POWER_CFG_DEEPSLEEP 1 102 + #define MXT_POWER_IDLEACQINT 0 103 + #define MXT_POWER_ACTVACQINT 1 104 + #define MXT_POWER_ACTV2IDLETO 2 109 105 110 106 /* MXT_GEN_ACQUIRE_T8 field */ 111 107 #define MXT_ACQUIRE_CHRGTIME 0 ··· 113 117 #define MXT_ACQUIRE_ATCHCALSTHR 7 114 118 115 119 /* MXT_TOUCH_MULTI_T9 field */ 120 + #define MXT_TOUCH_CTRL 0 116 121 #define MXT_T9_ORIENT 9 117 122 #define MXT_T9_RANGE 18 118 123 ··· 253 256 bool update_input; 254 257 u8 last_message_count; 255 258 u8 num_touchids; 256 - struct t7_config t7_cfg; 257 259 258 260 /* Cached parameters from object table */ 259 261 u16 T5_address; ··· 666 670 667 671 /* Save current status */ 668 672 data->t6_status = status; 673 + } 674 + 675 + static int mxt_write_object(struct mxt_data *data, 676 + u8 type, u8 offset, u8 val) 677 + { 678 + struct mxt_object *object; 679 + u16 reg; 680 + 681 + object = mxt_get_object(data, type); 682 + if (!object || offset >= mxt_obj_size(object)) 683 + return -EINVAL; 684 + 685 + reg = object->start_address; 686 + return mxt_write_reg(data->client, reg + offset, val); 669 687 } 670 688 671 689 static void mxt_input_button(struct mxt_data *data, u8 *message) ··· 1752 1742 return error; 1753 1743 } 1754 1744 1755 - static int mxt_set_t7_power_cfg(struct mxt_data *data, u8 sleep) 1756 - { 1757 - struct device *dev = &data->client->dev; 1758 - int error; 1759 - struct t7_config *new_config; 1760 - struct t7_config deepsleep = { .active = 0, .idle = 0 }; 1761 - 1762 - if (sleep == MXT_POWER_CFG_DEEPSLEEP) 1763 - new_config = &deepsleep; 1764 - else 1765 - new_config = &data->t7_cfg; 1766 - 1767 - error = __mxt_write_reg(data->client, data->T7_address, 1768 - sizeof(data->t7_cfg), new_config); 1769 - if (error) 1770 - return error; 1771 - 1772 - dev_dbg(dev, "Set T7 ACTV:%d IDLE:%d\n", 1773 - new_config->active, new_config->idle); 1774 - 1775 - return 0; 1776 - } 1777 - 1778 - static int mxt_init_t7_power_cfg(struct mxt_data *data) 1779 - { 1780 - struct device *dev = &data->client->dev; 1781 - int error; 1782 - bool retry = false; 1783 - 1784 - recheck: 1785 - error = __mxt_read_reg(data->client, data->T7_address, 1786 - sizeof(data->t7_cfg), &data->t7_cfg); 1787 - if (error) 1788 - return error; 1789 - 1790 - if (data->t7_cfg.active == 0 || data->t7_cfg.idle == 0) { 1791 - if (!retry) { 1792 - dev_dbg(dev, "T7 cfg zero, resetting\n"); 1793 - mxt_soft_reset(data); 1794 - retry = true; 1795 - goto recheck; 1796 - } else { 1797 - dev_dbg(dev, "T7 cfg zero after reset, overriding\n"); 1798 - data->t7_cfg.active = 20; 1799 - data->t7_cfg.idle = 100; 1800 - return mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN); 1801 - } 1802 - } 1803 - 1804 - dev_dbg(dev, "Initialized power cfg: ACTV %d, IDLE %d\n", 1805 - data->t7_cfg.active, data->t7_cfg.idle); 1806 - return 0; 1807 - } 1808 - 1809 1745 static int mxt_configure_objects(struct mxt_data *data, 1810 1746 const struct firmware *cfg) 1811 1747 { ··· 1763 1807 error = mxt_update_cfg(data, cfg); 1764 1808 if (error) 1765 1809 dev_warn(dev, "Error %d updating config\n", error); 1766 - } 1767 - 1768 - error = mxt_init_t7_power_cfg(data); 1769 - if (error) { 1770 - dev_err(dev, "Failed to initialize power cfg\n"); 1771 - return error; 1772 1810 } 1773 1811 1774 1812 error = mxt_initialize_t9_input_device(data); ··· 2043 2093 2044 2094 static void mxt_start(struct mxt_data *data) 2045 2095 { 2046 - mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN); 2047 - 2048 - /* Recalibrate since chip has been in deep sleep */ 2049 - mxt_t6_command(data, MXT_COMMAND_CALIBRATE, 1, false); 2096 + /* Touch enable */ 2097 + mxt_write_object(data, 2098 + MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0x83); 2050 2099 } 2051 2100 2052 2101 static void mxt_stop(struct mxt_data *data) 2053 2102 { 2054 - mxt_set_t7_power_cfg(data, MXT_POWER_CFG_DEEPSLEEP); 2103 + /* Touch disable */ 2104 + mxt_write_object(data, 2105 + MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0); 2055 2106 } 2056 2107 2057 2108 static int mxt_input_open(struct input_dev *dev) ··· 2216 2265 struct i2c_client *client = to_i2c_client(dev); 2217 2266 struct mxt_data *data = i2c_get_clientdata(client); 2218 2267 struct input_dev *input_dev = data->input_dev; 2268 + 2269 + mxt_soft_reset(data); 2219 2270 2220 2271 mutex_lock(&input_dev->mutex); 2221 2272