@@ -120,28 +120,42 @@ struct gpio_intel_data {
120120 uint32_t pad_owner_reg ;
121121 uint32_t host_owner_reg ;
122122 uint32_t intr_stat_reg ;
123+ uint32_t intr_en_reg ;
123124 uint32_t base_num ;
124125#endif
125126};
126127
127128#if DT_ANY_INST_HAS_PROP_STATUS_OKAY (acpi_hid )
129+ #define GPIO_PAD_OWNERSHIP_SHIFT (0x04) /* Shift between Ownership regs */
130+
131+ #define GPIO_PAD_PINS_PER_REG (8) /*Pins for each Register */
132+
128133#define GPIO_REG_BASE_GET (dev ) DEVICE_MMIO_NAMED_GET(dev, reg_base)
129134
130135#define REG_GPI_INT_STS_BASE_GET (data ) (data)->intr_stat_reg
131136
132- #define REG_GPI_INT_EN_BASE_GET (data ) (data)->intr_stat_reg + 0x20
133-
134137#define PIN_OFFSET_GET (dev ) (0)
135138
136- #define GPIO_PAD_OWNERSHIP_GET (data , pin , offset ) (data)->pad_owner_reg + (((pin) / 8) * 0x4)
137-
138139#define REG_PAD_HOST_SW_OWNER_GET (data ) (data)->host_owner_reg
139140
140141#define GPIO_BASE_GET (cdf ) (0)
141142
142143#define GPIO_INTERRUPT_BASE_GET (cfg ) (0)
143144
144145#define GPIO_GET_PIN_MAX (dev ) ((struct gpio_intel_data *)(dev)->data)->num_pins
146+
147+ #define REG_GPI_INT_EN_BASE_GET (data ) (data)->intr_en_reg
148+
149+ #if DT_ANY_INST_HAS_BOOL_STATUS_OKAY (acpi_ginf )
150+ #define GPIO_PAD_OWNERSHIP_GET (data , pin , offset )\
151+ (data)->pad_owner_reg + (pin * GPIO_PAD_OWNERSHIP_SHIFT)
152+
153+ #else
154+ #define GPIO_PAD_OWNERSHIP_GET (data , pin , offset ) (data)->pad_owner_reg +\
155+ (((pin) / GPIO_PAD_PINS_PER_REG) * GPIO_PAD_OWNERSHIP_SHIFT)
156+
157+ #endif
158+
145159#else /* Non-ACPI */
146160#define GPIO_REG_BASE_GET (dev ) GPIO_REG_BASE(DEVICE_MMIO_NAMED_GET(dev, reg_base))
147161
@@ -564,13 +578,14 @@ static DEVICE_API(gpio, gpio_intel_api) = {
564578/* We need support either DTS or ACPI base resource enumeration at time.*/
565579#if DT_ANY_INST_HAS_PROP_STATUS_OKAY (acpi_hid )
566580
567- static int gpio_intel_acpi_enum (const struct device * dev , int bank_idx , char * hid , char * uid )
581+ static int gpio_intel_acpi_enum (const struct device * dev , int bank_idx , char * hid , char * uid ,
582+ bool ginf )
568583{
569584 int ret ;
570585 struct gpio_acpi_res res ;
571586 struct gpio_intel_data * data = dev -> data ;
572587
573- ret = soc_acpi_gpio_resource_get (bank_idx , hid , uid , & res );
588+ ret = soc_acpi_gpio_resource_get (bank_idx , hid , uid , & res , ginf );
574589 if (ret ) {
575590 return ret ;
576591 }
@@ -580,7 +595,8 @@ static int gpio_intel_acpi_enum(const struct device *dev, int bank_idx, char *hi
580595 data -> num_pins = res .num_pins ;
581596 data -> pad_owner_reg = res .pad_owner_reg ;
582597 data -> host_owner_reg = res .host_owner_reg ;
583- data -> intr_stat_reg = res .intr_stat_reg ;
598+ data -> intr_stat_reg = res .gp_evt_stat_reg - DT_INST_PROP (0 , int_stat_offset );
599+ data -> intr_en_reg = res .gp_evt_stat_reg - DT_INST_PROP (0 , int_en_offset );
584600 data -> base_num = res .base_num ;
585601 data -> pad_base = res .pad_base ;
586602
@@ -605,8 +621,9 @@ static int gpio_intel_acpi_enum(const struct device *dev, int bank_idx, char *hi
605621#define GPIO_INIT_FN_DEFINE (n ) \
606622 static int gpio_intel_init##n(const struct device *dev) \
607623 { \
608- return gpio_intel_acpi_enum(dev, DT_INST_PROP(n, group_index), \
609- ACPI_DT_HID(DT_DRV_INST(n)), ACPI_DT_UID(DT_DRV_INST(n))); \
624+ return gpio_intel_acpi_enum(dev, DT_INST_PROP(n, group_index), \
625+ ACPI_DT_HID(DT_DRV_INST(n)), ACPI_DT_UID(DT_DRV_INST(n)), \
626+ DT_INST_PROP(n, acpi_ginf_3_param)); \
610627 }
611628
612629#define GPIO_MMIO_ROM_INIT (n )
0 commit comments