summaryrefslogtreecommitdiff
path: root/src/soc/mediatek/mt8196/gpio.c
diff options
context:
space:
mode:
authorJarried Lin <jarried.lin@mediatek.corp-partner.google.com>2024-08-20 11:44:08 +0800
committerFelix Held <felix-coreboot@felixheld.de>2024-08-23 14:34:54 +0000
commit62d69eb59b818fbb225fc47adababa8642bc69a1 (patch)
tree6c1818aec0e3dc63504c487ee0b2cfd89cea0e9d /src/soc/mediatek/mt8196/gpio.c
parent2bb1388d68c00c8f88a469276365832c02d4483b (diff)
soc/mediatek/mt8196: Add GPIO driver
Add GPIO driver for other modules to control GPIO pins. TEST=build pass BUG=b:317009620 Change-Id: I6d1e6ef17660308c8de908697ffba6b5f17ff9ae Signed-off-by: Jarried Lin <jarried.lin@mediatek.corp-partner.google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/83922 Reviewed-by: Yidi Lin <yidilin@google.com> Reviewed-by: Yu-Ping Wu <yupingso@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/soc/mediatek/mt8196/gpio.c')
-rw-r--r--src/soc/mediatek/mt8196/gpio.c402
1 files changed, 402 insertions, 0 deletions
diff --git a/src/soc/mediatek/mt8196/gpio.c b/src/soc/mediatek/mt8196/gpio.c
new file mode 100644
index 0000000000..443c391947
--- /dev/null
+++ b/src/soc/mediatek/mt8196/gpio.c
@@ -0,0 +1,402 @@
+/* SPDX-License-Identifier: GPL-2.0-only OR MIT */
+
+/*
+ * This file is created based on MT8196 Functional Specification
+ * Chapter number: 13.4
+ */
+
+#include <device/mmio.h>
+#include <gpio.h>
+
+static const struct gpio_drv_info gpio_driving_info[] = {
+ [0] = { 0x00, 0, 3, },
+ [1] = { 0x00, 3, 3, },
+ [2] = { 0x00, 12, 3, },
+ [3] = { 0x00, 12, 3, },
+ [4] = { 0x00, 15, 3, },
+ [5] = { 0x00, 0, 3, },
+ [6] = { 0x00, 3, 3, },
+ [7] = { 0x00, 6, 3, },
+ [8] = { 0x00, 9, 3, },
+ [9] = { 0x10, 9, 3, },
+ [10] = { 0x10, 6, 3, },
+ [11] = { 0x00, 24, 3, },
+ [12] = { 0x10, 15, 3, },
+ [13] = { 0x00, 9, 3, },
+ [14] = { 0x00, 0, 3, },
+ [15] = { 0x00, 0, 3, },
+ [16] = { 0x00, 9, 3, },
+ [17] = { 0x00, 9, 3, },
+ [18] = { 0x00, 3, 3, },
+ [19] = { 0x00, 6, 3, },
+ [20] = { 0x00, 9, 3, },
+ [21] = { 0x00, 0, 3, },
+ [22] = { 0x00, 3, 3, },
+ [23] = { 0x00, 6, 3, },
+ [24] = { 0x00, 9, 3, },
+ [25] = { 0x00, 12, 3, },
+ [26] = { 0x00, 15, 3, },
+ [27] = { 0x10, 3, 3, },
+ [28] = { 0x00, 18, 3, },
+ [29] = { 0x00, 21, 3, },
+ [30] = { 0x00, 24, 3, },
+ [31] = { 0x00, 27, 3, },
+ [32] = { 0x00, 21, 3, },
+ [33] = { 0x00, 21, 3, },
+ [34] = { 0x00, 21, 3, },
+ [35] = { 0x00, 21, 3, },
+ [36] = { 0x00, 21, 3, },
+ [37] = { 0x00, 27, 3, },
+ [38] = { 0x00, 18, 3, },
+ [39] = { 0x00, 27, 3, },
+ [40] = { 0x00, 6, 3, },
+ [41] = { 0x00, 12, 3, },
+ [42] = { 0x00, 9, 3, },
+ [43] = { 0x00, 15, 3, },
+ [44] = { 0x00, 18, 3, },
+ [45] = { 0x00, 21, 3, },
+ [46] = { 0x10, 0, 3, },
+ [47] = { 0x10, 9, 3, },
+ [48] = { 0x10, 3, 3, },
+ [49] = { 0x10, 12, 3, },
+ [50] = { 0x10, 6, 3, },
+ [51] = { 0x10, 15, 3, },
+ [52] = { 0x00, 21, 3, },
+ [53] = { 0x00, 24, 3, },
+ [54] = { 0x00, 6, 3, },
+ [55] = { 0x00, 3, 3, },
+ [56] = { 0x00, 15, 3, },
+ [57] = { 0x00, 18, 3, },
+ [58] = { 0x00, 9, 3, },
+ [59] = { 0x00, 12, 3, },
+ [60] = { 0x10, 24, 3, },
+ [61] = { 0x10, 0, 3, },
+ [62] = { 0x00, 27, 3, },
+ [63] = { 0x10, 12, 3, },
+ [64] = { 0x00, 0, 3, },
+ [65] = { 0x10, 3, 3, },
+ [66] = { 0x10, 27, 3, },
+ [67] = { 0x10, 21, 3, },
+ [68] = { 0x10, 21, 3, },
+ [69] = { 0x10, 21, 3, },
+ [70] = { 0x10, 18, 3, },
+ [71] = { 0x10, 18, 3, },
+ [72] = { 0x10, 21, 3, },
+ [73] = { 0x10, 18, 3, },
+ [74] = { 0x10, 18, 3, },
+ [75] = { 0x00, 6, 3, },
+ [76] = { 0x00, 9, 3, },
+ [77] = { 0x00, 12, 3, },
+ [78] = { 0x00, 15, 3, },
+ [79] = { 0x00, 0, 3, },
+ [80] = { 0x00, 3, 3, },
+ [81] = { 0x00, 18, 3, },
+ [82] = { 0x00, 21, 3, },
+ [83] = { 0x00, 27, 3, },
+ [84] = { 0x00, 24, 3, },
+ [85] = { 0x10, 0, 3, },
+ [86] = { 0x10, 3, 3, },
+ [87] = { 0x10, 9, 3, },
+ [88] = { 0x10, 6, 3, },
+ [89] = { 0x00, 12, 3, },
+ [90] = { 0x00, 12, 3, },
+ [91] = { 0x00, 15, 3, },
+ [92] = { 0x00, 15, 3, },
+ [93] = { 0x00, 15, 3, },
+ [94] = { 0x00, 12, 3, },
+ [95] = { 0x00, 0, 3, },
+ [96] = { 0x00, 6, 3, },
+ [97] = { 0x00, 3, 3, },
+ [98] = { 0x00, 9, 3, },
+ [99] = { 0x00, 18, 3, },
+ [100] = { 0x00, 27, 3, },
+ [101] = { 0x00, 21, 3, },
+ [102] = { 0x10, 0, 3, },
+ [103] = { 0x00, 12, 3, },
+ [104] = { 0x00, 24, 3, },
+ [105] = { 0x10, 3, 3, },
+ [106] = { 0x00, 0, 3, },
+ [107] = { 0x00, 3, 3, },
+ [108] = { 0x00, 9, 3, },
+ [109] = { 0x00, 6, 3, },
+ [110] = { 0x00, 12, 3, },
+ [111] = { 0x00, 15, 3, },
+ [112] = { 0x00, 21, 3, },
+ [113] = { 0x00, 18, 3, },
+ [114] = { 0x00, 24, 3, },
+ [115] = { 0x00, 27, 3, },
+ [116] = { 0x10, 3, 3, },
+ [117] = { 0x10, 0, 3, },
+ [118] = { 0x00, 18, 3, },
+ [119] = { 0x00, 21, 3, },
+ [120] = { 0x00, 27, 3, },
+ [121] = { 0x00, 24, 3, },
+ [122] = { 0x00, 9, 3, },
+ [123] = { 0x00, 12, 3, },
+ [124] = { 0x00, 15, 3, },
+ [125] = { 0x00, 0, 3, },
+ [126] = { 0x00, 3, 3, },
+ [127] = { 0x00, 6, 3, },
+ [128] = { 0x00, 9, 3, },
+ [129] = { 0x00, 12, 3, },
+ [130] = { 0x00, 15, 3, },
+ [131] = { 0x00, 27, 3, },
+ [132] = { 0x10, 3, 3, },
+ [133] = { 0x10, 0, 3, },
+ [134] = { 0x00, 18, 3, },
+ [135] = { 0x00, 24, 3, },
+ [136] = { 0x00, 21, 3, },
+ [137] = { 0x00, 6, 3, },
+ [138] = { 0x00, 9, 3, },
+ [139] = { 0x00, 12, 3, },
+ [140] = { 0x00, 15, 3, },
+ [141] = { 0x00, 18, 3, },
+ [142] = { 0x00, 21, 3, },
+ [143] = { 0x00, 24, 3, },
+ [144] = { 0x00, 27, 3, },
+ [145] = { 0x10, 0, 3, },
+ [146] = { 0x10, 0, 3, },
+ [147] = { 0x00, 0, 3, },
+ [148] = { 0x00, 3, 3, },
+ [149] = { 0x10, 3, 3, },
+ [150] = { 0x10, 3, 3, },
+ [151] = { 0x10, 3, 3, },
+ [152] = { 0x10, 3, 3, },
+ [153] = { 0x10, 12, 3, },
+ [154] = { 0x10, 9, 3, },
+ [155] = { 0x10, 6, 3, },
+ [156] = { 0x10, 6, 3, },
+ [157] = { 0x10, 0, 3, },
+ [158] = { 0x10, 0, 3, },
+ [159] = { 0x10, 0, 3, },
+ [160] = { 0x00, 3, 3, },
+ [161] = { 0x00, 6, 3, },
+ [162] = { 0x00, 6, 3, },
+ [163] = { 0x00, 6, 3, },
+ [164] = { 0x00, 18, 3, },
+ [165] = { 0x00, 24, 3, },
+ [166] = { 0x00, 21, 3, },
+ [167] = { 0x00, 27, 3, },
+ [168] = { 0x10, 0, 3, },
+ [169] = { 0x10, 3, 3, },
+ [170] = { 0x10, 9, 3, },
+ [171] = { 0x10, 6, 3, },
+ [172] = { 0x00, 9, 3, },
+ [173] = { 0x00, 9, 3, },
+ [174] = { 0x00, 27, 3, },
+ [175] = { 0x00, 27, 3, },
+ [176] = { 0x10, 0, 3, },
+ [177] = { 0x10, 3, 3, },
+ [178] = { 0x00, 24, 3, },
+ [179] = { 0x00, 24, 3, },
+ [180] = { 0x00, 0, 3, },
+ [181] = { 0x00, 3, 3, },
+ [182] = { 0x00, 6, 3, },
+ [183] = { 0x00, 9, 3, },
+ [184] = { 0x00, 12, 3, },
+ [185] = { 0x00, 15, 3, },
+ [186] = { 0x10, 12, 3, },
+ [187] = { 0x10, 12, 3, },
+ [188] = { 0x00, 12, 3, },
+ [189] = { 0x00, 27, 3, },
+ [190] = { 0x00, 15, 3, },
+ [191] = { 0x10, 0, 3, },
+ [192] = { 0x00, 0, 3, },
+ [193] = { 0x10, 15, 3, },
+ [194] = { 0x00, 18, 3, },
+ [195] = { 0x10, 3, 3, },
+ [196] = { 0x00, 3, 3, },
+ [197] = { 0x10, 18, 3, },
+ [198] = { 0x00, 21, 3, },
+ [199] = { 0x10, 6, 3, },
+ [200] = { 0x10, 27, 3, },
+ [201] = { 0x20, 6, 3, },
+ [202] = { 0x00, 24, 3, },
+ [203] = { 0x10, 9, 3, },
+ [204] = { 0x00, 6, 3, },
+ [205] = { 0x00, 9, 3, },
+ [206] = { 0x10, 24, 3, },
+ [207] = { 0x10, 21, 3, },
+ [208] = { 0x10, 21, 3, },
+ [209] = { 0x10, 21, 3, },
+ [210] = { 0x00, 0, 3, },
+ [211] = { 0x00, 3, 3, },
+ [212] = { 0x00, 6, 3, },
+ [213] = { 0x00, 9, 3, },
+ [214] = { 0x20, 0, 3, },
+ [215] = { 0x20, 3, 3, },
+ [216] = { 0x10, 6, 3, },
+ [217] = { 0x10, 6, 3, },
+ [218] = { 0x00, 15, 3, },
+ [219] = { 0x00, 12, 3, },
+ [220] = { 0x20, 3, 3, },
+ [221] = { 0x20, 6, 3, },
+ [222] = { 0x20, 12, 3, },
+ [223] = { 0x20, 9, 3, },
+ [224] = { 0x00, 18, 3, },
+ [225] = { 0x00, 21, 3, },
+ [226] = { 0x00, 24, 3, },
+ [227] = { 0x00, 27, 3, },
+ [228] = { 0x10, 0, 3, },
+ [229] = { 0x10, 3, 3, },
+ [230] = { 0x00, 0, 3, },
+ [231] = { 0x00, 0, 3, },
+ [232] = { 0x00, 0, 3, },
+ [233] = { 0x00, 3, 3, },
+ [234] = { 0x00, 3, 3, },
+ [235] = { 0x00, 3, 3, },
+ [236] = { 0x00, 3, 3, },
+ [237] = { 0x00, 6, 3, },
+ [238] = { 0x00, 6, 3, },
+ [239] = { 0x00, 6, 3, },
+ [240] = { 0x00, 6, 3, },
+ [241] = { 0x00, 9, 3, },
+ [242] = { 0x00, 9, 3, },
+ [243] = { 0x00, 9, 3, },
+ [244] = { 0x00, 9, 3, },
+ [245] = { 0x00, 12, 3, },
+ [246] = { 0x00, 15, 3, },
+ [247] = { 0x00, 15, 3, },
+ [248] = { 0x00, 12, 3, },
+ [249] = { 0x00, 12, 3, },
+ [250] = { 0x00, 12, 3, },
+ [251] = { 0x00, 9, 3, },
+ [252] = { 0x00, 12, 3, },
+ [253] = { 0x00, 12, 3, },
+ [254] = { 0x00, 12, 3, },
+ [255] = { 0x00, 12, 3, },
+ [256] = { 0x00, 15, 3, },
+ [257] = { 0x00, 15, 3, },
+ [258] = { 0x00, 15, 3, },
+ [259] = { 0x10, 9, 3, },
+ [260] = { 0x10, 12, 3, },
+ [261] = { 0x10, 15, 3, },
+ [262] = { 0x10, 18, 3, },
+ [263] = { 0x10, 21, 3, },
+ [264] = { 0x10, 24, 3, },
+ [265] = { 0x10, 27, 3, },
+ [266] = { 0x20, 0, 3, },
+ [267] = { 0x00, 24, 3, },
+ [268] = { 0x00, 27, 3, },
+ [269] = { 0x00, 18, 3, },
+ [270] = { 0x00, 21, 3, },
+};
+_Static_assert(ARRAY_SIZE(gpio_driving_info) == GPIO_NUM,
+ "gpio_driving_info array size not match");
+
+static const struct gpio_drv_info gpio_driving_adv_info[] = {
+ [46] = { 0x30, 0, 3, },
+ [47] = { 0x30, 9, 3, },
+ [48] = { 0x30, 3, 3, },
+ [49] = { 0x30, 12, 3, },
+ [50] = { 0x30, 6, 3, },
+ [51] = { 0x30, 15, 3, },
+ [52] = { 0x30, 0, 3, },
+ [53] = { 0x30, 3, 3, },
+ [75] = { 0x20, 0, 5, },
+ [76] = { 0x20, 5, 5, },
+ [77] = { 0x20, 10, 5, },
+ [78] = { 0x20, 15, 5, },
+ [99] = { 0x20, 0, 3, },
+ [100] = { 0x20, 9, 3, },
+ [101] = { 0x20, 3, 3, },
+ [102] = { 0x20, 12, 3, },
+ [104] = { 0x20, 6, 3, },
+ [105] = { 0x20, 15, 3, },
+ [123] = { 0x20, 0, 3, },
+ [124] = { 0x20, 3, 3, },
+ [164] = { 0x20, 0, 3, },
+ [165] = { 0x20, 6, 3, },
+ [166] = { 0x20, 3, 3, },
+ [167] = { 0x20, 9, 3, },
+ [168] = { 0x20, 12, 3, },
+ [170] = { 0x20, 15, 3, },
+ [176] = { 0x20, 0, 3, },
+ [177] = { 0x20, 3, 3, },
+ [188] = { 0x40, 0, 3, },
+ [189] = { 0x40, 15, 3, },
+ [190] = { 0x40, 3, 3, },
+ [191] = { 0x40, 18, 3, },
+ [194] = { 0x40, 6, 3, },
+ [195] = { 0x40, 21, 3, },
+ [198] = { 0x40, 9, 3, },
+ [199] = { 0x40, 24, 3, },
+ [200] = { 0x50, 0, 3, },
+ [201] = { 0x50, 9, 3, },
+ [202] = { 0x40, 12, 3, },
+ [203] = { 0x40, 27, 3, },
+ [214] = { 0x50, 3, 3, },
+ [215] = { 0x50, 6, 3, },
+};
+
+void *gpio_find_reg_addr(gpio_t gpio)
+{
+ void *reg_addr;
+
+ switch (gpio.base & 0x0f) {
+ case 1:
+ reg_addr = (void *)IOCFG_RT_BASE;
+ break;
+ case 2:
+ reg_addr = (void *)IOCFG_RM1_BASE;
+ break;
+ case 3:
+ reg_addr = (void *)IOCFG_RM2_BASE;
+ break;
+ case 4:
+ reg_addr = (void *)IOCFG_RB_BASE;
+ break;
+ case 5:
+ reg_addr = (void *)IOCFG_BM1_BASE;
+ break;
+ case 6:
+ reg_addr = (void *)IOCFG_BM2_BASE;
+ break;
+ case 7:
+ reg_addr = (void *)IOCFG_BM3_BASE;
+ break;
+ case 8:
+ reg_addr = (void *)IOCFG_LT_BASE;
+ break;
+ case 9:
+ reg_addr = (void *)IOCFG_LM1_BASE;
+ break;
+ case 10:
+ reg_addr = (void *)IOCFG_LM2_BASE;
+ break;
+ case 11:
+ reg_addr = (void *)IOCFG_LB1_BASE;
+ break;
+ case 12:
+ reg_addr = (void *)IOCFG_LB2_BASE;
+ break;
+ case 13:
+ reg_addr = (void *)IOCFG_TM1_BASE;
+ break;
+ case 14:
+ reg_addr = (void *)IOCFG_TM2_BASE;
+ break;
+ case 15:
+ reg_addr = (void *)IOCFG_TM3_BASE;
+ break;
+ default:
+ reg_addr = NULL;
+ break;
+ }
+
+ return reg_addr;
+}
+
+const struct gpio_drv_info *get_gpio_driving_info(uint32_t raw_id)
+{
+ if (raw_id >= ARRAY_SIZE(gpio_driving_info))
+ return NULL;
+ return &gpio_driving_info[raw_id];
+}
+
+const struct gpio_drv_info *get_gpio_driving_adv_info(uint32_t raw_id)
+{
+ if (raw_id >= ARRAY_SIZE(gpio_driving_adv_info))
+ return NULL;
+ return &gpio_driving_adv_info[raw_id];
+}