mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 04:45:43 +01:00
Merge tag 'pinctrl-v7.3-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl
Pull pin control fixes from Linus Walleij: - AMD: Clear S4 wake bits when firmware has _AEI, this is important for some AMD systems. - Do not accumulate sunxi npins across probe() attempts with deferred probe. (desc->npins just went ++ and ++...) - Qualcomm patch galore: split QUP functions on the Nord pin controller, fix an OF module alias on IPQ5210 so the module modprobes, fix two groups on the IPQ5018, make direction changes exclusive on the SPMI-GPIO, and fix the interrupt target width on four different SoCs. * tag 'pinctrl-v7.3-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: pinctrl: sunxi: dt: do not accumulate npins across probe attempts pinctrl: amd: Clear S4 wake bits when firmware has _AEI pinctrl: qcom: ipq5018: replace gcc_plltest with pwm2 on gpio12 pinctrl: qcom: ipq5018: update PWM groups and corresponding pin functions pinctrl: qcom: spmi-gpio: make direction changes exclusive pinctrl: qcom: ipq5018: add missing pwm3 function on gpio13 pinctrl: qcom: qcs8300: Fix intr_target_width pinctrl: qcom: maili: Fix intr_target_width pinctrl: qcom: hawi: Fix intr_target_width pinctrl: qcom: nord: fix GPIO interrupt target width pinctrl: qcom: ipq5210: Publish the OF module alias pinctrl: qcom: nord: Split QUP1 SE2/SE3 into lane-pair functions
This commit is contained in:
commit
70dd4ee72e
8 files changed
+53
-18
No files matched your search
@@ -886,6 +886,15 @@ static void amd_gpio_irq_init(struct amd_gpio *gpio_dev)
|
||||
|
||||
mask = BIT(WAKE_CNTRL_OFF_S0I3) | BIT(WAKE_CNTRL_OFF_S3);
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
/*
|
||||
* Platforms without _AEI leave GPIO wake sources to firmware, so
|
||||
* preserve their S4 wake bits.
|
||||
*/
|
||||
if (acpi_has_method(ACPI_HANDLE(&gpio_dev->pdev->dev), "_AEI"))
|
||||
mask |= BIT(WAKE_CNTRL_OFF_S4);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < desc->npins; i++) {
|
||||
int pin = desc->pins[i].number;
|
||||
const struct pin_desc *pd = pin_desc_get(gpio_dev->pctrl, pin);
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
.intr_wakeup_present_bit = 6, \
|
||||
.intr_wakeup_enable_bit = 7, \
|
||||
.intr_target_bit = 8, \
|
||||
.intr_target_width = 4, \
|
||||
.intr_target_kpss_val = 3, \
|
||||
.intr_raw_status_bit = 4, \
|
||||
.intr_polarity_bit = 1, \
|
||||
|
||||
@@ -361,7 +361,7 @@ static const char * const blsp1_uart0_groups[] = {
|
||||
};
|
||||
|
||||
static const char * const gcc_plltest_groups[] = {
|
||||
"gpio10", "gpio12",
|
||||
"gpio10",
|
||||
};
|
||||
|
||||
static const char * const gcc_tlmm_groups[] = {
|
||||
@@ -539,7 +539,7 @@ static const char * const qdss_tracectl_b_groups[] = {
|
||||
};
|
||||
|
||||
static const char * const pwm0_groups[] = {
|
||||
"gpio42",
|
||||
"gpio42", "gpio46",
|
||||
};
|
||||
|
||||
static const char * const qdss_cti_trig_out_b0_groups[] = {
|
||||
@@ -547,7 +547,7 @@ static const char * const qdss_cti_trig_out_b0_groups[] = {
|
||||
};
|
||||
|
||||
static const char * const pwm1_groups[] = {
|
||||
"gpio43",
|
||||
"gpio43", "gpio1",
|
||||
};
|
||||
|
||||
static const char * const qdss_cti_trig_in_b0_groups[] = {
|
||||
@@ -555,7 +555,7 @@ static const char * const qdss_cti_trig_in_b0_groups[] = {
|
||||
};
|
||||
|
||||
static const char * const pwm2_groups[] = {
|
||||
"gpio44",
|
||||
"gpio12", "gpio44",
|
||||
};
|
||||
|
||||
static const char * const qdss_cti_trig_out_b1_groups[] = {
|
||||
@@ -563,7 +563,7 @@ static const char * const qdss_cti_trig_out_b1_groups[] = {
|
||||
};
|
||||
|
||||
static const char * const pwm3_groups[] = {
|
||||
"gpio45",
|
||||
"gpio45", "gpio30", "gpio13",
|
||||
};
|
||||
|
||||
static const char * const qdss_cti_trig_in_b1_groups[] = {
|
||||
@@ -677,7 +677,7 @@ static const struct pinfunction ipq5018_functions[] = {
|
||||
|
||||
static const struct msm_pingroup ipq5018_groups[] = {
|
||||
PINGROUP(0, atest_char, _, qdss_cti_trig_out_a0, wci_txd, wci_rxd, xfem, _, _, _),
|
||||
PINGROUP(1, atest_char, _, qdss_cti_trig_in_a0, wci_txd, wci_rxd, xfem, _, _, _),
|
||||
PINGROUP(1, atest_char, pwm1, qdss_cti_trig_in_a0, wci_txd, wci_rxd, xfem, _, _, _),
|
||||
PINGROUP(2, atest_char, _, qdss_cti_trig_out_a1, wci_txd, wci_rxd, xfem, _, _, _),
|
||||
PINGROUP(3, atest_char, _, qdss_cti_trig_in_a1, wci_txd, wci_rxd, xfem, _, _, _),
|
||||
PINGROUP(4, sdc1_data, qspi_data, blsp1_spi1, btss, dbg_out, qdss_traceclk_a, _, burn0, _),
|
||||
@@ -688,8 +688,8 @@ static const struct msm_pingroup ipq5018_groups[] = {
|
||||
PINGROUP(9, sdc1_clk, qspi_clk, _, qdss_tracedata_a, _, _, _, _, _),
|
||||
PINGROUP(10, blsp0_spi, blsp1_uart0, led0, gcc_plltest, qdss_tracedata_a, _, _, _, _),
|
||||
PINGROUP(11, blsp0_spi, blsp1_uart0, _, gcc_tlmm, qdss_tracedata_a, _, _, _, _),
|
||||
PINGROUP(12, blsp0_spi, blsp0_i2c, blsp1_uart0, _, gcc_plltest, qdss_tracedata_a, _, _, _),
|
||||
PINGROUP(13, blsp0_spi, blsp0_i2c, blsp1_uart0, _, qdss_tracedata_a, _, _, _, _),
|
||||
PINGROUP(12, blsp0_spi, blsp0_i2c, blsp1_uart0, _, pwm2, qdss_tracedata_a, _, _, _),
|
||||
PINGROUP(13, blsp0_spi, blsp0_i2c, blsp1_uart0, pwm3, qdss_tracedata_a, _, _, _, _),
|
||||
PINGROUP(14, pcie0_clk, _, _, cri_trng0, qdss_tracedata_a, _, _, _, _),
|
||||
PINGROUP(15, _, _, cri_trng1, qdss_tracedata_a, _, _, _, _, _),
|
||||
PINGROUP(16, pcie0_wake, _, _, cri_trng, qdss_tracedata_a, _, _, _, _),
|
||||
@@ -706,7 +706,7 @@ static const struct msm_pingroup ipq5018_groups[] = {
|
||||
PINGROUP(27, audio_txmclk, wsa_swrm, audio_txmclk, blsp2_spi, btss, _, qdss_tracedata_b, _, _),
|
||||
PINGROUP(28, audio_txbclk, wsa_swrm, blsp0_uart1, btss, qdss_tracedata_b, _, _, _, _),
|
||||
PINGROUP(29, audio_txfsync, _, blsp0_uart1, _, qdss_tracedata_b, _, _, _, _),
|
||||
PINGROUP(30, audio_txd, led2, led0, _, _, _, _, _, _),
|
||||
PINGROUP(30, audio_txd, led2, led0, pwm3, _, _, _, _, _),
|
||||
PINGROUP(31, blsp2_spi0, blsp1_uart1, _, qdss_tracedata_b, eud_gpio, _, _, _, _),
|
||||
PINGROUP(32, blsp2_spi0, blsp1_uart1, _, qdss_tracedata_b, eud_gpio, _, _, _, _),
|
||||
PINGROUP(33, blsp2_i2c0, blsp2_spi0, blsp1_uart1, _, qdss_tracedata_b, eud_gpio, _, _, _),
|
||||
@@ -722,7 +722,7 @@ static const struct msm_pingroup ipq5018_groups[] = {
|
||||
PINGROUP(43, pwm1, qdss_cti_trig_in_b0, wci_txd, wci_rxd, xfem, _, _, _, _),
|
||||
PINGROUP(44, pwm2, qdss_cti_trig_out_b1, wci_txd, wci_rxd, xfem, _, _, _, _),
|
||||
PINGROUP(45, pwm3, qdss_cti_trig_in_b1, wci_txd, wci_rxd, xfem, _, _, _, _),
|
||||
PINGROUP(46, led0, _, _, _, _, _, _, _, _),
|
||||
PINGROUP(46, led0, pwm0, _, _, _, _, _, _, _),
|
||||
};
|
||||
|
||||
static const struct msm_pinctrl_soc_data ipq5018_pinctrl = {
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
.intr_wakeup_present_bit = 6, \
|
||||
.intr_wakeup_enable_bit = 7, \
|
||||
.intr_target_bit = 8, \
|
||||
.intr_target_width = 4, \
|
||||
.intr_target_kpss_val = 3, \
|
||||
.intr_raw_status_bit = 4, \
|
||||
.intr_polarity_bit = 1, \
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
.intr_wakeup_present_bit = 6, \
|
||||
.intr_wakeup_enable_bit = 7, \
|
||||
.intr_target_bit = 8, \
|
||||
.intr_target_width = 4, \
|
||||
.intr_target_kpss_val = 3, \
|
||||
.intr_raw_status_bit = 4, \
|
||||
.intr_polarity_bit = 1, \
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
.intr_enable_bit = 0, \
|
||||
.intr_status_bit = 0, \
|
||||
.intr_target_bit = 5, \
|
||||
.intr_target_width = 4, \
|
||||
.intr_target_kpss_val = 3, \
|
||||
.intr_raw_status_bit = 4, \
|
||||
.intr_polarity_bit = 1, \
|
||||
|
||||
@@ -734,29 +734,50 @@ static int pmic_gpio_get_direction(struct gpio_chip *chip, unsigned pin)
|
||||
(!pad->input_enabled && !pad->output_enabled))
|
||||
return -EINVAL;
|
||||
|
||||
/* Make sure the state is aligned on what pmic_gpio_get() returns */
|
||||
return pad->input_enabled ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
|
||||
/*
|
||||
* An open-drain or open-source pad keeps its input buffer enabled while
|
||||
* driving, so the output buffer is what tells the direction.
|
||||
*/
|
||||
return pad->output_enabled ? GPIO_LINE_DIRECTION_OUT : GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static int pmic_gpio_direction_input(struct gpio_chip *chip, unsigned pin)
|
||||
{
|
||||
struct pmic_gpio_state *state = gpiochip_get_data(chip);
|
||||
unsigned long config;
|
||||
unsigned long configs[2];
|
||||
|
||||
config = pinconf_to_config_packed(PIN_CONFIG_INPUT_ENABLE, 1);
|
||||
configs[0] = pinconf_to_config_packed(PIN_CONFIG_OUTPUT_ENABLE, 0);
|
||||
configs[1] = pinconf_to_config_packed(PIN_CONFIG_INPUT_ENABLE, 1);
|
||||
|
||||
return pmic_gpio_config_set(state->ctrl, pin, &config, 1);
|
||||
return pmic_gpio_config_set(state->ctrl, pin, configs,
|
||||
ARRAY_SIZE(configs));
|
||||
}
|
||||
|
||||
static int pmic_gpio_direction_output(struct gpio_chip *chip,
|
||||
unsigned pin, int val)
|
||||
{
|
||||
struct pmic_gpio_state *state = gpiochip_get_data(chip);
|
||||
unsigned long config;
|
||||
struct pmic_gpio_pad *pad = state->ctrl->desc->pins[pin].drv_data;
|
||||
unsigned long configs[2];
|
||||
|
||||
config = pinconf_to_config_packed(PIN_CONFIG_LEVEL, val);
|
||||
/*
|
||||
* An open-drain or open-source pad only ever drives one rail, so the
|
||||
* line can still be sampled while the pad is an output. Keep the input
|
||||
* buffer enabled for those, so that pmic_gpio_get() reports what is on
|
||||
* the wire rather than the value last written, and disable it for a
|
||||
* CMOS pad, so that the pad ends up in DIGITAL_OUTPUT rather than
|
||||
* DIGITAL_INPUT_OUTPUT. Program it either way, as the buffer may have
|
||||
* been left in the opposite state by the bootloader or by an earlier
|
||||
* direction change with a different buffer type. gpiolib applies
|
||||
* PIN_CONFIG_DRIVE_OPEN_DRAIN before calling this, so buffer_type is
|
||||
* already up to date here.
|
||||
*/
|
||||
configs[0] = pinconf_to_config_packed(PIN_CONFIG_INPUT_ENABLE,
|
||||
pad->buffer_type != PMIC_GPIO_OUT_BUF_CMOS);
|
||||
configs[1] = pinconf_to_config_packed(PIN_CONFIG_LEVEL, val);
|
||||
|
||||
return pmic_gpio_config_set(state->ctrl, pin, &config, 1);
|
||||
return pmic_gpio_config_set(state->ctrl, pin, configs,
|
||||
ARRAY_SIZE(configs));
|
||||
}
|
||||
|
||||
static int pmic_gpio_get(struct gpio_chip *chip, unsigned pin)
|
||||
|
||||
@@ -84,6 +84,7 @@ static struct sunxi_desc_pin *init_pins_table(struct device *dev,
|
||||
* Find the total number of pins.
|
||||
* Also work out how much memory we need to store all the pin names.
|
||||
*/
|
||||
desc->npins = 0;
|
||||
for (i = 0; i < SUNXI_PINCTRL_MAX_BANKS; i++) {
|
||||
desc->npins += pins_per_bank[i];
|
||||
if (pins_per_bank[i] < 10) {
|
||||
|
||||
Reference in new issue
Block a user