]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - arch/arm/mach-s3c24xx/setup-camif.c
Merge tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty...
[karo-tx-linux.git] / arch / arm / mach-s3c24xx / setup-camif.c
1 /*
2  * Copyright (C) 2012 Sylwester Nawrocki <sylvester.nawrocki@gmail.com>
3  *
4  * Helper functions for S3C24XX/S3C64XX SoC series CAMIF driver
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10
11 #include <linux/gpio.h>
12 #include <plat/gpio-cfg.h>
13 #include <mach/gpio-samsung.h>
14
15 /* Number of camera port pins, without FIELD */
16 #define S3C_CAMIF_NUM_GPIOS     13
17
18 /* Default camera port configuration helpers. */
19
20 static void camif_get_gpios(int *gpio_start, int *gpio_reset)
21 {
22 #ifdef CONFIG_ARCH_S3C24XX
23         *gpio_start = S3C2410_GPJ(0);
24         *gpio_reset = S3C2410_GPJ(12);
25 #else
26         /* s3c64xx */
27         *gpio_start = S3C64XX_GPF(0);
28         *gpio_reset = S3C64XX_GPF(3);
29 #endif
30 }
31
32 int s3c_camif_gpio_get(void)
33 {
34         int gpio_start, gpio_reset;
35         int ret, i;
36
37         camif_get_gpios(&gpio_start, &gpio_reset);
38
39         for (i = 0; i < S3C_CAMIF_NUM_GPIOS; i++) {
40                 int gpio = gpio_start + i;
41
42                 if (gpio == gpio_reset)
43                         continue;
44
45                 ret = gpio_request(gpio, "camif");
46                 if (!ret)
47                         ret = s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
48                 if (ret) {
49                         pr_err("failed to configure GPIO %d\n", gpio);
50                         for (--i; i >= 0; i--)
51                                 gpio_free(gpio--);
52                         return ret;
53                 }
54                 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
55         }
56
57         return 0;
58 }
59
60 void s3c_camif_gpio_put(void)
61 {
62         int i, gpio_start, gpio_reset;
63
64         camif_get_gpios(&gpio_start, &gpio_reset);
65
66         for (i = 0; i < S3C_CAMIF_NUM_GPIOS; i++) {
67                 int gpio = gpio_start + i;
68                 if (gpio != gpio_reset)
69                         gpio_free(gpio);
70         }
71 }