73 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0+
 | |
| /*
 | |
|  * Copyright 2013 Broadcom Corporation.
 | |
|  */
 | |
| 
 | |
| #include <common.h>
 | |
| #include <asm/io.h>
 | |
| #include <linux/errno.h>
 | |
| #include <asm/arch/sysmap.h>
 | |
| #include <asm/kona-common/clk.h>
 | |
| #include "clk-core.h"
 | |
| 
 | |
| /* Enable appropriate clocks for an SDIO port */
 | |
| int clk_sdio_enable(void *base, u32 rate, u32 *actual_ratep)
 | |
| {
 | |
| 	int ret;
 | |
| 	struct clk *c;
 | |
| 
 | |
| 	char *clkstr;
 | |
| 	char *slpstr;
 | |
| 	char *ahbstr;
 | |
| 
 | |
| 	switch ((u32) base) {
 | |
| 	case CONFIG_SYS_SDIO_BASE0:
 | |
| 		clkstr = CONFIG_SYS_SDIO0 "_clk";
 | |
| 		ahbstr = CONFIG_SYS_SDIO0 "_ahb_clk";
 | |
| 		slpstr = CONFIG_SYS_SDIO0 "_sleep_clk";
 | |
| 		break;
 | |
| 	case CONFIG_SYS_SDIO_BASE1:
 | |
| 		clkstr = CONFIG_SYS_SDIO1 "_clk";
 | |
| 		ahbstr = CONFIG_SYS_SDIO1 "_ahb_clk";
 | |
| 		slpstr = CONFIG_SYS_SDIO1 "_sleep_clk";
 | |
| 		break;
 | |
| 	case CONFIG_SYS_SDIO_BASE2:
 | |
| 		clkstr = CONFIG_SYS_SDIO2 "_clk";
 | |
| 		ahbstr = CONFIG_SYS_SDIO2 "_ahb_clk";
 | |
| 		slpstr = CONFIG_SYS_SDIO2 "_sleep_clk";
 | |
| 		break;
 | |
| 	case CONFIG_SYS_SDIO_BASE3:
 | |
| 		clkstr = CONFIG_SYS_SDIO3 "_clk";
 | |
| 		ahbstr = CONFIG_SYS_SDIO3 "_ahb_clk";
 | |
| 		slpstr = CONFIG_SYS_SDIO3 "_sleep_clk";
 | |
| 		break;
 | |
| 	default:
 | |
| 		printf("%s: base 0x%p not found\n", __func__, base);
 | |
| 		return -EINVAL;
 | |
| 	}
 | |
| 
 | |
| 	ret = clk_get_and_enable(ahbstr);
 | |
| 	if (ret)
 | |
| 		return ret;
 | |
| 
 | |
| 	ret = clk_get_and_enable(slpstr);
 | |
| 	if (ret)
 | |
| 		return ret;
 | |
| 
 | |
| 	c = clk_get(clkstr);
 | |
| 	if (c) {
 | |
| 		ret = clk_set_rate(c, rate);
 | |
| 		if (ret)
 | |
| 			return ret;
 | |
| 
 | |
| 		ret = clk_enable(c);
 | |
| 		if (ret)
 | |
| 			return ret;
 | |
| 	} else {
 | |
| 		printf("%s: Couldn't find %s\n", __func__, clkstr);
 | |
| 		return -EINVAL;
 | |
| 	}
 | |
| 	*actual_ratep = rate;
 | |
| 	return 0;
 | |
| }
 | 
