platform/x86: int3472: Support multiple gpio lookups in board data
Currently, we only support passing a single gpiod_lookup_table as part of the board data for the tps68470 driver. This carries the implicit assumption that each TPS68470 device will only support a single sensor, which does not hold true. Extend the code to support the possibility of multiple sensors each having a gpiod_lookup_table, and opportunistically add the lookup table for the Surface Go line's IR camera. Reviewed-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Daniel Scally <djrscally@gmail.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
43cf36974d
commit
06a659d1f0
|
@ -150,6 +150,7 @@ static int skl_int3472_tps68470_probe(struct i2c_client *client)
|
|||
int n_consumers;
|
||||
int device_type;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
n_consumers = skl_int3472_fill_clk_pdata(&client->dev, &clk_pdata);
|
||||
if (n_consumers < 0)
|
||||
|
@ -194,15 +195,18 @@ static int skl_int3472_tps68470_probe(struct i2c_client *client)
|
|||
cells[1].pdata_size = sizeof(struct tps68470_regulator_platform_data);
|
||||
cells[2].name = "tps68470-gpio";
|
||||
|
||||
gpiod_add_lookup_table(board_data->tps68470_gpio_lookup_table);
|
||||
for (i = 0; i < board_data->n_gpiod_lookups; i++)
|
||||
gpiod_add_lookup_table(board_data->tps68470_gpio_lookup_tables[i]);
|
||||
|
||||
ret = devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
|
||||
cells, TPS68470_WIN_MFD_CELL_COUNT,
|
||||
NULL, 0, NULL);
|
||||
kfree(cells);
|
||||
|
||||
if (ret)
|
||||
gpiod_remove_lookup_table(board_data->tps68470_gpio_lookup_table);
|
||||
if (ret) {
|
||||
for (i = 0; i < board_data->n_gpiod_lookups; i++)
|
||||
gpiod_remove_lookup_table(board_data->tps68470_gpio_lookup_tables[i]);
|
||||
}
|
||||
|
||||
break;
|
||||
case DESIGNED_FOR_CHROMEOS:
|
||||
|
@ -226,10 +230,13 @@ static int skl_int3472_tps68470_probe(struct i2c_client *client)
|
|||
static int skl_int3472_tps68470_remove(struct i2c_client *client)
|
||||
{
|
||||
const struct int3472_tps68470_board_data *board_data;
|
||||
int i;
|
||||
|
||||
board_data = int3472_tps68470_get_board_data(dev_name(&client->dev));
|
||||
if (board_data)
|
||||
gpiod_remove_lookup_table(board_data->tps68470_gpio_lookup_table);
|
||||
if (board_data) {
|
||||
for (i = 0; i < board_data->n_gpiod_lookups; i++)
|
||||
gpiod_remove_lookup_table(board_data->tps68470_gpio_lookup_tables[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -16,8 +16,9 @@ struct tps68470_regulator_platform_data;
|
|||
|
||||
struct int3472_tps68470_board_data {
|
||||
const char *dev_name;
|
||||
struct gpiod_lookup_table *tps68470_gpio_lookup_table;
|
||||
const struct tps68470_regulator_platform_data *tps68470_regulator_pdata;
|
||||
unsigned int n_gpiod_lookups;
|
||||
struct gpiod_lookup_table *tps68470_gpio_lookup_tables[];
|
||||
};
|
||||
|
||||
const struct int3472_tps68470_board_data *int3472_tps68470_get_board_data(const char *dev_name);
|
||||
|
|
|
@ -96,7 +96,7 @@ static const struct tps68470_regulator_platform_data surface_go_tps68470_pdata =
|
|||
},
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table surface_go_tps68470_gpios = {
|
||||
static struct gpiod_lookup_table surface_go_int347a_gpios = {
|
||||
.dev_id = "i2c-INT347A:00",
|
||||
.table = {
|
||||
GPIO_LOOKUP("tps68470-gpio", 9, "reset", GPIO_ACTIVE_LOW),
|
||||
|
@ -105,16 +105,31 @@ static struct gpiod_lookup_table surface_go_tps68470_gpios = {
|
|||
}
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table surface_go_int347e_gpios = {
|
||||
.dev_id = "i2c-INT347E:00",
|
||||
.table = {
|
||||
GPIO_LOOKUP("tps68470-gpio", 5, "enable", GPIO_ACTIVE_HIGH),
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
||||
static const struct int3472_tps68470_board_data surface_go_tps68470_board_data = {
|
||||
.dev_name = "i2c-INT3472:05",
|
||||
.tps68470_gpio_lookup_table = &surface_go_tps68470_gpios,
|
||||
.tps68470_regulator_pdata = &surface_go_tps68470_pdata,
|
||||
.n_gpiod_lookups = 2,
|
||||
.tps68470_gpio_lookup_tables = {
|
||||
&surface_go_int347a_gpios,
|
||||
&surface_go_int347e_gpios,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct int3472_tps68470_board_data surface_go3_tps68470_board_data = {
|
||||
.dev_name = "i2c-INT3472:01",
|
||||
.tps68470_gpio_lookup_table = &surface_go_tps68470_gpios,
|
||||
.tps68470_regulator_pdata = &surface_go_tps68470_pdata,
|
||||
.n_gpiod_lookups = 1,
|
||||
.tps68470_gpio_lookup_tables = {
|
||||
&surface_go_int347a_gpios
|
||||
},
|
||||
};
|
||||
|
||||
static const struct dmi_system_id int3472_tps68470_board_data_table[] = {
|
||||
|
|
Loading…
Reference in New Issue