diff options
Diffstat (limited to 'drivers/input/touchscreen/ti_am335x_tsc.c')
| -rw-r--r-- | drivers/input/touchscreen/ti_am335x_tsc.c | 27 | 
1 files changed, 21 insertions, 6 deletions
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c index e1c5300cacf..2ce649520fe 100644 --- a/drivers/input/touchscreen/ti_am335x_tsc.c +++ b/drivers/input/touchscreen/ti_am335x_tsc.c @@ -14,7 +14,6 @@   */ -#include <linux/init.h>  #include <linux/kernel.h>  #include <linux/err.h>  #include <linux/module.h> @@ -52,6 +51,7 @@ struct titsc {  	u32			config_inp[4];  	u32			bit_xp, bit_xn, bit_yp, bit_yn;  	u32			inp_xp, inp_xn, inp_yp, inp_yn; +	u32			step_mask;  };  static unsigned int titsc_readl(struct titsc *ts, unsigned int reg) @@ -196,7 +196,8 @@ static void titsc_step_config(struct titsc *ts_dev)  	/* The steps1 … end and bit 0 for TS_Charge */  	stepenable = (1 << (end_step + 2)) - 1; -	am335x_tsc_se_set(ts_dev->mfd_tscadc, stepenable); +	ts_dev->step_mask = stepenable; +	am335x_tsc_se_set_cache(ts_dev->mfd_tscadc, ts_dev->step_mask);  }  static void titsc_read_coordinates(struct titsc *ts_dev, @@ -260,6 +261,10 @@ static irqreturn_t titsc_irq(int irq, void *dev)  	unsigned int fsm;  	status = titsc_readl(ts_dev, REG_IRQSTATUS); +	/* +	 * ADC and touchscreen share the IRQ line. +	 * FIFO1 interrupts are used by ADC. Handle FIFO0 IRQs here only +	 */  	if (status & IRQENB_FIFO0THRES) {  		titsc_read_coordinates(ts_dev, &x, &y, &z1, &z2); @@ -316,7 +321,7 @@ static irqreturn_t titsc_irq(int irq, void *dev)  	if (irqclr) {  		titsc_writel(ts_dev, REG_IRQSTATUS, irqclr); -		am335x_tsc_se_update(ts_dev->mfd_tscadc); +		am335x_tsc_se_set_cache(ts_dev->mfd_tscadc, ts_dev->step_mask);  		return IRQ_HANDLED;  	}  	return IRQ_NONE; @@ -348,8 +353,18 @@ static int titsc_parse_dt(struct platform_device *pdev,  	if (err < 0)  		return err; -	err = of_property_read_u32(node, "ti,coordiante-readouts", +	/* +	 * Try with the new binding first. If it fails, try again with +	 * bogus, miss-spelled version. +	 */ +	err = of_property_read_u32(node, "ti,coordinate-readouts",  			&ts_dev->coordinate_readouts); +	if (err < 0) { +		dev_warn(&pdev->dev, "please use 'ti,coordinate-readouts' instead\n"); +		err = of_property_read_u32(node, "ti,coordiante-readouts", +				&ts_dev->coordinate_readouts); +	} +  	if (err < 0)  		return err; @@ -389,7 +404,7 @@ static int titsc_probe(struct platform_device *pdev)  	}  	err = request_irq(ts_dev->irq, titsc_irq, -			  0, pdev->dev.driver->name, ts_dev); +			  IRQF_SHARED, pdev->dev.driver->name, ts_dev);  	if (err) {  		dev_err(&pdev->dev, "failed to allocate irq.\n");  		goto err_free_mem; @@ -505,7 +520,7 @@ static struct platform_driver ti_tsc_driver = {  		.name   = "TI-am335x-tsc",  		.owner	= THIS_MODULE,  		.pm	= TITSC_PM_OPS, -		.of_match_table = of_match_ptr(ti_tsc_dt_ids), +		.of_match_table = ti_tsc_dt_ids,  	},  };  module_platform_driver(ti_tsc_driver);  | 
