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