i2c: allow attaching IRQ resources to i2c_board_info

Simple integer for interrupt number is not expressive enough, as it does
not convey interrupt trigger type that should be used. Let's allow
attaching array of resources to the board info and have i2c core parse
first IRQ resource and set up interrupt trigger as needed.

Reviewed-by: Wolfram Sang <[email protected]>
Signed-off-by: Dmitry Torokhov <[email protected]>
This commit is contained in:
Dmitry Torokhov 2017-03-01 11:45:51 -08:00
commit 4124c4eba4
3 changed files with 46 additions and 0 deletions

View file

@ -90,6 +90,18 @@ int i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsig
}
}
if (info->resources) {
devinfo->board_info.resources =
kmemdup(info->resources,
info->num_resources *
sizeof(*info->resources),
GFP_KERNEL);
if (!devinfo->board_info.resources) {
status = -ENOMEM;
break;
}
}
list_add_tail(&devinfo->list, &__i2c_board_list);
}

View file

@ -1278,6 +1278,32 @@ static void i2c_dev_set_name(struct i2c_adapter *adap,
i2c_encode_flags_to_addr(client));
}
static int i2c_dev_irq_from_resources(const struct resource *resources,
unsigned int num_resources)
{
struct irq_data *irqd;
int i;
for (i = 0; i < num_resources; i++) {
const struct resource *r = &resources[i];
if (resource_type(r) != IORESOURCE_IRQ)
continue;
if (r->flags & IORESOURCE_BITS) {
irqd = irq_get_irq_data(r->start);
if (!irqd)
break;
irqd_set_trigger_type(irqd, r->flags & IORESOURCE_BITS);
}
return r->start;
}
return 0;
}
/**
* i2c_new_device - instantiate an i2c device
* @adap: the adapter managing the device
@ -1313,7 +1339,11 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
client->flags = info->flags;
client->addr = info->addr;
client->irq = info->irq;
if (!client->irq)
client->irq = i2c_dev_irq_from_resources(info->resources,
info->num_resources);
strlcpy(client->name, info->type, sizeof(client->name));