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 
camif_get_gpios(int * gpio_start,int * gpio_reset)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 
s3c_camif_gpio_get(void)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 
s3c_camif_gpio_put(void)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 }
72