Commit 73721451 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull more input updates from Dmitry Torokhov:

 - fixups for Synaptics RMI4 driver

 - a quirk for Goodinx touchscreen on Teclast tablet

 - a new keycode definition for activating privacy screen feature found
   on a few "enterprise" laptops

 - updates to snvs_pwrkey driver

 - polling uinput device for writing (which is always allowed) now works

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
  Input: synaptics-rmi4 - don't increment rmiaddr for SMBus transfers
  Input: synaptics-rmi4 - re-enable IRQs in f34v7_do_reflash
  Input: goodix - add upside-down quirk for Teclast X89 tablet
  Input: add privacy screen toggle keycode
  Input: uinput - fix returning EPOLLOUT from uinput_poll
  Input: snvs_pwrkey - remove gratuitous NULL initializers
  Input: snvs_pwrkey - send key events for i.MX6 S, DL and Q
parents 95207d55 afbd65f5
...@@ -450,7 +450,7 @@ config KEYBOARD_SNVS_PWRKEY ...@@ -450,7 +450,7 @@ config KEYBOARD_SNVS_PWRKEY
depends on OF depends on OF
help help
This is the snvs powerkey driver for the Freescale i.MX application This is the snvs powerkey driver for the Freescale i.MX application
processors that are newer than i.MX6 SX. processors.
To compile this driver as a module, choose M here; the To compile this driver as a module, choose M here; the
module will be called snvs_pwrkey. module will be called snvs_pwrkey.
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/mfd/syscon.h> #include <linux/mfd/syscon.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#define SNVS_HPVIDR1_REG 0xF8
#define SNVS_LPSR_REG 0x4C /* LP Status Register */ #define SNVS_LPSR_REG 0x4C /* LP Status Register */
#define SNVS_LPCR_REG 0x38 /* LP Control Register */ #define SNVS_LPCR_REG 0x38 /* LP Control Register */
#define SNVS_HPSR_REG 0x14 #define SNVS_HPSR_REG 0x14
...@@ -37,6 +38,7 @@ struct pwrkey_drv_data { ...@@ -37,6 +38,7 @@ struct pwrkey_drv_data {
int wakeup; int wakeup;
struct timer_list check_timer; struct timer_list check_timer;
struct input_dev *input; struct input_dev *input;
u8 minor_rev;
}; };
static void imx_imx_snvs_check_for_events(struct timer_list *t) static void imx_imx_snvs_check_for_events(struct timer_list *t)
...@@ -67,13 +69,29 @@ static irqreturn_t imx_snvs_pwrkey_interrupt(int irq, void *dev_id) ...@@ -67,13 +69,29 @@ static irqreturn_t imx_snvs_pwrkey_interrupt(int irq, void *dev_id)
{ {
struct platform_device *pdev = dev_id; struct platform_device *pdev = dev_id;
struct pwrkey_drv_data *pdata = platform_get_drvdata(pdev); struct pwrkey_drv_data *pdata = platform_get_drvdata(pdev);
struct input_dev *input = pdata->input;
u32 lp_status; u32 lp_status;
pm_wakeup_event(pdata->input->dev.parent, 0); pm_wakeup_event(input->dev.parent, 0);
regmap_read(pdata->snvs, SNVS_LPSR_REG, &lp_status); regmap_read(pdata->snvs, SNVS_LPSR_REG, &lp_status);
if (lp_status & SNVS_LPSR_SPO) if (lp_status & SNVS_LPSR_SPO) {
mod_timer(&pdata->check_timer, jiffies + msecs_to_jiffies(DEBOUNCE_TIME)); if (pdata->minor_rev == 0) {
/*
* The first generation i.MX6 SoCs only sends an
* interrupt on button release. To mimic power-key
* usage, we'll prepend a press event.
*/
input_report_key(input, pdata->keycode, 1);
input_sync(input);
input_report_key(input, pdata->keycode, 0);
input_sync(input);
pm_relax(input->dev.parent);
} else {
mod_timer(&pdata->check_timer,
jiffies + msecs_to_jiffies(DEBOUNCE_TIME));
}
}
/* clear SPO status */ /* clear SPO status */
regmap_write(pdata->snvs, SNVS_LPSR_REG, SNVS_LPSR_SPO); regmap_write(pdata->snvs, SNVS_LPSR_REG, SNVS_LPSR_SPO);
...@@ -90,10 +108,11 @@ static void imx_snvs_pwrkey_act(void *pdata) ...@@ -90,10 +108,11 @@ static void imx_snvs_pwrkey_act(void *pdata)
static int imx_snvs_pwrkey_probe(struct platform_device *pdev) static int imx_snvs_pwrkey_probe(struct platform_device *pdev)
{ {
struct pwrkey_drv_data *pdata = NULL; struct pwrkey_drv_data *pdata;
struct input_dev *input = NULL; struct input_dev *input;
struct device_node *np; struct device_node *np;
int error; int error;
u32 vid;
/* Get SNVS register Page */ /* Get SNVS register Page */
np = pdev->dev.of_node; np = pdev->dev.of_node;
...@@ -121,6 +140,9 @@ static int imx_snvs_pwrkey_probe(struct platform_device *pdev) ...@@ -121,6 +140,9 @@ static int imx_snvs_pwrkey_probe(struct platform_device *pdev)
if (pdata->irq < 0) if (pdata->irq < 0)
return -EINVAL; return -EINVAL;
regmap_read(pdata->snvs, SNVS_HPVIDR1_REG, &vid);
pdata->minor_rev = vid & 0xff;
regmap_update_bits(pdata->snvs, SNVS_LPCR_REG, SNVS_LPCR_DEP_EN, SNVS_LPCR_DEP_EN); regmap_update_bits(pdata->snvs, SNVS_LPCR_REG, SNVS_LPCR_DEP_EN, SNVS_LPCR_DEP_EN);
/* clear the unexpected interrupt before driver ready */ /* clear the unexpected interrupt before driver ready */
......
...@@ -695,7 +695,7 @@ static __poll_t uinput_poll(struct file *file, poll_table *wait) ...@@ -695,7 +695,7 @@ static __poll_t uinput_poll(struct file *file, poll_table *wait)
if (udev->head != udev->tail) if (udev->head != udev->tail)
return EPOLLIN | EPOLLRDNORM; return EPOLLIN | EPOLLRDNORM;
return 0; return EPOLLOUT | EPOLLWRNORM;
} }
static int uinput_release(struct inode *inode, struct file *file) static int uinput_release(struct inode *inode, struct file *file)
......
...@@ -1189,6 +1189,9 @@ int rmi_f34v7_do_reflash(struct f34_data *f34, const struct firmware *fw) ...@@ -1189,6 +1189,9 @@ int rmi_f34v7_do_reflash(struct f34_data *f34, const struct firmware *fw)
{ {
int ret; int ret;
f34->fn->rmi_dev->driver->set_irq_bits(f34->fn->rmi_dev,
f34->fn->irq_mask);
rmi_f34v7_read_queries_bl_version(f34); rmi_f34v7_read_queries_bl_version(f34);
f34->v7.image = fw->data; f34->v7.image = fw->data;
......
...@@ -163,7 +163,6 @@ static int rmi_smb_write_block(struct rmi_transport_dev *xport, u16 rmiaddr, ...@@ -163,7 +163,6 @@ static int rmi_smb_write_block(struct rmi_transport_dev *xport, u16 rmiaddr,
/* prepare to write next block of bytes */ /* prepare to write next block of bytes */
cur_len -= SMB_MAX_COUNT; cur_len -= SMB_MAX_COUNT;
databuff += SMB_MAX_COUNT; databuff += SMB_MAX_COUNT;
rmiaddr += SMB_MAX_COUNT;
} }
exit: exit:
mutex_unlock(&rmi_smb->page_mutex); mutex_unlock(&rmi_smb->page_mutex);
...@@ -215,7 +214,6 @@ static int rmi_smb_read_block(struct rmi_transport_dev *xport, u16 rmiaddr, ...@@ -215,7 +214,6 @@ static int rmi_smb_read_block(struct rmi_transport_dev *xport, u16 rmiaddr,
/* prepare to read next block of bytes */ /* prepare to read next block of bytes */
cur_len -= SMB_MAX_COUNT; cur_len -= SMB_MAX_COUNT;
databuff += SMB_MAX_COUNT; databuff += SMB_MAX_COUNT;
rmiaddr += SMB_MAX_COUNT;
} }
retval = 0; retval = 0;
......
...@@ -128,6 +128,15 @@ static const unsigned long goodix_irq_flags[] = { ...@@ -128,6 +128,15 @@ static const unsigned long goodix_irq_flags[] = {
*/ */
static const struct dmi_system_id rotated_screen[] = { static const struct dmi_system_id rotated_screen[] = {
#if defined(CONFIG_DMI) && defined(CONFIG_X86) #if defined(CONFIG_DMI) && defined(CONFIG_X86)
{
.ident = "Teclast X89",
.matches = {
/* tPAD is too generic, also match on bios date */
DMI_MATCH(DMI_BOARD_VENDOR, "TECLAST"),
DMI_MATCH(DMI_BOARD_NAME, "tPAD"),
DMI_MATCH(DMI_BIOS_DATE, "12/19/2014"),
},
},
{ {
.ident = "WinBook TW100", .ident = "WinBook TW100",
.matches = { .matches = {
......
...@@ -649,6 +649,8 @@ ...@@ -649,6 +649,8 @@
*/ */
#define KEY_DATA 0x277 #define KEY_DATA 0x277
#define KEY_ONSCREEN_KEYBOARD 0x278 #define KEY_ONSCREEN_KEYBOARD 0x278
/* Electronic privacy screen control */
#define KEY_PRIVACY_SCREEN_TOGGLE 0x279
/* /*
* Some keyboards have keys which do not have a defined meaning, these keys * Some keyboards have keys which do not have a defined meaning, these keys
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment