mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	serial: tegra: Add missing clk_disable_unprepare() in tegra_uart_hw_init()
Add the missing clk_disable_unprepare() before return from tegra_uart_hw_init() in the error handling path. When request_irq() fails in tegra_uart_startup(), 'tup->uart_clk' has been enabled, fix it by adding clk_disable_unprepare(). Fixes:cc9ca4d958("serial: tegra: Only print FIFO error message when an error occurs") Fixes:d781ec21ba("serial: tegra: report clk rate errors") Signed-off-by: Yi Yang <yiyang13@huawei.com> Link: https://lore.kernel.org/r/20221126020852.113378-1-yiyang13@huawei.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									c8f71b49ee
								
							
						
					
					
						commit
						38f28cfe9d
					
				
					 1 changed files with 6 additions and 1 deletions
				
			
		|  | @ -1046,6 +1046,7 @@ static int tegra_uart_hw_init(struct tegra_uart_port *tup) | ||||||
| 	if (tup->cdata->fifo_mode_enable_status) { | 	if (tup->cdata->fifo_mode_enable_status) { | ||||||
| 		ret = tegra_uart_wait_fifo_mode_enabled(tup); | 		ret = tegra_uart_wait_fifo_mode_enabled(tup); | ||||||
| 		if (ret < 0) { | 		if (ret < 0) { | ||||||
|  | 			clk_disable_unprepare(tup->uart_clk); | ||||||
| 			dev_err(tup->uport.dev, | 			dev_err(tup->uport.dev, | ||||||
| 				"Failed to enable FIFO mode: %d\n", ret); | 				"Failed to enable FIFO mode: %d\n", ret); | ||||||
| 			return ret; | 			return ret; | ||||||
|  | @ -1067,6 +1068,7 @@ static int tegra_uart_hw_init(struct tegra_uart_port *tup) | ||||||
| 	 */ | 	 */ | ||||||
| 	ret = tegra_set_baudrate(tup, TEGRA_UART_DEFAULT_BAUD); | 	ret = tegra_set_baudrate(tup, TEGRA_UART_DEFAULT_BAUD); | ||||||
| 	if (ret < 0) { | 	if (ret < 0) { | ||||||
|  | 		clk_disable_unprepare(tup->uart_clk); | ||||||
| 		dev_err(tup->uport.dev, "Failed to set baud rate\n"); | 		dev_err(tup->uport.dev, "Failed to set baud rate\n"); | ||||||
| 		return ret; | 		return ret; | ||||||
| 	} | 	} | ||||||
|  | @ -1226,10 +1228,13 @@ static int tegra_uart_startup(struct uart_port *u) | ||||||
| 				dev_name(u->dev), tup); | 				dev_name(u->dev), tup); | ||||||
| 	if (ret < 0) { | 	if (ret < 0) { | ||||||
| 		dev_err(u->dev, "Failed to register ISR for IRQ %d\n", u->irq); | 		dev_err(u->dev, "Failed to register ISR for IRQ %d\n", u->irq); | ||||||
| 		goto fail_hw_init; | 		goto fail_request_irq; | ||||||
| 	} | 	} | ||||||
| 	return 0; | 	return 0; | ||||||
| 
 | 
 | ||||||
|  | fail_request_irq: | ||||||
|  | 	/* tup->uart_clk is already enabled in tegra_uart_hw_init */ | ||||||
|  | 	clk_disable_unprepare(tup->uart_clk); | ||||||
| fail_hw_init: | fail_hw_init: | ||||||
| 	if (!tup->use_rx_pio) | 	if (!tup->use_rx_pio) | ||||||
| 		tegra_uart_dma_channel_free(tup, true); | 		tegra_uart_dma_channel_free(tup, true); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Yi Yang
						Yi Yang