1 #include <linux/module.h>
2 #include <linux/kernel.h>
3 #include <linux/init.h>
5 #include <linux/interrupt.h>
6 #include <linux/sched.h>
8 #include <linux/sysctl.h>
9 #include <linux/proc_fs.h>
10 #include <linux/platform_device.h>
11 #include <linux/miscdevice.h>
12 #include <linux/slab.h>
14 #include <asm/uaccess.h>
15 #include <linux/timer.h>
16 #include <linux/input.h>
17 #include <linux/adc.h>
18 #include <linux/delay.h>
19 #include <linux/string.h>
22 #include <mach/rk29_lightsensor.h>
24 struct rk29_lsr_platform_data *lightsensor;
25 static void lsr_report_value(struct input_dev *input_dev, int value)
27 input_report_abs(input_dev, ABS_X, value);
28 //input_sync(input_dev);
32 static inline void timer_callback(unsigned long data)
36 adc_async_read(lightsensor->client);
37 mutex_lock(&lightsensor->lsr_mutex);
38 rate = lightsensor->rate;
39 mutex_unlock(&lightsensor->lsr_mutex);
40 if(lightsensor->client->result != lightsensor->oldresult)
42 lsr_report_value(lightsensor->input_dev, lightsensor->client->result);
43 lightsensor->oldresult = lightsensor->client->result;
45 ret = mod_timer( &lightsensor->timer, jiffies + msecs_to_jiffies(RATE(rate)));
47 printk("Error in mod_timer\n");
49 static inline void set_lsr_value(bool state)
52 lightsensor->lsr_state = 1;
54 lightsensor->lsr_state = 0;
55 gpio_direction_output(LSR_GPIO, lightsensor->lsr_state);
56 gpio_set_value(LSR_GPIO, lightsensor->lsr_state);
59 static inline unsigned int get_lsr_value(void)
61 if(0 == lightsensor->lsr_state)
67 static inline unsigned int get_adc_value(void)
70 return lightsensor->client->result;
73 static inline unsigned int set_lsr_rate(unsigned int value)
75 mutex_lock(&lightsensor->lsr_mutex);
80 lightsensor->rate = value;
81 mutex_unlock(&lightsensor->lsr_mutex);
84 static inline unsigned int set_lsr_timer(unsigned int value)
88 if(1 != lightsensor->timer_on)
90 add_timer(&lightsensor->timer);
91 lightsensor->timer_on = 1;
97 if(0 != lightsensor->timer_on)
99 del_timer(&lightsensor->timer);
100 lightsensor->timer_on = 0;
109 static ssize_t lsr_store_value(struct device *dev,
110 struct device_attribute *attr,
111 const char *buf, size_t count)
116 if (strict_strtoul(buf, 10, &val) < 0)
121 set_lsr_value(false);
125 static ssize_t lsr_show_value(struct device *dev,
126 struct device_attribute *attr, char *buf)
128 return sprintf(buf, "lsr value:%d\nadc value:%d\n", get_lsr_value(),get_adc_value());
131 static DEVICE_ATTR(value, S_IWUSR|S_IRUGO, lsr_show_value, lsr_store_value );
133 static struct attribute *lsr_attributes[] = {
134 &dev_attr_value.attr,
138 static const struct attribute_group lsr_attr_group = {
139 .attrs = lsr_attributes,
141 static int rk29_lsr_io_init(struct platform_device *dev)
144 struct platform_device *pdev = dev;
145 struct rk29_lsr_platform_data *pdata = pdev->dev.platform_data;
147 err = gpio_request(pdata->gpio, pdata->desc ?: "rk29-lsr");
149 gpio_free(pdata->gpio);
150 printk("-------request RK29_PIN6_PB1 fail--------\n");
154 gpio_direction_output(pdata->gpio, pdata->active_low);
155 gpio_set_value(pdata->gpio, pdata->active_low);
156 set_lsr_value(STARTUP_LEV_LOW);
157 err = sysfs_create_group(&pdev->dev.kobj, &lsr_attr_group);
160 static int rk29_lsr_io_deinit(struct platform_device *dev)
162 struct platform_device *pdev = dev;
163 struct rk29_lsr_platform_data *pdata = pdev->dev.platform_data;
165 gpio_direction_output(pdata->gpio, pdata->active_low);
166 gpio_set_value(pdata->gpio, pdata->active_low);
168 gpio_free(pdata->gpio);
169 sysfs_remove_group(&pdev->dev.kobj, &lsr_attr_group);
172 static void callback(struct adc_client *client, void *callback_param, int result)
174 client->result = result;
176 static int rk29_lsr_adc_init(struct platform_device *dev)
178 struct rk29_lsr_platform_data *pdata = dev->dev.platform_data;
179 pdata->client = adc_register(pdata->adc_chn, callback, "lsr_adc");
182 mutex_init(&pdata->lsr_mutex);
185 static void rk29_lsr_adc_deinit(struct platform_device *dev)
187 struct rk29_lsr_platform_data *pdata = dev->dev.platform_data;
188 adc_unregister(pdata->client);
189 mutex_destroy(&pdata->lsr_mutex);
192 static void rk29_lsr_timer_init(struct platform_device *dev)
195 struct rk29_lsr_platform_data *pdata = dev->dev.platform_data;
196 setup_timer(&pdata->timer, timer_callback, 0);
197 lightsensor->timer_on = 1;
198 ret = mod_timer( &pdata->timer, jiffies + msecs_to_jiffies(pdata->delay_time) );
200 printk("Error in mod_timer\n");
203 static void rk29_lsr_timer_deinit(struct platform_device *dev)
205 struct rk29_lsr_platform_data *pdata = dev->dev.platform_data;
206 del_timer(&pdata->timer);
207 lightsensor->timer_on = 0;
210 static void rk29_lsr_input_init(struct platform_device *dev)
213 struct rk29_lsr_platform_data *pdata = dev->dev.platform_data;
214 pdata->input_dev = input_allocate_device();
215 if (!pdata->input_dev) {
216 printk(KERN_ERR"rk29_lsr_input_init: Failed to allocate input device\n");
217 goto init_input_register_device_failed;
219 pdata->input_dev->name = "lsensor";
220 pdata->input_dev->dev.parent = &dev->dev;
221 pdata->input_dev->evbit[0] = BIT(EV_ABS);
222 input_set_abs_params(pdata->input_dev,ABS_X,0,0x3ff,0,0);
223 ret = input_register_device(pdata->input_dev);
225 init_input_register_device_failed:
226 input_free_device(pdata->input_dev);
229 static void rk29_lsr_input_deinit(struct platform_device *dev)
231 struct rk29_lsr_platform_data *pdata = dev->dev.platform_data;
232 input_unregister_device(pdata->input_dev);
233 input_free_device(pdata->input_dev);
236 static int __devinit lsr_probe(struct platform_device *pdev)
238 lightsensor = kzalloc(sizeof(struct rk29_lsr_platform_data), GFP_KERNEL);
241 dev_err(&pdev->dev, "no memory for state\n");
242 goto err_kzalloc_lightsensor;
244 lightsensor->gpio = LSR_GPIO;
245 lightsensor->desc = "rk29-lsr";
246 lightsensor->adc_chn = 1;
247 lightsensor->delay_time = 1000;
248 lightsensor->rate = 100;
249 lightsensor->oldresult = 0;
250 lightsensor->active_low = STARTUP_LEV_LOW;
251 pdev->dev.platform_data = lightsensor;
252 rk29_lsr_io_init(pdev);
253 rk29_lsr_adc_init(pdev);
254 rk29_lsr_timer_init(pdev);
255 rk29_lsr_input_init(pdev);
258 err_kzalloc_lightsensor:
264 static int __devexit lsr_remove(struct platform_device *pdev)
266 rk29_lsr_io_deinit(pdev);
267 rk29_lsr_adc_deinit(pdev);
268 rk29_lsr_timer_deinit(pdev);
269 rk29_lsr_input_deinit(pdev);
274 static int lsr_suspend(struct platform_device *pdev, pm_message_t state)
277 set_lsr_value(LSR_OFF);
281 static int lsr_resume(struct platform_device *pdev)
284 set_lsr_value(LSR_ON);
290 static struct platform_driver lsr_device_driver = {
292 .remove = __devexit_p(lsr_remove),
293 .suspend = lsr_suspend,
294 .resume = lsr_resume,
297 .owner = THIS_MODULE,
301 static int lsr_adc_open(struct inode * inode, struct file * file)
303 set_lsr_value(LSR_ON);
307 static int lsr_adc_ioctl(struct tty_struct * tty,struct file * file,unsigned int cmd, unsigned long arg)
312 case LSR_IOCTL_ENABLE:
315 case LSR_IOCTL_SETRATE:
318 case LSR_IOCTL_DEVNAME:
319 ret = copy_to_user((void __user *)arg,lightsensor->input_dev->name,strlen(lightsensor->input_dev->name)+1);
321 case LSR_IOCTL_SWICTH:
330 static ssize_t lsr_adc_read(struct file *file, char __user *userbuf, size_t bytes, loff_t *off)
333 ret = copy_to_user(userbuf,&lightsensor->client->result,bytes);
337 static struct file_operations lsr_adc_fops = {
338 .owner = THIS_MODULE,
339 .open = lsr_adc_open,
340 .read = lsr_adc_read,
341 .ioctl = lsr_adc_ioctl,
344 static struct miscdevice misc_lsr_adc_device = {
345 .minor = MISC_DYNAMIC_MINOR,
347 .fops = &lsr_adc_fops,
350 static int __init lsr_init(void)
352 platform_driver_register(&lsr_device_driver);
353 misc_register(&misc_lsr_adc_device);
357 static void __exit lsr_exit(void)
359 platform_driver_unregister(&lsr_device_driver);
360 misc_deregister(&misc_lsr_adc_device);
363 module_init(lsr_init);
364 module_exit(lsr_exit);
366 MODULE_LICENSE("GPL");
367 MODULE_AUTHOR("Seven Huang <sevenxuemin@sina.com>");
368 MODULE_DESCRIPTION("Light sensor for Backlight");
369 MODULE_ALIAS("platform:gpio-lightsensor");