mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
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:
parent
0daaf99d84
commit
4124c4eba4
3 changed files with 46 additions and 0 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue