Home | History | Annotate | Download | only in bcm281xx
      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