mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 14:04:26 -04:00 
			
		
		
		
	Manually merged: hack-5.4 230-openwrt_lzma_options.patch bcm27xx 950-0283-hid-usb-Add-device-quirks-for-Freeway-Airmouse-T3-an.patch x86 011-tune_lzma_options.patch Remove upstreamed patches in collaboration with Ansuel Smith: ipq806x 093-1-v5.8-ipq806x-PCI-qcom-Add-missing-ipq806x-clocks-in-PCIe-driver.patch 093-2-v5.8-ipq806x-PCI-qcom-Change-duplicate-PCI-reset-to-phy-reset.patch 093-3-v5.8-ipq806x-PCI-qcom-Add-missing-reset-for-ipq806x.patch All other modifications made by update_kernel.sh Build-tested: bcm27xx/bcm2708, ipq806x, x86/64 Run-tested: ipq806x (R7800), x86/64 No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> [update commit message/tested] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 409f4b56de7611d703790c54a70fad9a6e2bb161 Mon Sep 17 00:00:00 2001
 | |
| From: Phil Elwell <phil@raspberrypi.org>
 | |
| Date: Wed, 1 Mar 2017 16:07:39 +0000
 | |
| Subject: [PATCH] amba_pl011: Round input clock up
 | |
| 
 | |
| The UART clock is initialised to be as close to the requested
 | |
| frequency as possible without exceeding it. Now that there is a
 | |
| clock manager that returns the actual frequencies, an expected
 | |
| 48MHz clock is reported as 47999625. If the requested baudrate
 | |
| == requested clock/16, there is no headroom and the slight
 | |
| reduction in actual clock rate results in failure.
 | |
| 
 | |
| Detect cases where it looks like a "round" clock was chosen and
 | |
| adjust the reported clock to match that "round" value. As the
 | |
| code comment says:
 | |
| 
 | |
| /*
 | |
|  * If increasing a clock by less than 0.1% changes it
 | |
|  * from ..999.. to ..000.., round up.
 | |
|  */
 | |
| 
 | |
| Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 | |
| ---
 | |
|  drivers/tty/serial/amba-pl011.c | 23 +++++++++++++++++++++--
 | |
|  1 file changed, 21 insertions(+), 2 deletions(-)
 | |
| 
 | |
| --- a/drivers/tty/serial/amba-pl011.c
 | |
| +++ b/drivers/tty/serial/amba-pl011.c
 | |
| @@ -1650,6 +1650,23 @@ static void pl011_put_poll_char(struct u
 | |
|  
 | |
|  #endif /* CONFIG_CONSOLE_POLL */
 | |
|  
 | |
| +unsigned long pl011_clk_round(unsigned long clk)
 | |
| +{
 | |
| +	unsigned long scaler;
 | |
| +
 | |
| +	/*
 | |
| +	 * If increasing a clock by less than 0.1% changes it
 | |
| +	 * from ..999.. to ..000.., round up.
 | |
| +	 */
 | |
| +	scaler = 1;
 | |
| +	while (scaler * 100000 < clk)
 | |
| +		scaler *= 10;
 | |
| +	if ((clk + scaler - 1)/scaler % 1000 == 0)
 | |
| +		clk = (clk/scaler + 1) * scaler;
 | |
| +
 | |
| +	return clk;
 | |
| +}
 | |
| +
 | |
|  static int pl011_hwinit(struct uart_port *port)
 | |
|  {
 | |
|  	struct uart_amba_port *uap =
 | |
| @@ -1666,7 +1683,7 @@ static int pl011_hwinit(struct uart_port
 | |
|  	if (retval)
 | |
|  		return retval;
 | |
|  
 | |
| -	uap->port.uartclk = clk_get_rate(uap->clk);
 | |
| +	uap->port.uartclk = pl011_clk_round(clk_get_rate(uap->clk));
 | |
|  
 | |
|  	/* Clear pending error and receive interrupts */
 | |
|  	pl011_write(UART011_OEIS | UART011_BEIS | UART011_PEIS |
 | |
| @@ -2321,7 +2338,7 @@ static int pl011_console_setup(struct co
 | |
|  			plat->init();
 | |
|  	}
 | |
|  
 | |
| -	uap->port.uartclk = clk_get_rate(uap->clk);
 | |
| +	uap->port.uartclk = pl011_clk_round(clk_get_rate(uap->clk));
 | |
|  
 | |
|  	if (uap->vendor->fixed_options) {
 | |
|  		baud = uap->fixed_baud;
 | |
| @@ -2506,6 +2523,7 @@ static struct uart_driver amba_reg = {
 | |
|  	.cons			= AMBA_CONSOLE,
 | |
|  };
 | |
|  
 | |
| +#if 0
 | |
|  static int pl011_probe_dt_alias(int index, struct device *dev)
 | |
|  {
 | |
|  	struct device_node *np;
 | |
| @@ -2537,6 +2555,7 @@ static int pl011_probe_dt_alias(int inde
 | |
|  
 | |
|  	return ret;
 | |
|  }
 | |
| +#endif
 | |
|  
 | |
|  /* unregisters the driver also if no more ports are left */
 | |
|  static void pl011_unregister_port(struct uart_amba_port *uap)
 |