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

net: ipa: call device_init_wakeup() earlier

Currently, enabling wakeup for the IPA device doesn't occur until
the setup phase of initialization (in ipa_power_setup()).

There is no need to delay doing that, however. We can conveniently
do it during the config phase, in ipa_interrupt_config(), where we
enable power management wakeup mode for the IPA interrupt.

Moving the device_init_wakeup() out of ipa_power_setup() leaves that
function empty, so it can just be eliminated.

Similarly, rearrange all of the matching inverse calls, disabling
device wakeup in ipa_interrupt_deconfig() and removing that function
as well.

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

authored by

Alex Elder and committed by
Paolo Abeni
19790951 6f370026

+10 -32
+10 -1
drivers/net/ipa/ipa_interrupt.c
··· 277 277 goto err_free_bitmap; 278 278 } 279 279 280 + ret = device_init_wakeup(dev, true); 281 + if (ret) { 282 + dev_err(dev, "error %d enabling wakeup\n", ret); 283 + goto err_free_irq; 284 + } 285 + 280 286 ret = dev_pm_set_wake_irq(dev, irq); 281 287 if (ret) { 282 288 dev_err(dev, "error %d registering \"ipa\" IRQ as wakeirq\n", 283 289 ret); 284 - goto err_free_irq; 290 + goto err_disable_wakeup; 285 291 } 286 292 287 293 ipa->interrupt = interrupt; 288 294 289 295 return 0; 290 296 297 + err_disable_wakeup: 298 + (void)device_init_wakeup(dev, false); 291 299 err_free_irq: 292 300 free_irq(interrupt->irq, interrupt); 293 301 err_free_bitmap: ··· 315 307 ipa->interrupt = NULL; 316 308 317 309 dev_pm_clear_wake_irq(dev); 310 + (void)device_init_wakeup(dev, false); 318 311 free_irq(interrupt->irq, interrupt); 319 312 bitmap_free(interrupt->suspend_enabled); 320 313 }
-7
drivers/net/ipa/ipa_main.c
··· 119 119 if (ret) 120 120 return ret; 121 121 122 - ret = ipa_power_setup(ipa); 123 - if (ret) 124 - goto err_gsi_teardown; 125 - 126 122 ipa_endpoint_setup(ipa); 127 123 128 124 /* We need to use the AP command TX endpoint to perform other ··· 165 169 ipa_endpoint_disable_one(command_endpoint); 166 170 err_endpoint_teardown: 167 171 ipa_endpoint_teardown(ipa); 168 - ipa_power_teardown(ipa); 169 - err_gsi_teardown: 170 172 gsi_teardown(&ipa->gsi); 171 173 172 174 return ret; ··· 189 195 command_endpoint = ipa->name_map[IPA_ENDPOINT_AP_COMMAND_TX]; 190 196 ipa_endpoint_disable_one(command_endpoint); 191 197 ipa_endpoint_teardown(ipa); 192 - ipa_power_teardown(ipa); 193 198 gsi_teardown(&ipa->gsi); 194 199 } 195 200
-10
drivers/net/ipa/ipa_power.c
··· 232 232 ret, enable ? "en" : "dis"); 233 233 } 234 234 235 - int ipa_power_setup(struct ipa *ipa) 236 - { 237 - return device_init_wakeup(ipa->dev, true); 238 - } 239 - 240 - void ipa_power_teardown(struct ipa *ipa) 241 - { 242 - (void)device_init_wakeup(ipa->dev, false); 243 - } 244 - 245 235 /* Initialize IPA power management */ 246 236 struct ipa_power * 247 237 ipa_power_init(struct device *dev, const struct ipa_power_data *data)
-14
drivers/net/ipa/ipa_power.h
··· 32 32 void ipa_power_retention(struct ipa *ipa, bool enable); 33 33 34 34 /** 35 - * ipa_power_setup() - Set up IPA power management 36 - * @ipa: IPA pointer 37 - * 38 - * Return: 0 if successful, or a negative error code 39 - */ 40 - int ipa_power_setup(struct ipa *ipa); 41 - 42 - /** 43 - * ipa_power_teardown() - Inverse of ipa_power_setup() 44 - * @ipa: IPA pointer 45 - */ 46 - void ipa_power_teardown(struct ipa *ipa); 47 - 48 - /** 49 35 * ipa_power_init() - Initialize IPA power management 50 36 * @dev: IPA device 51 37 * @data: Clock configuration data