static ssize_t store_als_enable(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct iio_dev *indio_dev = dev_to_iio_dev(dev); struct ltr558_chip *chip = iio_priv(indio_dev); struct i2c_client *client = chip->client; int err = 0; unsigned long lval; dev_vdbg(dev, "%s()\n", __func__); if (strict_strtoul(buf, 10, &lval)) return -EINVAL; if ((lval != 1) && (lval != 0)) { dev_err(dev, "illegal value %lu\n", lval); return -EINVAL; } mutex_lock(&chip->lock); if (lval == 1) err = ltr558_als_enable(client, chip->als_gainrange); else err = ltr558_als_disable(client); if (err < 0) dev_err(dev, "Error in enabling ALS\n"); else chip->is_als_enable = (lval) ? true : false; mutex_unlock(&chip->lock); return count; }
static int ltr558_remove(struct i2c_client *client){ ltr558_ps_disable(); ltr558_als_disable(); disable_irq(ltr558_data->ltr558_irq); free_irq(gpio_to_irq(GPIO_INT_NO), NULL); gpio_free(GPIO_INT_NO); input_free_device(ltr558_data->ltr558_input); misc_deregister(<r558_device); kfree(i2c_get_clientdata(client)); return 0; }
static int ltr558_remove(struct i2c_client *client) { struct iio_dev *indio_dev = i2c_get_clientdata(client); struct ltr558_chip *chip = iio_priv(indio_dev); dev_dbg(&client->dev, "%s()\n", __func__); if (chip->irq > 0) free_irq(chip->irq, chip); ltr558_ps_disable(client); ltr558_als_disable(client); iio_device_unregister(indio_dev); return 0; }
/******************************************* function:enable or disable the L-sensor parameter: @l_flag:the flag that we want to disblae or enable L-sensor LS_ENABLE: enable L-sensor LS_DISABLE: disable L-sensor return: return none zero means fail ********************************************/ static int ltr558_updata_als_status(short l_flag){ int result = 0; if((ALS_ENABLE == l_flag) && (ALS_DISABLE == ltr558_data->l_enable)){ P_L_printk("enable L-sensor\n"); result = ltr558_als_enable(ALS_GAINRANGE); if (0 == result){ ltr558_data->l_enable = ALS_ENABLE; } }else if((ALS_DISABLE == l_flag) && (ALS_ENABLE == ltr558_data->l_enable)){ P_L_printk("disable L-sensor\n"); result = ltr558_als_disable(); if(0 == result){ ltr558_data->l_enable = ALS_DISABLE; } }else{ LTRDBG("L-sensor already %s\n", (l_flag) ? "enable" : "disable"); result = 0; } return result; }
void ltr558_shutdown(struct i2c_client *client) { ltr558_als_disable(); ltr558_ps_disable(); }
static int ltr558_devinit(void){ int error; int ret=0; //mdelay(PON_DELAY); ltr558_read_id(); if (false == ltr558_read_id()){ LTRERR("ltr558 id is wrong\n"); return -1; } P_L_printk("%s: Can read ltr558 id successfully.\n",__func__); error = ltr558_als_disable(); if (error < 0) goto exit_disable_sensor_fail; error = ltr558_ps_disable(); if (error < 0) goto exit_disable_sensor_fail; error = ltr558_config(); if (error < 0) goto exit_config_sensor_fail; error = ltr558_set_p_range(P_RANGE_1); if (error < 0) goto exit_set_sensor_range_fail; error = ltr558_set_l_range(L_RANGE_1); if (error < 0) goto exit_set_sensor_range_fail; mdelay(WAKEUP_DELAY); #if 0 LTRDBG("0x80 = [%x]\n", ltr558_i2c_read_reg(0x80)); LTRDBG("0x81 = [%x]\n", ltr558_i2c_read_reg(0x81)); LTRDBG("0x82 = [%x]\n", ltr558_i2c_read_reg(0x82)); LTRDBG("0x83 = [%x]\n", ltr558_i2c_read_reg(0x83)); LTRDBG("0x84 = [%x]\n", ltr558_i2c_read_reg(0x84)); LTRDBG("0x85 = [%x]\n", ltr558_i2c_read_reg(0x85)); LTRDBG("0x86 = [%x]\n", ltr558_i2c_read_reg(0x86)); LTRDBG("0x87 = [%x]\n", ltr558_i2c_read_reg(0x87)); LTRDBG("0x88 = [%x]\n", ltr558_i2c_read_reg(0x88)); LTRDBG("0x89 = [%x]\n", ltr558_i2c_read_reg(0x89)); LTRDBG("0x8a = [%x]\n", ltr558_i2c_read_reg(0x8a)); LTRDBG("0x8b = [%x]\n", ltr558_i2c_read_reg(0x8b)); LTRDBG("0x8c = [%x]\n", ltr558_i2c_read_reg(0x8c)); LTRDBG("0x8d = [%x]\n", ltr558_i2c_read_reg(0x8d)); LTRDBG("0x8e = [%x]\n", ltr558_i2c_read_reg(0x8e)); LTRDBG("0x8f = [%x]\n",ltr558_i2c_read_reg(0x8f)); LTRDBG("0x90 = [%x]\n", ltr558_i2c_read_reg(0x90)); LTRDBG("0x91 = [%x]\n", ltr558_i2c_read_reg(0x91)); LTRDBG("0x92 = [%x]\n", ltr558_i2c_read_reg(0x92)); LTRDBG("0x93 = [%x]\n", ltr558_i2c_read_reg(0x93)); LTRDBG("0x97 = [%x]\n", ltr558_i2c_read_reg(0x97)); LTRDBG("0x98 = [%x]\n", ltr558_i2c_read_reg(0x98)); LTRDBG("0x99 = [%x]\n", ltr558_i2c_read_reg(0x99)); LTRDBG("0x9a = [%x]\n", ltr558_i2c_read_reg(0x9a)); LTRDBG("0x9e = [%x]\n", ltr558_i2c_read_reg(0x9e)); #endif error = 0; exit_set_sensor_range_fail: exit_config_sensor_fail: exit_disable_sensor_fail: return error; }
static int ltr558_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { int ret = 0; int flag; int set_flag; void __user *argp = (void __user *)arg; switch (cmd) { case ECS_IOCTL_APP_SET_LFLAG: { LTR558_DBG("into set lflag!!!\n"); if (copy_from_user(&flag, argp, sizeof(flag))) { return -EFAULT; } atomic_set(&l_flag, flag); set_flag = atomic_read(&l_flag) ? 1 : 0; /*set bit 1 of reg 0 by set_flag */ if (set_flag) { ret = ltr558_als_enable(ltr_this_data,als_gainrange); if (ret < 0) { printk(KERN_ERR "%s:enable TLR558 als failed ,ret = %d\n", __func__,ret); } } else { LTR558_DBG("%s:disable light sensor\n", __func__); ret = ltr558_als_disable(ltr_this_data); if (ret < 0) { printk(KERN_ERR "%s:LTR set diable LFLAG is error(%d)!", __func__, ret); } } break; } case ECS_IOCTL_APP_GET_LFLAG: { flag = atomic_read(&l_flag); printk(KERN_ERR "%s:get light flag\n", __func__); if (copy_to_user(argp, &flag, sizeof(flag))) { return -EFAULT; } break; } case ECS_IOCTL_APP_SET_PFLAG: { if (copy_from_user(&flag, argp, sizeof(flag))) { return -EFAULT; } printk(KERN_ERR "%s:into ps_set \n", __func__); atomic_set(&p_flag, flag); set_flag = atomic_read(&p_flag) ? 1 : 0; if (set_flag) { ret = ltr558_ps_enable(ltr_this_data,ps_gainrange); if (ret < 0) { printk(KERN_ERR "%s:enable TLR558 ps failed . error(%d)!\n", __func__,ret); } } else { ret = ltr558_ps_disable(ltr_this_data); if (ret < 0) { printk(KERN_ERR "%s:LTR set ECS_IOCTL_APP_SET_PFLAG flag is error(%d)!", __func__, ret); } } break; } case ECS_IOCTL_APP_GET_PFLAG: { flag = atomic_read(&p_flag); printk(KERN_ERR "%s:get ps flag\n", __func__); if (copy_to_user(argp, &flag, sizeof(flag))) { return -EFAULT; } break; } case ECS_IOCTL_APP_SET_DELAY: { printk(KERN_ERR "%s:set delay", __func__); if (copy_from_user(&flag, argp, sizeof(flag))) { return -EFAULT; } if(flag) ltr_558_delay = flag; else ltr_558_delay = 20;/*20ms*/ break; } case ECS_IOCTL_APP_GET_DELAY: { flag = ltr_558_delay; if (copy_to_user(argp, &flag, sizeof(flag))) { return -EFAULT; } break; } default: { break; } } return ret; }