Merge "input: sensors: add enable and poll_delay handler for mpu3050 sensor driver"
diff --git a/Documentation/devicetree/bindings/hwmon/qpnp-adc-voltage.txt b/Documentation/devicetree/bindings/hwmon/qpnp-adc-voltage.txt
index ae7d039..1be5504 100644
--- a/Documentation/devicetree/bindings/hwmon/qpnp-adc-voltage.txt
+++ b/Documentation/devicetree/bindings/hwmon/qpnp-adc-voltage.txt
@@ -65,6 +65,8 @@
3 : Returns current across 0.1 ohm resistor.
4 : Returns XO thermistor voltage in degree's Centigrade.
5 : Returns result in degC for 150k pull-up.
+ 9 : Conversion to temperature based on -15~55 allowable
+ battery charging tempeature setting for btm parameters.
- qcom,hw-settle-time : Settling period for the channel before ADC read.
Select from the following unsigned int.
0 : 0us
diff --git a/arch/arm/boot/dts/msm8926-qrd-skug-pvt.dts b/arch/arm/boot/dts/msm8926-qrd-skug-pvt.dts
index b763736..2a45592 100644
--- a/arch/arm/boot/dts/msm8926-qrd-skug-pvt.dts
+++ b/arch/arm/boot/dts/msm8926-qrd-skug-pvt.dts
@@ -19,3 +19,9 @@
qcom,board-id = <0x2000b 5>;
};
+&pm8226_vadc {
+ chan@30 {
+ label = "batt_therm";
+ qcom,scale-function = <9>;
+ };
+};
diff --git a/arch/arm/configs/msm8226-perf_defconfig b/arch/arm/configs/msm8226-perf_defconfig
index 1e32cfa..c13f18f 100644
--- a/arch/arm/configs/msm8226-perf_defconfig
+++ b/arch/arm/configs/msm8226-perf_defconfig
@@ -216,6 +216,7 @@
CONFIG_BT_HCISMD=y
CONFIG_CFG80211=y
CONFIG_NL80211_TESTMODE=y
+CONFIG_CFG80211_INTERNAL_REGDB=y
CONFIG_CMA=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y
diff --git a/arch/arm/configs/msm8610-perf_defconfig b/arch/arm/configs/msm8610-perf_defconfig
index ffa2310..bd135b3 100644
--- a/arch/arm/configs/msm8610-perf_defconfig
+++ b/arch/arm/configs/msm8610-perf_defconfig
@@ -206,6 +206,7 @@
CONFIG_BT_HCISMD=y
CONFIG_CFG80211=y
CONFIG_NL80211_TESTMODE=y
+CONFIG_CFG80211_INTERNAL_REGDB=y
CONFIG_CMA=y
CONFIG_CMA_SIZE_MBYTES=4
CONFIG_BLK_DEV_LOOP=y
diff --git a/arch/arm/configs/msm8974-perf_defconfig b/arch/arm/configs/msm8974-perf_defconfig
index 10f2919..d442371 100755
--- a/arch/arm/configs/msm8974-perf_defconfig
+++ b/arch/arm/configs/msm8974-perf_defconfig
@@ -245,6 +245,7 @@
CONFIG_MSM_BT_POWER=y
CONFIG_CFG80211=y
CONFIG_NL80211_TESTMODE=y
+CONFIG_CFG80211_INTERNAL_REGDB=y
CONFIG_RFKILL=y
CONFIG_GENLOCK=y
CONFIG_GENLOCK_MISCDEVICE=y
diff --git a/drivers/hwmon/qpnp-adc-common.c b/drivers/hwmon/qpnp-adc-common.c
index 9e0be59..6a52aa3 100644
--- a/drivers/hwmon/qpnp-adc-common.c
+++ b/drivers/hwmon/qpnp-adc-common.c
@@ -238,6 +238,60 @@
{800, 549},
};
+static const struct qpnp_vadc_map_pt adcmap_qrd_skug_btm_threshold[] = {
+ {-200, 1338},
+ {-180, 1307},
+ {-160, 1276},
+ {-140, 1244},
+ {-120, 1213},
+ {-100, 1182},
+ {-80, 1151},
+ {-60, 1121},
+ {-40, 1092},
+ {-20, 1063},
+ {0, 1035},
+ {20, 1008},
+ {40, 982},
+ {60, 957},
+ {80, 933},
+ {100, 910},
+ {120, 889},
+ {140, 868},
+ {160, 848},
+ {180, 830},
+ {200, 812},
+ {220, 795},
+ {240, 780},
+ {260, 765},
+ {280, 751},
+ {300, 738},
+ {320, 726},
+ {340, 714},
+ {360, 704},
+ {380, 694},
+ {400, 684},
+ {420, 675},
+ {440, 667},
+ {460, 659},
+ {480, 652},
+ {500, 645},
+ {520, 639},
+ {540, 633},
+ {560, 627},
+ {580, 622},
+ {600, 617},
+ {620, 613},
+ {640, 608},
+ {660, 604},
+ {680, 600},
+ {700, 597},
+ {720, 593},
+ {740, 590},
+ {760, 587},
+ {780, 585},
+ {800, 582},
+};
+
/* Voltage to temperature */
static const struct qpnp_vadc_map_pt adcmap_100k_104ef_104fb[] = {
{1758, -40},
@@ -612,6 +666,24 @@
}
EXPORT_SYMBOL(qpnp_adc_scale_qrd_skuaa_batt_therm);
+int32_t qpnp_adc_scale_qrd_skug_batt_therm(struct qpnp_vadc_chip *chip,
+ int32_t adc_code,
+ const struct qpnp_adc_properties *adc_properties,
+ const struct qpnp_vadc_chan_properties *chan_properties,
+ struct qpnp_vadc_result *adc_chan_result)
+{
+ int64_t bat_voltage = 0;
+
+ bat_voltage = qpnp_adc_scale_ratiometric_calib(adc_code,
+ adc_properties, chan_properties);
+
+ return qpnp_adc_map_temp_voltage(
+ adcmap_qrd_skug_btm_threshold,
+ ARRAY_SIZE(adcmap_qrd_skug_btm_threshold),
+ bat_voltage,
+ &adc_chan_result->physical);
+}
+EXPORT_SYMBOL(qpnp_adc_scale_qrd_skug_batt_therm);
int32_t qpnp_adc_scale_therm_pu1(struct qpnp_vadc_chip *chip,
int32_t adc_code,
const struct qpnp_adc_properties *adc_properties,
diff --git a/drivers/hwmon/qpnp-adc-voltage.c b/drivers/hwmon/qpnp-adc-voltage.c
index b2b846a..fb882b3 100644
--- a/drivers/hwmon/qpnp-adc-voltage.c
+++ b/drivers/hwmon/qpnp-adc-voltage.c
@@ -129,6 +129,7 @@
[SCALE_THERM_150K_PULLUP] = {qpnp_adc_scale_therm_pu1},
[SCALE_QRD_BATT_THERM] = {qpnp_adc_scale_qrd_batt_therm},
[SCALE_QRD_SKUAA_BATT_THERM] = {qpnp_adc_scale_qrd_skuaa_batt_therm},
+ [SCALE_QRD_SKUG_BATT_THERM] = {qpnp_adc_scale_qrd_skug_batt_therm},
};
static int32_t qpnp_vadc_read_reg(struct qpnp_vadc_chip *vadc, int16_t reg,
diff --git a/drivers/input/misc/stk3x1x.c b/drivers/input/misc/stk3x1x.c
index 39349bf..f9d3478 100644
--- a/drivers/input/misc/stk3x1x.c
+++ b/drivers/input/misc/stk3x1x.c
@@ -190,9 +190,13 @@
.max_range = "6500",
.resolution = "0.0625",
.sensor_power = "0.09",
- .min_delay = 0,
+ .min_delay = (MIN_ALS_POLL_DELAY_NS / 1000), /* us */
.fifo_reserved_event_count = 0,
.fifo_max_event_count = 0,
+ .enabled = 0,
+ .delay_msec = 200,
+ .sensors_enable = NULL,
+ .sensors_poll_delay = NULL,
};
static struct sensors_classdev sensors_proximity_cdev = {
@@ -207,6 +211,10 @@
.min_delay = 0,
.fifo_reserved_event_count = 0,
.fifo_max_event_count = 0,
+ .enabled = 0,
+ .delay_msec = 200,
+ .sensors_enable = NULL,
+ .sensors_poll_delay = NULL,
};
struct data_filter {
@@ -219,6 +227,8 @@
struct stk3x1x_data {
struct i2c_client *client;
struct stk3x1x_platform_data *pdata;
+ struct sensors_classdev als_cdev;
+ struct sensors_classdev ps_cdev;
#if (!defined(STK_POLL_PS) || !defined(STK_POLL_ALS))
int32_t irq;
struct work_struct stk_work;
@@ -236,7 +246,7 @@
int32_t ps_distance_last;
bool ps_enabled;
struct wake_lock ps_wakelock;
- struct work_struct stk_ps_work;
+ struct work_struct stk_ps_work;
struct workqueue_struct *stk_ps_wq;
#ifdef STK_POLL_PS
struct wake_lock ps_nosuspend_wl;
@@ -903,6 +913,21 @@
return scnprintf(buf, PAGE_SIZE, "%d\n", reading);
}
+static ssize_t stk_als_enable_set(struct sensors_classdev *sensors_cdev,
+ unsigned int enabled)
+{
+ struct stk3x1x_data *als_data = container_of(sensors_cdev,
+ struct stk3x1x_data, als_cdev);
+ int err;
+
+ mutex_lock(&als_data->io_lock);
+ err = stk3x1x_enable_als(als_data, enabled);
+ mutex_unlock(&als_data->io_lock);
+
+ if (err < 0)
+ return err;
+ return 0;
+}
static ssize_t stk_als_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
{
@@ -1008,7 +1033,8 @@
static ssize_t stk_als_delay_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct stk3x1x_data *ps_data = dev_get_drvdata(dev);
- return scnprintf(buf, PAGE_SIZE, "%lld\n", ktime_to_ns(ps_data->als_poll_delay));
+ return scnprintf(buf, PAGE_SIZE, "%u\n",
+ (u32)ktime_to_ms(ps_data->als_poll_delay));
}
static inline void stk_als_delay_store_fir(struct stk3x1x_data *ps_data)
@@ -1017,34 +1043,48 @@
ps_data->fir.idx = 0;
ps_data->fir.sum = 0;
}
+
+static ssize_t stk_als_poll_delay_set(struct sensors_classdev *sensors_cdev,
+ unsigned int delay_msec)
+{
+ struct stk3x1x_data *als_data = container_of(sensors_cdev,
+ struct stk3x1x_data, als_cdev);
+ uint64_t value = 0;
+
+ value = delay_msec * 1000000;
+
+ if (value < MIN_ALS_POLL_DELAY_NS)
+ value = MIN_ALS_POLL_DELAY_NS;
+
+ mutex_lock(&als_data->io_lock);
+ if (value != ktime_to_ns(als_data->als_poll_delay))
+ als_data->als_poll_delay = ns_to_ktime(value);
+
+ if (als_data->use_fir)
+ stk_als_delay_store_fir(als_data);
+
+ mutex_unlock(&als_data->io_lock);
+
+ return 0;
+}
+
static ssize_t stk_als_delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{
uint64_t value = 0;
int ret;
- struct stk3x1x_data *ps_data = dev_get_drvdata(dev);
+ struct stk3x1x_data *als_data = dev_get_drvdata(dev);
ret = kstrtoull(buf, 10, &value);
if(ret < 0)
{
- printk(KERN_ERR "%s:kstrtoull failed, ret=0x%x\n",
- __func__, ret);
+ dev_err(dev, "%s:kstrtoull failed, ret=0x%x\n", __func__, ret);
return ret;
}
#ifdef STK_DEBUG_PRINTF
- printk(KERN_INFO "%s: set als poll delay=%lld\n", __func__, value);
+ dev_dbg(dev, "%s: set als poll delay=%lld\n", __func__, value);
#endif
- if(value < MIN_ALS_POLL_DELAY_NS)
- {
- printk(KERN_ERR "%s: delay is too small\n", __func__);
- value = MIN_ALS_POLL_DELAY_NS;
- }
- mutex_lock(&ps_data->io_lock);
- if(value != ktime_to_ns(ps_data->als_poll_delay))
- ps_data->als_poll_delay = ns_to_ktime(value);
-
- if (ps_data->use_fir)
- stk_als_delay_store_fir(ps_data);
-
- mutex_unlock(&ps_data->io_lock);
+ ret = stk_als_poll_delay_set(&als_data->als_cdev, value);
+ if (ret < 0)
+ return ret;
return size;
}
@@ -1135,6 +1175,22 @@
return scnprintf(buf, PAGE_SIZE, "%d\n", reading);
}
+static ssize_t stk_ps_enable_set(struct sensors_classdev *sensors_cdev,
+ unsigned int enabled)
+{
+ struct stk3x1x_data *ps_data = container_of(sensors_cdev,
+ struct stk3x1x_data, ps_cdev);
+ int err;
+
+ mutex_lock(&ps_data->io_lock);
+ err = stk3x1x_enable_ps(ps_data, enabled);
+ mutex_unlock(&ps_data->io_lock);
+
+ if (err < 0)
+ return err;
+ return 0;
+}
+
static ssize_t stk_ps_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
{
int32_t enable, ret;
@@ -2389,10 +2445,16 @@
register_early_suspend(&ps_data->stk_early_suspend);
#endif
/* make sure everything is ok before registering the class device */
- err = sensors_classdev_register(&client->dev, &sensors_light_cdev);
+ ps_data->als_cdev = sensors_light_cdev;
+ ps_data->als_cdev.sensors_enable = stk_als_enable_set;
+ ps_data->als_cdev.sensors_poll_delay = stk_als_poll_delay_set;
+ err = sensors_classdev_register(&client->dev, &ps_data->als_cdev);
if (err)
goto err_power_on;
- err = sensors_classdev_register(&client->dev, &sensors_proximity_cdev);
+
+ ps_data->ps_cdev = sensors_proximity_cdev;
+ ps_data->ps_cdev.sensors_enable = stk_ps_enable_set;
+ err = sensors_classdev_register(&client->dev, &ps_data->ps_cdev);
if (err)
goto err_class_sysfs;
@@ -2406,9 +2468,9 @@
err_init_all_setting:
stk3x1x_power_ctl(ps_data, false);
- sensors_classdev_unregister(&sensors_proximity_cdev);
+ sensors_classdev_unregister(&ps_data->ps_cdev);
err_class_sysfs:
- sensors_classdev_unregister(&sensors_light_cdev);
+ sensors_classdev_unregister(&ps_data->als_cdev);
err_power_on:
stk3x1x_power_init(ps_data, false);
err_power_init:
diff --git a/drivers/input/touchscreen/ft5x06_ts.c b/drivers/input/touchscreen/ft5x06_ts.c
index 9a4301e..4b8a3d4 100644
--- a/drivers/input/touchscreen/ft5x06_ts.c
+++ b/drivers/input/touchscreen/ft5x06_ts.c
@@ -1546,8 +1546,9 @@
data->family_id = pdata->family_id;
err = request_threaded_irq(client->irq, NULL,
- ft5x06_ts_interrupt, pdata->irqflags,
- client->dev.driver->name, data);
+ ft5x06_ts_interrupt,
+ pdata->irqflags | IRQF_ONESHOT,
+ client->dev.driver->name, data);
if (err) {
dev_err(&client->dev, "request irq failed\n");
goto free_reset_gpio;
diff --git a/drivers/input/touchscreen/gt9xx/gt9xx.c b/drivers/input/touchscreen/gt9xx/gt9xx.c
index 7fa6c39..6d4c638 100644
--- a/drivers/input/touchscreen/gt9xx/gt9xx.c
+++ b/drivers/input/touchscreen/gt9xx/gt9xx.c
@@ -1217,7 +1217,8 @@
int ret;
const u8 irq_table[] = GTP_IRQ_TAB;
- ret = request_irq(ts->client->irq, goodix_ts_irq_handler,
+ ret = request_threaded_irq(ts->client->irq, NULL,
+ goodix_ts_irq_handler,
irq_table[ts->int_trigger_type],
ts->client->name, ts);
if (ret) {
diff --git a/drivers/platform/msm/sps/sps.c b/drivers/platform/msm/sps/sps.c
index c621d2a..444b4b2 100644
--- a/drivers/platform/msm/sps/sps.c
+++ b/drivers/platform/msm/sps/sps.c
@@ -2535,13 +2535,12 @@
ret = -EPROBE_DEFER;
else
SPS_ERR("sps:fail to get dfab_clk.");
- goto clk_err;
+ goto dfab_clk_err;
} else {
ret = clk_set_rate(sps->dfab_clk, 64000000);
if (ret) {
SPS_ERR("sps:failed to set dfab_clk rate.");
- clk_put(sps->dfab_clk);
- goto clk_err;
+ goto dfab_clk_set_err;
}
}
@@ -2552,12 +2551,12 @@
ret = -EPROBE_DEFER;
else
SPS_ERR("sps:fail to get pmem_clk.");
- goto clk_err;
+ goto dfab_clk_set_err;
} else {
ret = clk_prepare_enable(sps->pmem_clk);
if (ret) {
SPS_ERR("sps:failed to enable pmem_clk.");
- goto clk_err;
+ goto pmem_clk_set_err;
}
}
}
@@ -2569,19 +2568,21 @@
ret = -EPROBE_DEFER;
else
SPS_ERR("sps:fail to get bamdma_clk.");
- goto clk_err;
+ goto pmem_clk_set_err;
} else {
ret = clk_prepare_enable(sps->bamdma_clk);
if (ret) {
SPS_ERR("sps:failed to enable bamdma_clk. ret=%d", ret);
- goto clk_err;
+ clk_put(sps->bamdma_clk);
+ goto pmem_clk_set_err;
}
}
ret = clk_prepare_enable(sps->dfab_clk);
if (ret) {
SPS_ERR("sps:failed to enable dfab_clk. ret=%d", ret);
- goto clk_err;
+ clk_put(sps->bamdma_clk);
+ goto pmem_clk_set_err;
}
#endif
ret = sps_device_init();
@@ -2590,8 +2591,9 @@
#ifdef CONFIG_SPS_SUPPORT_BAMDMA
clk_disable_unprepare(sps->dfab_clk);
clk_disable_unprepare(sps->bamdma_clk);
+ clk_put(sps->bamdma_clk);
#endif
- goto sps_device_init_err;
+ goto pmem_clk_set_err;
}
#ifdef CONFIG_SPS_SUPPORT_BAMDMA
clk_disable_unprepare(sps->dfab_clk);
@@ -2602,8 +2604,12 @@
SPS_INFO("sps:sps is ready.");
return 0;
-clk_err:
-sps_device_init_err:
+pmem_clk_set_err:
+ if (!d_type)
+ clk_put(sps->pmem_clk);
+dfab_clk_set_err:
+ clk_put(sps->dfab_clk);
+dfab_clk_err:
device_destroy(sps->dev_class, sps->dev_num);
device_create_err:
unregister_chrdev_region(sps->dev_num, 1);
diff --git a/include/linux/qpnp/qpnp-adc.h b/include/linux/qpnp/qpnp-adc.h
index 6e711c2..e6dcc3b 100644
--- a/include/linux/qpnp/qpnp-adc.h
+++ b/include/linux/qpnp/qpnp-adc.h
@@ -220,6 +220,8 @@
* btm parameters.
* %SCALE_QRD_SKUAA_BATT_THERM: Conversion to temperature(decidegC) based on
* btm parametersi for SKUAA.
+ * %SCALE_QRD_SKUG_BATT_THERM: Conversion to temperature(decidegC) based on
+ * btm parametersi for SKUG.
* %SCALE_NONE: Do not use this scaling type.
*/
enum qpnp_adc_scale_fn_type {
@@ -231,6 +233,7 @@
SCALE_THERM_150K_PULLUP,
SCALE_QRD_BATT_THERM,
SCALE_QRD_SKUAA_BATT_THERM,
+ SCALE_QRD_SKUG_BATT_THERM = 9,
SCALE_NONE,
};
@@ -1135,6 +1138,23 @@
const struct qpnp_vadc_chan_properties *chan_prop,
struct qpnp_vadc_result *chan_rslt);
/**
+ * qpnp_adc_scale_qrd_skug_batt_therm() - Scales the pre-calibrated digital output
+ * of an ADC to the ADC reference and compensates for the
+ * gain and offset. Returns the temperature in decidegC.
+ * @dev: Structure device for qpnp vadc
+ * @adc_code: pre-calibrated digital ouput of the ADC.
+ * @adc_prop: adc properties of the pm8xxx adc such as bit resolution,
+ * reference voltage.
+ * @chan_prop: individual channel properties to compensate the i/p scaling,
+ * slope and offset.
+ * @chan_rslt: physical result to be stored.
+ */
+int32_t qpnp_adc_scale_qrd_skug_batt_therm(struct qpnp_vadc_chip *dev,
+ int32_t adc_code,
+ const struct qpnp_adc_properties *adc_prop,
+ const struct qpnp_vadc_chan_properties *chan_prop,
+ struct qpnp_vadc_result *chan_rslt);
+/**
* qpnp_adc_scale_batt_id() - Scales the pre-calibrated digital output
* of an ADC to the ADC reference and compensates for the
* gain and offset.
@@ -1388,6 +1408,12 @@
const struct qpnp_vadc_chan_properties *chan_prop,
struct qpnp_vadc_result *chan_rslt)
{ return -ENXIO; }
+static inline int32_t qpnp_adc_scale_qrd_skug_batt_therm(
+ struct qpnp_vadc_chip *vadc, int32_t adc_code,
+ const struct qpnp_adc_properties *adc_prop,
+ const struct qpnp_vadc_chan_properties *chan_prop,
+ struct qpnp_vadc_result *chan_rslt)
+{ return -ENXIO; }
static inline int32_t qpnp_adc_scale_batt_id(struct qpnp_vadc_chip *vadc,
int32_t adc_code,
const struct qpnp_adc_properties *adc_prop,