forked from mirrors/linux
		
	net: ipa: enable IPA interrupt handlers separate from registration
Expose ipa_interrupt_enable() and have functions that register IPA interrupt handlers enable them directly, rather than having the registration process do that. Do the same for disabling IPA interrupt handlers. Signed-off-by: Alex Elder <elder@linaro.org> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
		
							parent
							
								
									8e461e1f09
								
							
						
					
					
						commit
						d50ed35587
					
				
					 4 changed files with 26 additions and 7 deletions
				
			
		|  | @ -135,7 +135,7 @@ static void ipa_interrupt_enabled_update(struct ipa *ipa) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Enable an IPA interrupt type */ | /* Enable an IPA interrupt type */ | ||||||
| static void ipa_interrupt_enable(struct ipa *ipa, enum ipa_irq_id ipa_irq) | void ipa_interrupt_enable(struct ipa *ipa, enum ipa_irq_id ipa_irq) | ||||||
| { | { | ||||||
| 	/* Update the IPA interrupt mask to enable it */ | 	/* Update the IPA interrupt mask to enable it */ | ||||||
| 	ipa->interrupt->enabled |= BIT(ipa_irq); | 	ipa->interrupt->enabled |= BIT(ipa_irq); | ||||||
|  | @ -143,7 +143,7 @@ static void ipa_interrupt_enable(struct ipa *ipa, enum ipa_irq_id ipa_irq) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Disable an IPA interrupt type */ | /* Disable an IPA interrupt type */ | ||||||
| static void ipa_interrupt_disable(struct ipa *ipa, enum ipa_irq_id ipa_irq) | void ipa_interrupt_disable(struct ipa *ipa, enum ipa_irq_id ipa_irq) | ||||||
| { | { | ||||||
| 	/* Update the IPA interrupt mask to disable it */ | 	/* Update the IPA interrupt mask to disable it */ | ||||||
| 	ipa->interrupt->enabled &= ~BIT(ipa_irq); | 	ipa->interrupt->enabled &= ~BIT(ipa_irq); | ||||||
|  | @ -231,8 +231,6 @@ void ipa_interrupt_add(struct ipa_interrupt *interrupt, | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	interrupt->handler[ipa_irq] = handler; | 	interrupt->handler[ipa_irq] = handler; | ||||||
| 
 |  | ||||||
| 	ipa_interrupt_enable(interrupt->ipa, ipa_irq); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Remove the handler for an IPA interrupt type */ | /* Remove the handler for an IPA interrupt type */ | ||||||
|  | @ -242,8 +240,6 @@ ipa_interrupt_remove(struct ipa_interrupt *interrupt, enum ipa_irq_id ipa_irq) | ||||||
| 	if (WARN_ON(ipa_irq >= IPA_IRQ_COUNT)) | 	if (WARN_ON(ipa_irq >= IPA_IRQ_COUNT)) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	ipa_interrupt_disable(interrupt->ipa, ipa_irq); |  | ||||||
| 
 |  | ||||||
| 	interrupt->handler[ipa_irq] = NULL; | 	interrupt->handler[ipa_irq] = NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ | ||||||
| 
 | 
 | ||||||
| struct ipa; | struct ipa; | ||||||
| struct ipa_interrupt; | struct ipa_interrupt; | ||||||
|  | enum ipa_irq_id; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * typedef ipa_irq_handler_t - IPA interrupt handler function type |  * typedef ipa_irq_handler_t - IPA interrupt handler function type | ||||||
|  | @ -85,6 +86,20 @@ void ipa_interrupt_suspend_clear_all(struct ipa_interrupt *interrupt); | ||||||
|  */ |  */ | ||||||
| void ipa_interrupt_simulate_suspend(struct ipa_interrupt *interrupt); | void ipa_interrupt_simulate_suspend(struct ipa_interrupt *interrupt); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * ipa_interrupt_enable() - Enable an IPA interrupt type | ||||||
|  |  * @ipa:	IPA pointer | ||||||
|  |  * @ipa_irq:	IPA interrupt ID | ||||||
|  |  */ | ||||||
|  | void ipa_interrupt_enable(struct ipa *ipa, enum ipa_irq_id ipa_irq); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * ipa_interrupt_disable() - Disable an IPA interrupt type | ||||||
|  |  * @ipa:	IPA pointer | ||||||
|  |  * @ipa_irq:	IPA interrupt ID | ||||||
|  |  */ | ||||||
|  | void ipa_interrupt_disable(struct ipa *ipa, enum ipa_irq_id ipa_irq); | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * ipa_interrupt_config() - Configure the IPA interrupt framework |  * ipa_interrupt_config() - Configure the IPA interrupt framework | ||||||
|  * @ipa:	IPA pointer |  * @ipa:	IPA pointer | ||||||
|  |  | ||||||
|  | @ -337,10 +337,13 @@ int ipa_power_setup(struct ipa *ipa) | ||||||
| 
 | 
 | ||||||
| 	ipa_interrupt_add(ipa->interrupt, IPA_IRQ_TX_SUSPEND, | 	ipa_interrupt_add(ipa->interrupt, IPA_IRQ_TX_SUSPEND, | ||||||
| 			  ipa_suspend_handler); | 			  ipa_suspend_handler); | ||||||
|  | 	ipa_interrupt_enable(ipa, IPA_IRQ_TX_SUSPEND); | ||||||
| 
 | 
 | ||||||
| 	ret = device_init_wakeup(&ipa->pdev->dev, true); | 	ret = device_init_wakeup(&ipa->pdev->dev, true); | ||||||
| 	if (ret) | 	if (ret) { | ||||||
|  | 		ipa_interrupt_disable(ipa, IPA_IRQ_TX_SUSPEND); | ||||||
| 		ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_TX_SUSPEND); | 		ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_TX_SUSPEND); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  | @ -348,6 +351,7 @@ int ipa_power_setup(struct ipa *ipa) | ||||||
| void ipa_power_teardown(struct ipa *ipa) | void ipa_power_teardown(struct ipa *ipa) | ||||||
| { | { | ||||||
| 	(void)device_init_wakeup(&ipa->pdev->dev, false); | 	(void)device_init_wakeup(&ipa->pdev->dev, false); | ||||||
|  | 	ipa_interrupt_disable(ipa, IPA_IRQ_TX_SUSPEND); | ||||||
| 	ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_TX_SUSPEND); | 	ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_TX_SUSPEND); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -187,7 +187,9 @@ void ipa_uc_config(struct ipa *ipa) | ||||||
| 	ipa->uc_powered = false; | 	ipa->uc_powered = false; | ||||||
| 	ipa->uc_loaded = false; | 	ipa->uc_loaded = false; | ||||||
| 	ipa_interrupt_add(interrupt, IPA_IRQ_UC_0, ipa_uc_interrupt_handler); | 	ipa_interrupt_add(interrupt, IPA_IRQ_UC_0, ipa_uc_interrupt_handler); | ||||||
|  | 	ipa_interrupt_enable(ipa, IPA_IRQ_UC_0); | ||||||
| 	ipa_interrupt_add(interrupt, IPA_IRQ_UC_1, ipa_uc_interrupt_handler); | 	ipa_interrupt_add(interrupt, IPA_IRQ_UC_1, ipa_uc_interrupt_handler); | ||||||
|  | 	ipa_interrupt_enable(ipa, IPA_IRQ_UC_1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Inverse of ipa_uc_config() */ | /* Inverse of ipa_uc_config() */ | ||||||
|  | @ -195,7 +197,9 @@ void ipa_uc_deconfig(struct ipa *ipa) | ||||||
| { | { | ||||||
| 	struct device *dev = &ipa->pdev->dev; | 	struct device *dev = &ipa->pdev->dev; | ||||||
| 
 | 
 | ||||||
|  | 	ipa_interrupt_disable(ipa, IPA_IRQ_UC_1); | ||||||
| 	ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_UC_1); | 	ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_UC_1); | ||||||
|  | 	ipa_interrupt_disable(ipa, IPA_IRQ_UC_0); | ||||||
| 	ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_UC_0); | 	ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_UC_0); | ||||||
| 	if (ipa->uc_loaded) | 	if (ipa->uc_loaded) | ||||||
| 		ipa_power_retention(ipa, false); | 		ipa_power_retention(ipa, false); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Alex Elder
						Alex Elder