hc
2023-05-31 43fd8d44e8182b691c8ee61d487cec02ca11afd2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
 * Copyright 2013 Broadcom Corporation.
 *
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
#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;
}