1 /*
2  * source/ekernel/drivers/drv/source/disp2/soc/platform_resource/platform_resource.c
3  *
4  * Copyright (c) 2007-2020 Allwinnertech Co., Ltd.
5  * Author: zhengxiaobin <zhengxiaobin@allwinnertech.com>
6  *
7  * This software is licensed under the terms of the GNU General Public
8  * License version 2, as published by the Free Software Foundation, and
9  * may be copied, distributed, and modified under those terms.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  */
17 #include <stdio.h>
18 #include <stdint.h>
19 #include <stdlib.h>
20 #include <hal_clk.h>
21 #include "platform_resource.h"
22 
23 extern u32 g_irq_no[];
24 extern u32 g_reg_base[];
25 extern struct clk_info_t g_clk_no[];
26 extern u32 g_irq_no_len;
27 extern u32 g_reg_base_len;
28 extern u32 g_clk_no_len;
29 
plat_get_reg_base(u32 index,u32 * data)30 s32 plat_get_reg_base(u32 index, u32 *data)
31 {
32     if (index >= g_reg_base_len || !data)
33         return -1;
34     *data = g_reg_base[index];
35     return 0;
36 }
37 
plat_get_irq_no(u32 index,u32 * data)38 s32 plat_get_irq_no(u32 index, u32 *data)
39 {
40     if (index >= g_irq_no_len || !data)
41         return -1;
42     *data = g_irq_no[index];
43     return 0;
44 }
45 
plat_get_clk(char * name,hal_clk_id_t * data)46 s32 plat_get_clk(char *name, hal_clk_id_t *data)
47 {
48     static int init_get_clk = 0;
49     u32 i = 0;
50     *data = (hal_clk_id_t)-1;
51     if (!init_get_clk) {
52         for (i = 0; i < g_clk_no_len; ++i) {
53             g_clk_no[i].clk = hal_clock_get(HAL_SUNXI_CCU, g_clk_no[i].clk_id);
54             g_clk_no[i].clk_parent = hal_clock_get(HAL_SUNXI_CCU, g_clk_no[i].clk_parent_id);
55             g_clk_no[i].rst = hal_reset_control_get(HAL_SUNXI_RESET, g_clk_no[i].rst_id);
56         }
57         init_get_clk = 1;
58     }
59     for (i = 0; i < g_clk_no_len; ++i) {
60         if(!strcmp(name, g_clk_no[i].name))
61             break;
62     }
63     if (i >= g_clk_no_len || !data)
64         return -1;
65     *data = g_clk_no[i].clk_id;
66     return 0;
67 }
68 
plat_get_clk_parent(hal_clk_id_t clk,hal_clk_id_t * parent)69 s32 plat_get_clk_parent(hal_clk_id_t clk, hal_clk_id_t *parent)
70 {
71     u32 i = 0;
72     *parent = (hal_clk_id_t)-1;
73     for (i = 0; i < g_clk_no_len; ++i) {
74         if (g_clk_no[i].clk_id == clk) {
75             *parent = g_clk_no[i].clk_parent_id;
76             break;
77         }
78     }
79 
80     return (i == g_clk_no_len) ? -1 : 0;
81 }
82 
plat_get_clk_from_id(hal_clk_id_t clk_id,hal_clk_t * clk,struct reset_control ** rst)83 s32 plat_get_clk_from_id(hal_clk_id_t clk_id, hal_clk_t *clk, struct reset_control **rst)
84 {
85     u32 i = 0;
86     *rst = NULL;
87     for (i = 0; i < g_clk_no_len; ++i) {
88         if (g_clk_no[i].clk_id == clk_id) {
89             *clk = g_clk_no[i].clk;
90             *rst = g_clk_no[i].rst;
91             break;
92         } else if (g_clk_no[i].clk_parent_id == clk_id) {
93             *clk = g_clk_no[i].clk_parent;
94         }
95     }
96 
97     return (i == g_clk_no_len) ? -1 : 0;
98 
99 }
100 
plat_get_rst_by_name(char * name,struct reset_control ** rst)101 s32 plat_get_rst_by_name(char *name, struct reset_control **rst)
102 {
103     int i;
104 
105     for (i = 0; i < g_clk_no_len; ++i) {
106         if(!strcmp(name, g_clk_no[i].name)) {
107             *rst = g_clk_no[i].rst;
108             return 0;
109         }
110     }
111 
112     return -1;
113 }
114 
115