aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/misc
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2013-12-15 06:28:26 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2013-12-27 20:18:29 -0500
commiteb735d3b841b42fd56d6bfb4039d61aa0fc3cf8d (patch)
tree83caf969703156d85782a3393055e00b5e1aa50b /drivers/input/misc
parente77a715ac3af14d16c027caebdb0ce5412976b9e (diff)
Input: pmic8xxx-pwrkey - switch to using managed resources
This simplifies error handling and device removal paths. Acked-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input/misc')
-rw-r--r--drivers/input/misc/pmic8xxx-pwrkey.c74
1 files changed, 25 insertions, 49 deletions
diff --git a/drivers/input/misc/pmic8xxx-pwrkey.c b/drivers/input/misc/pmic8xxx-pwrkey.c
index 3914e5ba05a1..aaf332510623 100644
--- a/drivers/input/misc/pmic8xxx-pwrkey.c
+++ b/drivers/input/misc/pmic8xxx-pwrkey.c
@@ -32,7 +32,6 @@
32 * @key_press_irq: key press irq number 32 * @key_press_irq: key press irq number
33 */ 33 */
34struct pmic8xxx_pwrkey { 34struct pmic8xxx_pwrkey {
35 struct input_dev *pwr;
36 int key_press_irq; 35 int key_press_irq;
37}; 36};
38 37
@@ -110,22 +109,22 @@ static int pmic8xxx_pwrkey_probe(struct platform_device *pdev)
110 return -ENODEV; 109 return -ENODEV;
111 } 110 }
112 111
113 pwrkey = kzalloc(sizeof(*pwrkey), GFP_KERNEL); 112 pwrkey = devm_kzalloc(&pdev->dev, sizeof(*pwrkey), GFP_KERNEL);
114 if (!pwrkey) 113 if (!pwrkey)
115 return -ENOMEM; 114 return -ENOMEM;
116 115
117 pwr = input_allocate_device(); 116 pwrkey->key_press_irq = key_press_irq;
117
118 pwr = devm_input_allocate_device(&pdev->dev);
118 if (!pwr) { 119 if (!pwr) {
119 dev_dbg(&pdev->dev, "Can't allocate power button\n"); 120 dev_dbg(&pdev->dev, "Can't allocate power button\n");
120 err = -ENOMEM; 121 return -ENOMEM;
121 goto free_pwrkey;
122 } 122 }
123 123
124 input_set_capability(pwr, EV_KEY, KEY_POWER); 124 input_set_capability(pwr, EV_KEY, KEY_POWER);
125 125
126 pwr->name = "pmic8xxx_pwrkey"; 126 pwr->name = "pmic8xxx_pwrkey";
127 pwr->phys = "pmic8xxx_pwrkey/input0"; 127 pwr->phys = "pmic8xxx_pwrkey/input0";
128 pwr->dev.parent = &pdev->dev;
129 128
130 delay = (pdata->kpd_trigger_delay_us << 10) / USEC_PER_SEC; 129 delay = (pdata->kpd_trigger_delay_us << 10) / USEC_PER_SEC;
131 delay = 1 + ilog2(delay); 130 delay = 1 + ilog2(delay);
@@ -133,7 +132,7 @@ static int pmic8xxx_pwrkey_probe(struct platform_device *pdev)
133 err = regmap_read(regmap, PON_CNTL_1, &pon_cntl); 132 err = regmap_read(regmap, PON_CNTL_1, &pon_cntl);
134 if (err < 0) { 133 if (err < 0) {
135 dev_err(&pdev->dev, "failed reading PON_CNTL_1 err=%d\n", err); 134 dev_err(&pdev->dev, "failed reading PON_CNTL_1 err=%d\n", err);
136 goto free_input_dev; 135 return err;
137 } 136 }
138 137
139 pon_cntl &= ~PON_CNTL_TRIG_DELAY_MASK; 138 pon_cntl &= ~PON_CNTL_TRIG_DELAY_MASK;
@@ -146,66 +145,43 @@ static int pmic8xxx_pwrkey_probe(struct platform_device *pdev)
146 err = regmap_write(regmap, PON_CNTL_1, pon_cntl); 145 err = regmap_write(regmap, PON_CNTL_1, pon_cntl);
147 if (err < 0) { 146 if (err < 0) {
148 dev_err(&pdev->dev, "failed writing PON_CNTL_1 err=%d\n", err); 147 dev_err(&pdev->dev, "failed writing PON_CNTL_1 err=%d\n", err);
149 goto free_input_dev; 148 return err;
150 } 149 }
151 150
152 err = input_register_device(pwr); 151 err = devm_request_irq(&pdev->dev, key_press_irq, pwrkey_press_irq,
152 IRQF_TRIGGER_RISING,
153 "pmic8xxx_pwrkey_press", pwr);
153 if (err) { 154 if (err) {
154 dev_dbg(&pdev->dev, "Can't register power key: %d\n", err); 155 dev_err(&pdev->dev, "Can't get %d IRQ for pwrkey: %d\n",
155 goto free_input_dev; 156 key_press_irq, err);
157 return err;
156 } 158 }
157 159
158 pwrkey->key_press_irq = key_press_irq; 160 err = devm_request_irq(&pdev->dev, key_release_irq, pwrkey_release_irq,
159 pwrkey->pwr = pwr; 161 IRQF_TRIGGER_RISING,
160 162 "pmic8xxx_pwrkey_release", pwr);
161 platform_set_drvdata(pdev, pwrkey); 163 if (err) {
162 164 dev_err(&pdev->dev, "Can't get %d IRQ for pwrkey: %d\n",
163 err = request_irq(key_press_irq, pwrkey_press_irq, 165 key_release_irq, err);
164 IRQF_TRIGGER_RISING, "pmic8xxx_pwrkey_press", pwr); 166 return err;
165 if (err < 0) {
166 dev_dbg(&pdev->dev, "Can't get %d IRQ for pwrkey: %d\n",
167 key_press_irq, err);
168 goto unreg_input_dev;
169 } 167 }
170 168
171 err = request_irq(key_release_irq, pwrkey_release_irq, 169 err = input_register_device(pwr);
172 IRQF_TRIGGER_RISING, "pmic8xxx_pwrkey_release", pwr); 170 if (err) {
173 if (err < 0) { 171 dev_err(&pdev->dev, "Can't register power key: %d\n", err);
174 dev_dbg(&pdev->dev, "Can't get %d IRQ for pwrkey: %d\n", 172 return err;
175 key_release_irq, err);
176
177 goto free_press_irq;
178 } 173 }
179 174
175 platform_set_drvdata(pdev, pwrkey);
180 device_init_wakeup(&pdev->dev, pdata->wakeup); 176 device_init_wakeup(&pdev->dev, pdata->wakeup);
181 177
182 return 0; 178 return 0;
183
184free_press_irq:
185 free_irq(key_press_irq, pwr);
186unreg_input_dev:
187 input_unregister_device(pwr);
188 pwr = NULL;
189free_input_dev:
190 input_free_device(pwr);
191free_pwrkey:
192 kfree(pwrkey);
193 return err;
194} 179}
195 180
196static int pmic8xxx_pwrkey_remove(struct platform_device *pdev) 181static int pmic8xxx_pwrkey_remove(struct platform_device *pdev)
197{ 182{
198 struct pmic8xxx_pwrkey *pwrkey = platform_get_drvdata(pdev);
199 int key_release_irq = platform_get_irq(pdev, 0);
200 int key_press_irq = platform_get_irq(pdev, 1);
201
202 device_init_wakeup(&pdev->dev, 0); 183 device_init_wakeup(&pdev->dev, 0);
203 184
204 free_irq(key_press_irq, pwrkey->pwr);
205 free_irq(key_release_irq, pwrkey->pwr);
206 input_unregister_device(pwrkey->pwr);
207 kfree(pwrkey);
208
209 return 0; 185 return 0;
210} 186}
211 187