Merge "power: pm8921-bms: implement BMS reset"
diff --git a/Documentation/devicetree/bindings/misc/isa1200.txt b/Documentation/devicetree/bindings/misc/isa1200.txt
new file mode 100644
index 0000000..b30782d
--- /dev/null
+++ b/Documentation/devicetree/bindings/misc/isa1200.txt
@@ -0,0 +1,65 @@
+Imagis ISA1200 Haptics Vibrator
+
+Required properties:
+ - reg: slave address of bus
+ - compatible: should be "imagis,isa1200"
+ - label: name for vibrator directory
+ - imagis,hap-en-gpio: haptic enable gpio
+ - imagis,mode-ctrl: mode of the controller, 0 = POWER_DOWN_MODE,
+ 1 = PWM_INPUT_MODE, 2 = PWM_GEN_MODE, 3 = WAVE_GEN_MODE
+ - imagis,max-timeout: maximum timeout for vibration
+ - imagis,chip-en: chip enable
+ - vcc_i2c-supply: regulator supplying i2c bus
+
+Regulator described as a child of the main device:
+ - regulator-name: A string used as a descriptive name for regulator outputs,
+ should match vcc_i2c above
+ - regulator-min-microvolt: smallest voltage consumers may set
+ - regulator-max-microvolt: largest voltage consumers may set
+ - regulator-max-microamp: largest current consumers may set
+
+Optional properties:
+ - imagis,smart-en: automatically control haptic power based on pwm/clk signal
+ - imagis,is-erm: controlled by dc motor, use ERM driving method
+ - imagis,overdrive-high: overdrive high
+ - imagis,overdrive-en: enable overdrive
+ - imagis,pwm-freq: pwm frequency (hZ)
+ - imagis,pwm-ch-id: pwm channel id
+ - imagis,pwm-div: pwm division to be used for vibration
+ - imagis,need-pwm-clk: use "pwm_clk"
+ - imagis,hap-len-gpio: haptic ldo enable gpio
+ - imagis,etc-clk-en: use external clock
+ - xyz-supply: to be used if additional regulators are require beyond
+ "imagis,regulator" above
+
+Any additional regulators are described as child nodes of main device:
+ - regulator-name: A string used as a descriptive name for regulator outputs,
+ should match supply "xyz"
+ - regulator-min-microvolt: smallest voltage consumers may set
+ - regulator-max-microvolt: largest voltage consumers may set
+ - regulator-max-microamp: largest current consumers may set
+
+Example:
+ i2c@f9967000 {
+ isa1200@48 {
+ status = "okay";
+ reg = <0x48>;
+ vcc_i2c-supply = <&pm8941_s3>;
+ compatible = "imagis,isa1200";
+ label = "vibrator";
+ imagis,chip-en;
+ imagis,smart-en;
+ imagis,need-pwm-clk;
+ imagis,ext-clk-en;
+ imagis,hap-en-gpio = <&msmgpio 86 0x00>;
+ imagis,max-timeout = <15000>;
+ imagis,pwm-div = <256>;
+ imagis,mode-ctrl = <2>;
+ imagis,regulator {
+ regulator-name = "vcc_i2c";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-max-microamp = <9360>;
+ };
+ };
+ };
diff --git a/drivers/media/video/msm/vfe/msm_vfe32.c b/drivers/media/video/msm/vfe/msm_vfe32.c
index 313401d..a962c94 100644
--- a/drivers/media/video/msm/vfe/msm_vfe32.c
+++ b/drivers/media/video/msm/vfe/msm_vfe32.c
@@ -2950,6 +2950,67 @@
cmdp -= 1;
break;
+ case VFE_CMD_RGB_ALL_CFG: {
+ cmdp = kmalloc((cmd->length), GFP_ATOMIC);
+ if (!cmdp) {
+ rc = -ENOMEM;
+ goto proc_general_done;
+ }
+ if (copy_from_user(cmdp,
+ (void __user *)(cmd->value),
+ cmd->length)) {
+ rc = -EFAULT;
+ goto proc_general_done;
+ }
+ msm_camera_io_memcpy(
+ vfe32_ctrl->share_ctrl->vfebase + V32_RGB_G_OFF,
+ cmdp, 4);
+ cmdp += 1;
+
+ vfe32_write_gamma_cfg(RGBLUT_RAM_CH0_BANK0,
+ cmdp + VFE32_GAMMA_CH0_G_POS, vfe32_ctrl);
+ vfe32_write_gamma_cfg(RGBLUT_RAM_CH1_BANK0,
+ cmdp + VFE32_GAMMA_CH1_B_POS, vfe32_ctrl);
+ vfe32_write_gamma_cfg(RGBLUT_RAM_CH2_BANK0,
+ cmdp + VFE32_GAMMA_CH2_R_POS, vfe32_ctrl);
+ }
+ cmdp -= 1;
+ break;
+
+ case VFE_CMD_RGB_ALL_UPDATE: {
+ cmdp = kmalloc((cmd->length), GFP_ATOMIC);
+ if (!cmdp) {
+ rc = -ENOMEM;
+ goto proc_general_done;
+ }
+ if (copy_from_user(cmdp, (void __user *)(cmd->value),
+ cmd->length)) {
+ rc = -EFAULT;
+ goto proc_general_done;
+ }
+ old_val = msm_camera_io_r(
+ vfe32_ctrl->share_ctrl->vfebase + V32_RGB_G_OFF);
+ cmdp += 1;
+ if (old_val != 0x0) {
+ vfe32_write_gamma_cfg(RGBLUT_RAM_CH0_BANK0,
+ cmdp + VFE32_GAMMA_CH0_G_POS, vfe32_ctrl);
+ vfe32_write_gamma_cfg(RGBLUT_RAM_CH1_BANK0,
+ cmdp + VFE32_GAMMA_CH1_B_POS, vfe32_ctrl);
+ vfe32_write_gamma_cfg(RGBLUT_RAM_CH2_BANK0,
+ cmdp + VFE32_GAMMA_CH2_R_POS, vfe32_ctrl);
+ } else {
+ vfe32_write_gamma_cfg(RGBLUT_RAM_CH0_BANK1,
+ cmdp + VFE32_GAMMA_CH0_G_POS, vfe32_ctrl);
+ vfe32_write_gamma_cfg(RGBLUT_RAM_CH1_BANK1,
+ cmdp + VFE32_GAMMA_CH1_B_POS, vfe32_ctrl);
+ vfe32_write_gamma_cfg(RGBLUT_RAM_CH2_BANK1,
+ cmdp + VFE32_GAMMA_CH2_R_POS, vfe32_ctrl);
+ }
+ }
+ vfe32_ctrl->update_gamma = TRUE;
+ cmdp -= 1;
+ break;
+
case VFE_CMD_RGB_G_UPDATE: {
cmdp = kmalloc(cmd->length, GFP_ATOMIC);
if (!cmdp) {
diff --git a/drivers/media/video/msm/vfe/msm_vfe32.h b/drivers/media/video/msm/vfe/msm_vfe32.h
index 322684c..6525752 100644
--- a/drivers/media/video/msm/vfe/msm_vfe32.h
+++ b/drivers/media/video/msm/vfe/msm_vfe32.h
@@ -543,6 +543,12 @@
#define VFE32_GAMMA_NUM_ENTRIES 64
+#define VFE32_GAMMA_CH0_G_POS 0
+
+#define VFE32_GAMMA_CH1_B_POS 32
+
+#define VFE32_GAMMA_CH2_R_POS 64
+
#define VFE32_LA_TABLE_LENGTH 64
#define VFE32_LINEARIZATON_TABLE_LENGTH 36
diff --git a/drivers/misc/isa1200.c b/drivers/misc/isa1200.c
index 647799f..c6d08d1 100644
--- a/drivers/misc/isa1200.c
+++ b/drivers/misc/isa1200.c
@@ -3,7 +3,7 @@
*
* Copyright (C) 2009 Samsung Electronics
* Kyungmin Park <kyungmin.park@samsung.com>
- * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -23,6 +23,7 @@
#include <linux/clk.h>
#include <linux/i2c/isa1200.h>
#include "../staging/android/timed_output.h"
+#include <linux/of_gpio.h>
#define ISA1200_HCTRL0 0x30
#define ISA1200_HCTRL1 0x31
@@ -121,7 +122,7 @@
/* vote for clock */
if (haptic->pdata->need_pwm_clk && !haptic->clk_on) {
- rc = clk_enable(haptic->pwm_clk);
+ rc = clk_prepare_enable(haptic->pwm_clk);
if (rc < 0) {
pr_err("%s: clk enable failed\n",
__func__);
@@ -163,7 +164,7 @@
/* de-vote clock */
if (haptic->pdata->need_pwm_clk && haptic->clk_on) {
- clk_disable(haptic->pwm_clk);
+ clk_disable_unprepare(haptic->pwm_clk);
haptic->clk_on = false;
}
/* check for board specific clk callback */
@@ -180,7 +181,7 @@
dis_clk:
if (haptic->pdata->need_pwm_clk && haptic->clk_on) {
- clk_disable(haptic->pwm_clk);
+ clk_disable_unprepare(haptic->pwm_clk);
haptic->clk_on = false;
}
@@ -406,10 +407,10 @@
for (i = 0; i < num_reg; i++) {
haptic->regs[i] = regulator_get(&haptic->client->dev,
- reg_info[i].name);
+ reg_info[i].name);
if (IS_ERR(haptic->regs[i])) {
rc = PTR_ERR(haptic->regs[i]);
- pr_err("%s:regulator get failed(%d)\n", __func__, rc);
+ pr_err("%s:regulator get failed(%d)\n", __func__, rc);
goto put_regs;
}
@@ -438,6 +439,138 @@
return rc;
}
+#ifdef CONFIG_OF
+static int isa1200_parse_dt(struct device *dev,
+ struct isa1200_platform_data *pdata)
+{
+ struct device_node *temp, *np = dev->of_node;
+ struct isa1200_regulator *reg_info;
+ enum of_gpio_flags hap_en_flags = OF_GPIO_ACTIVE_LOW;
+ enum of_gpio_flags hap_len_flags = OF_GPIO_ACTIVE_LOW;
+ int rc = 0;
+ u32 temp_val;
+ const char *temp_string;
+
+ rc = of_property_read_string(np, "label", &pdata->name);
+ if (rc) {
+ dev_err(dev, "Unable to read device name\n");
+ return rc;
+ }
+
+ pdata->chip_en = of_property_read_bool(np, "imagis,chip-en");
+ pdata->ext_clk_en = of_property_read_bool(np, "imagis,ext-clk-en");
+ pdata->is_erm = of_property_read_bool(np, "imagis,is-erm");
+ pdata->overdrive_high =
+ of_property_read_bool(np, "imagis,overdrive-high");
+ pdata->overdrive_en = of_property_read_bool(np, "imagis,overdrive-en");
+ pdata->smart_en = of_property_read_bool(np, "imagis,smart-en");
+ pdata->need_pwm_clk = of_property_read_bool(np, "imagis,need-pwm-clk");
+
+ pdata->hap_en_gpio = of_get_named_gpio_flags(np,
+ "imagis,hap-en-gpio", 0, &hap_en_flags);
+ pdata->hap_len_gpio = of_get_named_gpio_flags(np,
+ "imagis,hap-len-gpio", 0, &hap_len_flags);
+
+ rc = of_property_read_u32(np, "imagis,max-timeout",
+ &pdata->max_timeout);
+ if (rc) {
+ dev_err(dev, "Unable to read max timeout\n");
+ return rc;
+ }
+
+ rc = of_property_read_u32(np, "imagis,pwm-div", &pdata->pwm_fd.pwm_div);
+ if (rc && (rc != -EINVAL)) {
+ dev_err(dev, "Unable to read pwm division\n");
+ return rc;
+ }
+
+ rc = of_property_read_u32(np, "imagis,pwm-freq",
+ &pdata->pwm_fd.pwm_freq);
+ if (rc && (rc != -EINVAL)) {
+ dev_err(dev, "Unable to read pwm frequency\n");
+ return rc;
+ }
+
+ rc = of_property_read_u32(np, "imagis,pwm-ch-id", &pdata->pwm_ch_id);
+ if (rc && (rc != -EINVAL)) {
+ dev_err(dev, "Unable to read pwm channel id\n");
+ return rc;
+ }
+
+ rc = of_property_read_u32(np, "imagis,mode-ctrl", &pdata->mode_ctrl);
+ if (rc) {
+ dev_err(dev, "Unable to read control mode\n");
+ return rc;
+ }
+
+ rc = of_property_read_u32(np, "imagis,duty", &pdata->duty);
+ if (rc && (rc != -EINVAL)) {
+ dev_err(dev, "Unable to read duty cycle\n");
+ return rc;
+ }
+
+ pdata->num_regulators = 0;
+ temp = NULL;
+ while ((temp = of_get_next_child(np, temp)))
+ pdata->num_regulators++;
+
+ if (!pdata->num_regulators)
+ return 0;
+
+ reg_info = devm_kzalloc(dev, pdata->num_regulators *
+ sizeof(struct isa1200_regulator), GFP_KERNEL);
+ if (!reg_info)
+ return -ENOMEM;
+
+ pdata->regulator_info = reg_info;
+
+ for_each_child_of_node(np, temp) {
+ rc = of_property_read_string(temp,
+ "regulator-name", &temp_string);
+ if (rc) {
+ dev_err(dev, "Unable to read regulator name\n");
+ return rc;
+ } else
+ reg_info->name = temp_string;
+
+ rc = of_property_read_u32(temp, "regulator-max-microvolt",
+ &temp_val);
+ if (rc) {
+ dev_err(dev, "Unable to read max uV\n");
+ return rc;
+ } else
+ reg_info->max_uV = temp_val;
+
+ rc = of_property_read_u32(temp, "regulator-min-microvolt",
+ &temp_val);
+ if (rc) {
+ dev_err(dev, "Unable to read min uV\n");
+ return rc;
+ } else
+ reg_info->min_uV = temp_val;
+
+ rc = of_property_read_u32(temp, "regulator-max-microamp",
+ &temp_val);
+ if (rc) {
+ dev_err(dev, "Unable to read load uA\n");
+ return rc;
+ } else
+ reg_info->load_uA = temp_val;
+
+ reg_info++;
+ }
+
+ return 0;
+}
+#else
+static int isa1200_parse_dt(struct device *dev,
+ struct isa1200_platform_data *pdata)
+{
+ return -ENODEV;
+}
+#endif
+
+
static int __devinit isa1200_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -452,7 +585,22 @@
return -EIO;
}
- pdata = client->dev.platform_data;
+ if (client->dev.of_node) {
+ pdata = devm_kzalloc(&client->dev,
+ sizeof(struct isa1200_platform_data), GFP_KERNEL);
+ if (!pdata) {
+ dev_err(&client->dev, "Failed to allocate memory\n");
+ return -ENOMEM;
+ }
+
+ ret = isa1200_parse_dt(&client->dev, pdata);
+ if (ret) {
+ dev_err(&client->dev, "Parsing DT failed(%d)", ret);
+ return ret;
+ }
+ } else
+ pdata = client->dev.platform_data;
+
if (!pdata) {
dev_err(&client->dev, "%s: no platform data\n", __func__);
return -EINVAL;
@@ -714,10 +862,19 @@
{ },
};
MODULE_DEVICE_TABLE(i2c, isa1200_id);
+#ifdef CONFIG_OF
+static struct of_device_id isa1200_match_table[] = {
+ { .compatible = "imagis,isa1200",},
+ { },
+};
+#else
+#define isa1200_match_table NULL
+#endif
static struct i2c_driver isa1200_driver = {
.driver = {
.name = "isa1200",
+ .of_match_table = isa1200_match_table,
},
.probe = isa1200_probe,
.remove = __devexit_p(isa1200_remove),
diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c
index 5b83cb4..52ea9e1 100644
--- a/drivers/usb/gadget/android.c
+++ b/drivers/usb/gadget/android.c
@@ -2105,6 +2105,7 @@
struct android_usb_function *f;
struct android_configuration *conf;
int enabled = 0;
+ static DEFINE_RATELIMIT_STATE(rl, 10*HZ, 1);
if (!cdev)
return -ENODEV;
@@ -2140,7 +2141,7 @@
f->disable(f);
}
dev->enabled = false;
- } else {
+ } else if (__ratelimit(&rl)) {
pr_err("android_usb: already %s\n",
dev->enabled ? "enabled" : "disabled");
}
diff --git a/drivers/usb/gadget/f_adb.c b/drivers/usb/gadget/f_adb.c
index dabb673..4445dc2 100644
--- a/drivers/usb/gadget/f_adb.c
+++ b/drivers/usb/gadget/f_adb.c
@@ -420,7 +420,10 @@
static int adb_open(struct inode *ip, struct file *fp)
{
- pr_info("adb_open\n");
+ static DEFINE_RATELIMIT_STATE(rl, 10*HZ, 1);
+
+ if (__ratelimit(&rl))
+ pr_info("adb_open\n");
if (!_adb_dev)
return -ENODEV;
@@ -443,7 +446,10 @@
static int adb_release(struct inode *ip, struct file *fp)
{
- pr_info("adb_release\n");
+ static DEFINE_RATELIMIT_STATE(rl, 10*HZ, 1);
+
+ if (__ratelimit(&rl))
+ pr_info("adb_release\n");
/*
* ADB daemon closes the device file after I/O error. The
diff --git a/drivers/video/msm/mdp4.h b/drivers/video/msm/mdp4.h
index c303c8f..7a2efc5 100644
--- a/drivers/video/msm/mdp4.h
+++ b/drivers/video/msm/mdp4.h
@@ -974,9 +974,9 @@
int mdp4_wfd_pipe_commit(struct msm_fb_data_type *mfd, int cndx, int wait);
#endif
#ifdef CONFIG_FB_MSM_OVERLAY
-int mdp4_unmap_sec_resource(void);
+int mdp4_unmap_sec_resource(struct msm_fb_data_type *mfd);
#else
-static inline void mdp4_unmap_sec_resource(void);
+static inline void mdp4_unmap_sec_resource(struct msm_fb_data_type *mfd);
{
/* empty */
return 0;
diff --git a/drivers/video/msm/mdp4_overlay.c b/drivers/video/msm/mdp4_overlay.c
index 9427842..51944e85 100644
--- a/drivers/video/msm/mdp4_overlay.c
+++ b/drivers/video/msm/mdp4_overlay.c
@@ -59,9 +59,6 @@
uint32 mixer0_played;
uint32 mixer1_played;
uint32 mixer2_played;
- uint32 sec_mapped;
- uint32 mmu_clk_on;
- uint32 sec_active;
} mdp4_overlay_db = {
.cs_controller = CS_CONTROLLER_0,
.plist = {
@@ -123,10 +120,20 @@
static struct ion_client *display_iclient;
-static int mdp4_map_sec_resource(void)
+static int mdp4_map_sec_resource(struct msm_fb_data_type *mfd)
{
int ret = 0;
- if (ctrl->sec_mapped)
+
+ if (!mfd) {
+ pr_err("%s: mfd is invalid\n", __func__);
+ return -ENODEV;
+ }
+
+ pr_debug("%s %d mfd->index=%d,mapped=%d,active=%d\n",
+ __func__, __LINE__,
+ mfd->index, mfd->sec_mapped, mfd->sec_active);
+
+ if (mfd->sec_mapped)
return 0;
ret = mdp_enable_iommu_clocks();
@@ -139,24 +146,34 @@
pr_err("ION heap secure failed heap id %d ret %d\n",
ION_CP_MM_HEAP_ID, ret);
else
- ctrl->sec_mapped = 1;
+ mfd->sec_mapped = 1;
mdp_disable_iommu_clocks();
return ret;
}
-int mdp4_unmap_sec_resource(void)
+int mdp4_unmap_sec_resource(struct msm_fb_data_type *mfd)
{
int ret = 0;
- if ((ctrl->sec_mapped == 0) || (ctrl->sec_active))
+
+ if (!mfd) {
+ pr_err("%s: mfd is invalid\n", __func__);
+ return -ENODEV;
+ }
+
+ if ((mfd->sec_mapped == 0) || (mfd->sec_active))
return 0;
+ pr_debug("%s %d mfd->index=%d,mapped=%d,active=%d\n",
+ __func__, __LINE__,
+ mfd->index, mfd->sec_mapped, mfd->sec_active);
+
ret = mdp_enable_iommu_clocks();
if (ret) {
pr_err("IOMMU clock enabled failed while close\n");
return ret;
}
msm_ion_unsecure_heap(ION_HEAP(ION_CP_MM_HEAP_ID));
- ctrl->sec_mapped = 0;
+ mfd->sec_mapped = 0;
mdp_disable_iommu_clocks();
return ret;
}
@@ -3200,6 +3217,11 @@
return ret;
}
+ if (pipe->flags & MDP_SECURE_OVERLAY_SESSION) {
+ mdp4_map_sec_resource(mfd);
+ mfd->sec_active = TRUE;
+ }
+
/* return id back to user */
req->id = pipe->pipe_ndx; /* pipe_ndx start from 1 */
pipe->req_data = *req; /* keep original req */
@@ -3215,10 +3237,6 @@
}
}
- if (pipe->flags & MDP_SECURE_OVERLAY_SESSION) {
- mdp4_map_sec_resource();
- ctrl->sec_active = TRUE;
- }
mdp4_stat.overlay_set[pipe->mixer_num]++;
if (pipe->flags & MDP_OVERLAY_PP_CFG_EN) {
@@ -3318,7 +3336,7 @@
mdp4_stat.overlay_unset[pipe->mixer_num]++;
if (pipe->flags & MDP_SECURE_OVERLAY_SESSION)
- ctrl->sec_active = FALSE;
+ mfd->sec_active = FALSE;
mdp4_overlay_pipe_free(pipe);
mutex_unlock(&mfd->dma->ov_mutex);
@@ -3645,7 +3663,7 @@
msm_fb_signal_timeline(mfd);
mdp4_overlay_mdp_perf_upd(mfd, 0);
- mdp4_unmap_sec_resource();
+ mdp4_unmap_sec_resource(mfd);
mutex_unlock(&mfd->dma->ov_mutex);
return ret;
diff --git a/drivers/video/msm/msm_fb.c b/drivers/video/msm/msm_fb.c
index e45b02a..e07c43b 100644
--- a/drivers/video/msm/msm_fb.c
+++ b/drivers/video/msm/msm_fb.c
@@ -122,10 +122,11 @@
#define MSM_FB_MAX_DBGFS 1024
#define MAX_BACKLIGHT_BRIGHTNESS 255
-/* 900 ms for fence time out */
-#define WAIT_FENCE_TIMEOUT 900
-/* 950 ms for display operation time out */
-#define WAIT_DISP_OP_TIMEOUT 950
+#define WAIT_FENCE_FIRST_TIMEOUT MSEC_PER_SEC
+#define WAIT_FENCE_FINAL_TIMEOUT 10 * MSEC_PER_SEC
+/* Display op timeout should be greater than total timeout */
+#define WAIT_DISP_OP_TIMEOUT (WAIT_FENCE_FIRST_TIMEOUT +\
+ WAIT_FENCE_FINAL_TIMEOUT) * MDP_MAX_FENCE_FD
#define MAX_TIMELINE_NAME_LEN 16
int msm_fb_debugfs_file_index;
@@ -1792,7 +1793,15 @@
int i, ret = 0;
/* buf sync */
for (i = 0; i < mfd->acq_fen_cnt; i++) {
- ret = sync_fence_wait(mfd->acq_fen[i], WAIT_FENCE_TIMEOUT);
+ ret = sync_fence_wait(mfd->acq_fen[i],
+ WAIT_FENCE_FIRST_TIMEOUT);
+ if (ret == -ETIME) {
+ pr_warn("%s: sync_fence_wait timed out!"
+ "Waiting %ld more seconds\n",
+ __func__,WAIT_FENCE_FINAL_TIMEOUT/MSEC_PER_SEC);
+ ret = sync_fence_wait(mfd->acq_fen[i],
+ WAIT_FENCE_FINAL_TIMEOUT);
+ }
if (ret < 0) {
pr_err("%s: sync_fence_wait failed! ret = %x\n",
__func__, ret);
@@ -2028,7 +2037,7 @@
mdp_dma_pan_update(info);
msm_fb_signal_timeline(mfd);
- if (mdp4_unmap_sec_resource())
+ if (mdp4_unmap_sec_resource(mfd))
pr_err("%s: unmap secure res failed\n", __func__);
up(&msm_fb_pan_sem);
diff --git a/drivers/video/msm/msm_fb.h b/drivers/video/msm/msm_fb.h
index 3eba41a..4b6f41f 100644
--- a/drivers/video/msm/msm_fb.h
+++ b/drivers/video/msm/msm_fb.h
@@ -215,6 +215,8 @@
int vsync_sysfs_created;
void *copy_splash_buf;
unsigned char *copy_splash_phys;
+ uint32 sec_mapped;
+ uint32 sec_active;
};
struct msm_fb_backup_type {
struct fb_info info;
diff --git a/include/media/msm_camera.h b/include/media/msm_camera.h
index 28314f7..d526cf7 100644
--- a/include/media/msm_camera.h
+++ b/include/media/msm_camera.h
@@ -1034,20 +1034,6 @@
#define SENSOR_QVGA_SIZE 2
#define SENSOR_INVALID_SIZE 3
-#define CAMERA_EFFECT_OFF 0
-#define CAMERA_EFFECT_MONO 1
-#define CAMERA_EFFECT_NEGATIVE 2
-#define CAMERA_EFFECT_SOLARIZE 3
-#define CAMERA_EFFECT_SEPIA 4
-#define CAMERA_EFFECT_POSTERIZE 5
-#define CAMERA_EFFECT_WHITEBOARD 6
-#define CAMERA_EFFECT_BLACKBOARD 7
-#define CAMERA_EFFECT_AQUA 8
-#define CAMERA_EFFECT_EMBOSS 9
-#define CAMERA_EFFECT_SKETCH 10
-#define CAMERA_EFFECT_NEON 11
-#define CAMERA_EFFECT_MAX 12
-
/* QRD */
#define CAMERA_EFFECT_BW 10
#define CAMERA_EFFECT_BLUISH 12
diff --git a/include/media/msm_isp.h b/include/media/msm_isp.h
index 8811104..19953ac 100644
--- a/include/media/msm_isp.h
+++ b/include/media/msm_isp.h
@@ -239,6 +239,8 @@
#define VFE_CMD_TEST_GEN_CFG 162
#define VFE_CMD_SELECT_RDI 163
#define VFE_CMD_SET_STATS_VER 164
+#define VFE_CMD_RGB_ALL_CFG 165
+#define VFE_CMD_RGB_ALL_UPDATE 166
struct msm_isp_cmd {
int32_t id;
diff --git a/sound/soc/msm/apq8064.c b/sound/soc/msm/apq8064.c
index 2de797a..b29cde7 100644
--- a/sound/soc/msm/apq8064.c
+++ b/sound/soc/msm/apq8064.c
@@ -846,7 +846,7 @@
msm_slim_3_rx_ch_get, msm_slim_3_rx_ch_put),
SOC_ENUM_EXT("HDMI_RX Channels", msm_enum[3],
msm_hdmi_rx_ch_get, msm_hdmi_rx_ch_put),
- SOC_ENUM_EXT("HDMI RX Rate", msm_enum[1],
+ SOC_ENUM_EXT("HDMI RX Rate", msm_enum[4],
msm_hdmi_rate_get,
msm_hdmi_rate_put),
};
@@ -1426,11 +1426,11 @@
pr_debug("%s channels->min %u channels->max %u ()\n", __func__,
channels->min, channels->max);
- if (channels->max < 2)
- channels->min = channels->max = 2;
if (!hdmi_rate_variable)
rate->min = rate->max = 48000;
channels->min = channels->max = msm_hdmi_rx_ch;
+ if (channels->max < 2)
+ channels->min = channels->max = 2;
return 0;
}
diff --git a/sound/soc/msm/mpq8064.c b/sound/soc/msm/mpq8064.c
index 0f7203f..0dcb958 100644
--- a/sound/soc/msm/mpq8064.c
+++ b/sound/soc/msm/mpq8064.c
@@ -134,7 +134,7 @@
static int msm_slim_0_rx_ch = 1;
static int msm_slim_0_tx_ch = 1;
static int msm_hdmi_rx_ch = 8;
-
+static int hdmi_rate_variable;
static struct clk *codec_clk;
static int clk_users;
@@ -517,6 +517,7 @@
static const char *slim0_tx_ch_text[] = {"One", "Two", "Three", "Four"};
static const char * const hdmi_rx_ch_text[] = {"Two", "Three", "Four",
"Five", "Six", "Seven", "Eight"};
+static const char * const hdmi_rate[] = {"Default", "Variable"};
static const struct soc_enum msm_enum[] = {
@@ -524,6 +525,7 @@
SOC_ENUM_SINGLE_EXT(2, slim0_rx_ch_text),
SOC_ENUM_SINGLE_EXT(4, slim0_tx_ch_text),
SOC_ENUM_SINGLE_EXT(7, hdmi_rx_ch_text),
+ SOC_ENUM_SINGLE_EXT(2, hdmi_rate),
};
@@ -585,6 +587,21 @@
}
+static int msm_hdmi_rate_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ hdmi_rate_variable = ucontrol->value.integer.value[0];
+ pr_debug("%s: hdmi_rate_variable = %d\n", __func__, hdmi_rate_variable);
+ return 0;
+}
+
+static int msm_hdmi_rate_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ ucontrol->value.integer.value[0] = hdmi_rate_variable;
+ return 0;
+}
+
static const struct snd_kcontrol_new tabla_msm_controls[] = {
SOC_ENUM_EXT("Speaker Function", msm_enum[0], msm_get_spk,
msm_set_spk),
@@ -594,7 +611,9 @@
msm_slim_0_tx_ch_get, msm_slim_0_tx_ch_put),
SOC_ENUM_EXT("HDMI_RX Channels", msm_enum[3],
msm_hdmi_rx_ch_get, msm_hdmi_rx_ch_put),
-
+ SOC_ENUM_EXT("HDMI RX Rate", msm_enum[4],
+ msm_hdmi_rate_get,
+ msm_hdmi_rate_put),
};
static void *def_tabla_mbhc_cal(void)
@@ -850,7 +869,9 @@
pr_debug("%s channels->min %u channels->max %u ()\n", __func__,
channels->min, channels->max);
- rate->min = rate->max = 48000;
+ /*Configure the sample rate as 48000 KHz for the LPCM playback*/
+ if (!hdmi_rate_variable)
+ rate->min = rate->max = 48000;
channels->min = channels->max = msm_hdmi_rx_ch;
return 0;
diff --git a/sound/soc/msm/msm-dai-q6-hdmi.c b/sound/soc/msm/msm-dai-q6-hdmi.c
index ab5265e2..99290a1 100644
--- a/sound/soc/msm/msm-dai-q6-hdmi.c
+++ b/sound/soc/msm/msm-dai-q6-hdmi.c
@@ -91,11 +91,25 @@
u32 channel_allocation = 0;
u32 level_shift = 0; /* 0dB */
bool down_mix = FALSE;
+ int sample_rate = 48000;
dai_data->channels = params_channels(params);
dai_data->rate = params_rate(params);
dai_data->port_config.hdmi_multi_ch.reserved = 0;
+ switch (dai_data->rate) {
+ case 48000:
+ sample_rate = HDMI_SAMPLE_RATE_48KHZ;
+ break;
+ case 44100:
+ sample_rate = HDMI_SAMPLE_RATE_44_1KHZ;
+ break;
+ case 32000:
+ sample_rate = HDMI_SAMPLE_RATE_32KHZ;
+ break;
+ }
+ hdmi_msm_audio_sample_rate_reset(sample_rate);
+
switch (dai_data->channels) {
case 2:
channel_allocation = 0;
diff --git a/sound/soc/msm/msm8930.c b/sound/soc/msm/msm8930.c
index a0295ea..18b8716 100644
--- a/sound/soc/msm/msm8930.c
+++ b/sound/soc/msm/msm8930.c
@@ -59,6 +59,7 @@
static int msm8930_btsco_rate = BTSCO_RATE_8KHZ;
static int msm8930_btsco_ch = 1;
static int hdmi_rate_variable;
+static int msm_hdmi_rx_ch = 2;
static struct clk *codec_clk;
static int clk_users;
@@ -394,7 +395,8 @@
static const char *spk_function[] = {"Off", "On"};
static const char *slim0_rx_ch_text[] = {"One", "Two"};
static const char *slim0_tx_ch_text[] = {"One", "Two", "Three", "Four"};
-
+static char const *hdmi_rx_ch_text[] = {"Two", "Three", "Four", "Five",
+ "Six", "Seven", "Eight"};
static const char * const hdmi_rate[] = {"Default", "Variable"};
static const struct soc_enum msm8930_enum[] = {
@@ -402,6 +404,7 @@
SOC_ENUM_SINGLE_EXT(2, slim0_rx_ch_text),
SOC_ENUM_SINGLE_EXT(4, slim0_tx_ch_text),
SOC_ENUM_SINGLE_EXT(2, hdmi_rate),
+ SOC_ENUM_SINGLE_EXT(7, hdmi_rx_ch_text),
};
static const char *btsco_rate_text[] = {"8000", "16000"};
@@ -508,6 +511,25 @@
return ret;
}
+static int msm_hdmi_rx_ch_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ pr_debug("%s: msm_hdmi_rx_ch = %d\n", __func__,
+ msm_hdmi_rx_ch);
+ ucontrol->value.integer.value[0] = msm_hdmi_rx_ch - 2;
+ return 0;
+}
+
+static int msm_hdmi_rx_ch_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ msm_hdmi_rx_ch = ucontrol->value.integer.value[0] + 2;
+
+ pr_debug("%s: msm_hdmi_rx_ch = %d\n", __func__,
+ msm_hdmi_rx_ch);
+ return 1;
+}
+
static int msm8930_hdmi_rate_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
@@ -537,6 +559,8 @@
SOC_ENUM_EXT("HDMI RX Rate", msm8930_enum[3],
msm8930_hdmi_rate_get,
msm8930_hdmi_rate_put),
+ SOC_ENUM_EXT("HDMI_RX Channels", msm8930_enum[4],
+ msm_hdmi_rx_ch_get, msm_hdmi_rx_ch_put),
};
static void *def_sitar_mbhc_cal(void)
@@ -778,7 +802,9 @@
if (!hdmi_rate_variable)
rate->min = rate->max = 48000;
- channels->min = channels->max = 2;
+ channels->min = channels->max = msm_hdmi_rx_ch;
+ if (channels->max < 2)
+ channels->min = channels->max = 2;
return 0;
}
diff --git a/sound/soc/msm/msm8960.c b/sound/soc/msm/msm8960.c
index 9bf404d..b151552 100644
--- a/sound/soc/msm/msm8960.c
+++ b/sound/soc/msm/msm8960.c
@@ -74,6 +74,7 @@
static int msm8960_btsco_rate = SAMPLE_RATE_8KHZ;
static int msm8960_btsco_ch = 1;
static int hdmi_rate_variable;
+static int msm_hdmi_rx_ch = 2;
static int msm8960_auxpcm_rate = SAMPLE_RATE_8KHZ;
static struct clk *codec_clk;
@@ -549,6 +550,8 @@
static const char *spk_function[] = {"Off", "On"};
static const char *slim0_rx_ch_text[] = {"One", "Two"};
static const char *slim0_tx_ch_text[] = {"One", "Two", "Three", "Four"};
+static char const *hdmi_rx_ch_text[] = {"Two", "Three", "Four", "Five",
+ "Six", "Seven", "Eight"};
static const char * const hdmi_rate[] = {"Default", "Variable"};
static const struct soc_enum msm8960_enum[] = {
@@ -556,6 +559,7 @@
SOC_ENUM_SINGLE_EXT(2, slim0_rx_ch_text),
SOC_ENUM_SINGLE_EXT(4, slim0_tx_ch_text),
SOC_ENUM_SINGLE_EXT(2, hdmi_rate),
+ SOC_ENUM_SINGLE_EXT(7, hdmi_rx_ch_text),
};
static const char *btsco_rate_text[] = {"8000", "16000"};
@@ -662,6 +666,25 @@
return 0;
}
+static int msm_hdmi_rx_ch_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ pr_debug("%s: msm_hdmi_rx_ch = %d\n", __func__,
+ msm_hdmi_rx_ch);
+ ucontrol->value.integer.value[0] = msm_hdmi_rx_ch - 2;
+ return 0;
+}
+
+static int msm_hdmi_rx_ch_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ msm_hdmi_rx_ch = ucontrol->value.integer.value[0] + 2;
+
+ pr_debug("%s: msm_hdmi_rx_ch = %d\n", __func__,
+ msm_hdmi_rx_ch);
+ return 1;
+}
+
static int msm8960_hdmi_rate_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
@@ -691,6 +714,8 @@
SOC_ENUM_EXT("HDMI RX Rate", msm8960_enum[3],
msm8960_hdmi_rate_get,
msm8960_hdmi_rate_put),
+ SOC_ENUM_EXT("HDMI_RX Channels", msm8960_enum[4],
+ msm_hdmi_rx_ch_get, msm_hdmi_rx_ch_put),
};
static void *def_tabla_mbhc_cal(void)
@@ -1038,10 +1063,11 @@
pr_debug("%s channels->min %u channels->max %u ()\n", __func__,
channels->min, channels->max);
- if (channels->max < 2)
- channels->min = channels->max = 2;
if (!hdmi_rate_variable)
rate->min = rate->max = 48000;
+ channels->min = channels->max = msm_hdmi_rx_ch;
+ if (channels->max < 2)
+ channels->min = channels->max = 2;
return 0;
}