1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/* wmt.camera.flash <flash>:<en>:<flen>
* wmt.camera.flash eup2471:3:2
*/
#include <linux/gpio.h>
#include <mach/wmt_env.h>
#include "../cmos-subdev.h"
#include "../../wmt-vid.h"
#include "flash.h"
struct eup2471_struct {
int gpio_en;
int gpio_flen;
};
static struct eup2471_struct *eup;
#define EUP2471_I2CADDR 0x37
/*
* TODO register flash as a subdev
*/
static int flash_dev_set_mode(int mode)
{
if (!eup)
return -EINVAL;
switch (mode) {
case FLASH_MODE_OFF:
gpio_direction_output(eup->gpio_en, 0);
gpio_direction_output(eup->gpio_flen, 0);
break;
case FLASH_MODE_ON:
gpio_direction_output(eup->gpio_en, 1);
gpio_direction_output(eup->gpio_flen, 0);
msleep(1);
wmt_vid_i2c_write(EUP2471_I2CADDR, 0x00, 0x00);
wmt_vid_i2c_write(EUP2471_I2CADDR, 0x01, 0x33);
break;
case FLASH_MODE_STROBE:
gpio_direction_output(eup->gpio_en, 1);
gpio_direction_output(eup->gpio_flen, 1);
msleep(1);
gpio_direction_output(eup->gpio_flen, 0);
break;
case FLASH_MODE_TORCH:
gpio_direction_output(2, 0);
gpio_direction_output(3, 1);
msleep(1);
break;
default:
return -EINVAL;
}
return 0;
}
static int parse_charger_param(void)
{
char *dev_name = "eup2471";
char *env = "wmt.camera.flash";
char s[64];
size_t l = sizeof(s);
int gpio_en, gpio_flen;
int rc;
if (wmt_getsyspara(env, s, &l)) {
//pr_err("read %s fail!\n", env);
return -EINVAL;
}
if (strncmp(s, dev_name, strlen(dev_name))) {
return -EINVAL;
}
rc = sscanf(s, "eup2471:%d:%d", &gpio_en, &gpio_flen);
if (rc < 2) {
pr_err("bad uboot env: %s\n", env);
return -EINVAL;
}
rc = gpio_request(gpio_en, "flash eup2471 en");
if (rc) {
pr_err("flash en gpio(%d) request failed\n", gpio_en);
return rc;
}
rc = gpio_request(gpio_flen, "flash eup2471 flen");
if (rc) {
pr_err("flash flen gpio(%d) request failed\n", gpio_flen);
gpio_free(gpio_en);
return rc;
}
eup = kzalloc(sizeof(*eup), GFP_KERNEL);
if (!eup)
return -ENOMEM;
eup->gpio_en = gpio_en;
eup->gpio_flen = gpio_flen;
printk("flash eup2471 register ok: en %d, flen %d\n",
eup->gpio_en, eup->gpio_flen);
return 0;
}
static int flash_dev_init(void)
{
if (eup)
return -EINVAL;
return parse_charger_param();
}
static void flash_dev_exit(void)
{
if (eup) {
gpio_free(eup->gpio_en);
gpio_free(eup->gpio_flen);
kfree(eup);
eup = NULL;
}
}
struct flash_dev flash_dev_eup2471 = {
.name = "eup2471",
.init = flash_dev_init,
.set_mode = flash_dev_set_mode,
.exit = flash_dev_exit,
};
|