Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+27 -51
+27 -51
drivers/input/misc/pmic8xxx-pwrkey.c
··· 32 32 * @key_press_irq: key press irq number 33 33 */ 34 34 struct pmic8xxx_pwrkey { 35 - struct input_dev *pwr; 36 35 int key_press_irq; 37 36 }; 38 37 ··· 109 110 return -ENODEV; 110 111 } 111 112 112 - pwrkey = kzalloc(sizeof(*pwrkey), GFP_KERNEL); 113 + pwrkey = devm_kzalloc(&pdev->dev, sizeof(*pwrkey), GFP_KERNEL); 113 114 if (!pwrkey) 114 115 return -ENOMEM; 115 116 116 - pwr = input_allocate_device(); 117 + pwrkey->key_press_irq = key_press_irq; 118 + 119 + pwr = devm_input_allocate_device(&pdev->dev); 117 120 if (!pwr) { 118 121 dev_dbg(&pdev->dev, "Can't allocate power button\n"); 119 - err = -ENOMEM; 120 - goto free_pwrkey; 122 + return -ENOMEM; 121 123 } 122 124 123 125 input_set_capability(pwr, EV_KEY, KEY_POWER); 124 126 125 127 pwr->name = "pmic8xxx_pwrkey"; 126 128 pwr->phys = "pmic8xxx_pwrkey/input0"; 127 - pwr->dev.parent = &pdev->dev; 128 129 129 130 delay = (pdata->kpd_trigger_delay_us << 10) / USEC_PER_SEC; 130 131 delay = 1 + ilog2(delay); ··· 132 133 err = regmap_read(regmap, PON_CNTL_1, &pon_cntl); 133 134 if (err < 0) { 134 135 dev_err(&pdev->dev, "failed reading PON_CNTL_1 err=%d\n", err); 135 - goto free_input_dev; 136 + return err; 136 137 } 137 138 138 139 pon_cntl &= ~PON_CNTL_TRIG_DELAY_MASK; ··· 145 146 err = regmap_write(regmap, PON_CNTL_1, pon_cntl); 146 147 if (err < 0) { 147 148 dev_err(&pdev->dev, "failed writing PON_CNTL_1 err=%d\n", err); 148 - goto free_input_dev; 149 + return err; 150 + } 151 + 152 + err = devm_request_irq(&pdev->dev, key_press_irq, pwrkey_press_irq, 153 + IRQF_TRIGGER_RISING, 154 + "pmic8xxx_pwrkey_press", pwr); 155 + if (err) { 156 + dev_err(&pdev->dev, "Can't get %d IRQ for pwrkey: %d\n", 157 + key_press_irq, err); 158 + return err; 159 + } 160 + 161 + err = devm_request_irq(&pdev->dev, key_release_irq, pwrkey_release_irq, 162 + IRQF_TRIGGER_RISING, 163 + "pmic8xxx_pwrkey_release", pwr); 164 + if (err) { 165 + dev_err(&pdev->dev, "Can't get %d IRQ for pwrkey: %d\n", 166 + key_release_irq, err); 167 + return err; 149 168 } 150 169 151 170 err = input_register_device(pwr); 152 171 if (err) { 153 - dev_dbg(&pdev->dev, "Can't register power key: %d\n", err); 154 - goto free_input_dev; 172 + dev_err(&pdev->dev, "Can't register power key: %d\n", err); 173 + return err; 155 174 } 156 - 157 - pwrkey->key_press_irq = key_press_irq; 158 - pwrkey->pwr = pwr; 159 175 160 176 platform_set_drvdata(pdev, pwrkey); 161 - 162 - err = request_irq(key_press_irq, pwrkey_press_irq, 163 - IRQF_TRIGGER_RISING, "pmic8xxx_pwrkey_press", pwr); 164 - if (err < 0) { 165 - dev_dbg(&pdev->dev, "Can't get %d IRQ for pwrkey: %d\n", 166 - key_press_irq, err); 167 - goto unreg_input_dev; 168 - } 169 - 170 - err = request_irq(key_release_irq, pwrkey_release_irq, 171 - IRQF_TRIGGER_RISING, "pmic8xxx_pwrkey_release", pwr); 172 - if (err < 0) { 173 - dev_dbg(&pdev->dev, "Can't get %d IRQ for pwrkey: %d\n", 174 - key_release_irq, err); 175 - 176 - goto free_press_irq; 177 - } 178 - 179 177 device_init_wakeup(&pdev->dev, pdata->wakeup); 180 178 181 179 return 0; 182 - 183 - free_press_irq: 184 - free_irq(key_press_irq, pwr); 185 - unreg_input_dev: 186 - input_unregister_device(pwr); 187 - pwr = NULL; 188 - free_input_dev: 189 - input_free_device(pwr); 190 - free_pwrkey: 191 - kfree(pwrkey); 192 - return err; 193 180 } 194 181 195 182 static int pmic8xxx_pwrkey_remove(struct platform_device *pdev) 196 183 { 197 - struct pmic8xxx_pwrkey *pwrkey = platform_get_drvdata(pdev); 198 - int key_release_irq = platform_get_irq(pdev, 0); 199 - int key_press_irq = platform_get_irq(pdev, 1); 200 - 201 184 device_init_wakeup(&pdev->dev, 0); 202 - 203 - free_irq(key_press_irq, pwrkey->pwr); 204 - free_irq(key_release_irq, pwrkey->pwr); 205 - input_unregister_device(pwrkey->pwr); 206 - kfree(pwrkey); 207 185 208 186 return 0; 209 187 }