media: atomisp: ov2680: Use v4l2_get_acpi_sensor_info() for the GPIO lookups

Use the new v4l2_get_acpi_sensor_info() for the GPIO lookups,
this uses the special Intel _DSM method to get more info about
the GPIOs like their function and their polarity.

Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
Hans de Goede 2023-04-01 14:25:20 +01:00 committed by Mauro Carvalho Chehab
parent d1229eb04e
commit 920cf0ba63
2 changed files with 3 additions and 24 deletions

View File

@ -3,6 +3,7 @@
* Support for OmniVision OV2680 1080p HD camera sensor.
*
* Copyright (c) 2013 Intel Corporation. All Rights Reserved.
* Copyright (c) 2023 Hans de Goede <hdegoede@redhat.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
@ -614,21 +615,6 @@ static void ov2680_remove(struct i2c_client *client)
pm_runtime_disable(&client->dev);
}
/*
* Unlike other sensors which have both a rest and powerdown input pins,
* the OV2680 only has a powerdown input. But some ACPI tables still list
* 2 GPIOs for the OV2680 and it is unclear which to use. So try to get
* up to 2 GPIOs (1 mandatory, 1 optional) and control them in sync.
*/
static const struct acpi_gpio_params ov2680_first_gpio = { 0, 0, true };
static const struct acpi_gpio_params ov2680_second_gpio = { 1, 0, true };
static const struct acpi_gpio_mapping ov2680_gpio_mapping[] = {
{ "powerdown-gpios", &ov2680_first_gpio, 1 },
{ "powerdown-alt-gpios", &ov2680_second_gpio, 1 },
{ },
};
static int ov2680_probe(struct i2c_client *client)
{
struct device *dev = &client->dev;
@ -644,18 +630,14 @@ static int ov2680_probe(struct i2c_client *client)
sensor->client = client;
v4l2_i2c_subdev_init(&sensor->sd, client, &ov2680_ops);
ret = devm_acpi_dev_add_driver_gpios(&client->dev, ov2680_gpio_mapping);
ret = v4l2_get_acpi_sensor_info(dev, NULL);
if (ret)
return ret;
sensor->powerdown = devm_gpiod_get(dev, "powerdown", GPIOD_OUT_HIGH);
sensor->powerdown = devm_gpiod_get_optional(dev, "powerdown", GPIOD_OUT_HIGH);
if (IS_ERR(sensor->powerdown))
return dev_err_probe(dev, PTR_ERR(sensor->powerdown), "getting powerdown GPIO\n");
sensor->powerdown_alt = devm_gpiod_get_optional(dev, "powerdown-alt", GPIOD_OUT_HIGH);
if (IS_ERR(sensor->powerdown_alt))
return dev_err_probe(dev, PTR_ERR(sensor->powerdown_alt), "getting powerdown-alt GPIO\n");
pm_runtime_set_suspended(dev);
pm_runtime_enable(dev);
pm_runtime_set_autosuspend_delay(dev, 1000);
@ -699,7 +681,6 @@ static int ov2680_suspend(struct device *dev)
struct ov2680_device *sensor = to_ov2680_sensor(sd);
gpiod_set_value_cansleep(sensor->powerdown, 1);
gpiod_set_value_cansleep(sensor->powerdown_alt, 1);
return 0;
}
@ -712,7 +693,6 @@ static int ov2680_resume(struct device *dev)
usleep_range(5000, 6000);
gpiod_set_value_cansleep(sensor->powerdown, 0);
gpiod_set_value_cansleep(sensor->powerdown_alt, 0);
/* according to DS, 20ms is needed between PWDN and i2c access */
msleep(20);

View File

@ -114,7 +114,6 @@ struct ov2680_device {
struct mutex input_lock;
struct i2c_client *client;
struct gpio_desc *powerdown;
struct gpio_desc *powerdown_alt;
bool is_streaming;
struct ov2680_mode {