106 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From b98027285bd1fa95da0645a4234a5fc1f1a83f92 Mon Sep 17 00:00:00 2001
 | |
| From: Jonas Gorski <jonas.gorski@gmail.com>
 | |
| Date: Sun, 26 Feb 2017 11:59:52 +0100
 | |
| Subject: [PATCH V2 8/8] MIPS: BCM63XX: split out swpkt_sar/usb clocks
 | |
| 
 | |
| Make the secondary switch clocks their own clocks. This allows proper
 | |
| enable reference counting between SAR/XTM and the main switch clocks,
 | |
| and controlling them individually from drivers.
 | |
| 
 | |
| Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
 | |
| ---
 | |
|  arch/mips/bcm63xx/clk.c | 61 +++++++++++++++++++++++++++++++++++++++++--------
 | |
|  1 file changed, 51 insertions(+), 10 deletions(-)
 | |
| 
 | |
| --- a/arch/mips/bcm63xx/clk.c
 | |
| +++ b/arch/mips/bcm63xx/clk.c
 | |
| @@ -121,21 +121,56 @@ static struct clk clk_ephy = {
 | |
|  };
 | |
|  
 | |
|  /*
 | |
| + * Ethernet switch SAR clock
 | |
| + */
 | |
| +static void swpkt_sar_set(struct clk *clk, int enable)
 | |
| +{
 | |
| +	if (BCMCPU_IS_6368())
 | |
| +		bcm_hwclock_set(CKCTL_6368_SWPKT_SAR_EN, enable);
 | |
| +	else
 | |
| +		return;
 | |
| +}
 | |
| +
 | |
| +static struct clk clk_swpkt_sar = {
 | |
| +	.set	= swpkt_sar_set,
 | |
| +};
 | |
| +
 | |
| +/*
 | |
| + * Ethernet switch USB clock
 | |
| + */
 | |
| +static void swpkt_usb_set(struct clk *clk, int enable)
 | |
| +{
 | |
| +	if (BCMCPU_IS_6368())
 | |
| +		bcm_hwclock_set(CKCTL_6368_SWPKT_USB_EN, enable);
 | |
| +	else
 | |
| +		return;
 | |
| +}
 | |
| +
 | |
| +static struct clk clk_swpkt_usb = {
 | |
| +	.set	= swpkt_usb_set,
 | |
| +};
 | |
| +
 | |
| +/*
 | |
|   * Ethernet switch clock
 | |
|   */
 | |
|  static void enetsw_set(struct clk *clk, int enable)
 | |
|  {
 | |
| -	if (BCMCPU_IS_6328())
 | |
| +	if (BCMCPU_IS_6328()) {
 | |
|  		bcm_hwclock_set(CKCTL_6328_ROBOSW_EN, enable);
 | |
| -	else if (BCMCPU_IS_6362())
 | |
| +	} else if (BCMCPU_IS_6362()) {
 | |
|  		bcm_hwclock_set(CKCTL_6362_ROBOSW_EN, enable);
 | |
| -	else if (BCMCPU_IS_6368())
 | |
| -		bcm_hwclock_set(CKCTL_6368_ROBOSW_EN |
 | |
| -				CKCTL_6368_SWPKT_USB_EN |
 | |
| -				CKCTL_6368_SWPKT_SAR_EN,
 | |
| -				enable);
 | |
| -	else
 | |
| +	} else if (BCMCPU_IS_6368()) {
 | |
| +		if (enable) {
 | |
| +			clk_enable_unlocked(&clk_swpkt_sar);
 | |
| +			clk_enable_unlocked(&clk_swpkt_usb);
 | |
| +		} else {
 | |
| +			clk_disable_unlocked(&clk_swpkt_usb);
 | |
| +			clk_disable_unlocked(&clk_swpkt_sar);
 | |
| +		}
 | |
| +		bcm_hwclock_set(CKCTL_6368_ROBOSW_EN, enable);
 | |
| +	} else {
 | |
|  		return;
 | |
| +	}
 | |
|  
 | |
|  	if (enable) {
 | |
|  		/* reset switch core afer clock change */
 | |
| @@ -260,8 +295,12 @@ static void xtm_set(struct clk *clk, int
 | |
|  	if (!BCMCPU_IS_6368())
 | |
|  		return;
 | |
|  
 | |
| -	bcm_hwclock_set(CKCTL_6368_SAR_EN |
 | |
| -			CKCTL_6368_SWPKT_SAR_EN, enable);
 | |
| +	if (enable)
 | |
| +		clk_enable_unlocked(&clk_swpkt_sar);
 | |
| +	else
 | |
| +		clk_disable_unlocked(&clk_swpkt_sar);
 | |
| +
 | |
| +	bcm_hwclock_set(CKCTL_6368_SAR_EN, enable);
 | |
|  
 | |
|  	if (enable) {
 | |
|  		/* reset sar core afer clock change */
 | |
| @@ -447,6 +486,8 @@ static struct clk_lookup bcm6358_clks[]
 | |
|  	CLKDEV_INIT(NULL, "usbd", &clk_usbd),
 | |
|  	CLKDEV_INIT(NULL, "spi", &clk_spi),
 | |
|  	CLKDEV_INIT(NULL, "pcm", &clk_pcm),
 | |
| +	CLKDEV_INIT(NULL, "swpkt_sar", &clk_swpkt_sar),
 | |
| +	CLKDEV_INIT(NULL, "swpkt_usb", &clk_swpkt_usb),
 | |
|  	CLKDEV_INIT("bcm63xx_enet.0", "enet", &clk_enet0),
 | |
|  	CLKDEV_INIT("bcm63xx_enet.1", "enet", &clk_enet1),
 | |
|  };
 | 
