struct i2c_client *client;
struct delayed_work p_work; //for psensor
struct delayed_work l_work; //for light sensor
-
+ struct mutex lock;
int enabled;
int irq;
};
static struct early_suspend isl29028_early_suspend;
#endif
+int g_lightlevel = 8;
+
static const int luxValues[8] = {
10, 160, 225, 320,
640, 1280, 2600, 4095
struct isl29028_data *isl = (struct isl29028_data *)container_of(work, struct isl29028_data, p_work.work);
char reg, value, int_flag;
+ mutex_lock(&isl->lock);
reg = ISL_REG_INT;
isl29028_read_reg(isl->client, reg, (char *)&int_flag);
}
if (int_flag & 0x08) {
- D("line %d; light sensor interrupt\n");
+ D("line %d; light sensor interrupt\n", __LINE__);
isl29028_write_reg(isl->client, reg, int_flag & 0xf7);
}
//D("%s: int is %#x\n", __FUNCTION__, int_flag);
D("%s: prox_int is %d\n", __FUNCTION__, (int_flag >> 7 ));
D("%s: prox_data is %#x\n", __FUNCTION__, value);
+ mutex_unlock(&isl->lock);
enable_irq(isl->irq);
}
int ret;
struct isl29028_data *isl = (struct isl29028_data *)i2c_get_clientdata(client);
+ mutex_lock(&isl->lock);
reg = ISL_REG_CONFIG;
ret = isl29028_read_reg(client, reg, &value);
value |= PROX_EN;
ret = isl29028_read_reg(client, reg, &value);
D("%s: configure reg value %#x ...\n", __FUNCTION__, value);
#endif
+ mutex_unlock(&isl->lock);
+
+ enable_irq(isl->irq);
return ret;
}
disable_irq(isl->irq);
cancel_delayed_work_sync(&isl->p_work);
- enable_irq(isl->irq);
+
+ mutex_lock(&isl->lock);
reg = ISL_REG_CONFIG;
ret = isl29028_read_reg(client, reg, &value);
D("%s: configure reg value %#x ...\n", __FUNCTION__, value);
D("%s: interrupt reg value %#x ...\n", __FUNCTION__, value2);
#endif
+ mutex_unlock(&isl->lock);
return ret;
}
static int isl29028_psensor_open(struct inode *inode, struct file *file)
{
- struct i2c_client *client =
- container_of (isl29028_psensor_misc.parent, struct i2c_client, dev);
+// struct i2c_client *client =
+// container_of (isl29028_psensor_misc.parent, struct i2c_client, dev);
D("%s\n", __func__);
if (misc_ps_opened)
return -EBUSY;
misc_ps_opened = 1;
-
- return isl29028_psensor_enable(client);
+ return 0;
+ //return isl29028_psensor_enable(client);
}
static int isl29028_psensor_release(struct inode *inode, struct file *file)
{
- struct i2c_client *client =
- container_of (isl29028_psensor_misc.parent, struct i2c_client, dev);
+// struct i2c_client *client =
+// container_of (isl29028_psensor_misc.parent, struct i2c_client, dev);
D("%s\n", __func__);
misc_ps_opened = 0;
- return isl29028_psensor_disable(client);
+ return 0;
+ //return isl29028_psensor_disable(client);
}
static long isl29028_psensor_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
char reg, val, enabled;
struct i2c_client *client =
container_of (isl29028_psensor_misc.parent, struct i2c_client, dev);
+ struct isl29028_data *isl = (struct isl29028_data *)i2c_get_clientdata(client);
D("%s cmd %d\n", __func__, _IOC_NR(cmd));
switch (cmd) {
return isl29028_psensor_disable(client);
break;
case PSENSOR_IOCTL_GET_ENABLED:
+ mutex_lock(&isl->lock);
reg = ISL_REG_CONFIG;
isl29028_read_reg(client, reg, &val);
enabled = (val & (1 << 7)) ? 1 : 0;
+ mutex_unlock(&isl->lock);
return put_user(enabled, (unsigned long __user *)arg);
break;
default:
goto err_free_gpio;
}
+
+ disable_irq(isl->irq);
+
return 0;
err_free_gpio:
int ret;
struct isl29028_data *isl = (struct isl29028_data *)i2c_get_clientdata(client);
+ mutex_lock(&isl->lock);
+
reg = ISL_REG_CONFIG;
ret = isl29028_read_reg(client, reg, &value);
value |= ALS_EN;
D("%s: configure reg value %#x ...\n", __FUNCTION__, value);
#endif
+ mutex_unlock(&isl->lock);
+
schedule_delayed_work(&(isl->l_work), msecs_to_jiffies(LSENSOR_POLL_PROMESHUTOK));
return ret;
cancel_delayed_work_sync(&(isl->l_work));
+ mutex_lock(&isl->lock);
+
reg = ISL_REG_CONFIG;
ret = isl29028_read_reg(client, reg, &value);
value &= ~ALS_EN;
D("%s: interrupt reg value %#x ...\n", __FUNCTION__, value2);
#endif
+ mutex_unlock(&isl->lock);
+
return ret;
}
for (i=0;i<7;i++)
if (value>=luxValues[i] && value<luxValues[i+1])
return i;
+ return -1;
}
static void isl29028_lsensor_work_handler(struct work_struct *work)
unsigned int als_value;
int level;
+ mutex_lock(&isl->lock);
reg = ISL_REG_ALSIR_LDATA;
isl29028_read_reg(isl->client, reg, (char *)&l_value);
reg = ISL_REG_ALSIR_HDATA;
isl29028_read_reg(isl->client, reg, (char *)&h_value);
+ mutex_unlock(&isl->lock);
+
als_value = h_value;
als_value = (als_value << 8) | l_value;
D("%s: ls_level is %d\n", __FUNCTION__, level);
#endif
- input_report_abs(isl->lsensor_input_dev, ABS_MISC, level);
- input_sync(isl->lsensor_input_dev);
-
+ if (level != g_lightlevel) {
+ g_lightlevel = level;
+ input_report_abs(isl->lsensor_input_dev, ABS_MISC, level);
+ input_sync(isl->lsensor_input_dev);
+ }
schedule_delayed_work(&(isl->l_work), msecs_to_jiffies(LSENSOR_POLL_PROMESHUTOK));
}
static int isl29028_lsensor_open(struct inode *inode, struct file *file)
{
- struct i2c_client *client =
- container_of (isl29028_lsensor_misc.parent, struct i2c_client, dev);
+// struct i2c_client *client =
+// container_of (isl29028_lsensor_misc.parent, struct i2c_client, dev);
D("%s\n", __func__);
if (misc_ls_opened)
return -EBUSY;
misc_ls_opened = 1;
-
- return isl29028_lsensor_enable(client);
+ return 0;
+ //return isl29028_lsensor_enable(client);
}
static int isl29028_lsensor_release(struct inode *inode, struct file *file)
{
- struct i2c_client *client =
- container_of (isl29028_lsensor_misc.parent, struct i2c_client, dev);
+// struct i2c_client *client =
+// container_of (isl29028_lsensor_misc.parent, struct i2c_client, dev);
D("%s\n", __func__);
misc_ls_opened = 0;
-
- return isl29028_lsensor_disable(client);
+ return 0;
+ //return isl29028_lsensor_disable(client);
}
static long isl29028_lsensor_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
char reg, val, enabled;
struct i2c_client *client =
container_of (isl29028_lsensor_misc.parent, struct i2c_client, dev);
+ struct isl29028_data *isl = (struct isl29028_data *)i2c_get_clientdata(client);
D("%s cmd %d\n", __func__, _IOC_NR(cmd));
switch (cmd) {
return isl29028_lsensor_disable(client);
break;
case LIGHTSENSOR_IOCTL_GET_ENABLED:
+ mutex_lock(&isl->lock);
reg = ISL_REG_CONFIG;
isl29028_read_reg(client, reg, &val);
+ mutex_unlock(&isl->lock);
enabled = (val & (1 << 2)) ? 1 : 0;
return put_user(enabled, (unsigned long __user *)arg);
break;
{
int ret;
char value, buf[2];
+ struct isl29028_data *isl = (struct isl29028_data *)i2c_get_clientdata(client);
D("%s: init isl29028 all register\n", __func__);
+ mutex_lock(&isl->lock);
+
/*********************** power on **************************/
buf[0] = 0x0e;
buf[1] = 0x00;
printk("%s: config isl29028 register %#x err %d\n", __FUNCTION__, buf[0], ret);
}
- if (ret < 2)
+ if (ret < 2) {
+ mutex_unlock(&isl->lock);
return -1;
-
+ }
mdelay(2);
/***********************config**************************/
buf[0] = ISL_REG_CONFIG;
- buf[1] = /*PROX_EN | */PROX_SLP(4) | PROX_DR_220 /*| ALS_EN | ALS_RANGE_L*/;
+ buf[1] = /*PROX_EN | */PROX_SLP(4) | PROX_DR_220 | ALS_RANGE_H /*| ALS_EN */;
if ((ret = i2c_master_send(client, buf, 2)) < 2) {
printk("%s: config isl29028 register %#x err %d\n", __FUNCTION__, buf[0], ret);
}
printk("%s: config isl29028 PROX_HT(0x04) reg %#x \n", __FUNCTION__, value);
#endif
+ mutex_unlock(&isl->lock);
+
return 0;
}
isl->client = client;
i2c_set_clientdata(client, isl);
+
+ mutex_init(&isl->lock);
+
rc = register_psensor_device(client, isl);
if (rc) {
dev_err(&client->dev, "failed to register_psensor_device\n");