mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 22:50:41 +00:00
fbdev/media: Use GPIO descriptors for VIA GPIO
The VIA fbdev exposes a custom GPIO chip for its GPIOs, these are in turn looked up the camera driver using a custom API. Drop the custom API, provide a look-up table and convert to GPIO descriptors. Note proper polarity on the RESET line. Cc: Jonathan Corbet <corbet@lwn.net> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Helge Deller <deller@gmx.de>
This commit is contained in:
parent
568c69ae2f
commit
d4313a68ec
@ -11,7 +11,7 @@
|
|||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio/consumer.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/videodev2.h>
|
#include <linux/videodev2.h>
|
||||||
@ -26,7 +26,6 @@
|
|||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/pm_qos.h>
|
#include <linux/pm_qos.h>
|
||||||
#include <linux/via-core.h>
|
#include <linux/via-core.h>
|
||||||
#include <linux/via-gpio.h>
|
|
||||||
#include <linux/via_i2c.h>
|
#include <linux/via_i2c.h>
|
||||||
|
|
||||||
#ifdef CONFIG_X86
|
#ifdef CONFIG_X86
|
||||||
@ -71,8 +70,8 @@ struct via_camera {
|
|||||||
/*
|
/*
|
||||||
* GPIO info for power/reset management
|
* GPIO info for power/reset management
|
||||||
*/
|
*/
|
||||||
int power_gpio;
|
struct gpio_desc *power_gpio;
|
||||||
int reset_gpio;
|
struct gpio_desc *reset_gpio;
|
||||||
/*
|
/*
|
||||||
* I/O memory stuff.
|
* I/O memory stuff.
|
||||||
*/
|
*/
|
||||||
@ -180,27 +179,19 @@ static struct via_format *via_find_format(u32 pixelformat)
|
|||||||
*/
|
*/
|
||||||
static int via_sensor_power_setup(struct via_camera *cam)
|
static int via_sensor_power_setup(struct via_camera *cam)
|
||||||
{
|
{
|
||||||
int ret;
|
struct device *dev = &cam->platdev->dev;
|
||||||
|
|
||||||
|
cam->power_gpio = devm_gpiod_get(dev, "VGPIO3", GPIOD_OUT_LOW);
|
||||||
|
if (IS_ERR(cam->power_gpio))
|
||||||
|
return dev_err_probe(dev, PTR_ERR(cam->power_gpio),
|
||||||
|
"failed to get power GPIO");
|
||||||
|
|
||||||
|
/* Request the reset line asserted */
|
||||||
|
cam->reset_gpio = devm_gpiod_get(dev, "VGPIO2", GPIOD_OUT_HIGH);
|
||||||
|
if (IS_ERR(cam->reset_gpio))
|
||||||
|
return dev_err_probe(dev, PTR_ERR(cam->reset_gpio),
|
||||||
|
"failed to get reset GPIO");
|
||||||
|
|
||||||
cam->power_gpio = viafb_gpio_lookup("VGPIO3");
|
|
||||||
cam->reset_gpio = viafb_gpio_lookup("VGPIO2");
|
|
||||||
if (!gpio_is_valid(cam->power_gpio) || !gpio_is_valid(cam->reset_gpio)) {
|
|
||||||
dev_err(&cam->platdev->dev, "Unable to find GPIO lines\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
ret = gpio_request(cam->power_gpio, "viafb-camera");
|
|
||||||
if (ret) {
|
|
||||||
dev_err(&cam->platdev->dev, "Unable to request power GPIO\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
ret = gpio_request(cam->reset_gpio, "viafb-camera");
|
|
||||||
if (ret) {
|
|
||||||
dev_err(&cam->platdev->dev, "Unable to request reset GPIO\n");
|
|
||||||
gpio_free(cam->power_gpio);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
gpio_direction_output(cam->power_gpio, 0);
|
|
||||||
gpio_direction_output(cam->reset_gpio, 0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,25 +200,23 @@ static int via_sensor_power_setup(struct via_camera *cam)
|
|||||||
*/
|
*/
|
||||||
static void via_sensor_power_up(struct via_camera *cam)
|
static void via_sensor_power_up(struct via_camera *cam)
|
||||||
{
|
{
|
||||||
gpio_set_value(cam->power_gpio, 1);
|
gpiod_set_value(cam->power_gpio, 1);
|
||||||
gpio_set_value(cam->reset_gpio, 0);
|
gpiod_set_value(cam->reset_gpio, 1);
|
||||||
msleep(20); /* Probably excessive */
|
msleep(20); /* Probably excessive */
|
||||||
gpio_set_value(cam->reset_gpio, 1);
|
gpiod_set_value(cam->reset_gpio, 0);
|
||||||
msleep(20);
|
msleep(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void via_sensor_power_down(struct via_camera *cam)
|
static void via_sensor_power_down(struct via_camera *cam)
|
||||||
{
|
{
|
||||||
gpio_set_value(cam->power_gpio, 0);
|
gpiod_set_value(cam->power_gpio, 0);
|
||||||
gpio_set_value(cam->reset_gpio, 0);
|
gpiod_set_value(cam->reset_gpio, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void via_sensor_power_release(struct via_camera *cam)
|
static void via_sensor_power_release(struct via_camera *cam)
|
||||||
{
|
{
|
||||||
via_sensor_power_down(cam);
|
via_sensor_power_down(cam);
|
||||||
gpio_free(cam->power_gpio);
|
|
||||||
gpio_free(cam->reset_gpio);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------*/
|
/* --------------------------------------------------------------------------*/
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include <linux/aperture.h>
|
#include <linux/aperture.h>
|
||||||
#include <linux/via-core.h>
|
#include <linux/via-core.h>
|
||||||
#include <linux/via_i2c.h>
|
#include <linux/via_i2c.h>
|
||||||
#include <linux/via-gpio.h>
|
#include "via-gpio.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
@ -7,10 +7,11 @@
|
|||||||
|
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/gpio/driver.h>
|
#include <linux/gpio/driver.h>
|
||||||
|
#include <linux/gpio/machine.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/via-core.h>
|
#include <linux/via-core.h>
|
||||||
#include <linux/via-gpio.h>
|
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
|
#include "via-gpio.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The ports we know about. Note that the port-25 gpios are not
|
* The ports we know about. Note that the port-25 gpios are not
|
||||||
@ -189,19 +190,14 @@ static struct viafb_pm_hooks viafb_gpio_pm_hooks = {
|
|||||||
};
|
};
|
||||||
#endif /* CONFIG_PM */
|
#endif /* CONFIG_PM */
|
||||||
|
|
||||||
/*
|
static struct gpiod_lookup_table viafb_gpio_table = {
|
||||||
* Look up a specific gpio and return the number it was assigned.
|
.dev_id = "viafb-camera",
|
||||||
*/
|
.table = {
|
||||||
int viafb_gpio_lookup(const char *name)
|
GPIO_LOOKUP("via-gpio", 2, "VGPIO2", GPIO_ACTIVE_LOW),
|
||||||
{
|
GPIO_LOOKUP("via-gpio", 3, "VGPIO3", GPIO_ACTIVE_HIGH),
|
||||||
int i;
|
{ }
|
||||||
|
},
|
||||||
for (i = 0; i < viafb_gpio_config.gpio_chip.ngpio; i++)
|
};
|
||||||
if (!strcmp(name, viafb_gpio_config.active_gpios[i]->vg_name))
|
|
||||||
return viafb_gpio_config.gpio_chip.base + i;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(viafb_gpio_lookup);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Platform device stuff.
|
* Platform device stuff.
|
||||||
@ -249,12 +245,16 @@ static int viafb_gpio_probe(struct platform_device *platdev)
|
|||||||
* Get registered.
|
* Get registered.
|
||||||
*/
|
*/
|
||||||
viafb_gpio_config.gpio_chip.base = -1; /* Dynamic */
|
viafb_gpio_config.gpio_chip.base = -1; /* Dynamic */
|
||||||
|
viafb_gpio_config.gpio_chip.label = "via-gpio";
|
||||||
ret = gpiochip_add_data(&viafb_gpio_config.gpio_chip,
|
ret = gpiochip_add_data(&viafb_gpio_config.gpio_chip,
|
||||||
&viafb_gpio_config);
|
&viafb_gpio_config);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printk(KERN_ERR "viafb: failed to add gpios (%d)\n", ret);
|
printk(KERN_ERR "viafb: failed to add gpios (%d)\n", ret);
|
||||||
viafb_gpio_config.gpio_chip.ngpio = 0;
|
viafb_gpio_config.gpio_chip.ngpio = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gpiod_add_lookup_table(&viafb_gpio_table);
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
viafb_pm_register(&viafb_gpio_pm_hooks);
|
viafb_pm_register(&viafb_gpio_pm_hooks);
|
||||||
#endif
|
#endif
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
#ifndef __VIA_GPIO_H__
|
#ifndef __VIA_GPIO_H__
|
||||||
#define __VIA_GPIO_H__
|
#define __VIA_GPIO_H__
|
||||||
|
|
||||||
extern int viafb_gpio_lookup(const char *name);
|
|
||||||
extern int viafb_gpio_init(void);
|
extern int viafb_gpio_init(void);
|
||||||
extern void viafb_gpio_exit(void);
|
extern void viafb_gpio_exit(void);
|
||||||
#endif
|
#endif
|
Loading…
x
Reference in New Issue
Block a user