@@ -120,28 +120,42 @@ struct gpio_intel_data {
120
120
uint32_t pad_owner_reg ;
121
121
uint32_t host_owner_reg ;
122
122
uint32_t intr_stat_reg ;
123
+ uint32_t intr_en_reg ;
123
124
uint32_t base_num ;
124
125
#endif
125
126
};
126
127
127
128
#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
+
128
133
#define GPIO_REG_BASE_GET (dev ) DEVICE_MMIO_NAMED_GET(dev, reg_base)
129
134
130
135
#define REG_GPI_INT_STS_BASE_GET (data ) (data)->intr_stat_reg
131
136
132
- #define REG_GPI_INT_EN_BASE_GET (data ) (data)->intr_stat_reg + 0x20
133
-
134
137
#define PIN_OFFSET_GET (dev ) (0)
135
138
136
- #define GPIO_PAD_OWNERSHIP_GET (data , pin , offset ) (data)->pad_owner_reg + (((pin) / 8) * 0x4)
137
-
138
139
#define REG_PAD_HOST_SW_OWNER_GET (data ) (data)->host_owner_reg
139
140
140
141
#define GPIO_BASE_GET (cdf ) (0)
141
142
142
143
#define GPIO_INTERRUPT_BASE_GET (cfg ) (0)
143
144
144
145
#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
+
145
159
#else /* Non-ACPI */
146
160
#define GPIO_REG_BASE_GET (dev ) GPIO_REG_BASE(DEVICE_MMIO_NAMED_GET(dev, reg_base))
147
161
@@ -564,13 +578,14 @@ static DEVICE_API(gpio, gpio_intel_api) = {
564
578
/* We need support either DTS or ACPI base resource enumeration at time.*/
565
579
#if DT_ANY_INST_HAS_PROP_STATUS_OKAY (acpi_hid )
566
580
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 )
568
583
{
569
584
int ret ;
570
585
struct gpio_acpi_res res ;
571
586
struct gpio_intel_data * data = dev -> data ;
572
587
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 );
574
589
if (ret ) {
575
590
return ret ;
576
591
}
@@ -580,7 +595,8 @@ static int gpio_intel_acpi_enum(const struct device *dev, int bank_idx, char *hi
580
595
data -> num_pins = res .num_pins ;
581
596
data -> pad_owner_reg = res .pad_owner_reg ;
582
597
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 );
584
600
data -> base_num = res .base_num ;
585
601
data -> pad_base = res .pad_base ;
586
602
@@ -605,8 +621,9 @@ static int gpio_intel_acpi_enum(const struct device *dev, int bank_idx, char *hi
605
621
#define GPIO_INIT_FN_DEFINE (n ) \
606
622
static int gpio_intel_init##n(const struct device *dev) \
607
623
{ \
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)); \
610
627
}
611
628
612
629
#define GPIO_MMIO_ROM_INIT (n )
0 commit comments