summaryrefslogtreecommitdiff
path: root/drivers/common/chips/decoder_cpu_ver_info.c (plain)
blob: 894bd74dc5fca95f17a24a3efe5b02842b4cb402
1/*
2* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
3*
4* This program is free software; you can redistribute it and/or modify
5* it under the terms of the GNU General Public License as published by
6* the Free Software Foundation; either version 2 of the License, or
7* (at your option) any later version.
8*
9* This program is distributed in the hope that it will be useful, but WITHOUT
10* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12* more details.
13*
14* You should have received a copy of the GNU General Public License along
15* with this program; if not, write to the Free Software Foundation, Inc.,
16* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17*
18* Description:
19*/
20#include <linux/kernel.h>
21#include <linux/kernel.h>
22#include <linux/module.h>
23#include <linux/types.h>
24#include <linux/errno.h>
25#include <linux/platform_device.h>
26#include <linux/of_device.h>
27#include <linux/amlogic/cpu_version.h>
28#include "decoder_cpu_ver_info.h"
29
30#define DECODE_CPU_VER_ID_NODE_NAME "cpu_ver_name"
31#define AM_SUCESS 0
32#define MAJOR_ID_START AM_MESON_CPU_MAJOR_ID_M6
33
34static enum AM_MESON_CPU_MAJOR_ID cpu_ver_id = AM_MESON_CPU_MAJOR_ID_MAX;
35
36static enum AM_MESON_CPU_MAJOR_ID cpu_ver_info[AM_MESON_CPU_MAJOR_ID_MAX - MAJOR_ID_START]=
37{
38 AM_MESON_CPU_MAJOR_ID_M6,
39 AM_MESON_CPU_MAJOR_ID_M6TV,
40 AM_MESON_CPU_MAJOR_ID_M6TVL,
41 AM_MESON_CPU_MAJOR_ID_M8,
42 AM_MESON_CPU_MAJOR_ID_MTVD,
43 AM_MESON_CPU_MAJOR_ID_M8B,
44 AM_MESON_CPU_MAJOR_ID_MG9TV,
45 AM_MESON_CPU_MAJOR_ID_M8M2,
46 AM_MESON_CPU_MAJOR_ID_UNUSE,
47 AM_MESON_CPU_MAJOR_ID_GXBB,
48 AM_MESON_CPU_MAJOR_ID_GXTVBB,
49 AM_MESON_CPU_MAJOR_ID_GXL,
50 AM_MESON_CPU_MAJOR_ID_GXM,
51 AM_MESON_CPU_MAJOR_ID_TXL,
52 AM_MESON_CPU_MAJOR_ID_TXLX,
53 AM_MESON_CPU_MAJOR_ID_AXG,
54 AM_MESON_CPU_MAJOR_ID_GXLX,
55 AM_MESON_CPU_MAJOR_ID_TXHD,
56 AM_MESON_CPU_MAJOR_ID_G12A,
57 AM_MESON_CPU_MAJOR_ID_G12B,
58 AM_MESON_CPU_MAJOR_ID_GXLX2,
59 AM_MESON_CPU_MAJOR_ID_SM1,
60 AM_MESON_CPU_MAJOR_ID_RES_0x2c,
61 AM_MESON_CPU_MAJOR_ID_RES_0x2d,
62 AM_MESON_CPU_MAJOR_ID_TL1,
63 AM_MESON_CPU_MAJOR_ID_TM2,
64};
65
66static const struct of_device_id cpu_ver_of_match[] = {
67 {
68 .compatible = "amlogic, cpu-major-id-axg",
69 .data = &cpu_ver_info[AM_MESON_CPU_MAJOR_ID_AXG - MAJOR_ID_START],
70 },
71
72 {
73 .compatible = "amlogic, cpu-major-id-g12a",
74 .data = &cpu_ver_info[AM_MESON_CPU_MAJOR_ID_G12A - MAJOR_ID_START],
75 },
76
77 {
78 .compatible = "amlogic, cpu-major-id-gxl",
79 .data = &cpu_ver_info[AM_MESON_CPU_MAJOR_ID_GXL - MAJOR_ID_START],
80 },
81
82 {
83 .compatible = "amlogic, cpu-major-id-gxm",
84 .data = &cpu_ver_info[AM_MESON_CPU_MAJOR_ID_GXM - MAJOR_ID_START],
85 },
86
87 {
88 .compatible = "amlogic, cpu-major-id-txl",
89 .data = &cpu_ver_info[AM_MESON_CPU_MAJOR_ID_TXL - MAJOR_ID_START],
90 },
91
92 {
93 .compatible = "amlogic, cpu-major-id-txlx",
94 .data = &cpu_ver_info[AM_MESON_CPU_MAJOR_ID_TXLX - MAJOR_ID_START],
95 },
96
97 {
98 .compatible = "amlogic, cpu-major-id-sm1",
99 .data = &cpu_ver_info[AM_MESON_CPU_MAJOR_ID_SM1 - MAJOR_ID_START],
100 },
101
102 {
103 .compatible = "amlogic, cpu-major-id-tl1",
104 .data = &cpu_ver_info[AM_MESON_CPU_MAJOR_ID_TL1 - MAJOR_ID_START],
105 },
106 {
107 .compatible = "amlogic, cpu-major-id-tm2",
108 .data = &cpu_ver_info[AM_MESON_CPU_MAJOR_ID_TM2 - MAJOR_ID_START],
109 },
110 {},
111};
112
113static bool get_cpu_id_from_dtb(enum AM_MESON_CPU_MAJOR_ID *pidType)
114{
115 struct device_node *pNode = NULL;
116 struct platform_device* pDev = NULL;
117 const struct of_device_id *pMatch = NULL;
118
119 pNode = of_find_node_by_name(NULL, DECODE_CPU_VER_ID_NODE_NAME);
120 if (NULL == pNode) {
121 pr_err("No find node.\n");
122 return -EINVAL;
123 }
124
125 pDev = of_find_device_by_node(pNode);
126 if (NULL == pDev)
127 return -EINVAL;
128
129 pMatch = of_match_device(cpu_ver_of_match, &pDev->dev);
130 if (NULL == pMatch) {
131 pr_err("No find of_match_device\n");
132 return -EINVAL;
133 }
134
135 *pidType = *(enum AM_MESON_CPU_MAJOR_ID *)pMatch->data;
136
137 return AM_SUCESS;
138}
139
140static void initial_cpu_id(void)
141{
142 enum AM_MESON_CPU_MAJOR_ID id_type = AM_MESON_CPU_MAJOR_ID_MAX;
143
144 if (AM_SUCESS == get_cpu_id_from_dtb(&id_type))
145 cpu_ver_id = id_type;
146 else
147 cpu_ver_id = (enum AM_MESON_CPU_MAJOR_ID)get_cpu_type();
148
149 if (AM_MESON_CPU_MAJOR_ID_G12B == cpu_ver_id)
150 if (is_meson_rev_b())
151 cpu_ver_id = AM_MESON_CPU_MAJOR_ID_TL1;
152}
153
154enum AM_MESON_CPU_MAJOR_ID get_cpu_major_id(void)
155{
156 if (AM_MESON_CPU_MAJOR_ID_MAX == cpu_ver_id)
157 initial_cpu_id();
158
159 return cpu_ver_id;
160}
161EXPORT_SYMBOL(get_cpu_major_id);
162
163bool is_cpu_tm2_revb(void)
164{
165 return ((get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_TM2) &&
166 (is_meson_rev_b()));
167}
168EXPORT_SYMBOL(is_cpu_tm2_revb);
169
170