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