*/ static int apds9130_init_client(struct i2c_client *client) { struct apds9130_data *data = i2c_get_clientdata(client); int err; int id; err = apds9130_set_enable(client, 0); if (err < 0) return err; data->pDrive = APDS9130_PDRVIE_100MA; id = i2c_smbus_read_byte_data(client, CMD_BYTE|APDS9130_ID_REG); if (id == 0x39) { printk(KERN_INFO"APDS-9130\n"); } else { printk(KERN_INFO"Not APDS-9130 %x\n", id); return -EIO; } err = apds9130_set_ptime(client, 0xFF); // 2.72ms Prox integration time if (err < 0) return err; err = apds9130_set_wtime(client, 0xDC); // 100ms Wait time for POLL_MEDIUM if (err < 0) return err; err = apds9130_set_ppcount(client, APDS9130_PS_PULSE_NUMBER); if (err < 0) return err; err = apds9130_set_config(client, 0); // no long wait if (err < 0) return err; err = apds9130_set_control(client, APDS9130_PDRVIE_100MA|APDS9130_PRX_IR_DIOD|APDS9130_PGAIN_2X); // 2012.10.10 PGAIN 4x-> 2x chkim. if (err < 0) return err; err = apds9130_set_pilt(client, 0); // init threshold for proximity if (err < 0) return err; err = apds9130_set_piht(client, APDS9130_PS_DETECTION_THRESHOLD); if (err < 0) return err; err = apds9130_set_pers(client, APDS9130_PPERS_2); // 2 consecutive Interrupt persistence if (err < 0) return err; // sensor is in disabled mode but all the configurations are preset /* */
*/ static int apds9130_init_client(struct i2c_client *client) { struct apds9130_data *data = i2c_get_clientdata(client); int err; int id; err = apds9130_set_enable(client, 0); if (err < 0) return err; data->pDrive = APDS9130_PDRVIE_100MA; id = i2c_smbus_read_byte_data(client, CMD_BYTE|APDS9130_ID_REG); if (id == 0x39) { printk(KERN_INFO"APDS-9130\n"); } else { printk(KERN_INFO"Not APDS-9130 %x\n", id); return -EIO; } err = apds9130_set_ptime(client, 0xFF); // 2.72ms Prox integration time if (err < 0) return err; err = apds9130_set_wtime(client, 0xDC); // 100ms Wait time for POLL_MEDIUM if (err < 0) return err; err = apds9130_set_ppcount(client, APDS9130_PS_PULSE_NUMBER); if (err < 0) return err; err = apds9130_set_config(client, 0); // no long wait if (err < 0) return err; err = apds9130_set_control(client, APDS9130_PDRVIE_100MA|APDS9130_PRX_IR_DIOD|APDS9130_PGAIN_2X); // 2012.10.10 PGAIN 4x-> 2x chkim. if (err < 0) return err; err = apds9130_set_pilt(client, 0); // init threshold for proximity if (err < 0) return err; err = apds9130_set_piht(client, APDS9130_PS_DETECTION_THRESHOLD); if (err < 0) return err; err = apds9130_set_pers(client, APDS9130_PPERS_2); // 2 consecutive Interrupt persistence if (err < 0) return err; // sensor is in disabled mode but all the configurations are preset /* Temp block the below code as no need to set cross talk threshold during proximity OFF state [LGSI_SP4_BSP][[email protected]] #if defined(APDS9130_PROXIMITY_CAL) err = apds9130_set_enable(client,0); if(err < 0){ printk(KERN_INFO "%s, enable set Fail\n",__func__); return err; } #endif */
static int apds9130_enable_ps_sensor(struct i2c_client *client, int val) { struct apds9130_data *data = i2c_get_clientdata(client); printk(KERN_INFO"enable ps sensor ( %d)\n", val); /* APDS9130_DISABLE_PS (0) = Disable PS */ /* APDS9130_ENABLE_PS_WITH_INT (1) = Enable PS with interrupt enabled */ if(val == APDS9130_ENABLE_PS_WITH_INT ) { #if defined(APDS9130_PROXIMITY_CAL) data->cross_talk = apds9130_read_crosstalk_data_fs(); #ifdef CONFIG_LEDS_LP5521 if(data->cross_talk <= 10 || data->cross_talk>870) #else if(data->cross_talk < 0 || data->cross_talk>870) #endif { printk(KERN_INFO"[%s] FROM FS data->crosstalk = %d", __func__, data->cross_talk); data->cross_talk = PS_DEFAULT_CROSS_TALK; } printk(KERN_INFO"%s Cross_talk : %d\n", __FUNCTION__, data->cross_talk); apds9130_Set_PS_Threshold_Adding_Cross_talk(client, data->cross_talk); printk(KERN_INFO"%s apds9130_Set_PS_Threshold_Adding_Cross_talk\n", __FUNCTION__); printk(KERN_INFO"%s apds9130_Set_PS_Threshold_Adding_Cross_talk = %d\n", __FUNCTION__,data->cross_talk); #endif //turn on p sensor data->enable_ps_sensor = val; apds9130_set_enable(client,0); /* Power Off */ apds9130_set_pilt(client, 0); // init threshold for proximity apds9130_set_piht(client, data->ps_threshold); //[LGSI_SP4_BSP][[email protected]] add calibrated threshold //[LGSI_SP4_BSP_BEGIN][[email protected]] Report the Far Detection evertytime when u enable the sensor 07-11-2012 input_report_abs(data->input_dev_ps, ABS_DISTANCE, PROX_INPUT_FAR);/* NEAR-to-FAR detection */ input_sync(data->input_dev_ps); //[LGSI_SP4_BSP_END][[email protected]] Report the Far Detection evertytime when u enable the sensor apds9130_set_enable(client, 0x2D); /* enable PS interrupt */ } else { apds9130_set_enable(client, 0); data->enable_ps_sensor = 0; } return 0; }
/* * Initialization function */ static int apds9130_init_client(struct i2c_client *client) { int err; int id; err = apds9130_set_enable(client, 0); if (err < 0) return err; id = i2c_smbus_read_byte_data(client, CMD_BYTE|APDS9130_ID_REG); if (id == 0x39) { printk("[ProximitySensor] APDS-9130\n"); } else { printk("[ProximitySensor_E] Not APDS-9130 %x\n", id); return -EIO; } err = apds9130_set_ptime(client, 0xFF); // 2.72ms Prox integration time if (err < 0) return err; err = apds9130_set_wtime(client, 0xDC); // 100ms Wait time for POLL_MEDIUM if (err < 0) return err; err = apds9130_set_ppcount(client, APDS9130_PS_PULSE_NUMBER); if (err < 0) return err; err = apds9130_set_config(client, 0); // no long wait if (err < 0) return err; #if defined(CONFIG_MACH_LGE_L9II_OPEN_EU) err = apds9130_set_control(client, APDS9130_PDRVIE_100MA|APDS9130_PRX_IR_DIOD|APDS9130_PGAIN_2X); #else err = apds9130_set_control(client, APDS9130_PDRVIE_100MA|APDS9130_PRX_IR_DIOD|APDS9130_PGAIN_4X); #endif if (err < 0) return err; err = apds9130_set_pilt(client, 1023); // to force first Near-to-Far interrupt if (err < 0) return err; err = apds9130_set_piht(client, 0); if (err < 0) return err; err = apds9130_set_pers(client, APDS9130_PPERS_2); // 2 consecutive Interrupt persistence if (err < 0) return err; // sensor is in disabled mode but all the configurations are preset return 0; }
static int apds9130_enable_ps_sensor(struct i2c_client *client, int val) { struct apds9130_data *data = i2c_get_clientdata(client); printk(KERN_INFO"enable ps sensor ( %d)\n", val); /* APDS9130_DISABLE_PS (0) = Disable PS */ /* APDS9130_ENABLE_PS_WITH_INT (1) = Enable PS with interrupt enabled */ if(val == APDS9130_ENABLE_PS_WITH_INT ) { #if defined(APDS9130_PROXIMITY_CAL) data->cross_talk = apds9130_read_crosstalk_data_fs(); if(data->cross_talk < 0 || data->cross_talk>870) data->cross_talk = PS_DEFAULT_CROSS_TALK; printk(KERN_INFO"%s Cross_talk : %d\n", __FUNCTION__, data->cross_talk); apds9130_Set_PS_Threshold_Adding_Cross_talk(client, data->cross_talk); printk(KERN_INFO"%s apds9130_Set_PS_Threshold_Adding_Cross_talk\n", __FUNCTION__); printk(KERN_INFO"%s apds9130_Set_PS_Threshold_Adding_Cross_talk = %d\n", __FUNCTION__,data->cross_talk); #endif //turn on p sensor data->enable_ps_sensor = val; apds9130_set_enable(client,0); /* Power Off */ apds9130_set_pilt(client, 0); // init threshold for proximity apds9130_set_piht(client, data->ps_threshold); // // input_report_abs(data->input_dev_ps, ABS_DISTANCE, PROX_INPUT_FAR);/* NEAR-to-FAR detection */ input_sync(data->input_dev_ps); // apds9130_set_enable(client, 0x2D); /* enable PS interrupt */ } else { apds9130_set_enable(client, 0); data->enable_ps_sensor = 0; } return 0; }
} static ssize_t apds9130_store_piht(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct i2c_client *client = to_i2c_client(dev); unsigned int rdata; sscanf(buf, "%d", &rdata); #if 0 #ifdef APDS9190_TUNE g_piht = rdata; #endif #endif if(client != NULL) apds9130_set_piht(client, rdata); else return -1;
static ssize_t apds9130_store_run_calibration(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct i2c_client *client = to_i2c_client(dev); struct apds9130_data *data = i2c_get_clientdata(client); int err; // start calibration apds9130_Run_Cross_talk_Calibration(client); // set threshold for near/far status data->ps_threshold = data->cross_talk + data->add_to_cross_talk; data->ps_hysteresis_threshold = data->ps_threshold - data->sub_from_ps_threshold; err = apds9130_set_piht(client, data->ps_threshold); if(err < 0) return err; err = apds9130_set_pilt(client, data->ps_hysteresis_threshold); if(err < 0) return err; printk("[ProximitySensor] %s: [piht][pilt][c_t] = [%d][%d][%d]\n", __func__, data->ps_threshold, data->ps_hysteresis_threshold, data->cross_talk); return count; }
static int apds9130_enable_ps_sensor(struct i2c_client *client, int val) { struct apds9130_data *data = i2c_get_clientdata(client); printk("[ProximitySensor] %s(%d)\n", __func__, val); if ((val != APDS9130_DISABLE_PS) && (val != APDS9130_ENABLE_PS_WITH_INT) && (val != APDS9130_ENABLE_PS_NO_INT)) { printk("[ProximitySensor_E] %s : invalid value(%d)\n", __func__, val); return -1; } /* APDS9130_DISABLE_PS (0) = Disable PS */ /* APDS9130_ENABLE_PS_WITH_INT (1) = Enable PS with interrupt enabled */ /* APDS9130_ENABLE_PS_NO_INT (2) = Enable PS without interrupt enabled */ if(val == APDS9130_ENABLE_PS_WITH_INT || val == APDS9130_ENABLE_PS_NO_INT) { //turn on p sensor data->enable_ps_sensor = val; apds9130_set_enable(client,0); /* Power Off */ apds9130_set_pilt(client, 1023); // to force first Near-to-Far interrupt apds9130_set_piht(client, 0); /* */ apds9130_set_pers(client, APDS9130_PPERS_0); if (val == APDS9130_ENABLE_PS_WITH_INT) { apds9130_set_enable(client, 0x2D); /* enable PS interrupt */ /* * If work is already scheduled then subsequent schedules will not * change the scheduled time that's why we have to cancel it first. */ __cancel_delayed_work(&data->ps_dwork); flush_delayed_work(&data->ps_dwork); } else { apds9130_set_enable(client, 0x0D); /* no PS interrupt */ /* * If work is already scheduled then subsequent schedules will not * change the scheduled time that's why we have to cancel it first. */ __cancel_delayed_work(&data->ps_dwork); flush_delayed_work(&data->ps_dwork); schedule_delayed_work(&data->ps_dwork, msecs_to_jiffies(data->ps_poll_delay)); } } else { apds9130_set_enable(client, 0); data->enable_ps_sensor = 0; /* * If work is already scheduled then subsequent schedules will not * change the scheduled time that's why we have to cancel it first. */ __cancel_delayed_work(&data->ps_dwork); flush_delayed_work(&data->ps_dwork); } return 0; }