Kapil Porwal | 8618bc6 | 2023-02-19 22:07:55 +0530 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | |
| 3 | #include <baseboard/variants.h> |
| 4 | #include <bootstate.h> |
| 5 | #include <console/console.h> |
| 6 | #include <fw_config.h> |
| 7 | #include <gpio.h> |
| 8 | |
| 9 | #define GPIO_PADBASED_OVERRIDE(b, a) gpio_padbased_override(b, a, ARRAY_SIZE(a)) |
| 10 | |
| 11 | static const struct pad_config dmic_disable_pads[] = { |
| 12 | PAD_NC(GPP_S02, NONE), |
| 13 | PAD_NC(GPP_S03, NONE), |
| 14 | PAD_NC(GPP_S06, NONE), |
| 15 | PAD_NC(GPP_S07, NONE), |
| 16 | }; |
| 17 | |
| 18 | static const struct pad_config sndw_disable_pads[] = { |
| 19 | PAD_NC(GPP_S00, NONE), |
| 20 | PAD_NC(GPP_S01, NONE), |
| 21 | PAD_NC(GPP_S04, NONE), |
| 22 | PAD_NC(GPP_S05, NONE), |
| 23 | }; |
| 24 | |
| 25 | static const struct pad_config i2s_disable_pads[] = { |
| 26 | PAD_NC(GPP_D09, NONE), |
| 27 | PAD_NC(GPP_D10, NONE), |
| 28 | PAD_NC(GPP_D11, NONE), |
| 29 | PAD_NC(GPP_D12, DN_20K), |
| 30 | PAD_NC(GPP_D13, NONE), |
| 31 | PAD_NC(GPP_D14, NONE), |
| 32 | PAD_NC(GPP_D15, NONE), |
| 33 | PAD_NC(GPP_D16, NONE), |
| 34 | PAD_NC(GPP_D17, NONE), |
| 35 | }; |
| 36 | |
Ravi Sarawadi | 9afa18f | 2023-02-07 09:33:46 -0800 | [diff] [blame] | 37 | static const struct pad_config bt_i2s_enable_pads[] = { |
| 38 | /* GPP_V30 : [] ==> BT_I2S_BCLK */ |
| 39 | PAD_CFG_NF(GPP_VGPIO30, NONE, DEEP, NF2), |
| 40 | /* GPP_V31 : [] ==> BT_I2S_SYNC */ |
| 41 | PAD_CFG_NF(GPP_VGPIO31, NONE, DEEP, NF2), |
| 42 | /* GPP_V32 : [] ==> BT_I2S_SDO */ |
| 43 | PAD_CFG_NF(GPP_VGPIO32, NONE, DEEP, NF2), |
| 44 | /* GPP_V33 : [] ==> BT_I2S_SDI */ |
| 45 | PAD_CFG_NF(GPP_VGPIO33, NONE, DEEP, NF2), |
| 46 | /* GPP_V34 : [] ==> SSP2_SCLK */ |
| 47 | PAD_CFG_NF(GPP_VGPIO34, NONE, DEEP, NF1), |
| 48 | /* GPP_V35 : [] ==> SSP2_SFRM */ |
| 49 | PAD_CFG_NF(GPP_VGPIO35, NONE, DEEP, NF1), |
| 50 | /* GPP_V36 : [] ==> SSP_TXD */ |
| 51 | PAD_CFG_NF(GPP_VGPIO36, NONE, DEEP, NF1), |
| 52 | /* GPP_V37 : [] ==> SSP_RXD */ |
| 53 | PAD_CFG_NF(GPP_VGPIO37, NONE, DEEP, NF1), |
| 54 | }; |
| 55 | |
Anil Kumar | 9acaa2b | 2023-08-09 11:20:14 -0700 | [diff] [blame^] | 56 | static const struct pad_config discrete_bt_i2s_enable_pads[] = { |
| 57 | /* GPP_S00 : [] ==> I2S1_SCLK */ |
| 58 | PAD_CFG_NF(GPP_S00, NONE, DEEP, NF6), |
| 59 | /* GPP_S01 : [] ==> I2S1_SFRM */ |
| 60 | PAD_CFG_NF(GPP_S01, NONE, DEEP, NF6), |
| 61 | /* GPP_S02 : [] ==> I2S1_TXD */ |
| 62 | PAD_CFG_NF(GPP_S02, NONE, DEEP, NF6), |
| 63 | /* GPP_S03 : [] ==> I2S1_RXD */ |
| 64 | PAD_CFG_NF(GPP_S03, NONE, DEEP, NF6), |
| 65 | }; |
| 66 | |
Ravi Sarawadi | 9afa18f | 2023-02-07 09:33:46 -0800 | [diff] [blame] | 67 | static const struct pad_config bt_i2s_disable_pads[] = { |
| 68 | /* GPP_V30 : [] ==> BT_I2S_BCLK */ |
| 69 | PAD_NC(GPP_VGPIO30, NONE), |
| 70 | /* GPP_V31 : [] ==> BT_I2S_SYNC */ |
| 71 | PAD_NC(GPP_VGPIO31, NONE), |
| 72 | /* GPP_V32 : [] ==> BT_I2S_SDO */ |
| 73 | PAD_NC(GPP_VGPIO32, NONE), |
| 74 | /* GPP_V33 : [] ==> BT_I2S_SDI */ |
| 75 | PAD_NC(GPP_VGPIO33, NONE), |
| 76 | /* GPP_V34 : [] ==> SSP2_SCLK */ |
| 77 | PAD_NC(GPP_VGPIO34, NONE), |
| 78 | /* GPP_V35 : [] ==> SSP2_SFRM */ |
| 79 | PAD_NC(GPP_VGPIO35, NONE), |
| 80 | /* GPP_V36 : [] ==> SSP_TXD */ |
| 81 | PAD_NC(GPP_VGPIO36, NONE), |
| 82 | /* GPP_V37 : [] ==> SSP_RXD */ |
| 83 | PAD_NC(GPP_VGPIO37, NONE), |
| 84 | }; |
| 85 | |
Bernardo Perez Priego | 3dedfcb | 2023-05-30 13:48:59 -0700 | [diff] [blame] | 86 | static const struct pad_config ish_enable_pads[] = { |
| 87 | /* GPP_B02 : ISH I2C0_SDA */ |
| 88 | PAD_CFG_NF(GPP_B02, NONE, DEEP, NF3), |
| 89 | /* GPP_B03 : ISH_I2C0_SCL */ |
| 90 | PAD_CFG_NF(GPP_B03, NONE, DEEP, NF3), |
| 91 | /* GPP_D05 : ISH_UART_TX */ |
| 92 | PAD_CFG_NF(GPP_D05, NONE, DEEP, NF2), |
| 93 | /* GPP_D06 : ISH_UART_RX */ |
| 94 | PAD_CFG_NF(GPP_D06, NONE, DEEP, NF2), |
| 95 | /* GPP_B08 : ISH_GP3, SOC_ISH_ACCEL_INT_L */ |
| 96 | PAD_CFG_NF(GPP_B08, NONE, DEEP, NF4), |
| 97 | /* GPP_E15 : ISH_GP5A, SOC_ISH_IMU_INT_L */ |
| 98 | PAD_CFG_NF(GPP_E15, NONE, DEEP, NF8), |
Bernardo Perez Priego | 5f15e37 | 2023-08-15 17:45:50 -0700 | [diff] [blame] | 99 | /* GPP_E16 : ISH_GP10, SOC_EC_ISH_NB_MODE */ |
| 100 | PAD_CFG_NF(GPP_E16, NONE, DEEP, NF8), |
Bernardo Perez Priego | 3dedfcb | 2023-05-30 13:48:59 -0700 | [diff] [blame] | 101 | /* GPP_F22 : ISH_GP8A, SOC_ISH_ALS_INT_L */ |
| 102 | PAD_CFG_NF(GPP_F22, NONE, DEEP, NF8), |
Bernardo Perez Priego | 5f15e37 | 2023-08-15 17:45:50 -0700 | [diff] [blame] | 103 | /* GPP_F23 : ISH_GP9A, LID_OPEN_1V8 */ |
| 104 | PAD_CFG_NF(GPP_F23, NONE, DEEP, NF8), |
| 105 | /* GPP_H11 : ISH_GP11A, SOC_ISH_IMU_INT_L */ |
| 106 | PAD_CFG_NF(GPP_H11, NONE, DEEP, NF8), |
Bernardo Perez Priego | 3dedfcb | 2023-05-30 13:48:59 -0700 | [diff] [blame] | 107 | }; |
| 108 | |
Eran Mitrani | 95a5e72 | 2023-06-26 13:27:42 -0700 | [diff] [blame] | 109 | static const struct pad_config touchscreen_i2c_int_pads[] = { |
| 110 | /* GPP_C07 : [] ==> SOC_TCHSCR_INT */ |
| 111 | PAD_CFG_GPI_APIC(GPP_C07, NONE, PLTRST, LEVEL, NONE), |
| 112 | }; |
| 113 | |
| 114 | static const struct pad_config touchscreen_spi_int_pads[] = { |
| 115 | /* GPP_C07 : [] ==> SOC_TCHSCR_INT */ |
| 116 | PAD_CFG_GPI_APIC(GPP_C07, NONE, PLTRST, EDGE_SINGLE, INVERT), |
| 117 | }; |
| 118 | |
Kapil Porwal | 8618bc6 | 2023-02-19 22:07:55 +0530 | [diff] [blame] | 119 | void fw_config_gpio_padbased_override(struct pad_config *padbased_table) |
| 120 | { |
| 121 | if (!fw_config_is_provisioned()) { |
| 122 | GPIO_PADBASED_OVERRIDE(padbased_table, i2s_disable_pads); |
| 123 | GPIO_PADBASED_OVERRIDE(padbased_table, dmic_disable_pads); |
| 124 | GPIO_PADBASED_OVERRIDE(padbased_table, sndw_disable_pads); |
Ravi Sarawadi | 9afa18f | 2023-02-07 09:33:46 -0800 | [diff] [blame] | 125 | GPIO_PADBASED_OVERRIDE(padbased_table, bt_i2s_disable_pads); |
Kapil Porwal | 8618bc6 | 2023-02-19 22:07:55 +0530 | [diff] [blame] | 126 | return; |
| 127 | } |
| 128 | |
| 129 | if (fw_config_probe(FW_CONFIG(AUDIO, AUDIO_UNKNOWN))) { |
| 130 | printk(BIOS_INFO, "Configure GPIOs for no audio.\n"); |
| 131 | GPIO_PADBASED_OVERRIDE(padbased_table, i2s_disable_pads); |
| 132 | GPIO_PADBASED_OVERRIDE(padbased_table, dmic_disable_pads); |
| 133 | GPIO_PADBASED_OVERRIDE(padbased_table, sndw_disable_pads); |
Ravi Sarawadi | 9afa18f | 2023-02-07 09:33:46 -0800 | [diff] [blame] | 134 | GPIO_PADBASED_OVERRIDE(padbased_table, bt_i2s_disable_pads); |
Kapil Porwal | 8618bc6 | 2023-02-19 22:07:55 +0530 | [diff] [blame] | 135 | } else if (fw_config_probe(FW_CONFIG(AUDIO, MAX98363_CS42L42_SNDW))) { |
| 136 | printk(BIOS_INFO, "Configure GPIOs for SoundWire audio.\n"); |
| 137 | GPIO_PADBASED_OVERRIDE(padbased_table, i2s_disable_pads); |
Uday M Bhat | 68e3826 | 2023-06-22 21:25:55 +0530 | [diff] [blame] | 138 | printk(BIOS_INFO, "Configure GPIOs for BT offload mode.\n"); |
| 139 | GPIO_PADBASED_OVERRIDE(padbased_table, bt_i2s_enable_pads); |
Kapil Porwal | 8618bc6 | 2023-02-19 22:07:55 +0530 | [diff] [blame] | 140 | } else if (fw_config_probe(FW_CONFIG(AUDIO, MAX98360_ALC5682I_I2S))) { |
| 141 | printk(BIOS_INFO, "Configure GPIOs for I2S audio.\n"); |
| 142 | GPIO_PADBASED_OVERRIDE(padbased_table, sndw_disable_pads); |
Ravi Sarawadi | 9afa18f | 2023-02-07 09:33:46 -0800 | [diff] [blame] | 143 | printk(BIOS_INFO, "Configure GPIOs for BT offload mode.\n"); |
| 144 | GPIO_PADBASED_OVERRIDE(padbased_table, bt_i2s_enable_pads); |
Anil Kumar | 9acaa2b | 2023-08-09 11:20:14 -0700 | [diff] [blame^] | 145 | } else if (fw_config_probe(FW_CONFIG(AUDIO, MAX98360_ALC5682I_DISCRETE_I2S_BT))) { |
| 146 | printk(BIOS_INFO, "Configure GPIOs for I2S audio.\n"); |
| 147 | GPIO_PADBASED_OVERRIDE(padbased_table, sndw_disable_pads); |
| 148 | printk(BIOS_INFO, "Configure GPIOs for BT offload mode(discrete).\n"); |
| 149 | GPIO_PADBASED_OVERRIDE(padbased_table, discrete_bt_i2s_enable_pads); |
Kapil Porwal | 8618bc6 | 2023-02-19 22:07:55 +0530 | [diff] [blame] | 150 | } |
Bernardo Perez Priego | 3dedfcb | 2023-05-30 13:48:59 -0700 | [diff] [blame] | 151 | |
| 152 | if (fw_config_probe(FW_CONFIG(ISH, ISH_ENABLE))) { |
| 153 | printk(BIOS_INFO, "Configure GPIOs for ISH.\n"); |
| 154 | GPIO_PADBASED_OVERRIDE(padbased_table, ish_enable_pads); |
| 155 | } |
Eran Mitrani | 95a5e72 | 2023-06-26 13:27:42 -0700 | [diff] [blame] | 156 | |
| 157 | if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_I2C))) { |
| 158 | printk(BIOS_INFO, "Configure Touchscreen Interrupt for I2C.\n"); |
| 159 | GPIO_PADBASED_OVERRIDE(padbased_table, touchscreen_i2c_int_pads); |
| 160 | } else { /* SPI */ |
| 161 | printk(BIOS_INFO, "Configure Touchscreen Interrupt for SPI.\n"); |
| 162 | GPIO_PADBASED_OVERRIDE(padbased_table, touchscreen_spi_int_pads); |
| 163 | } |
Kapil Porwal | 8618bc6 | 2023-02-19 22:07:55 +0530 | [diff] [blame] | 164 | } |