diff options
Diffstat (limited to 'drivers/input/keyboard/lm8323.c')
| -rw-r--r-- | drivers/input/keyboard/lm8323.c | 32 | 
1 files changed, 11 insertions, 21 deletions
diff --git a/drivers/input/keyboard/lm8323.c b/drivers/input/keyboard/lm8323.c index 71f744a8e68..756348a7f93 100644 --- a/drivers/input/keyboard/lm8323.c +++ b/drivers/input/keyboard/lm8323.c @@ -146,7 +146,6 @@ struct lm8323_chip {  	/* device lock */  	struct mutex		lock;  	struct i2c_client	*client; -	struct work_struct	work;  	struct input_dev	*idev;  	bool			kp_enabled;  	bool			pm_suspend; @@ -162,7 +161,6 @@ struct lm8323_chip {  #define client_to_lm8323(c)	container_of(c, struct lm8323_chip, client)  #define dev_to_lm8323(d)	container_of(d, struct lm8323_chip, client->dev) -#define work_to_lm8323(w)	container_of(w, struct lm8323_chip, work)  #define cdev_to_pwm(c)		container_of(c, struct lm8323_pwm, cdev)  #define work_to_pwm(w)		container_of(w, struct lm8323_pwm, work) @@ -375,9 +373,9 @@ static void pwm_done(struct lm8323_pwm *pwm)   * Bottom half: handle the interrupt by posting key events, or dealing with   * errors appropriately.   */ -static void lm8323_work(struct work_struct *work) +static irqreturn_t lm8323_irq(int irq, void *_lm)  { -	struct lm8323_chip *lm = work_to_lm8323(work); +	struct lm8323_chip *lm = _lm;  	u8 ints;  	int i; @@ -409,16 +407,6 @@ static void lm8323_work(struct work_struct *work)  	}  	mutex_unlock(&lm->lock); -} - -/* - * We cannot use I2C in interrupt context, so we just schedule work. - */ -static irqreturn_t lm8323_irq(int irq, void *data) -{ -	struct lm8323_chip *lm = data; - -	schedule_work(&lm->work);  	return IRQ_HANDLED;  } @@ -675,7 +663,6 @@ static int __devinit lm8323_probe(struct i2c_client *client,  	lm->client = client;  	lm->idev = idev;  	mutex_init(&lm->lock); -	INIT_WORK(&lm->work, lm8323_work);  	lm->size_x = pdata->size_x;  	lm->size_y = pdata->size_y; @@ -746,9 +733,8 @@ static int __devinit lm8323_probe(struct i2c_client *client,  		goto fail3;  	} -	err = request_irq(client->irq, lm8323_irq, -			  IRQF_TRIGGER_FALLING | IRQF_DISABLED, -			  "lm8323", lm); +	err = request_threaded_irq(client->irq, NULL, lm8323_irq, +			  IRQF_TRIGGER_LOW|IRQF_ONESHOT, "lm8323", lm);  	if (err) {  		dev_err(&client->dev, "could not get IRQ %d\n", client->irq);  		goto fail4; @@ -768,8 +754,11 @@ fail3:  	device_remove_file(&client->dev, &dev_attr_disable_kp);  fail2:  	while (--pwm >= 0) -		if (lm->pwm[pwm].enabled) +		if (lm->pwm[pwm].enabled) { +			device_remove_file(lm->pwm[pwm].cdev.dev, +					   &dev_attr_time);  			led_classdev_unregister(&lm->pwm[pwm].cdev); +		}  fail1:  	input_free_device(idev);  	kfree(lm); @@ -783,15 +772,16 @@ static int __devexit lm8323_remove(struct i2c_client *client)  	disable_irq_wake(client->irq);  	free_irq(client->irq, lm); -	cancel_work_sync(&lm->work);  	input_unregister_device(lm->idev);  	device_remove_file(&lm->client->dev, &dev_attr_disable_kp);  	for (i = 0; i < 3; i++) -		if (lm->pwm[i].enabled) +		if (lm->pwm[i].enabled) { +			device_remove_file(lm->pwm[i].cdev.dev, &dev_attr_time);  			led_classdev_unregister(&lm->pwm[i].cdev); +		}  	kfree(lm);  |