50116a7ef9d1a43e8ed6bddcfa83db636b3dcc09
[oweals/u-boot_mod.git] / u-boot / cpu / mips / ar7240 / qca_common.c
1 /*
2  * Qualcomm/Atheros common/helper functions
3  *
4  * Copyright (C) 2015 Piotr Dymacz <piotr@dymacz.pl>
5  *
6  * Partially based on:
7  * Linux/arch/mips/ath79/setup.c
8  *
9  * SPDX-License-Identifier:GPL-2.0
10  */
11
12 #include <config.h>
13 #include <common.h>
14 #include <asm/addrspace.h>
15 #include <soc/qca_soc_common.h>
16
17 /*
18  * Returns 1 if reference clock is 40 MHz
19  */
20 inline u32 qca_xtal_is_40mhz(void)
21 {
22         return ((qca_soc_reg_read(QCA_RST_BOOTSTRAP_REG) &
23                         QCA_RST_BOOTSTRAP_REF_CLK_MASK) >> QCA_RST_BOOTSTRAP_REF_CLK_SHIFT);
24 }
25
26 /*
27  * Return memory type value from BOOT_STRAP register
28  */
29 inline u32 qca_mem_type(void)
30 {
31         return ((qca_soc_reg_read(QCA_RST_BOOTSTRAP_REG) &
32                         QCA_RST_BOOTSTRAP_MEM_TYPE_MASK) >> QCA_RST_BOOTSTRAP_MEM_TYPE_SHIFT);
33 }
34
35 /*
36  * Put QCA SOC name, version and revision in buffer
37  */
38 void qca_soc_name_rev(char *buf)
39 {
40         u32 id;
41         u32 major;
42         u32 rev = 0;
43
44         if (buf == NULL)
45                 return;
46
47         /* Get revision ID value */
48         id = qca_soc_reg_read(QCA_RST_REVISION_ID_REG);
49
50         major = id & QCA_RST_REVISION_ID_MAJOR_MASK;
51         rev = id & QCA_RST_REVISION_ID_REV_MASK;
52
53         switch (major) {
54 #if (SOC_TYPE & QCA_AR933X_SOC)
55         case QCA_RST_REVISION_ID_MAJOR_AR9330_VAL:
56                 sprintf(buf, "AR9330 rev. %d", rev);
57                 break;
58         case QCA_RST_REVISION_ID_MAJOR_AR9331_VAL:
59                 sprintf(buf, "AR9331 rev. %d", rev);
60                 break;
61 #endif
62 #if (SOC_TYPE & QCA_AR934X_SOC)
63         case QCA_RST_REVISION_ID_MAJOR_AR9341_VAL:
64                 sprintf(buf, "AR9341 rev. %d", rev);
65                 break;
66         case QCA_RST_REVISION_ID_MAJOR_AR9344_VAL:
67                 sprintf(buf, "AR9344 rev. %d", rev);
68                 break;
69 #endif
70 #if (SOC_TYPE & QCA_QCA953X_SOC)
71         case QCA_RST_REVISION_ID_MAJOR_QCA953X_VAL:
72                 sprintf(buf, "QCA953x ver. 1 rev. %d", rev);
73                 break;
74         case QCA_RST_REVISION_ID_MAJOR_QCA953X_V2_VAL:
75                 sprintf(buf, "QCA953x ver. 2 rev. %d", rev);
76                 break;
77 #endif
78 #if (SOC_TYPE & QCA_QCA955X_SOC)
79         case QCA_RST_REVISION_ID_MAJOR_QCA9558_VAL:
80                 sprintf(buf, "QCA9558 rev. %d", rev);
81                 break;
82 #endif
83         default:
84                 sprintf(buf, "Unknown");
85                 break;
86         }
87 }
88
89 /*
90  * Performs full chip reset
91  */
92 void qca_full_chip_reset(void)
93 {
94         volatile u32 i = 1;
95
96         do {
97                 qca_soc_reg_write(QCA_RST_RST_REG,
98                                                   QCA_RST_RESET_FULL_CHIP_RST_MASK
99                                                   | QCA_RST_RESET_DDR_RST_MASK);
100         } while (i);
101 }