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:
parent
43d57ce1c2
commit
8317f9ea4f
4 changed files with 70 additions and 13 deletions
|
@ -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, \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>;
|
||||
};
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue