summaryrefslogtreecommitdiff
path: root/ANDROID_3.4.5/drivers/input/sensor/stk3310/stk3310.c
diff options
context:
space:
mode:
Diffstat (limited to 'ANDROID_3.4.5/drivers/input/sensor/stk3310/stk3310.c')
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/stk3310/stk3310.c644
1 files changed, 0 insertions, 644 deletions
diff --git a/ANDROID_3.4.5/drivers/input/sensor/stk3310/stk3310.c b/ANDROID_3.4.5/drivers/input/sensor/stk3310/stk3310.c
deleted file mode 100755
index 4e9fde10..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/stk3310/stk3310.c
+++ /dev/null
@@ -1,644 +0,0 @@
-/*
- * stk3310.c - stk3310 ALS & Proximity Driver
- *
- * By Intersil Corp
- * Michael DiGioia
- *
- * Based on isl29011.c
- * by Mike DiGioia <mdigioia@intersil.com>
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/i2c.h>
-#include <linux/kernel.h>
-#include <linux/hwmon.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/sysfs.h>
-#include <linux/pm_runtime.h>
-#include <linux/input-polldev.h>
-#include <linux/miscdevice.h>
-#include <asm/uaccess.h>
-//#include <linux/earlysuspend.h>
-#include <linux/platform_device.h>
-#include "../sensor.h"
-#define SENSOR_I2C_NAME "stk3310"
-#define SENSOR_I2C_ADDR 0x48
-
-#undef dbg
-#define dbg(fmt, args...)
-#undef errlog
-#undef klog
-#define errlog(fmt, args...) printk(KERN_ERR "[%s]: " fmt, __FUNCTION__, ## args)
-#define klog(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-/* Insmod parameters */
-//I2C_CLIENT_INSMOD_1(stk3310);
-
-#define MODULE_NAME "stk3310"
-
-
-struct stk_device {
- struct input_polled_dev* input_poll_devl;
- struct input_polled_dev* input_poll_devp;
- struct i2c_client* client;
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend earlysuspend;
-#endif
-
-};
-
-static struct stk_device* l_sensorconfig = NULL;
-static int l_enable = 1; // 0:don't report data
-static int p_enable = 1; // 0:don't report data
-
-static struct i2c_client *this_client = NULL;
-
-static DEFINE_MUTEX(mutex);
-
-static int isl_get_lux_datal(struct i2c_client* client)
-{
- __u16 resH, resL;
- resL = i2c_smbus_read_byte_data(client, 0x14);
- resH = i2c_smbus_read_byte_data(client, 0x13);
- if ((resL < 0) || (resH < 0))
- {
- errlog("Error to read lux_data!\n");
- return -1;
- }
- return (resH <<8 | resL) ;//* idev->range / idev->resolution;
-}
-
-
-static int isl_get_lux_datap(struct i2c_client* client)
-{
- __u16 resH, resL;
- resL = i2c_smbus_read_byte_data(client, 0x12);
- resH = i2c_smbus_read_byte_data(client, 0x11);
- if ((resL < 0) || (resH < 0))
- {
- errlog("Error to read lux_data!\n");
- return -1;
- }
- //return (resH <<8 | resL) ;//* idev->range / idev->resolution;
- if(resH>0)
- return 0;
- else
- return 6;
-}
-
-//#define PXM 0
-static int isl_set_default_config(struct i2c_client *client)
-{
- int ret=0;
- unsigned char regval;
-//#if PXM
- ret = i2c_smbus_write_byte_data(client, 0, (1 << 1));
- if(p_enable)
- {
- regval = i2c_smbus_read_byte_data(l_sensorconfig->client, 0);
- regval |= (1 << 0);
- i2c_smbus_write_byte_data(l_sensorconfig->client, 0, regval);
- }
- //ret = i2c_smbus_write_byte_data(client, 0, (1 << 0));
-//#else
-//#endif
- if (ret < 0)
- return -EINVAL;
- return 0;
-}
-
-/* Return 0 if detection is successful, -ENODEV otherwise */
-static int stk3310_detect(struct i2c_client *client/*, int kind,
- struct i2c_board_info *info*/)
-{
- int device;
-
- device= i2c_smbus_read_byte_data(client, 0x3e);
- if(0x13==device)
- {
- printk(KERN_ALERT "stk3310 detected OK\n");
- return 0;
- }
- else
- return -1;
-}
-
-int isl_input_open(struct input_dev* input)
-{
- return 0;
-}
-
-void isl_input_close(struct input_dev* input)
-{
-}
-
-static void isl_input_lux_poll_l(struct input_polled_dev *dev)
-{
- struct stk_device* idev = dev->private;
- struct input_dev* input = idev->input_poll_devl->input;
- struct i2c_client* client = idev->client;
- if (l_enable != 0)
- {
- mutex_lock(&mutex);
- //printk(KERN_ALERT "by flashchen val is %x",val);
- input_report_abs(input, ABS_MISC, isl_get_lux_datal(client));
- input_sync(input);
- mutex_unlock(&mutex);
- }
-}
-
-static void isl_input_lux_poll_p(struct input_polled_dev *dev)
-{
- struct stk_device* idev = dev->private;
- struct input_dev* input = idev->input_poll_devp->input;
- struct i2c_client* client = idev->client;
- if (p_enable != 0)
- {
- mutex_lock(&mutex);
- //printk(KERN_ALERT "by flashchen val is %x",val);
- input_report_abs(input, ABS_MISC, isl_get_lux_datap(client));
- input_sync(input);
- mutex_unlock(&mutex);
- }
-}
-
-static struct i2c_device_id stk3310_id[] = {
- {"stk3310", 0},
- {}
-};
-
-MODULE_DEVICE_TABLE(i2c, stk3310_id);
-
-
-static int mmad_open(struct inode *inode, struct file *file)
-{
- dbg("Open the l-sensor node...\n");
- return 0;
-}
-
-static int mmad_release(struct inode *inode, struct file *file)
-{
- dbg("Close the l-sensor node...\n");
- return 0;
-}
-
-static ssize_t mmadl_read(struct file *fl, char __user *buf, size_t cnt, loff_t *lf)
-{
- int lux_data = 0;
-
- mutex_lock(&mutex);
- lux_data = isl_get_lux_datal(l_sensorconfig->client);
- mutex_unlock(&mutex);
- if (lux_data < 0)
- {
- errlog("Failed to read lux data!\n");
- return -1;
- }
- printk(KERN_ALERT "lux_data is %x\n",lux_data);
- return 0;
- copy_to_user(buf, &lux_data, sizeof(lux_data));
- return sizeof(lux_data);
-}
-
-
-static ssize_t mmadp_read(struct file *fl, char __user *buf, size_t cnt, loff_t *lf)
-{
- int lux_data = 0;
-
- mutex_lock(&mutex);
- lux_data = isl_get_lux_datap(l_sensorconfig->client);
- mutex_unlock(&mutex);
- if (lux_data < 0)
- {
- errlog("Failed to read lux data!\n");
- return -1;
- }
- printk(KERN_ALERT "lux_data is %x\n",lux_data);
- return 0;
- copy_to_user(buf, &lux_data, sizeof(lux_data));
- return sizeof(lux_data);
-}
-
-static long
-mmadl_ioctl(/*struct inode *inode,*/ struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- //char rwbuf[5];
- short enable; //amsr = -1;
- unsigned int uval;
-
- dbg("l-sensor ioctr...\n");
- //memset(rwbuf, 0, sizeof(rwbuf));
- switch (cmd) {
- case LIGHT_IOCTL_SET_ENABLE:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- return -EFAULT;
- }
- dbg("enable=%d\n",enable);
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor.\n", enable);
-
- //l_sensorconfig.sensor_enable = enable;
- dbg("Should to implement d/e the light sensor!\n");
- l_enable = enable;
-
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- return -EINVAL;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
-#define DRVID 0
- uval = DRVID ;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("stk3310_driver_id:%d\n",uval);
- default:
- break;
- }
-
- return 0;
-}
-
-
-static long
-mmadp_ioctl(/*struct inode *inode,*/ struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- //char rwbuf[5];
- short enable; //amsr = -1;
- unsigned int uval;
- unsigned char regval;
-
- dbg("l-sensor ioctr...\n");
- //memset(rwbuf, 0, sizeof(rwbuf));
- switch (cmd) {
- case LIGHT_IOCTL_SET_ENABLE:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- return -EFAULT;
- }
- dbg("enable=%d\n",enable);
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor.\n", enable);
-
- //l_sensorconfig.sensor_enable = enable;
- dbg("Should to implement d/e the light sensor!\n");
- p_enable = enable;
- if(p_enable)
- {
- regval = i2c_smbus_read_byte_data(l_sensorconfig->client, 0);
- regval |= (1 << 0);
- i2c_smbus_write_byte_data(l_sensorconfig->client, 0, regval);
- }
- else
- {
- regval = i2c_smbus_read_byte_data(l_sensorconfig->client, 0);
- regval &= ~(1 << 0);
- i2c_smbus_write_byte_data(l_sensorconfig->client, 0, regval);
- }
-
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- return -EINVAL;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
-#define DRVID 0
- uval = DRVID ;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("stk3310_driver_id:%d\n",uval);
- default:
- break;
- }
-
- return 0;
-}
-
-
-static struct file_operations mmadl_fops = {
- .owner = THIS_MODULE,
- .open = mmad_open,
- .release = mmad_release,
- .read = mmadl_read,
- .unlocked_ioctl = mmadl_ioctl,
-};
-
-static struct miscdevice mmadl_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "lsensor_ctrl",
- .fops = &mmadl_fops,
-};
-
-static struct file_operations mmadp_fops = {
- .owner = THIS_MODULE,
- .open = mmad_open,
- .release = mmad_release,
- .read = mmadp_read,
- .unlocked_ioctl = mmadp_ioctl,
-};
-
-static struct miscdevice mmadp_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "psensor_ctrl",
- .fops = &mmadp_fops,
-};
-#if 0
-static void stk3310_early_suspend(struct early_suspend *h)
-{
- dbg("start\n");
- mutex_lock(&mutex);
- //pm_runtime_get_sync(dev);
- //isl_set_mod(client, ISL_MOD_POWERDOWN);
- //pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- dbg("exit\n");
-}
-
-static void stk3310_late_resume(struct early_suspend *h)
-{
- struct i2c_client *client = l_sensorconfig->client;
-
- dbg("start\n");
- mutex_lock(&mutex);
- //pm_runtime_get_sync(dev);
- //isl_set_mod(client, last_mod);
- isl_set_default_config(client);
- //pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- dbg("exit\n");
-}
-#endif
-
-static int
-stk3310_probe(struct i2c_client *client/*, const struct i2c_device_id *id*/)
-{
- int res=0;
-
- struct stk_device* idev = kzalloc(sizeof(struct stk_device), GFP_KERNEL);
- if(!idev)
- return -ENOMEM;
-
- l_sensorconfig = idev;
-
-/* last mod is ALS continuous */
- //pm_runtime_enable(&client->dev);
- idev->input_poll_devl = input_allocate_polled_device();
- if(!idev->input_poll_devl)
- {
- res = -ENOMEM;
- goto err_input_allocate_device;
- }
- idev->input_poll_devp = input_allocate_polled_device();
- if(!idev->input_poll_devp)
- {
- res = -ENOMEM;
- goto err_input_allocate_device;
- }
- idev->client = client;
-
- idev->input_poll_devl->private = idev;
- idev->input_poll_devl->poll = isl_input_lux_poll_l;
- idev->input_poll_devl->poll_interval = 100;//50;
- idev->input_poll_devl->input->open = isl_input_open;
- idev->input_poll_devl->input->close = isl_input_close;
- idev->input_poll_devl->input->name = "lsensor_lux";
- idev->input_poll_devl->input->id.bustype = BUS_I2C;
- idev->input_poll_devl->input->dev.parent = &client->dev;
-
- input_set_drvdata(idev->input_poll_devl->input, idev);
- input_set_capability(idev->input_poll_devl->input, EV_ABS, ABS_MISC);
- input_set_abs_params(idev->input_poll_devl->input, ABS_MISC, 0, 16000, 0, 0);
-
- idev->input_poll_devp->private = idev;
- idev->input_poll_devp->poll = isl_input_lux_poll_p;
- idev->input_poll_devp->poll_interval = 100;//50;
- idev->input_poll_devp->input->open = isl_input_open;
- idev->input_poll_devp->input->close = isl_input_close;
- idev->input_poll_devp->input->name = "psensor_lux";
- idev->input_poll_devp->input->id.bustype = BUS_I2C;
- idev->input_poll_devp->input->dev.parent = &client->dev;
-
- input_set_drvdata(idev->input_poll_devp->input, idev);
- input_set_capability(idev->input_poll_devp->input, EV_ABS, ABS_MISC);
- input_set_abs_params(idev->input_poll_devp->input, ABS_MISC, 0, 16000, 0, 0);
- i2c_set_clientdata(client, idev);
- /* set default config after set_clientdata */
- res = isl_set_default_config(client);
- res = misc_register(&mmadl_device);
- if (res) {
- errlog("mmad_device register failed\n");
- goto err_misc_registerl;
- }
- res = misc_register(&mmadp_device);
- if (res) {
- errlog("mmad_device register failed\n");
- goto err_misc_registerp;
- }
- res = input_register_polled_device(idev->input_poll_devl);
- if(res < 0)
- goto err_input_register_devicel;
- res = input_register_polled_device(idev->input_poll_devp);
- if(res < 0)
- goto err_input_register_devicep;
- // suspend/resume register
-#ifdef CONFIG_HAS_EARLYSUSPEND
- idev->earlysuspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
- idev->earlysuspend.suspend = stk3310_early_suspend;
- idev->earlysuspend.resume = stk3310_late_resume;
- register_early_suspend(&(idev->earlysuspend));
-#endif
-
- dbg("stk3310 probe succeed!\n");
- return 0;
-err_input_register_devicep:
- input_free_polled_device(idev->input_poll_devp);
-err_input_register_devicel:
- input_free_polled_device(idev->input_poll_devl);
-err_misc_registerp:
- misc_deregister(&mmadp_device);
-err_misc_registerl:
- misc_deregister(&mmadl_device);
-err_input_allocate_device:
- //__pm_runtime_disable(&client->dev, false);
- kfree(idev);
- return res;
-}
-
-static int stk3310_remove(struct i2c_client *client)
-{
- struct stk_device* idev = i2c_get_clientdata(client);
-
- //unregister_early_suspend(&(idev->earlysuspend));
- misc_deregister(&mmadl_device);
- misc_deregister(&mmadp_device);
- input_unregister_polled_device(idev->input_poll_devl);
- input_unregister_polled_device(idev->input_poll_devp);
- input_free_polled_device(idev->input_poll_devl);
- input_free_polled_device(idev->input_poll_devp);
- //__pm_runtime_disable(&client->dev, false);
- kfree(idev);
- printk(KERN_INFO MODULE_NAME ": %s stk3310 remove call, \n", __func__);
- return 0;
-}
-
-//****************add platform_device & platform_driver for suspend &resume 2013-7-2
-static int ls_probe(struct platform_device *pdev){
- //printk("<<<%s\n", __FUNCTION__);
- return 0;
-}
-static int ls_remove(struct platform_device *pdev){
- //printk("<<<%s\n", __FUNCTION__);
- return 0;
-}
-static int ls_suspend(struct platform_device *pdev, pm_message_t state){
- printk("<<<%s\n", __FUNCTION__);
-
- return 0;
-}
-
-static int ls_resume(struct platform_device *pdev){
- //return 0;
- int ret = 0;
- int count = 0;
-
- struct i2c_client *client = l_sensorconfig->client;
- printk("<<<%s\n", __FUNCTION__);
-
-RETRY:
- mutex_lock(&mutex);
-
- ret = isl_set_default_config(client);
-
- mutex_unlock(&mutex);
- if (ret < 0){
- printk("%s isl_set_default_config fail!\n", __FUNCTION__);
- count++;
- if (count < 5){
- mdelay(2);
- goto RETRY;
- }
- else
- return ret;
- }
- return 0;
-
-}
-static void lsdev_release(struct device *dev)
-{
- return;
-}
-static struct platform_device lsdev = {
- .name = "lsdevice",
- .id = -1,
- .dev = {
- .release = lsdev_release,
- },
-};
-static struct platform_driver lsdrv = {
- .probe = ls_probe,
- .remove = ls_remove,
- .suspend = ls_suspend,
- .resume = ls_resume,
- .driver = {
- .name = "lsdevice",
- },
-};
-//********************************************************************
-
-
-static int __init sensor_stk3310_init(void)
-{
- int ret = 0;
- printk(KERN_INFO MODULE_NAME ": %s stk3310 init call, \n", __func__);
- /*
- * Force device to initialize: i2c-15 0x44
- * If i2c_new_device is not called, even stk3310_detect will not run
- * TODO: rework to automatically initialize the device
- */
- //i2c_new_device(i2c_get_adapter(15), &isl_info);
- //return i2c_add_driver(&stk3310_driver);
- if (!(this_client = sensor_i2c_register_device(2, SENSOR_I2C_ADDR, SENSOR_I2C_NAME)))
- {
- printk(KERN_EMERG"Can't register gsensor i2c device!\n");
- return -1;
- }
- if (stk3310_detect(this_client))
- {
- errlog("Can't find light sensor stk3310!\n");
- goto detect_fail;
- }
- if(stk3310_probe(this_client))
- {
- errlog("Erro for probe!\n");
- goto detect_fail;
- }
-
- ret = platform_device_register(&lsdev);
- if (ret){
- printk("<<<platform_device_register fail!\n");
- return ret;
- }
- ret = platform_driver_register(&lsdrv);
- if (ret){
- printk("<<<platform_driver_register fail!\n");
- platform_device_unregister(&lsdev);
- return ret;
- }
- return 0;
-
-detect_fail:
- sensor_i2c_unregister_device(this_client);
- return -1;
-}
-
-static void __exit sensor_stk3310_exit(void)
-{
- printk(KERN_INFO MODULE_NAME ": %s stk3310 exit call \n", __func__);
- stk3310_remove(this_client);
- sensor_i2c_unregister_device(this_client);
- platform_driver_unregister(&lsdrv);
- platform_device_unregister(&lsdev);
- //i2c_del_driver(&stk3310_driver);
-}
-
-module_init(sensor_stk3310_init);
-module_exit(sensor_stk3310_exit);
-
-MODULE_AUTHOR("flash");
-MODULE_ALIAS("stk3310 ALS");
-MODULE_DESCRIPTION("Stk3310 Driver");
-MODULE_LICENSE("GPL v2");
-