2023-12-20 23:55:38

by Mark Hasemeyer

[permalink] [raw]
Subject: [PATCH v2 02/22] i2c: acpi: Modify i2c_acpi_get_irq() to use resource

The i2c_acpi_irq_context structure provides redundant information that
can be provided with struct resource.

Refactor i2c_acpi_get_irq() to use struct resource instead of struct
i2c_acpi_irq_context.

Signed-off-by: Mark Hasemeyer <[email protected]>
---

Changes in v2:
-New patch

drivers/i2c/i2c-core-acpi.c | 44 ++++++++++++++-----------------------
drivers/i2c/i2c-core-base.c | 6 ++---
drivers/i2c/i2c-core.h | 4 ++--
3 files changed, 22 insertions(+), 32 deletions(-)

diff --git a/drivers/i2c/i2c-core-acpi.c b/drivers/i2c/i2c-core-acpi.c
index 8126a87baf3d4..01cf140da21af 100644
--- a/drivers/i2c/i2c-core-acpi.c
+++ b/drivers/i2c/i2c-core-acpi.c
@@ -175,64 +175,54 @@ static int i2c_acpi_do_lookup(struct acpi_device *adev,

static int i2c_acpi_add_irq_resource(struct acpi_resource *ares, void *data)
{
- struct i2c_acpi_irq_context *irq_ctx = data;
- struct resource r;
+ struct resource *r = data;

- if (irq_ctx->irq > 0)
+ if (r->start > 0)
return 1;

- if (!acpi_dev_resource_interrupt(ares, 0, &r))
+ if (!acpi_dev_resource_interrupt(ares, 0, r))
return 1;

- irq_ctx->irq = i2c_dev_irq_from_resources(&r, 1);
- irq_ctx->wake_capable = r.flags & IORESOURCE_IRQ_WAKECAPABLE;
+ i2c_dev_irq_from_resources(r, 1);

return 1; /* No need to add resource to the list */
}

/**
- * i2c_acpi_get_irq - get device IRQ number from ACPI
+ * i2c_acpi_get_irq - get device IRQ number from ACPI and populate resource
* @client: Pointer to the I2C client device
- * @wake_capable: Set to true if the IRQ is wake capable
+ * @r: resource with populated IRQ information
*
* Find the IRQ number used by a specific client device.
*
* Return: The IRQ number or an error code.
*/
-int i2c_acpi_get_irq(struct i2c_client *client, bool *wake_capable)
+int i2c_acpi_get_irq(struct i2c_client *client, struct resource *r)
{
struct acpi_device *adev = ACPI_COMPANION(&client->dev);
struct list_head resource_list;
- struct resource irqres;
- struct i2c_acpi_irq_context irq_ctx = {
- .irq = -ENOENT,
- };
int ret;

+ if (IS_ERR_OR_NULL(r))
+ return -EINVAL;
+
INIT_LIST_HEAD(&resource_list);

ret = acpi_dev_get_resources(adev, &resource_list,
- i2c_acpi_add_irq_resource, &irq_ctx);
+ i2c_acpi_add_irq_resource, r);
if (ret < 0)
return ret;

acpi_dev_free_resource_list(&resource_list);

- if (irq_ctx.irq == -ENOENT) {
- ret = acpi_dev_get_gpio_irq_resource(adev, NULL, 0, &irqres);
- if (ret)
- return ret;
- irq_ctx.irq = irqres.start;
- irq_ctx.wake_capable = irqres.flags & IORESOURCE_IRQ_WAKECAPABLE;
- }
-
- if (irq_ctx.irq < 0)
- return irq_ctx.irq;
+ if (r->start > 0)
+ return r->start;

- if (wake_capable)
- *wake_capable = irq_ctx.wake_capable;
+ ret = acpi_dev_get_gpio_irq_resource(adev, NULL, 0, r);
+ if (!ret)
+ return r->start;

- return irq_ctx.irq;
+ return ret;
}

