1 | A simple refactoring of the GPIO ACPI library parts to get an impressive | 1 | A simple refactoring of the GPIO ACPI library parts to get an impressive |
---|---|---|---|
2 | ~8% code shrink on x86_64 and ~2% on x86_32. Also reduces a C code a bit. | 2 | ~8% code shrink on x86_64 and ~2% on x86_32. Also reduces a C code a bit. |
3 | 3 | ||
4 | Andy Shevchenko (5): | 4 | add/remove: 0/2 grow/shrink: 0/5 up/down: 0/-1221 (-1221) |
5 | Function old new delta | ||
6 | acpi_gpio_property_lookup 425 414 -11 | ||
7 | acpi_find_gpio.__UNIQUE_ID_ddebug478 56 - -56 | ||
8 | acpi_dev_gpio_irq_wake_get_by.__UNIQUE_ID_ddebug480 56 - -56 | ||
9 | acpi_find_gpio 354 216 -138 | ||
10 | acpi_get_gpiod_by_index 462 307 -155 | ||
11 | __acpi_find_gpio 877 638 -239 | ||
12 | acpi_dev_gpio_irq_wake_get_by 695 129 -566 | ||
13 | Total: Before=15375, After=14154, chg -7.94% | ||
14 | |||
15 | In v2: | ||
16 | - renamed par to params (Mika, Bart) | ||
17 | |||
18 | Andy Shevchenko (6): | ||
5 | gpiolib: acpi: Improve struct acpi_gpio_info memory footprint | 19 | gpiolib: acpi: Improve struct acpi_gpio_info memory footprint |
6 | gpiolib: acpi: Remove index parameter from acpi_gpio_property_lookup() | 20 | gpiolib: acpi: Remove index parameter from acpi_gpio_property_lookup() |
7 | gpiolib: acpi: Reduce memory footprint for struct acpi_gpio_params | 21 | gpiolib: acpi: Reduce memory footprint for struct acpi_gpio_params |
22 | gpiolib: acpi: Rename par to params for better readability | ||
8 | gpiolib: acpi: Reuse struct acpi_gpio_params in struct | 23 | gpiolib: acpi: Reuse struct acpi_gpio_params in struct |
9 | acpi_gpio_lookup | 24 | acpi_gpio_lookup |
10 | gpiolib: acpi: Deduplicate some code in __acpi_find_gpio() | 25 | gpiolib: acpi: Deduplicate some code in __acpi_find_gpio() |
11 | 26 | ||
12 | drivers/gpio/gpiolib-acpi.c | 138 +++++++++++++++++----------------- | 27 | drivers/gpio/gpiolib-acpi.c | 146 +++++++++++++++++----------------- |
13 | include/linux/gpio/consumer.h | 2 +- | 28 | include/linux/gpio/consumer.h | 2 +- |
14 | 2 files changed, 68 insertions(+), 72 deletions(-) | 29 | 2 files changed, 72 insertions(+), 76 deletions(-) |
15 | 30 | ||
16 | -- | 31 | -- |
17 | 2.47.2 | 32 | 2.47.2 | diff view generated by jsdifflib |
1 | The struct acpi_gpio_info has two boolean members that are located | 1 | The struct acpi_gpio_info has two boolean members that are located |
---|---|---|---|
2 | not close to each other making two gaps due to alignment requirements. | 2 | not close to each other making two gaps due to alignment requirements. |
3 | Group them to improve memory footprint. | 3 | Group them to improve memory footprint. |
4 | 4 | ||
5 | `pahole` difference before and after (on 32-bit): | 5 | `pahole` difference before and after (on 32-bit): |
6 | 6 | ||
7 | - /* size: 36, cachelines: 1, members: 9 */ | 7 | - /* size: 36, cachelines: 1, members: 9 */ |
8 | - /* sum members: 30, holes: 2, sum holes: 6 */ | 8 | - /* sum members: 30, holes: 2, sum holes: 6 */ |
9 | 9 | ||
10 | + /* size: 32, cachelines: 1, members: 9 */ | 10 | + /* size: 32, cachelines: 1, members: 9 */ |
11 | + /* sum members: 30, holes: 1, sum holes: 2 */ | 11 | + /* sum members: 30, holes: 1, sum holes: 2 */ |
12 | 12 | ||
13 | Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 13 | Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
14 | --- | 14 | --- |
15 | drivers/gpio/gpiolib-acpi.c | 4 ++-- | 15 | drivers/gpio/gpiolib-acpi.c | 4 ++-- |
16 | 1 file changed, 2 insertions(+), 2 deletions(-) | 16 | 1 file changed, 2 insertions(+), 2 deletions(-) |
17 | 17 | ||
18 | diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c | 18 | diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c |
19 | index XXXXXXX..XXXXXXX 100644 | 19 | index XXXXXXX..XXXXXXX 100644 |
20 | --- a/drivers/gpio/gpiolib-acpi.c | 20 | --- a/drivers/gpio/gpiolib-acpi.c |
21 | +++ b/drivers/gpio/gpiolib-acpi.c | 21 | +++ b/drivers/gpio/gpiolib-acpi.c |
22 | @@ -XXX,XX +XXX,XX @@ struct acpi_gpio_chip { | 22 | @@ -XXX,XX +XXX,XX @@ struct acpi_gpio_chip { |
23 | * @adev: reference to ACPI device which consumes GPIO resource | 23 | * @adev: reference to ACPI device which consumes GPIO resource |
24 | * @flags: GPIO initialization flags | 24 | * @flags: GPIO initialization flags |
25 | * @gpioint: if %true this GPIO is of type GpioInt otherwise type is GpioIo | 25 | * @gpioint: if %true this GPIO is of type GpioInt otherwise type is GpioIo |
26 | + * @wake_capable: wake capability as provided by ACPI | 26 | + * @wake_capable: wake capability as provided by ACPI |
27 | * @pin_config: pin bias as provided by ACPI | 27 | * @pin_config: pin bias as provided by ACPI |
28 | * @polarity: interrupt polarity as provided by ACPI | 28 | * @polarity: interrupt polarity as provided by ACPI |
29 | * @triggering: triggering type as provided by ACPI | 29 | * @triggering: triggering type as provided by ACPI |
30 | - * @wake_capable: wake capability as provided by ACPI | 30 | - * @wake_capable: wake capability as provided by ACPI |
31 | * @debounce: debounce timeout as provided by ACPI | 31 | * @debounce: debounce timeout as provided by ACPI |
32 | * @quirks: Linux specific quirks as provided by struct acpi_gpio_mapping | 32 | * @quirks: Linux specific quirks as provided by struct acpi_gpio_mapping |
33 | */ | 33 | */ |
34 | @@ -XXX,XX +XXX,XX @@ struct acpi_gpio_info { | 34 | @@ -XXX,XX +XXX,XX @@ struct acpi_gpio_info { |
35 | struct acpi_device *adev; | 35 | struct acpi_device *adev; |
36 | enum gpiod_flags flags; | 36 | enum gpiod_flags flags; |
37 | bool gpioint; | 37 | bool gpioint; |
38 | + bool wake_capable; | 38 | + bool wake_capable; |
39 | int pin_config; | 39 | int pin_config; |
40 | int polarity; | 40 | int polarity; |
41 | int triggering; | 41 | int triggering; |
42 | - bool wake_capable; | 42 | - bool wake_capable; |
43 | unsigned int debounce; | 43 | unsigned int debounce; |
44 | unsigned int quirks; | 44 | unsigned int quirks; |
45 | }; | 45 | }; |
46 | -- | 46 | -- |
47 | 2.47.2 | 47 | 2.47.2 | diff view generated by jsdifflib |
1 | In all cases the supplied index is the same as the passed one in | 1 | In all cases the supplied index is the same as the passed one in |
---|---|---|---|
2 | the struct acpi_gpio_lookup. Remove index parameter and reuse one | 2 | the struct acpi_gpio_lookup. Remove index parameter and reuse one |
3 | from the struct acpi_gpio_lookup instead. | 3 | from the struct acpi_gpio_lookup instead. |
4 | |||
5 | add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-14 (-14) | ||
6 | Function old new delta | ||
7 | acpi_get_gpiod_by_index 462 456 -6 | ||
8 | acpi_gpio_property_lookup 425 417 -8 | ||
9 | Total: Before=15375, After=15361, chg -0.09% | ||
4 | 10 | ||
5 | Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 11 | Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
6 | --- | 12 | --- |
7 | drivers/gpio/gpiolib-acpi.c | 13 ++++++------- | 13 | drivers/gpio/gpiolib-acpi.c | 13 ++++++------- |
8 | 1 file changed, 6 insertions(+), 7 deletions(-) | 14 | 1 file changed, 6 insertions(+), 7 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | The line_index member in the struct acpi_gpio_params replicates | 1 | The line_index member in the struct acpi_gpio_params replicates |
---|---|---|---|
2 | what is covered in the ACPI GpioIo() or GpioInt() resource. | 2 | what is covered in the ACPI GpioIo() or GpioInt() resource. |
3 | The value there is limited to 16-bit one, so we don't really need | 3 | The value there is limited to 16-bit one, so we don't really need |
4 | to have a full 32-bit storage for it. Together with followed | 4 | to have a full 32-bit storage for it. Together with followed |
5 | boolean the structure will be smaller. | 5 | boolean the structure will be smaller. |
6 | |||
7 | add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-3 (-3) | ||
8 | Function old new delta | ||
9 | acpi_gpio_property_lookup 417 414 -3 | ||
10 | Total: Before=15361, After=15358, chg -0.02% | ||
6 | 11 | ||
7 | `pahole` difference before and after: | 12 | `pahole` difference before and after: |
8 | 13 | ||
9 | - /* size: 12, cachelines: 1, members: 3 */ | 14 | - /* size: 12, cachelines: 1, members: 3 */ |
10 | - /* padding: 3 */ | 15 | - /* padding: 3 */ |
... | ... | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | Rename par to params for better readability in acpi_get_driver_gpio_data(). | ||
2 | No functional changes intended. | ||
1 | 3 | ||
4 | Requested-by: Bartosz Golaszewski <brgl@bgdev.pl> | ||
5 | Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> | ||
6 | --- | ||
7 | drivers/gpio/gpiolib-acpi.c | 8 ++++---- | ||
8 | 1 file changed, 4 insertions(+), 4 deletions(-) | ||
9 | |||
10 | diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c | ||
11 | index XXXXXXX..XXXXXXX 100644 | ||
12 | --- a/drivers/gpio/gpiolib-acpi.c | ||
13 | +++ b/drivers/gpio/gpiolib-acpi.c | ||
14 | @@ -XXX,XX +XXX,XX @@ static bool acpi_get_driver_gpio_data(struct acpi_device *adev, | ||
15 | |||
16 | for (gm = adev->driver_gpios; gm->name; gm++) | ||
17 | if (!strcmp(name, gm->name) && gm->data && index < gm->size) { | ||
18 | - const struct acpi_gpio_params *par = gm->data + index; | ||
19 | + const struct acpi_gpio_params *params = gm->data + index; | ||
20 | |||
21 | args->fwnode = acpi_fwnode_handle(adev); | ||
22 | - args->args[0] = par->crs_entry_index; | ||
23 | - args->args[1] = par->line_index; | ||
24 | - args->args[2] = par->active_low; | ||
25 | + args->args[0] = params->crs_entry_index; | ||
26 | + args->args[1] = params->line_index; | ||
27 | + args->args[2] = params->active_low; | ||
28 | args->nargs = 3; | ||
29 | |||
30 | *quirks = gm->quirks; | ||
31 | -- | ||
32 | 2.47.2 | diff view generated by jsdifflib |
1 | Some of the contents of struct acpi_gpio_lookup repeats what we have | 1 | Some of the contents of struct acpi_gpio_lookup repeats what we have |
---|---|---|---|
2 | in the struct acpi_gpio_params. Reuse the latter in the former. | 2 | in the struct acpi_gpio_params. Reuse the latter in the former. |
3 | 3 | ||
4 | Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 4 | Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
5 | --- | 5 | --- |
6 | drivers/gpio/gpiolib-acpi.c | 34 ++++++++++++++++++---------------- | 6 | drivers/gpio/gpiolib-acpi.c | 36 +++++++++++++++++++----------------- |
7 | 1 file changed, 18 insertions(+), 16 deletions(-) | 7 | 1 file changed, 19 insertions(+), 17 deletions(-) |
8 | 8 | ||
9 | diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c | 9 | diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c |
10 | index XXXXXXX..XXXXXXX 100644 | 10 | index XXXXXXX..XXXXXXX 100644 |
11 | --- a/drivers/gpio/gpiolib-acpi.c | 11 | --- a/drivers/gpio/gpiolib-acpi.c |
12 | +++ b/drivers/gpio/gpiolib-acpi.c | 12 | +++ b/drivers/gpio/gpiolib-acpi.c |
... | ... | ||
15 | struct acpi_gpio_lookup { | 15 | struct acpi_gpio_lookup { |
16 | struct acpi_gpio_info info; | 16 | struct acpi_gpio_info info; |
17 | - int index; | 17 | - int index; |
18 | - u16 pin_index; | 18 | - u16 pin_index; |
19 | - bool active_low; | 19 | - bool active_low; |
20 | + struct acpi_gpio_params par; | 20 | + struct acpi_gpio_params params; |
21 | struct gpio_desc *desc; | 21 | struct gpio_desc *desc; |
22 | int n; | 22 | int n; |
23 | }; | 23 | }; |
24 | @@ -XXX,XX +XXX,XX @@ struct acpi_gpio_lookup { | 24 | @@ -XXX,XX +XXX,XX @@ struct acpi_gpio_lookup { |
25 | static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) | 25 | static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) |
26 | { | 26 | { |
27 | struct acpi_gpio_lookup *lookup = data; | 27 | struct acpi_gpio_lookup *lookup = data; |
28 | + struct acpi_gpio_params *par = &lookup->par; | 28 | + struct acpi_gpio_params *params = &lookup->params; |
29 | 29 | ||
30 | if (ares->type != ACPI_RESOURCE_TYPE_GPIO) | 30 | if (ares->type != ACPI_RESOURCE_TYPE_GPIO) |
31 | return 1; | 31 | return 1; |
32 | @@ -XXX,XX +XXX,XX @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) | 32 | @@ -XXX,XX +XXX,XX @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) |
33 | u16 pin_index; | 33 | u16 pin_index; |
34 | 34 | ||
35 | if (lookup->info.quirks & ACPI_GPIO_QUIRK_ONLY_GPIOIO && gpioint) | 35 | if (lookup->info.quirks & ACPI_GPIO_QUIRK_ONLY_GPIOIO && gpioint) |
36 | - lookup->index++; | 36 | - lookup->index++; |
37 | + par->crs_entry_index++; | 37 | + params->crs_entry_index++; |
38 | 38 | ||
39 | - if (lookup->n++ != lookup->index) | 39 | - if (lookup->n++ != lookup->index) |
40 | + if (lookup->n++ != par->crs_entry_index) | 40 | + if (lookup->n++ != params->crs_entry_index) |
41 | return 1; | 41 | return 1; |
42 | 42 | ||
43 | - pin_index = lookup->pin_index; | 43 | - pin_index = lookup->pin_index; |
44 | + pin_index = par->line_index; | 44 | + pin_index = params->line_index; |
45 | if (pin_index >= agpio->pin_table_length) | 45 | if (pin_index >= agpio->pin_table_length) |
46 | return 1; | 46 | return 1; |
47 | 47 | ||
48 | @@ -XXX,XX +XXX,XX @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) | 48 | @@ -XXX,XX +XXX,XX @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) |
49 | lookup->info.polarity = agpio->polarity; | 49 | lookup->info.polarity = agpio->polarity; |
50 | lookup->info.triggering = agpio->triggering; | 50 | lookup->info.triggering = agpio->triggering; |
51 | } else { | 51 | } else { |
52 | - lookup->info.polarity = lookup->active_low; | 52 | - lookup->info.polarity = lookup->active_low; |
53 | + lookup->info.polarity = par->active_low; | 53 | + lookup->info.polarity = params->active_low; |
54 | } | 54 | } |
55 | 55 | ||
56 | lookup->info.flags = acpi_gpio_to_gpiod_flags(agpio, lookup->info.polarity); | 56 | lookup->info.flags = acpi_gpio_to_gpiod_flags(agpio, lookup->info.polarity); |
57 | @@ -XXX,XX +XXX,XX @@ static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode, const char *p | 57 | @@ -XXX,XX +XXX,XX @@ static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode, const char *p |
58 | struct acpi_gpio_lookup *lookup) | 58 | struct acpi_gpio_lookup *lookup) |
59 | { | 59 | { |
60 | struct fwnode_reference_args args; | 60 | struct fwnode_reference_args args; |
61 | - unsigned int index = lookup->index; | 61 | - unsigned int index = lookup->index; |
62 | + struct acpi_gpio_params *par = &lookup->par; | 62 | + struct acpi_gpio_params *params = &lookup->params; |
63 | + unsigned int index = par->crs_entry_index; | 63 | + unsigned int index = params->crs_entry_index; |
64 | unsigned int quirks = 0; | 64 | unsigned int quirks = 0; |
65 | int ret; | 65 | int ret; |
66 | 66 | ||
67 | @@ -XXX,XX +XXX,XX @@ static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode, const char *p | 67 | @@ -XXX,XX +XXX,XX @@ static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode, const char *p |
68 | if (args.nargs != 3) | 68 | if (args.nargs != 3) |
69 | return -EPROTO; | 69 | return -EPROTO; |
70 | 70 | ||
71 | - lookup->index = args.args[0]; | 71 | - lookup->index = args.args[0]; |
72 | - lookup->pin_index = args.args[1]; | 72 | - lookup->pin_index = args.args[1]; |
73 | - lookup->active_low = !!args.args[2]; | 73 | - lookup->active_low = !!args.args[2]; |
74 | + par->crs_entry_index = args.args[0]; | 74 | + params->crs_entry_index = args.args[0]; |
75 | + par->line_index = args.args[1]; | 75 | + params->line_index = args.args[1]; |
76 | + par->active_low = !!args.args[2]; | 76 | + params->active_low = !!args.args[2]; |
77 | 77 | ||
78 | lookup->info.adev = to_acpi_device_node(args.fwnode); | 78 | lookup->info.adev = to_acpi_device_node(args.fwnode); |
79 | lookup->info.quirks = quirks; | 79 | lookup->info.quirks = quirks; |
80 | @@ -XXX,XX +XXX,XX @@ static struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev, | 80 | @@ -XXX,XX +XXX,XX @@ static struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev, |
81 | struct acpi_gpio_info *info) | 81 | struct acpi_gpio_info *info) |
82 | { | 82 | { |
83 | struct acpi_gpio_lookup lookup; | 83 | struct acpi_gpio_lookup lookup; |
84 | + struct acpi_gpio_params *par = &lookup.par; | 84 | + struct acpi_gpio_params *params = &lookup.params; |
85 | int ret; | 85 | int ret; |
86 | 86 | ||
87 | memset(&lookup, 0, sizeof(lookup)); | 87 | memset(&lookup, 0, sizeof(lookup)); |
88 | - lookup.index = index; | 88 | - lookup.index = index; |
89 | + par->crs_entry_index = index; | 89 | + params->crs_entry_index = index; |
90 | 90 | ||
91 | if (propname) { | 91 | if (propname) { |
92 | dev_dbg(&adev->dev, "GPIO: looking up %s\n", propname); | 92 | dev_dbg(&adev->dev, "GPIO: looking up %s\n", propname); |
93 | @@ -XXX,XX +XXX,XX @@ static struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev, | 93 | @@ -XXX,XX +XXX,XX @@ static struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev, |
94 | if (ret) | 94 | if (ret) |
... | ... | ||
97 | - dev_dbg(&adev->dev, "GPIO: _DSD returned %s %d %u %u\n", | 97 | - dev_dbg(&adev->dev, "GPIO: _DSD returned %s %d %u %u\n", |
98 | - dev_name(&lookup.info.adev->dev), lookup.index, | 98 | - dev_name(&lookup.info.adev->dev), lookup.index, |
99 | - lookup.pin_index, lookup.active_low); | 99 | - lookup.pin_index, lookup.active_low); |
100 | + dev_dbg(&adev->dev, "GPIO: _DSD returned %s %u %u %u\n", | 100 | + dev_dbg(&adev->dev, "GPIO: _DSD returned %s %u %u %u\n", |
101 | + dev_name(&lookup.info.adev->dev), | 101 | + dev_name(&lookup.info.adev->dev), |
102 | + par->crs_entry_index, par->line_index, par->active_low); | 102 | + params->crs_entry_index, params->line_index, params->active_low); |
103 | } else { | 103 | } else { |
104 | dev_dbg(&adev->dev, "GPIO: looking up %d in _CRS\n", index); | 104 | - dev_dbg(&adev->dev, "GPIO: looking up %d in _CRS\n", index); |
105 | + dev_dbg(&adev->dev, "GPIO: looking up %u in _CRS\n", params->crs_entry_index); | ||
105 | lookup.info.adev = adev; | 106 | lookup.info.adev = adev; |
107 | } | ||
108 | |||
106 | @@ -XXX,XX +XXX,XX @@ static struct gpio_desc *acpi_get_gpiod_from_data(struct fwnode_handle *fwnode, | 109 | @@ -XXX,XX +XXX,XX @@ static struct gpio_desc *acpi_get_gpiod_from_data(struct fwnode_handle *fwnode, |
107 | struct acpi_gpio_info *info) | 110 | struct acpi_gpio_info *info) |
108 | { | 111 | { |
109 | struct acpi_gpio_lookup lookup; | 112 | struct acpi_gpio_lookup lookup; |
110 | + struct acpi_gpio_params *par = &lookup.par; | 113 | + struct acpi_gpio_params *params = &lookup.params; |
111 | int ret; | 114 | int ret; |
112 | 115 | ||
113 | if (!is_acpi_data_node(fwnode)) | 116 | if (!is_acpi_data_node(fwnode)) |
114 | @@ -XXX,XX +XXX,XX @@ static struct gpio_desc *acpi_get_gpiod_from_data(struct fwnode_handle *fwnode, | 117 | @@ -XXX,XX +XXX,XX @@ static struct gpio_desc *acpi_get_gpiod_from_data(struct fwnode_handle *fwnode, |
115 | return ERR_PTR(-EINVAL); | 118 | return ERR_PTR(-EINVAL); |
116 | 119 | ||
117 | memset(&lookup, 0, sizeof(lookup)); | 120 | memset(&lookup, 0, sizeof(lookup)); |
118 | - lookup.index = index; | 121 | - lookup.index = index; |
119 | + par->crs_entry_index = index; | 122 | + params->crs_entry_index = index; |
120 | 123 | ||
121 | ret = acpi_gpio_property_lookup(fwnode, propname, &lookup); | 124 | ret = acpi_gpio_property_lookup(fwnode, propname, &lookup); |
122 | if (ret) | 125 | if (ret) |
123 | -- | 126 | -- |
124 | 2.47.2 | 127 | 2.47.2 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
14 | acpi_dev_gpio_irq_wake_get_by 695 129 -566 | 14 | acpi_dev_gpio_irq_wake_get_by 695 129 -566 |
15 | Total: Before=15358, After=14154, chg -7.84% | 15 | Total: Before=15358, After=14154, chg -7.84% |
16 | 16 | ||
17 | Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 17 | Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
18 | --- | 18 | --- |
19 | drivers/gpio/gpiolib-acpi.c | 103 +++++++++++++++++------------------- | 19 | drivers/gpio/gpiolib-acpi.c | 101 +++++++++++++++++------------------- |
20 | 1 file changed, 49 insertions(+), 54 deletions(-) | 20 | 1 file changed, 48 insertions(+), 53 deletions(-) |
21 | 21 | ||
22 | diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c | 22 | diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c |
23 | index XXXXXXX..XXXXXXX 100644 | 23 | index XXXXXXX..XXXXXXX 100644 |
24 | --- a/drivers/gpio/gpiolib-acpi.c | 24 | --- a/drivers/gpio/gpiolib-acpi.c |
25 | +++ b/drivers/gpio/gpiolib-acpi.c | 25 | +++ b/drivers/gpio/gpiolib-acpi.c |
... | ... | ||
80 | - struct acpi_gpio_info *info) | 80 | - struct acpi_gpio_info *info) |
81 | +static int acpi_get_gpiod_by_index(struct acpi_device *adev, const char *propname, | 81 | +static int acpi_get_gpiod_by_index(struct acpi_device *adev, const char *propname, |
82 | + struct acpi_gpio_lookup *lookup) | 82 | + struct acpi_gpio_lookup *lookup) |
83 | { | 83 | { |
84 | - struct acpi_gpio_lookup lookup; | 84 | - struct acpi_gpio_lookup lookup; |
85 | - struct acpi_gpio_params *par = &lookup.par; | 85 | - struct acpi_gpio_params *params = &lookup.params; |
86 | + struct acpi_gpio_info *info = &lookup->info; | 86 | + struct acpi_gpio_info *info = &lookup->info; |
87 | + struct acpi_gpio_params *par = &lookup->par; | 87 | + struct acpi_gpio_params *params = &lookup->params; |
88 | int ret; | 88 | int ret; |
89 | 89 | ||
90 | - memset(&lookup, 0, sizeof(lookup)); | 90 | - memset(&lookup, 0, sizeof(lookup)); |
91 | - par->crs_entry_index = index; | 91 | - params->crs_entry_index = index; |
92 | - | 92 | - |
93 | if (propname) { | 93 | if (propname) { |
94 | dev_dbg(&adev->dev, "GPIO: looking up %s\n", propname); | 94 | dev_dbg(&adev->dev, "GPIO: looking up %s\n", propname); |
95 | 95 | ||
96 | - ret = acpi_gpio_property_lookup(acpi_fwnode_handle(adev), propname, &lookup); | 96 | - ret = acpi_gpio_property_lookup(acpi_fwnode_handle(adev), propname, &lookup); |
... | ... | ||
100 | + return ret; | 100 | + return ret; |
101 | 101 | ||
102 | dev_dbg(&adev->dev, "GPIO: _DSD returned %s %u %u %u\n", | 102 | dev_dbg(&adev->dev, "GPIO: _DSD returned %s %u %u %u\n", |
103 | - dev_name(&lookup.info.adev->dev), | 103 | - dev_name(&lookup.info.adev->dev), |
104 | + dev_name(&info->adev->dev), | 104 | + dev_name(&info->adev->dev), |
105 | par->crs_entry_index, par->line_index, par->active_low); | 105 | params->crs_entry_index, params->line_index, params->active_low); |
106 | } else { | 106 | } else { |
107 | - dev_dbg(&adev->dev, "GPIO: looking up %d in _CRS\n", index); | 107 | dev_dbg(&adev->dev, "GPIO: looking up %u in _CRS\n", params->crs_entry_index); |
108 | - lookup.info.adev = adev; | 108 | - lookup.info.adev = adev; |
109 | + dev_dbg(&adev->dev, "GPIO: looking up %u in _CRS\n", par->crs_entry_index); | ||
110 | + info->adev = adev; | 109 | + info->adev = adev; |
111 | } | 110 | } |
112 | 111 | ||
113 | - ret = acpi_gpio_resource_lookup(&lookup, info); | 112 | - ret = acpi_gpio_resource_lookup(&lookup, info); |
114 | - return ret ? ERR_PTR(ret) : lookup.desc; | 113 | - return ret ? ERR_PTR(ret) : lookup.desc; |
... | ... | ||
142 | - struct acpi_gpio_info *info) | 141 | - struct acpi_gpio_info *info) |
143 | +static int acpi_get_gpiod_from_data(struct fwnode_handle *fwnode, const char *propname, | 142 | +static int acpi_get_gpiod_from_data(struct fwnode_handle *fwnode, const char *propname, |
144 | + struct acpi_gpio_lookup *lookup) | 143 | + struct acpi_gpio_lookup *lookup) |
145 | { | 144 | { |
146 | - struct acpi_gpio_lookup lookup; | 145 | - struct acpi_gpio_lookup lookup; |
147 | - struct acpi_gpio_params *par = &lookup.par; | 146 | - struct acpi_gpio_params *params = &lookup.params; |
148 | int ret; | 147 | int ret; |
149 | 148 | ||
150 | if (!is_acpi_data_node(fwnode)) | 149 | if (!is_acpi_data_node(fwnode)) |
151 | - return ERR_PTR(-ENODEV); | 150 | - return ERR_PTR(-ENODEV); |
152 | + return -ENODEV; | 151 | + return -ENODEV; |
153 | 152 | ||
154 | if (!propname) | 153 | if (!propname) |
155 | - return ERR_PTR(-EINVAL); | 154 | - return ERR_PTR(-EINVAL); |
156 | + return -EINVAL; | 155 | + return -EINVAL; |
157 | 156 | ||
158 | - memset(&lookup, 0, sizeof(lookup)); | 157 | - memset(&lookup, 0, sizeof(lookup)); |
159 | - par->crs_entry_index = index; | 158 | - params->crs_entry_index = index; |
160 | - | 159 | - |
161 | - ret = acpi_gpio_property_lookup(fwnode, propname, &lookup); | 160 | - ret = acpi_gpio_property_lookup(fwnode, propname, &lookup); |
162 | + ret = acpi_gpio_property_lookup(fwnode, propname, lookup); | 161 | + ret = acpi_gpio_property_lookup(fwnode, propname, lookup); |
163 | if (ret) | 162 | if (ret) |
164 | - return ERR_PTR(ret); | 163 | - return ERR_PTR(ret); |
... | ... | ||
178 | struct gpio_desc *desc; | 177 | struct gpio_desc *desc; |
179 | char propname[32]; | 178 | char propname[32]; |
180 | + int ret; | 179 | + int ret; |
181 | + | 180 | + |
182 | + memset(&lookup, 0, sizeof(lookup)); | 181 | + memset(&lookup, 0, sizeof(lookup)); |
183 | + lookup.par.crs_entry_index = idx; | 182 | + lookup.params.crs_entry_index = idx; |
184 | 183 | ||
185 | /* Try first from _DSD */ | 184 | /* Try first from _DSD */ |
186 | for_each_gpio_property_name(propname, con_id) { | 185 | for_each_gpio_property_name(propname, con_id) { |
187 | if (adev) | 186 | if (adev) |
188 | - desc = acpi_get_gpiod_by_index(adev, | 187 | - desc = acpi_get_gpiod_by_index(adev, |
... | ... | diff view generated by jsdifflib |