Hi Wan ZongShun, > > --- > drivers/input/touchscreen/w90p910_ts.c | 25 ++++++++++++------------- > 1 files changed, 12 insertions(+), 13 deletions(-) > > diff --git a/drivers/input/touchscreen/w90p910_ts.c b/drivers/input/touchscreen/w90p910_ts.c > index 6071f58..7bef19e 100644 > --- a/drivers/input/touchscreen/w90p910_ts.c > +++ b/drivers/input/touchscreen/w90p910_ts.c > @@ -13,6 +13,7 @@ > #include <linux/module.h> > #include <linux/platform_device.h> > #include <linux/io.h> > +#include <linux/clk.h> > #include <linux/input.h> > #include <linux/interrupt.h> > > @@ -47,8 +48,8 @@ enum ts_state { > struct w90p910_ts { > struct input_dev *input; > struct timer_list timer; > + struct clk *clk; > int irq_num; > - void __iomem *clocken; > void __iomem *ts_reg; > spinlock_t lock; > enum ts_state state; > @@ -166,8 +167,7 @@ static int w90p910_open(struct input_dev *dev) > unsigned long val; > > /* enable the ADC clock */ > - val = __raw_readl(w90p910_ts->clocken); > - __raw_writel(val | ADC_CLK_EN, w90p910_ts->clocken); > + clk_enable(w90p910_ts->clk); > > __raw_writel(ADC_RST1, w90p910_ts->ts_reg); > msleep(1); > @@ -211,8 +211,8 @@ static void w90p910_close(struct input_dev *dev) > del_timer_sync(&w90p910_ts->timer); > > /* stop the ADC clock */ > - val = __raw_readl(w90p910_ts->clocken); > - __raw_writel(val & ~ADC_CLK_EN, w90p910_ts->clocken); > + clk_disable(w90p910_ts->clk); > + clk_put(w90p910_ts->clk); why you are doing clk_put on _close? I think you are calling clk_get only on _probe, so there is a mismatch here. Also I don't see clk_disable/clk_put in driver remove function. -- ---Trilok Soni http://triloksoni.wordpress.com http://www.linkedin.com/in/triloksoni -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html