blob: bf476725967cd186b3d213104df961cc4a520233 [file] [log] [blame]
Darwin Ramboc5613142014-02-11 11:06:34 -08001/*
2 * Copyright 2013 Broadcom Corporation.
3 *
4 * SPDX-License-Identifier: GPL-2.0+
5 */
6
7#include <common.h>
8#include <asm/io.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +09009#include <linux/errno.h>
Darwin Ramboc5613142014-02-11 11:06:34 -080010#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 */
15int 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}