ITE: drivers/gpio: Add keyboard-controller property

When set, this GPIO controller has pins associated with the
keyboard controller. In this case the reg_gpcr property is
overloaded and used to write the keyboard GCTRL register

Signed-off-by: Tim Lin <tim2.lin@ite.corp-partner.google.com>
This commit is contained in:
Tim Lin 2024-01-16 14:34:47 +08:00 committed by Henrik Brix Andersen
commit 8317f9ea4f
4 changed files with 70 additions and 13 deletions

View file

@ -54,6 +54,8 @@ struct gpio_ite_cfg {
uint8_t has_volt_sel[8];
/* Number of pins per group of GPIO */
uint8_t num_pins;
/* gpioksi, gpioksoh and gpioksol extended setting */
bool kbs_ctrl;
};
/* Structure gpio_ite_data is about callback function */
@ -159,25 +161,57 @@ static int gpio_ite_configure(const struct device *dev,
}
/* Set input or output. */
if (flags & GPIO_OUTPUT) {
ECREG(reg_gpcr) = (ECREG(reg_gpcr) | GPCR_PORT_PIN_MODE_OUTPUT) &
~GPCR_PORT_PIN_MODE_INPUT;
if (gpio_config->kbs_ctrl) {
/* Handle keyboard scan controller */
uint8_t ksxgctrlr = ECREG(reg_gpcr);
ksxgctrlr |= KSIX_KSOX_KBS_GPIO_MODE;
if (flags & GPIO_OUTPUT) {
ksxgctrlr |= KSIX_KSOX_GPIO_OUTPUT;
} else {
ksxgctrlr &= ~KSIX_KSOX_GPIO_OUTPUT;
}
ECREG(reg_gpcr) = ksxgctrlr;
} else {
ECREG(reg_gpcr) = (ECREG(reg_gpcr) | GPCR_PORT_PIN_MODE_INPUT) &
/* Handle regular GPIO controller */
if (flags & GPIO_OUTPUT) {
ECREG(reg_gpcr) = (ECREG(reg_gpcr) | GPCR_PORT_PIN_MODE_OUTPUT) &
~GPCR_PORT_PIN_MODE_INPUT;
} else {
ECREG(reg_gpcr) = (ECREG(reg_gpcr) | GPCR_PORT_PIN_MODE_INPUT) &
~GPCR_PORT_PIN_MODE_OUTPUT;
}
}
/* Handle pullup / pulldown */
if (flags & GPIO_PULL_UP) {
ECREG(reg_gpcr) = (ECREG(reg_gpcr) | GPCR_PORT_PIN_MODE_PULLUP) &
~GPCR_PORT_PIN_MODE_PULLDOWN;
} else if (flags & GPIO_PULL_DOWN) {
ECREG(reg_gpcr) = (ECREG(reg_gpcr) | GPCR_PORT_PIN_MODE_PULLDOWN) &
~GPCR_PORT_PIN_MODE_PULLUP;
if (gpio_config->kbs_ctrl) {
/* Handle keyboard scan controller */
uint8_t ksxgctrlr = ECREG(reg_gpcr);
if (flags & GPIO_PULL_UP) {
ksxgctrlr = (ksxgctrlr | KSIX_KSOX_GPIO_PULLUP) &
~KSIX_KSOX_GPIO_PULLDOWN;
} else if (flags & GPIO_PULL_DOWN) {
ksxgctrlr = (ksxgctrlr | KSIX_KSOX_GPIO_PULLDOWN) &
~KSIX_KSOX_GPIO_PULLUP;
} else {
/* No pull up/down */
ksxgctrlr &= ~(KSIX_KSOX_GPIO_PULLUP | KSIX_KSOX_GPIO_PULLDOWN);
}
ECREG(reg_gpcr) = ksxgctrlr;
} else {
/* No pull up/down */
ECREG(reg_gpcr) &= ~(GPCR_PORT_PIN_MODE_PULLUP |
GPCR_PORT_PIN_MODE_PULLDOWN);
/* Handle regular GPIO controller */
if (flags & GPIO_PULL_UP) {
ECREG(reg_gpcr) = (ECREG(reg_gpcr) | GPCR_PORT_PIN_MODE_PULLUP) &
~GPCR_PORT_PIN_MODE_PULLDOWN;
} else if (flags & GPIO_PULL_DOWN) {
ECREG(reg_gpcr) = (ECREG(reg_gpcr) | GPCR_PORT_PIN_MODE_PULLDOWN) &
~GPCR_PORT_PIN_MODE_PULLUP;
} else {
/* No pull up/down */
ECREG(reg_gpcr) &= ~(GPCR_PORT_PIN_MODE_PULLUP |
GPCR_PORT_PIN_MODE_PULLDOWN);
}
}
unlock_and_return:
@ -512,6 +546,7 @@ static const struct gpio_ite_cfg gpio_ite_cfg_##inst = { \
.gpio_irq = IT8XXX2_DT_GPIO_IRQ_LIST(inst), \
.has_volt_sel = DT_INST_PROP_OR(inst, has_volt_sel, {0}), \
.num_pins = DT_INST_PROP(inst, ngpios), \
.kbs_ctrl = DT_INST_PROP_OR(inst, keyboard_controller, 0), \
}; \
DEVICE_DT_INST_DEFINE(inst, \
gpio_ite_init, \

View file

@ -27,6 +27,20 @@ properties:
wuc-mask:
type: array
keyboard-controller:
type: boolean
description: |
When set, this GPIO controller has pins associated with the
keyboard controller. In this case the reg_gpcr property is
overloaded and used to write the keyboard GCTRL register.
This setting will be found in the gpio_ite_configure function
when the judgment of gpio_config->ksb_ctrl is true.
The GPIO control register that will be set for these three
nodes is as follows:
gpioksi: 0xf01d40-0xf01d47
gpioksol: 0xf01d48-0xf01d4f
gpioksoh: 0xf01d50-0xf01d57
gpio-cells:
- pin
- flags

View file

@ -390,6 +390,7 @@
NO_FUNC 0
NO_FUNC 0>;
interrupt-parent = <&intc>;
keyboard-controller;
#gpio-cells = <2>;
};
@ -411,6 +412,7 @@
NO_FUNC 0
NO_FUNC 0>;
interrupt-parent = <&intc>;
keyboard-controller;
#gpio-cells = <2>;
};
@ -432,6 +434,7 @@
NO_FUNC 0
NO_FUNC 0>;
interrupt-parent = <&intc>;
keyboard-controller;
#gpio-cells = <2>;
};

View file

@ -1073,6 +1073,11 @@ struct gpio_it8xxx2_regs {
#define IT8XXX2_GPIO_GPH1VS BIT(1)
#define IT8XXX2_GPIO_GPH2VS BIT(0)
#define KSIX_KSOX_KBS_GPIO_MODE BIT(7)
#define KSIX_KSOX_GPIO_OUTPUT BIT(6)
#define KSIX_KSOX_GPIO_PULLUP BIT(2)
#define KSIX_KSOX_GPIO_PULLDOWN BIT(1)
#define GPCR_PORT_PIN_MODE_INPUT BIT(7)
#define GPCR_PORT_PIN_MODE_OUTPUT BIT(6)
#define GPCR_PORT_PIN_MODE_PULLUP BIT(2)