static int i2c_acpi_get_info(struct acpi_device *adev,
diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index 3bd48d4b6318f..8b8c7581a60c2 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -513,10 +513,10 @@ static int i2c_device_probe(struct device *dev)
if (irq == -EINVAL || irq == -ENODATA)
irq = of_irq_get(dev->of_node, 0);
} else if (ACPI_COMPANION(dev)) {
- bool wake_capable;
+ struct resource r = {0};

- irq = i2c_acpi_get_irq(client, &wake_capable);
- if (irq > 0 && wake_capable)
+ irq = i2c_acpi_get_irq(client, &r);
+ if (irq > 0 && r.flags & IORESOURCE_IRQ_WAKECAPABLE)
client->flags |= I2C_CLIENT_WAKE;
}
if (irq == -EPROBE_DEFER) {
diff --git a/drivers/i2c/i2c-core.h b/drivers/i2c/i2c-core.h
index 05b8b8dfa9bdd..b5dc559c49d11 100644
--- a/drivers/i2c/i2c-core.h
+++ b/drivers/i2c/i2c-core.h
@@ -61,11 +61,11 @@ static inline int __i2c_check_suspended(struct i2c_adapter *adap)
#ifdef CONFIG_ACPI
void i2c_acpi_register_devices(struct i2c_adapter *adap);

-int i2c_acpi_get_irq(struct i2c_client *client, bool *wake_capable);
+int i2c_acpi_get_irq(struct i2c_client *client, struct resource *r);
#else /* CONFIG_ACPI */
static inline void i2c_acpi_register_devices(struct i2c_adapter *adap) { }

-static inline int i2c_acpi_get_irq(struct i2c_client *client, bool *wake_capable)
+static inline int i2c_acpi_get_irq(struct i2c_client *client, struct resource *r)
{
return 0;
}
--
2.43.0.472.g3155946c3a-goog



2023-12-21 14:02:04

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v2 02/22] i2c: acpi: Modify i2c_acpi_get_irq() to use resource

On Wed, Dec 20, 2023 at 04:54:16PM -0700, Mark Hasemeyer wrote:
> The i2c_acpi_irq_context structure provides redundant information that
> can be provided with struct resource.
>
> Refactor i2c_acpi_get_irq() to use struct resource instead of struct
> i2c_acpi_irq_context.

Suggested-by?

...

> static int i2c_acpi_add_irq_resource(struct acpi_resource *ares, void *data)
> {
> - struct i2c_acpi_irq_context *irq_ctx = data;
> - struct resource r;
> + struct resource *r = data;

> - if (irq_ctx->irq > 0)
> + if (r->start > 0)
> return 1;

Checking flags is more robust.

if (r->flags)
return 1;

> - if (!acpi_dev_resource_interrupt(ares, 0, &r))
> + if (!acpi_dev_resource_interrupt(ares, 0, r))
> return 1;
>
> - irq_ctx->irq = i2c_dev_irq_from_resources(&r, 1);
> - irq_ctx->wake_capable = r.flags & IORESOURCE_IRQ_WAKECAPABLE;
> + i2c_dev_irq_from_resources(r, 1);
>
> return 1; /* No need to add resource to the list */
> }

...

> + if (IS_ERR_OR_NULL(r))
> + return -EINVAL;

Hmm... Do we expect this to be an error pointer in some cases?

...

> + ret = acpi_dev_get_gpio_irq_resource(adev, NULL, 0, r);
> + if (!ret)
> + return r->start;
>
> - return irq_ctx.irq;
> + return ret;

What's wrong with the standard pattern?

if (ret)
return ret;
...
return ...;

...

> + struct resource r = {0};

'0' is redundant.

...

> + irq = i2c_acpi_get_irq(client, &r);
> + if (irq > 0 && r.flags & IORESOURCE_IRQ_WAKECAPABLE)

Why checking just flags is not enough?

> client->flags |= I2C_CLIENT_WAKE;

--
With Best Regards,
Andy Shevchenko