1 /*
2  * Copyright 2013 Broadcom Corporation.
3  *
4  * SPDX-License-Identifier:      GPL-2.0+
5  */
6 
7 #include <common.h>
8 #include <asm/io.h>
9 #include <linux/errno.h>
10 #include <asm/arch/sysmap.h>
11 #include <asm/kona-common/clk.h>
12 #include "clk-core.h"
13 
14 /* Enable appropriate clocks for an SDIO port */
15 int clk_sdio_enable(void *base, u32 rate, u32 *actual_ratep)
16 {
17 	int ret;
18 	struct clk *c;
19 
20 	char *clkstr;
21 	char *slpstr;
22 	char *ahbstr;
23 
24 	switch ((u32) base) {
25 	case CONFIG_SYS_SDIO_BASE0:
26 		clkstr = CONFIG_SYS_SDIO0 "_clk";
27 		ahbstr = CONFIG_SYS_SDIO0 "_ahb_clk";
28 		slpstr = CONFIG_SYS_SDIO0 "_sleep_clk";
29 		break;
30 	case CONFIG_SYS_SDIO_BASE1:
31 		clkstr = CONFIG_SYS_SDIO1 "_clk";
32 		ahbstr = CONFIG_SYS_SDIO1 "_ahb_clk";
33 		slpstr = CONFIG_SYS_SDIO1 "_sleep_clk";
34 		break;
35 	case CONFIG_SYS_SDIO_BASE2:
36 		clkstr = CONFIG_SYS_SDIO2 "_clk";
37 		ahbstr = CONFIG_SYS_SDIO2 "_ahb_clk";
38 		slpstr = CONFIG_SYS_SDIO2 "_sleep_clk";
39 		break;
40 	case CONFIG_SYS_SDIO_BASE3:
41 		clkstr = CONFIG_SYS_SDIO3 "_clk";
42 		ahbstr = CONFIG_SYS_SDIO3 "_ahb_clk";
43 		slpstr = CONFIG_SYS_SDIO3 "_sleep_clk";
44 		break;
45 	default:
46 		printf("%s: base 0x%p not found\n", __func__, base);
47 		return -EINVAL;
48 	}
49 
50 	ret = clk_get_and_enable(ahbstr);
51 	if (ret)
52 		return ret;
53 
54 	ret = clk_get_and_enable(slpstr);
55 	if (ret)
56 		return ret;
57 
58 	c = clk_get(clkstr);
59 	if (c) {
60 		ret = clk_set_rate(c, rate);
61 		if (ret)
62 			return ret;
63 
64 		ret = clk_enable(c);
65 		if (ret)
66 			return ret;
67 	} else {
68 		printf("%s: Couldn't find %s\n", __func__, clkstr);
69 		return -EINVAL;
70 	}
71 	*actual_ratep = rate;
72 	return 0;
73 }
74