Example #1
0
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;
}
Example #2
0
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(&ltr558_device);	
	kfree(i2c_get_clientdata(client));
	return 0;
}
Example #3
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;
}
Example #4
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;
}
Example #5
0
void ltr558_shutdown(struct i2c_client *client)
{
	ltr558_als_disable();
	ltr558_ps_disable();
}
Example #6
0
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;
}
Example #7
0
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;
    
}