summaryrefslogtreecommitdiffstats
path: root/drivers/video/via/via-gpio.c
diff options
context:
space:
mode:
authorJonathan Corbet <corbet@lwn.net>2010-04-22 17:39:34 -0600
committerJonathan Corbet <corbet@lwn.net>2010-05-07 17:17:37 -0600
commit7582eb9be85f35271fd2569681a88a5b243e9380 (patch)
tree84a234364b9e314e7b25800d473e6047da379a56 /drivers/video/via/via-gpio.c
parent75b035ace904761b8a340b524533a36e37313b29 (diff)
viafb: Turn GPIO and i2c into proper platform devices
Another step toward making this thing a real multifunction device driver. Cc: ScottFang@viatech.com.cn Cc: JosephChan@via.com.tw Cc: Harald Welte <laforge@gnumonks.org> Acked-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de> Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Diffstat (limited to 'drivers/video/via/via-gpio.c')
-rw-r--r--drivers/video/via/via-gpio.c49
1 files changed, 34 insertions, 15 deletions
diff --git a/drivers/video/via/via-gpio.c b/drivers/video/via/via-gpio.c
index 6b361177bf0..44537be1f07 100644
--- a/drivers/video/via/via-gpio.c
+++ b/drivers/video/via/via-gpio.c
@@ -7,6 +7,7 @@
#include <linux/spinlock.h>
#include <linux/gpio.h>
+#include <linux/platform_device.h>
#include "via-core.h"
#include "via-gpio.h"
#include "global.h"
@@ -172,12 +173,27 @@ static void viafb_gpio_disable(struct viafb_gpio *gpio)
via_write_reg_mask(VIASR, gpio->vg_port_index, 0, 0x02);
}
+/*
+ * Look up a specific gpio and return the number it was assigned.
+ */
+int viafb_gpio_lookup(const char *name)
+{
+ int i;
+ for (i = 0; i < gpio_config.gpio_chip.ngpio; i++)
+ if (!strcmp(name, gpio_config.active_gpios[i]->vg_name))
+ return gpio_config.gpio_chip.base + i;
+ return -1;
+}
+EXPORT_SYMBOL_GPL(viafb_gpio_lookup);
-
-int viafb_create_gpios(struct viafb_dev *vdev,
- const struct via_port_cfg *port_cfg)
+/*
+ * Platform device stuff.
+ */
+static __devinit int viafb_gpio_probe(struct platform_device *platdev)
{
+ struct viafb_dev *vdev = platdev->dev.platform_data;
+ struct via_port_cfg *port_cfg = vdev->port_cfg;
int i, ngpio = 0, ret;
struct viafb_gpio *gpio;
unsigned long flags;
@@ -222,11 +238,10 @@ int viafb_create_gpios(struct viafb_dev *vdev,
gpio_config.gpio_chip.ngpio = 0;
}
return ret;
-/* Port enable ? */
}
-int viafb_destroy_gpios(void)
+static int viafb_gpio_remove(struct platform_device *platdev)
{
unsigned long flags;
int ret = 0, i;
@@ -253,16 +268,20 @@ out:
return ret;
}
-/*
- * Look up a specific gpio and return the number it was assigned.
- */
-int viafb_gpio_lookup(const char *name)
+static struct platform_driver via_gpio_driver = {
+ .driver = {
+ .name = "viafb-gpio",
+ },
+ .probe = viafb_gpio_probe,
+ .remove = viafb_gpio_remove,
+};
+
+int viafb_gpio_init(void)
{
- int i;
+ return platform_driver_register(&via_gpio_driver);
+}
- for (i = 0; i < gpio_config.gpio_chip.ngpio; i++)
- if (!strcmp(name, gpio_config.active_gpios[i]->vg_name))
- return gpio_config.gpio_chip.base + i;
- return -1;
+void viafb_gpio_exit(void)
+{
+ platform_driver_unregister(&via_gpio_driver);
}
-EXPORT_SYMBOL_GPL(viafb_gpio_lookup);