summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/base/core.c39
-rw-r--r--drivers/clk/clk-composite.c2
-rw-r--r--drivers/clk/clk-divider.c2
-rw-r--r--drivers/clk/clk-fixed-factor.c2
-rw-r--r--drivers/clk/clk-fixed-rate.c2
-rw-r--r--drivers/clk/clk-fractional-divider.c2
-rw-r--r--drivers/clk/clk-gate.c2
-rw-r--r--drivers/clk/clk-mux.c2
-rw-r--r--drivers/clk/clk-pwm.c2
-rw-r--r--drivers/clk/clk.c268
-rw-r--r--drivers/clk/msm/clock-debug.c8
-rw-r--r--drivers/hwtracing/coresight/coresight-tmc.c18
-rw-r--r--drivers/leds/leds-qpnp-flash-v2.c17
-rw-r--r--drivers/md/dm-ioctl.c39
-rw-r--r--drivers/md/dm-table.c1
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp40.c25
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp44.c25
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp46.c30
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp47.c77
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c36
-rw-r--r--drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c3
-rw-r--r--drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c26
-rw-r--r--drivers/media/platform/msm/vidc/msm_vidc_common.c4
-rw-r--r--drivers/misc/qcom/qdsp6v2/amrwb_in.c2
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_aac.c10
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_alac.c2
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_amrnb.c6
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_amrwb.c6
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c6
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_ape.c6
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_evrc.c6
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c4
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_mp3.c6
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_qcelp.c6
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_utils.c4
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_utils_aio.c215
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_wma.c6
-rw-r--r--drivers/misc/qcom/qdsp6v2/audio_wmapro.c4
-rw-r--r--drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c20
-rw-r--r--drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c12
-rw-r--r--drivers/misc/qcom/qdsp6v2/ultrasound/usfcdev.c6
-rw-r--r--drivers/platform/msm/usb_bam.c11
-rw-r--r--drivers/soc/qcom/qdsp6v2/apr.c63
-rw-r--r--drivers/soc/qcom/scm.c18
-rw-r--r--drivers/soc/qcom/secure_buffer.c4
-rw-r--r--drivers/staging/android/ion/ion_heap.c10
-rw-r--r--drivers/usb/dwc3/gadget.c15
-rw-r--r--drivers/usb/pd/policy_engine.c179
-rw-r--r--drivers/video/fbdev/msm/mdss_fb.c2
49 files changed, 828 insertions, 433 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 3ac683dff7de..bbe8e2efc677 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -841,11 +841,29 @@ static struct kobject *get_device_parent(struct device *dev,
return NULL;
}
+static inline bool live_in_glue_dir(struct kobject *kobj,
+ struct device *dev)
+{
+ if (!kobj || !dev->class ||
+ kobj->kset != &dev->class->p->glue_dirs)
+ return false;
+ return true;
+}
+
+static inline struct kobject *get_glue_dir(struct device *dev)
+{
+ return dev->kobj.parent;
+}
+
+/*
+ * make sure cleaning up dir as the last step, we need to make
+ * sure .release handler of kobject is run with holding the
+ * global lock
+ */
static void cleanup_glue_dir(struct device *dev, struct kobject *glue_dir)
{
/* see if we live in a "glue" directory */
- if (!glue_dir || !dev->class ||
- glue_dir->kset != &dev->class->p->glue_dirs)
+ if (!live_in_glue_dir(glue_dir, dev))
return;
mutex_lock(&gdp_mutex);
@@ -853,11 +871,6 @@ static void cleanup_glue_dir(struct device *dev, struct kobject *glue_dir)
mutex_unlock(&gdp_mutex);
}
-static void cleanup_device_parent(struct device *dev)
-{
- cleanup_glue_dir(dev, dev->kobj.parent);
-}
-
static int device_add_class_symlinks(struct device *dev)
{
struct device_node *of_node = dev_of_node(dev);
@@ -1033,6 +1046,7 @@ int device_add(struct device *dev)
struct kobject *kobj;
struct class_interface *class_intf;
int error = -EINVAL;
+ struct kobject *glue_dir = NULL;
dev = get_device(dev);
if (!dev)
@@ -1077,8 +1091,10 @@ int device_add(struct device *dev)
/* first, register with generic layer. */
/* we require the name to be set before, and pass NULL */
error = kobject_add(&dev->kobj, dev->kobj.parent, NULL);
- if (error)
+ if (error) {
+ glue_dir = get_glue_dir(dev);
goto Error;
+ }
/* notify platform of device entry */
if (platform_notify)
@@ -1159,9 +1175,10 @@ done:
device_remove_file(dev, &dev_attr_uevent);
attrError:
kobject_uevent(&dev->kobj, KOBJ_REMOVE);
+ glue_dir = get_glue_dir(dev);
kobject_del(&dev->kobj);
Error:
- cleanup_device_parent(dev);
+ cleanup_glue_dir(dev, glue_dir);
put_device(parent);
name_error:
kfree(dev->p);
@@ -1237,6 +1254,7 @@ EXPORT_SYMBOL_GPL(put_device);
void device_del(struct device *dev)
{
struct device *parent = dev->parent;
+ struct kobject *glue_dir = NULL;
struct class_interface *class_intf;
/* Notify clients of device removal. This call must come
@@ -1281,8 +1299,9 @@ void device_del(struct device *dev)
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
BUS_NOTIFY_REMOVED_DEVICE, dev);
kobject_uevent(&dev->kobj, KOBJ_REMOVE);
- cleanup_device_parent(dev);
+ glue_dir = get_glue_dir(dev);
kobject_del(&dev->kobj);
+ cleanup_glue_dir(dev, glue_dir);
put_device(parent);
}
EXPORT_SYMBOL_GPL(device_del);
diff --git a/drivers/clk/clk-composite.c b/drivers/clk/clk-composite.c
index 4735de0660cc..8db56919e367 100644
--- a/drivers/clk/clk-composite.c
+++ b/drivers/clk/clk-composite.c
@@ -194,7 +194,7 @@ struct clk *clk_register_composite(struct device *dev, const char *name,
unsigned long flags)
{
struct clk *clk;
- struct clk_init_data init;
+ struct clk_init_data init = {};
struct clk_composite *composite;
struct clk_ops *clk_composite_ops;
diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c
index bbf206e3da0d..0c83ffc22dd2 100644
--- a/drivers/clk/clk-divider.c
+++ b/drivers/clk/clk-divider.c
@@ -436,7 +436,7 @@ static struct clk *_register_divider(struct device *dev, const char *name,
{
struct clk_divider *div;
struct clk *clk;
- struct clk_init_data init;
+ struct clk_init_data init = {};
if (clk_divider_flags & CLK_DIVIDER_HIWORD_MASK) {
if (width + shift > 16) {
diff --git a/drivers/clk/clk-fixed-factor.c b/drivers/clk/clk-fixed-factor.c
index 83de57aeceea..57fbc94764ff 100644
--- a/drivers/clk/clk-fixed-factor.c
+++ b/drivers/clk/clk-fixed-factor.c
@@ -75,7 +75,7 @@ struct clk *clk_register_fixed_factor(struct device *dev, const char *name,
unsigned int mult, unsigned int div)
{
struct clk_fixed_factor *fix;
- struct clk_init_data init;
+ struct clk_init_data init = {};
struct clk *clk;
fix = kmalloc(sizeof(*fix), GFP_KERNEL);
diff --git a/drivers/clk/clk-fixed-rate.c b/drivers/clk/clk-fixed-rate.c
index f85ec8d1711f..2ca7d5a8826f 100644
--- a/drivers/clk/clk-fixed-rate.c
+++ b/drivers/clk/clk-fixed-rate.c
@@ -62,7 +62,7 @@ struct clk *clk_register_fixed_rate_with_accuracy(struct device *dev,
{
struct clk_fixed_rate *fixed;
struct clk *clk;
- struct clk_init_data init;
+ struct clk_init_data init = {};
/* allocate fixed-rate clock */
fixed = kzalloc(sizeof(*fixed), GFP_KERNEL);
diff --git a/drivers/clk/clk-fractional-divider.c b/drivers/clk/clk-fractional-divider.c
index 5c4955e33f7a..f50892a74b60 100644
--- a/drivers/clk/clk-fractional-divider.c
+++ b/drivers/clk/clk-fractional-divider.c
@@ -124,7 +124,7 @@ struct clk *clk_register_fractional_divider(struct device *dev,
u8 clk_divider_flags, spinlock_t *lock)
{
struct clk_fractional_divider *fd;
- struct clk_init_data init;
+ struct clk_init_data init = {};
struct clk *clk;
fd = kzalloc(sizeof(*fd), GFP_KERNEL);
diff --git a/drivers/clk/clk-gate.c b/drivers/clk/clk-gate.c
index de0b322f5f58..eeb142534016 100644
--- a/drivers/clk/clk-gate.c
+++ b/drivers/clk/clk-gate.c
@@ -129,7 +129,7 @@ struct clk *clk_register_gate(struct device *dev, const char *name,
{
struct clk_gate *gate;
struct clk *clk;
- struct clk_init_data init;
+ struct clk_init_data init = {};
if (clk_gate_flags & CLK_GATE_HIWORD_MASK) {
if (bit_idx > 15) {
diff --git a/drivers/clk/clk-mux.c b/drivers/clk/clk-mux.c
index 7129c86a79db..21cb9fc0e4c4 100644
--- a/drivers/clk/clk-mux.c
+++ b/drivers/clk/clk-mux.c
@@ -124,7 +124,7 @@ struct clk *clk_register_mux_table(struct device *dev, const char *name,
{
struct clk_mux *mux;
struct clk *clk;
- struct clk_init_data init;
+ struct clk_init_data init = {};
u8 width = 0;
if (clk_mux_flags & CLK_MUX_HIWORD_MASK) {
diff --git a/drivers/clk/clk-pwm.c b/drivers/clk/clk-pwm.c
index 328fcfcefd8c..63505a323a08 100644
--- a/drivers/clk/clk-pwm.c
+++ b/drivers/clk/clk-pwm.c
@@ -56,7 +56,7 @@ static const struct clk_ops clk_pwm_ops = {
static int clk_pwm_probe(struct platform_device *pdev)
{
struct device_node *node = pdev->dev.of_node;
- struct clk_init_data init;
+ struct clk_init_data init = {};
struct clk_pwm *clk_pwm;
struct pwm_device *pwm;
const char *clk_name;
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 97a604755053..1eb6e32e0d51 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2010-2011 Canonical Ltd <jeremy.kerr@canonical.com>
* Copyright (C) 2011-2012 Linaro Ltd <mturquette@linaro.org>
+ * Copyright (c) 2016, 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 +24,7 @@
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/clkdev.h>
+#include <linux/regulator/consumer.h>
#include "clk.h"
@@ -41,6 +43,13 @@ static HLIST_HEAD(clk_root_list);
static HLIST_HEAD(clk_orphan_list);
static LIST_HEAD(clk_notifier_list);
+struct clk_handoff_vdd {
+ struct list_head list;
+ struct clk_vdd_class *vdd_class;
+};
+
+static LIST_HEAD(clk_handoff_vdd_list);
+
/*** private data structures ***/
struct clk_core {
@@ -75,6 +84,9 @@ struct clk_core {
struct hlist_node debug_node;
#endif
struct kref ref;
+ struct clk_vdd_class *vdd_class;
+ unsigned long *rate_max;
+ int num_rate_max;
};
#define CREATE_TRACE_POINTS
@@ -243,9 +255,12 @@ static int __init clk_ignore_unused_setup(char *__unused)
}
__setup("clk_ignore_unused", clk_ignore_unused_setup);
+static int clk_unvote_vdd_level(struct clk_vdd_class *vdd_class, int level);
+
static int clk_disable_unused(void)
{
struct clk_core *core;
+ struct clk_handoff_vdd *v, *v_temp;
if (clk_ignore_unused) {
pr_warn("clk: Not disabling unused clocks\n");
@@ -266,6 +281,13 @@ static int clk_disable_unused(void)
hlist_for_each_entry(core, &clk_orphan_list, child_node)
clk_unprepare_unused_subtree(core);
+ list_for_each_entry_safe(v, v_temp, &clk_handoff_vdd_list, list) {
+ clk_unvote_vdd_level(v->vdd_class,
+ v->vdd_class->num_levels - 1);
+ list_del(&v->list);
+ kfree(v);
+ };
+
clk_prepare_unlock();
return 0;
@@ -585,6 +607,212 @@ int __clk_mux_determine_rate_closest(struct clk_hw *hw,
}
EXPORT_SYMBOL_GPL(__clk_mux_determine_rate_closest);
+/*
+ * Find the voltage level required for a given clock rate.
+ */
+static int clk_find_vdd_level(struct clk_core *clk, unsigned long rate)
+{
+ int level;
+
+ for (level = 0; level < clk->num_rate_max; level++)
+ if (rate <= clk->rate_max[level])
+ break;
+
+ if (level == clk->num_rate_max) {
+ pr_err("Rate %lu for %s is greater than highest Fmax\n", rate,
+ clk->name);
+ return -EINVAL;
+ }
+
+ return level;
+}
+
+/*
+ * Update voltage level given the current votes.
+ */
+static int clk_update_vdd(struct clk_vdd_class *vdd_class)
+{
+ int level, rc = 0, i, ignore;
+ struct regulator **r = vdd_class->regulator;
+ int *uv = vdd_class->vdd_uv;
+ int n_reg = vdd_class->num_regulators;
+ int cur_lvl = vdd_class->cur_level;
+ int max_lvl = vdd_class->num_levels - 1;
+ int cur_base = cur_lvl * n_reg;
+ int new_base;
+
+ /* aggregate votes */
+ for (level = max_lvl; level > 0; level--)
+ if (vdd_class->level_votes[level])
+ break;
+
+ if (level == cur_lvl)
+ return 0;
+
+ max_lvl = max_lvl * n_reg;
+ new_base = level * n_reg;
+
+ for (i = 0; i < vdd_class->num_regulators; i++) {
+ pr_debug("Set Voltage level Min %d, Max %d\n", uv[new_base + i],
+ uv[max_lvl + i]);
+ rc = regulator_set_voltage(r[i], uv[new_base + i],
+ uv[max_lvl + i]);
+ if (rc)
+ goto set_voltage_fail;
+
+ if (cur_lvl == 0 || cur_lvl == vdd_class->num_levels)
+ rc = regulator_enable(r[i]);
+ else if (level == 0)
+ rc = regulator_disable(r[i]);
+ if (rc)
+ goto enable_disable_fail;
+ }
+
+ if (vdd_class->set_vdd && !vdd_class->num_regulators)
+ rc = vdd_class->set_vdd(vdd_class, level);
+
+ if (!rc)
+ vdd_class->cur_level = level;
+
+ return rc;
+
+enable_disable_fail:
+ regulator_set_voltage(r[i], uv[cur_base + i], uv[max_lvl + i]);
+
+set_voltage_fail:
+ for (i--; i >= 0; i--) {
+ regulator_set_voltage(r[i], uv[cur_base + i], uv[max_lvl + i]);
+ if (cur_lvl == 0 || cur_lvl == vdd_class->num_levels)
+ regulator_disable(r[i]);
+ else if (level == 0)
+ ignore = regulator_enable(r[i]);
+ }
+
+ return rc;
+}
+
+/*
+ * Vote for a voltage level.
+ */
+static int clk_vote_vdd_level(struct clk_vdd_class *vdd_class, int level)
+{
+ int rc = 0;
+
+ if (level >= vdd_class->num_levels)
+ return -EINVAL;
+
+ mutex_lock(&vdd_class->lock);
+
+ vdd_class->level_votes[level]++;
+
+ rc = clk_update_vdd(vdd_class);
+ if (rc)
+ vdd_class->level_votes[level]--;
+
+ mutex_unlock(&vdd_class->lock);
+
+ return rc;
+}
+
+/*
+ * Remove vote for a voltage level.
+ */
+static int clk_unvote_vdd_level(struct clk_vdd_class *vdd_class, int level)
+{
+ int rc = 0;
+
+ if (level >= vdd_class->num_levels)
+ return -EINVAL;
+
+ mutex_lock(&vdd_class->lock);
+
+ if (WARN(!vdd_class->level_votes[level],
+ "Reference counts are incorrect for %s level %d\n",
+ vdd_class->class_name, level))
+ goto out;
+
+ vdd_class->level_votes[level]--;
+
+ rc = clk_update_vdd(vdd_class);
+ if (rc)
+ vdd_class->level_votes[level]++;
+
+out:
+ mutex_unlock(&vdd_class->lock);
+ return rc;
+}
+
+/*
+ * Vote for a voltage level corresponding to a clock's rate.
+ */
+static int clk_vote_rate_vdd(struct clk_core *core, unsigned long rate)
+{
+ int level;
+
+ if (!core->vdd_class)
+ return 0;
+
+ level = clk_find_vdd_level(core, rate);
+ if (level < 0)
+ return level;
+
+ return clk_vote_vdd_level(core->vdd_class, level);
+}
+
+/*
+ * Remove vote for a voltage level corresponding to a clock's rate.
+ */
+static void clk_unvote_rate_vdd(struct clk_core *core, unsigned long rate)
+{
+ int level;
+
+ if (!core->vdd_class)
+ return;
+
+ level = clk_find_vdd_level(core, rate);
+ if (level < 0)
+ return;
+
+ clk_unvote_vdd_level(core->vdd_class, level);
+}
+
+static bool clk_is_rate_level_valid(struct clk_core *core, unsigned long rate)
+{
+ int level;
+
+ if (!core->vdd_class)
+ return true;
+
+ level = clk_find_vdd_level(core, rate);
+
+ return level >= 0;
+}
+
+static int clk_vdd_class_init(struct clk_vdd_class *vdd)
+{
+ struct clk_handoff_vdd *v;
+
+ list_for_each_entry(v, &clk_handoff_vdd_list, list) {
+ if (v->vdd_class == vdd)
+ return 0;
+ }
+
+ pr_debug("voting for vdd_class %s\n", vdd->class_name);
+
+ if (clk_vote_vdd_level(vdd, vdd->num_levels - 1))
+ pr_err("failed to vote for %s\n", vdd->class_name);
+
+ v = kmalloc(sizeof(*v), GFP_KERNEL);
+ if (!v)
+ return -ENOMEM;
+
+ v->vdd_class = vdd;
+
+ list_add_tail(&v->list, &clk_handoff_vdd_list);
+
+ return 0;
+}
+
/*** clk api ***/
static void clk_core_unprepare(struct clk_core *core)
@@ -608,6 +836,9 @@ static void clk_core_unprepare(struct clk_core *core)
core->ops->unprepare(core->hw);
trace_clk_unprepare_complete(core);
+
+ clk_unvote_rate_vdd(core, core->rate);
+
clk_core_unprepare(core->parent);
}
@@ -649,12 +880,19 @@ static int clk_core_prepare(struct clk_core *core)
trace_clk_prepare(core);
+ ret = clk_vote_rate_vdd(core, core->rate);
+ if (ret) {
+ clk_core_unprepare(core->parent);
+ return ret;
+ }
+
if (core->ops->prepare)
ret = core->ops->prepare(core->hw);
trace_clk_prepare_complete(core);
if (ret) {
+ clk_unvote_rate_vdd(core, core->rate);
clk_core_unprepare(core->parent);
return ret;
}
@@ -1401,6 +1639,9 @@ static struct clk_core *clk_calc_new_rates(struct clk_core *core,
top = clk_calc_new_rates(parent, best_parent_rate);
out:
+ if (!clk_is_rate_level_valid(core, rate))
+ return NULL;
+
clk_calc_subtree(core, new_rate, parent, p_index);
return top;
@@ -1485,15 +1726,26 @@ static int clk_change_rate(struct clk_core *core)
trace_clk_set_rate(core, core->new_rate);
+ /* Enforce vdd requirements for new frequency. */
+ if (core->prepare_count) {
+ rc = clk_vote_rate_vdd(core, core->new_rate);
+ if (rc)
+ goto out;
+ }
+
if (!skip_set_rate && core->ops->set_rate) {
rc = core->ops->set_rate(core->hw, core->new_rate,
best_parent_rate);
if (rc)
- goto out;
+ goto err_set_rate;
}
trace_clk_set_rate_complete(core, core->new_rate);
+ /* Release vdd requirements for old frequency. */
+ if (core->prepare_count)
+ clk_unvote_rate_vdd(core, old_rate);
+
core->rate = clk_recalc(core, best_parent_rate);
if (core->notifier_count && old_rate != core->rate)
@@ -1519,6 +1771,9 @@ static int clk_change_rate(struct clk_core *core)
return rc;
+err_set_rate:
+ if (core->prepare_count)
+ clk_unvote_rate_vdd(core, core->new_rate);
out:
trace_clk_set_rate_complete(core, core->new_rate);
@@ -2597,8 +2852,19 @@ struct clk *clk_register(struct device *dev, struct clk_hw *hw)
core->num_parents = hw->init->num_parents;
core->min_rate = 0;
core->max_rate = ULONG_MAX;
+ core->vdd_class = hw->init->vdd_class;
+ core->rate_max = hw->init->rate_max;
+ core->num_rate_max = hw->init->num_rate_max;
hw->core = core;
+ if (core->vdd_class) {
+ ret = clk_vdd_class_init(core->vdd_class);
+ if (ret) {
+ pr_err("Failed to initialize vdd class\n");
+ goto fail_parent_names;
+ }
+ }
+
/* allocate local copy in case parent_names is __initdata */
core->parent_names = kcalloc(core->num_parents, sizeof(char *),
GFP_KERNEL);
diff --git a/drivers/clk/msm/clock-debug.c b/drivers/clk/msm/clock-debug.c
index d0ff821eb203..00a86ba55171 100644
--- a/drivers/clk/msm/clock-debug.c
+++ b/drivers/clk/msm/clock-debug.c
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2007 Google, Inc.
- * Copyright (c) 2007-2014, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2007-2014, 2016, The Linux Foundation. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -355,8 +355,12 @@ static int trace_clocks_show(struct seq_file *m, void *unused)
return 1;
}
list_for_each_entry(c, &clk_list, list) {
+ int vlevel = 0;
+
+ if (c->num_fmax)
+ vlevel = find_vdd_level(c, c->rate);
trace_clock_state(c->dbg_name, c->prepare_count, c->count,
- c->rate);
+ c->rate, vlevel);
total_cnt++;
}
mutex_unlock(&clk_list_lock);
diff --git a/drivers/hwtracing/coresight/coresight-tmc.c b/drivers/hwtracing/coresight/coresight-tmc.c
index 766b052ade1d..294444d5f59e 100644
--- a/drivers/hwtracing/coresight/coresight-tmc.c
+++ b/drivers/hwtracing/coresight/coresight-tmc.c
@@ -792,11 +792,14 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode)
drvdata->out_mode == TMC_ETR_OUT_MODE_USB) {
drvdata->usbch = usb_qdss_open("qdss", drvdata,
usb_notifier);
- if (IS_ERR(drvdata->usbch)) {
+ if (IS_ERR_OR_NULL(drvdata->usbch)) {
dev_err(drvdata->dev, "usb_qdss_open failed\n");
ret = PTR_ERR(drvdata->usbch);
pm_runtime_put(drvdata->dev);
mutex_unlock(&drvdata->mem_lock);
+ if (!ret)
+ ret = -ENODEV;
+
return ret;
}
} else if (drvdata->config_type == TMC_CONFIG_TYPE_ETB ||
@@ -1846,12 +1849,13 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
struct device_node *np = adev->dev.of_node;
struct coresight_cti_data *ctidata;
- if (np) {
- pdata = of_get_coresight_platform_data(dev, np);
- if (IS_ERR(pdata))
- return PTR_ERR(pdata);
- adev->dev.platform_data = pdata;
- }
+ if (!np)
+ return -ENODEV;
+
+ pdata = of_get_coresight_platform_data(dev, np);
+ if (IS_ERR(pdata))
+ return PTR_ERR(pdata);
+ adev->dev.platform_data = pdata;
drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
if (!drvdata)
diff --git a/drivers/leds/leds-qpnp-flash-v2.c b/drivers/leds/leds-qpnp-flash-v2.c
index 325bdb35e8a3..51fd79f101c8 100644
--- a/drivers/leds/leds-qpnp-flash-v2.c
+++ b/drivers/leds/leds-qpnp-flash-v2.c
@@ -58,6 +58,7 @@
#define FLASH_LED_HDRM_VOL_MASK GENMASK(7, 4)
#define FLASH_LED_CURRENT_MASK GENMASK(6, 0)
#define FLASH_LED_ENABLE_MASK GENMASK(2, 0)
+#define FLASH_HW_STROBE_MASK GENMASK(2, 0)
#define FLASH_LED_SAFETY_TMR_MASK GENMASK(7, 0)
#define FLASH_LED_INT_RT_STS_MASK GENMASK(7, 0)
#define FLASH_LED_ISC_WARMUP_DELAY_MASK GENMASK(1, 0)
@@ -72,7 +73,7 @@
#define FLASH_LED_THERMAL_THRSH_MASK GENMASK(2, 0)
#define FLASH_LED_THERMAL_OTST_MASK GENMASK(2, 0)
#define FLASH_LED_MOD_CTRL_MASK BIT(7)
-#define FLASH_LED_HW_SW_STROBE_SEL_MASK BIT(2)
+#define FLASH_LED_HW_SW_STROBE_SEL_BIT BIT(2)
#define FLASH_LED_VPH_DROOP_FAULT_MASK BIT(4)
#define FLASH_LED_LMH_MITIGATION_EN_MASK BIT(0)
#define FLASH_LED_CHGR_MITIGATION_EN_MASK BIT(4)
@@ -811,7 +812,7 @@ static int qpnp_flash_led_switch_disable(struct flash_switch_data *snode)
}
}
- if (led->fnode[i].trigger & FLASH_LED_HW_SW_STROBE_SEL_MASK) {
+ if (led->fnode[i].trigger & FLASH_LED_HW_SW_STROBE_SEL_BIT) {
rc = qpnp_flash_led_hw_strobe_enable(&led->fnode[i],
led->pdata->hw_strobe_option, false);
if (rc < 0) {
@@ -831,7 +832,7 @@ static int qpnp_flash_led_switch_set(struct flash_switch_data *snode, bool on)
{
struct qpnp_flash_led *led = dev_get_drvdata(&snode->pdev->dev);
int rc, i, addr_offset;
- u8 val;
+ u8 val, mask;
if (snode->enabled == on) {
dev_warn(&led->pdev->dev, "Switch node is already %s!\n",
@@ -869,9 +870,13 @@ static int qpnp_flash_led_switch_set(struct flash_switch_data *snode, bool on)
continue;
addr_offset = led->fnode[i].id;
+ if (led->fnode[i].trigger & FLASH_LED_HW_SW_STROBE_SEL_BIT)
+ mask = FLASH_HW_STROBE_MASK;
+ else
+ mask = FLASH_LED_HW_SW_STROBE_SEL_BIT;
rc = qpnp_flash_led_masked_write(led,
FLASH_LED_REG_STROBE_CTRL(led->base + addr_offset),
- FLASH_LED_ENABLE_MASK, led->fnode[i].trigger);
+ mask, led->fnode[i].trigger);
if (rc < 0)
return rc;
@@ -899,7 +904,7 @@ static int qpnp_flash_led_switch_set(struct flash_switch_data *snode, bool on)
}
}
- if (led->fnode[i].trigger & FLASH_LED_HW_SW_STROBE_SEL_MASK) {
+ if (led->fnode[i].trigger & FLASH_LED_HW_SW_STROBE_SEL_BIT) {
rc = qpnp_flash_led_hw_strobe_enable(&led->fnode[i],
led->pdata->hw_strobe_option, true);
if (rc < 0) {
@@ -1389,7 +1394,7 @@ static int qpnp_flash_led_parse_each_led_dt(struct qpnp_flash_led *led,
}
fnode->trigger = (strobe_sel << 2) | (edge_trigger << 1) | active_high;
- if (fnode->trigger & FLASH_LED_HW_SW_STROBE_SEL_MASK) {
+ if (fnode->trigger & FLASH_LED_HW_SW_STROBE_SEL_BIT) {
if (of_find_property(node, "qcom,hw-strobe-gpio", NULL)) {
fnode->hw_strobe_gpio = of_get_named_gpio(node,
"qcom,hw-strobe-gpio", 0);
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
index 80a439543259..bc5e9a5b1f30 100644
--- a/drivers/md/dm-ioctl.c
+++ b/drivers/md/dm-ioctl.c
@@ -1923,6 +1923,45 @@ void dm_interface_exit(void)
dm_hash_exit();
}
+
+/**
+ * dm_ioctl_export - Permanently export a mapped device via the ioctl interface
+ * @md: Pointer to mapped_device
+ * @name: Buffer (size DM_NAME_LEN) for name
+ * @uuid: Buffer (size DM_UUID_LEN) for uuid or NULL if not desired
+ */
+int dm_ioctl_export(struct mapped_device *md, const char *name,
+ const char *uuid)
+{
+ int r = 0;
+ struct hash_cell *hc;
+
+ if (!md) {
+ r = -ENXIO;
+ goto out;
+ }
+
+ /* The name and uuid can only be set once. */
+ mutex_lock(&dm_hash_cells_mutex);
+ hc = dm_get_mdptr(md);
+ mutex_unlock(&dm_hash_cells_mutex);
+ if (hc) {
+ DMERR("%s: already exported", dm_device_name(md));
+ r = -ENXIO;
+ goto out;
+ }
+
+ r = dm_hash_insert(name, uuid, md);
+ if (r) {
+ DMERR("%s: could not bind to '%s'", dm_device_name(md), name);
+ goto out;
+ }
+
+ /* Let udev know we've changed. */
+ dm_kobject_uevent(md, KOBJ_CHANGE, dm_get_event_nr(md));
+out:
+ return r;
+}
/**
* dm_copy_name_and_uuid - Copy mapped device name & uuid into supplied buffers
* @md: Pointer to mapped_device
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
index cb5d0daf53bb..b3d78bba3a79 100644
--- a/drivers/md/dm-table.c
+++ b/drivers/md/dm-table.c
@@ -11,6 +11,7 @@
#include <linux/vmalloc.h>
#include <linux/blkdev.h>
#include <linux/namei.h>
+#include <linux/mount.h>
#include <linux/ctype.h>
#include <linux/string.h>
#include <linux/slab.h>
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c
index 9e68af87b86c..1529e2aa740c 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c
@@ -105,6 +105,9 @@ static void msm_vfe40_config_irq(struct vfe_device *vfe_dev,
case MSM_ISP_IRQ_ENABLE:
vfe_dev->irq0_mask |= irq0_mask;
vfe_dev->irq1_mask |= irq1_mask;
+ msm_camera_io_w(irq0_mask, vfe_dev->vfe_base + 0x30);
+ msm_camera_io_w(irq0_mask, vfe_dev->vfe_base + 0x34);
+ msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x24);
break;
case MSM_ISP_IRQ_DISABLE:
vfe_dev->irq0_mask &= ~irq0_mask;
@@ -113,6 +116,9 @@ static void msm_vfe40_config_irq(struct vfe_device *vfe_dev,
case MSM_ISP_IRQ_SET:
vfe_dev->irq0_mask = irq0_mask;
vfe_dev->irq1_mask = irq1_mask;
+ msm_camera_io_w(irq0_mask, vfe_dev->vfe_base + 0x30);
+ msm_camera_io_w(irq0_mask, vfe_dev->vfe_base + 0x34);
+ msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x24);
}
msm_camera_io_w_mb(vfe_dev->irq0_mask, vfe_dev->vfe_base + 0x28);
msm_camera_io_w_mb(vfe_dev->irq1_mask, vfe_dev->vfe_base + 0x2C);
@@ -329,13 +335,6 @@ static void msm_vfe40_init_hardware_reg(struct vfe_device *vfe_dev)
msm_camera_io_w(0x10000001, vfe_dev->vfe_base + 0x50);
msm_vfe40_config_irq(vfe_dev, 0x800000E0, 0xFEFFFF7E,
MSM_ISP_IRQ_ENABLE);
- msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x30);
- msm_camera_io_w_mb(0xFEFFFFFF, vfe_dev->vfe_base + 0x34);
- msm_camera_io_w(1, vfe_dev->vfe_base + 0x24);
-
- msm_camera_io_w(0, vfe_dev->vfe_base + 0x30);
- msm_camera_io_w_mb(0, vfe_dev->vfe_base + 0x34);
- msm_camera_io_w(1, vfe_dev->vfe_base + 0x24);
}
static void msm_vfe40_clear_status_reg(struct vfe_device *vfe_dev)
@@ -1742,10 +1741,6 @@ static int msm_vfe40_axi_halt(struct vfe_device *vfe_dev,
/* Keep only halt and restart mask */
msm_vfe40_config_irq(vfe_dev, (1 << 31), (1 << 8),
MSM_ISP_IRQ_SET);
- /*Clear IRQ Status */
- msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x30);
- msm_camera_io_w(0xFEFFFEFF, vfe_dev->vfe_base + 0x34);
- msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x24);
msm_isp_get_timestamp(&ts, vfe_dev);
/* if any stream is waiting for update, signal complete */
@@ -1777,12 +1772,8 @@ static int msm_vfe40_axi_halt(struct vfe_device *vfe_dev,
static void msm_vfe40_axi_restart(struct vfe_device *vfe_dev,
uint32_t blocking, uint32_t enable_camif)
{
- msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
- MSM_ISP_IRQ_SET);
- /* Clear IRQ Status */
- msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x30);
- msm_camera_io_w(0xFEFFFEFF, vfe_dev->vfe_base + 0x34);
- msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x24);
+ msm_vfe40_config_irq(vfe_dev, 0x800000E0, 0xFEFFFF7E,
+ MSM_ISP_IRQ_ENABLE);
msm_camera_io_w_mb(0x140000, vfe_dev->vfe_base + 0x318);
/* Start AXI */
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c
index fb4f7a1dcc92..a9940927d426 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c
@@ -74,6 +74,9 @@ static void msm_vfe44_config_irq(struct vfe_device *vfe_dev,
case MSM_ISP_IRQ_ENABLE:
vfe_dev->irq0_mask |= irq0_mask;
vfe_dev->irq1_mask |= irq1_mask;
+ msm_camera_io_w(irq0_mask, vfe_dev->vfe_base + 0x30);
+ msm_camera_io_w(irq1_mask, vfe_dev->vfe_base + 0x34);
+ msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x24);
break;
case MSM_ISP_IRQ_DISABLE:
vfe_dev->irq0_mask &= ~irq0_mask;
@@ -82,6 +85,9 @@ static void msm_vfe44_config_irq(struct vfe_device *vfe_dev,
case MSM_ISP_IRQ_SET:
vfe_dev->irq0_mask = irq0_mask;
vfe_dev->irq1_mask = irq1_mask;
+ msm_camera_io_w(irq0_mask, vfe_dev->vfe_base + 0x30);
+ msm_camera_io_w(irq1_mask, vfe_dev->vfe_base + 0x34);
+ msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x24);
break;
}
msm_camera_io_w_mb(irq0_mask, vfe_dev->vfe_base + 0x28);
@@ -175,9 +181,6 @@ static void msm_vfe44_init_hardware_reg(struct vfe_device *vfe_dev)
msm_camera_io_w(0x10000001, vfe_dev->vfe_base + 0x50);
msm_vfe44_config_irq(vfe_dev, 0x800000E0, 0xFFFFFF7E,
MSM_ISP_IRQ_ENABLE);
- msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x30);
- msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x34);
- msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x24);
}
@@ -1349,15 +1352,6 @@ static int msm_vfe44_axi_halt(struct vfe_device *vfe_dev,
msm_vfe44_config_irq(vfe_dev, (1 << 31), (1 << 8),
MSM_ISP_IRQ_SET);
- /*Clear IRQ Status0, only leave reset irq mask*/
- msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x30);
-
- /*Clear IRQ Status1, only leave halt irq mask*/
- msm_camera_io_w(0xFEFFFEFF, vfe_dev->vfe_base + 0x34);
-
- /*push clear cmd*/
- msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x24);
-
if (atomic_read(&vfe_dev->error_info.overflow_state)
== OVERFLOW_DETECTED)
pr_err_ratelimited("%s: VFE%d halt for recovery, blocking %d\n",
@@ -1393,11 +1387,8 @@ static int msm_vfe44_axi_halt(struct vfe_device *vfe_dev,
static void msm_vfe44_axi_restart(struct vfe_device *vfe_dev,
uint32_t blocking, uint32_t enable_camif)
{
- msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
- MSM_ISP_IRQ_SET);
- msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x30);
- msm_camera_io_w(0xFEFFFEFF, vfe_dev->vfe_base + 0x34);
- msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x24);
+ msm_vfe44_config_irq(vfe_dev, 0x800000E0, 0xFFFFFF7E,
+ MSM_ISP_IRQ_ENABLE);
msm_camera_io_w_mb(0x140000, vfe_dev->vfe_base + 0x318);
/* Start AXI */
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c
index d45b6ff0a7d0..d239c6069ad9 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c
@@ -96,6 +96,9 @@ static void msm_vfe46_config_irq(struct vfe_device *vfe_dev,
case MSM_ISP_IRQ_ENABLE:
vfe_dev->irq0_mask |= irq0_mask;
vfe_dev->irq1_mask |= irq1_mask;
+ msm_camera_io_w(irq0_mask, vfe_dev->vfe_base + 0x64);
+ msm_camera_io_w_mb(irq1_mask, vfe_dev->vfe_base + 0x68);
+ msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x58);
break;
case MSM_ISP_IRQ_DISABLE:
vfe_dev->irq0_mask &= ~irq0_mask;
@@ -104,6 +107,9 @@ static void msm_vfe46_config_irq(struct vfe_device *vfe_dev,
case MSM_ISP_IRQ_SET:
vfe_dev->irq0_mask = irq0_mask;
vfe_dev->irq1_mask = irq1_mask;
+ msm_camera_io_w(irq1_mask, vfe_dev->vfe_base + 0x64);
+ msm_camera_io_w_mb(irq1_mask, vfe_dev->vfe_base + 0x68);
+ msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x58);
break;
}
msm_camera_io_w_mb(vfe_dev->irq0_mask,
@@ -204,9 +210,6 @@ static void msm_vfe46_init_hardware_reg(struct vfe_device *vfe_dev)
/* IRQ_MASK/CLEAR */
msm_vfe46_config_irq(vfe_dev, 0x810000E0, 0xFFFFFF7E,
MSM_ISP_IRQ_ENABLE);
- msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x64);
- msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x68);
- msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x58);
}
static void msm_vfe46_clear_status_reg(struct vfe_device *vfe_dev)
@@ -1159,11 +1162,6 @@ static void msm_vfe46_update_camif_state(struct vfe_device *vfe_dev,
/* testgen OFF*/
if (vfe_dev->axi_data.src_info[VFE_PIX_0].input_mux == TESTGEN)
msm_camera_io_w(1 << 1, vfe_dev->vfe_base + 0xAF4);
- msm_camera_io_w(0, vfe_dev->vfe_base + 0x64);
- msm_camera_io_w((1 << 0), vfe_dev->vfe_base + 0x68);
- msm_camera_io_w_mb(1, vfe_dev->vfe_base + 0x58);
- msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask,
- vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
}
}
@@ -1436,15 +1434,6 @@ static int msm_vfe46_axi_halt(struct vfe_device *vfe_dev,
msm_vfe46_config_irq(vfe_dev, (1 << 31), (1 << 8),
MSM_ISP_IRQ_SET);
- /*Clear IRQ Status0, only leave reset irq mask*/
- msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x64);
-
- /*Clear IRQ Status1, only leave halt irq mask*/
- msm_camera_io_w(0xFFFFFEFF, vfe_dev->vfe_base + 0x68);
-
- /*push clear cmd*/
- msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x58);
-
if (atomic_read(&vfe_dev->error_info.overflow_state)
== OVERFLOW_DETECTED)
pr_err_ratelimited("%s: VFE%d halt for recovery, blocking %d\n",
@@ -1479,11 +1468,8 @@ static int msm_vfe46_axi_halt(struct vfe_device *vfe_dev,
static void msm_vfe46_axi_restart(struct vfe_device *vfe_dev,
uint32_t blocking, uint32_t enable_camif)
{
- msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
- MSM_ISP_IRQ_SET);
- msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x64);
- msm_camera_io_w(0xFFFFFEFF, vfe_dev->vfe_base + 0x68);
- msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x58);
+ msm_vfe46_config_irq(vfe_dev, 0x810000E0, 0xFFFFFF7E,
+ MSM_ISP_IRQ_ENABLE);
msm_camera_io_w_mb(0x20000, vfe_dev->vfe_base + 0x3CC);
/* Start AXI */
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c
index 6d1ad8ef6804..c50c55a69fb5 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c
@@ -156,6 +156,9 @@ void msm_vfe47_config_irq(struct vfe_device *vfe_dev,
case MSM_ISP_IRQ_ENABLE:
vfe_dev->irq0_mask |= irq0_mask;
vfe_dev->irq1_mask |= irq1_mask;
+ msm_camera_io_w_mb(irq0_mask, vfe_dev->vfe_base + 0x64);
+ msm_camera_io_w_mb(irq1_mask, vfe_dev->vfe_base + 0x68);
+ msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x58);
break;
case MSM_ISP_IRQ_DISABLE:
vfe_dev->irq0_mask &= ~irq0_mask;
@@ -164,6 +167,9 @@ void msm_vfe47_config_irq(struct vfe_device *vfe_dev,
case MSM_ISP_IRQ_SET:
vfe_dev->irq0_mask = irq0_mask;
vfe_dev->irq1_mask = irq1_mask;
+ msm_camera_io_w_mb(irq0_mask, vfe_dev->vfe_base + 0x64);
+ msm_camera_io_w_mb(irq1_mask, vfe_dev->vfe_base + 0x68);
+ msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x58);
break;
}
msm_camera_io_w_mb(vfe_dev->irq0_mask,
@@ -404,9 +410,6 @@ void msm_vfe47_init_hardware_reg(struct vfe_device *vfe_dev)
/* IRQ_MASK/CLEAR */
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
0x810000E0, 0xFFFFFF7E, MSM_ISP_IRQ_ENABLE);
- msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x64);
- msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x68);
- msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x58);
}
void msm_vfe47_clear_status_reg(struct vfe_device *vfe_dev)
@@ -792,6 +795,8 @@ void msm_vfe47_axi_cfg_comp_mask(struct vfe_device *vfe_dev,
struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data;
int vfe_idx = msm_isp_get_vfe_idx_for_stream(vfe_dev, stream_info);
uint32_t comp_mask, comp_mask_index;
+ int i;
+ uint32_t overflow_mask = 0;
comp_mask_index = stream_info->comp_mask_index[vfe_idx];
comp_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x74);
@@ -800,8 +805,11 @@ void msm_vfe47_axi_cfg_comp_mask(struct vfe_device *vfe_dev,
stream_composite_mask << (comp_mask_index * 8));
msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x74);
+ for (i = 0; i < stream_info->num_planes; i++)
+ overflow_mask |= (1 << (stream_info->wm[vfe_idx][i] + 9));
+
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- 1 << (comp_mask_index + 25), 0,
+ 1 << (comp_mask_index + 25), overflow_mask,
MSM_ISP_IRQ_ENABLE);
}
@@ -827,7 +835,8 @@ void msm_vfe47_axi_cfg_wm_irq_mask(struct vfe_device *vfe_dev,
int vfe_idx = msm_isp_get_vfe_idx_for_stream(vfe_dev, stream_info);
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- 1 << (stream_info->wm[vfe_idx][0] + 8), 0,
+ 1 << (stream_info->wm[vfe_idx][0] + 8),
+ 1 << (stream_info->wm[vfe_idx][0] + 9),
MSM_ISP_IRQ_ENABLE);
}
@@ -1309,7 +1318,7 @@ void msm_vfe47_cfg_camif(struct vfe_device *vfe_dev,
msm_camera_io_w(
subsample_cfg->first_line << 16 |
subsample_cfg->last_line,
- vfe_dev->vfe_base + 0xCE4);
+ vfe_dev->vfe_base + 0xCE8);
val = msm_camera_io_r(
vfe_dev->vfe_base + 0x47C);
ISP_DBG("%s: camif raw crop enabled\n", __func__);
@@ -1417,11 +1426,8 @@ void msm_vfe47_update_camif_state(struct vfe_device *vfe_dev,
val = msm_camera_io_r(vfe_dev->vfe_base + 0x47C);
if (update_state == ENABLE_CAMIF) {
- msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x64);
- msm_camera_io_w(0x81, vfe_dev->vfe_base + 0x68);
- msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x58);
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- 0x15, 0x81,
+ 0x15, 0x91,
MSM_ISP_IRQ_ENABLE);
if ((vfe_dev->hvx_cmd > HVX_DISABLE) &&
@@ -1452,8 +1458,8 @@ void msm_vfe47_update_camif_state(struct vfe_device *vfe_dev,
/* For testgen always halt on camif boundary */
if (vfe_dev->axi_data.src_info[VFE_PIX_0].input_mux == TESTGEN)
update_state = DISABLE_CAMIF;
- /* turn off camif violation and error irqs */
- vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev, 0, 0x81,
+ /* turn off camif, violation and write master overwrite irq */
+ vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev, 0, 0x91,
MSM_ISP_IRQ_DISABLE);
val = msm_camera_io_r(vfe_dev->vfe_base + 0x464);
/* disable danger signal */
@@ -1471,16 +1477,6 @@ void msm_vfe47_update_camif_state(struct vfe_device *vfe_dev,
if ((vfe_dev->hvx_cmd > HVX_DISABLE) &&
(vfe_dev->hvx_cmd <= HVX_ROUND_TRIP))
msm_vfe47_configure_hvx(vfe_dev, 0);
- /*
- * restore the irq that were disabled for camif stop and clear
- * the camif error interrupts if generated during that period
- */
- msm_camera_io_w(0, vfe_dev->vfe_base + 0x64);
- msm_camera_io_w(1 << 0, vfe_dev->vfe_base + 0x68);
- msm_camera_io_w_mb(1, vfe_dev->vfe_base + 0x58);
- vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- vfe_dev->irq0_mask,
- vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
}
}
@@ -1768,16 +1764,6 @@ int msm_vfe47_axi_halt(struct vfe_device *vfe_dev,
(1 << 31), (1 << 8),
MSM_ISP_IRQ_SET);
- /*Clear IRQ Status0, only leave reset irq mask*/
- msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x64);
-
- /*Clear IRQ Status1, only leave halt irq mask*/
- msm_camera_io_w(0xFFFFFEFF, vfe_dev->vfe_base + 0x68);
-
- /*push clear cmd*/
- msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x58);
-
-
if (atomic_read(&vfe_dev->error_info.overflow_state)
== OVERFLOW_DETECTED)
pr_err_ratelimited("%s: VFE%d halt for recovery, blocking %d\n",
@@ -1815,12 +1801,7 @@ void msm_vfe47_axi_restart(struct vfe_device *vfe_dev,
uint32_t blocking, uint32_t enable_camif)
{
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- vfe_dev->irq0_mask, vfe_dev->irq1_mask,
- MSM_ISP_IRQ_SET);
- msm_camera_io_w(0x7FFFFFFF, vfe_dev->vfe_base + 0x64);
- msm_camera_io_w(0xFFFFFEFF, vfe_dev->vfe_base + 0x68);
- msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x58);
-
+ 0x810000E0, 0xFFFFFF7E, MSM_ISP_IRQ_ENABLE);
/* Start AXI */
msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x400);
@@ -1832,6 +1813,8 @@ void msm_vfe47_axi_restart(struct vfe_device *vfe_dev,
vfe_dev->hw_info->vfe_ops.core_ops.
update_camif_state(vfe_dev, ENABLE_CAMIF);
}
+ vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
+ 0x810000E0, 0xFFFFFF7E, MSM_ISP_IRQ_ENABLE);
}
uint32_t msm_vfe47_get_wm_mask(
@@ -1957,40 +1940,40 @@ void msm_vfe47_stats_cfg_wm_irq_mask(
switch (STATS_IDX(stream_info->stream_handle[vfe_idx])) {
case STATS_COMP_IDX_AEC_BG:
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- 1 << 15, 0, MSM_ISP_IRQ_ENABLE);
+ 1 << 15, 1 << 24, MSM_ISP_IRQ_ENABLE);
break;
case STATS_COMP_IDX_HDR_BE:
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- 1 << 16, 0, MSM_ISP_IRQ_ENABLE);
+ 1 << 16, 1 << 16, MSM_ISP_IRQ_ENABLE);
break;
case STATS_COMP_IDX_BG:
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- 1 << 17, 0, MSM_ISP_IRQ_ENABLE);
+ 1 << 17, 1 << 17, MSM_ISP_IRQ_ENABLE);
break;
case STATS_COMP_IDX_BF:
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- 1 << 18, 1 << 26,
+ 1 << 18, 1 << 26 | 1 << 18,
MSM_ISP_IRQ_ENABLE);
break;
case STATS_COMP_IDX_HDR_BHIST:
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- 1 << 19, 0, MSM_ISP_IRQ_ENABLE);
+ 1 << 19, 1 << 19, MSM_ISP_IRQ_ENABLE);
break;
case STATS_COMP_IDX_RS:
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- 1 << 20, 0, MSM_ISP_IRQ_ENABLE);
+ 1 << 20, 1 << 20, MSM_ISP_IRQ_ENABLE);
break;
case STATS_COMP_IDX_CS:
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- 1 << 21, 0, MSM_ISP_IRQ_ENABLE);
+ 1 << 21, 1 << 21, MSM_ISP_IRQ_ENABLE);
break;
case STATS_COMP_IDX_IHIST:
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- 1 << 22, 0, MSM_ISP_IRQ_ENABLE);
+ 1 << 22, 1 << 22, MSM_ISP_IRQ_ENABLE);
break;
case STATS_COMP_IDX_BHIST:
vfe_dev->hw_info->vfe_ops.irq_ops.config_irq(vfe_dev,
- 1 << 23, 0, MSM_ISP_IRQ_ENABLE);
+ 1 << 23, 1 << 23, MSM_ISP_IRQ_ENABLE);
break;
default:
pr_err("%s: Invalid stats idx %d\n", __func__,
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
index fbc2fee5a51d..fdc98436a105 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
@@ -14,6 +14,7 @@
#include <asm/div64.h>
#include "msm_isp_util.h"
#include "msm_isp_axi_util.h"
+#include "msm_isp48.h"
#define HANDLE_TO_IDX(handle) (handle & 0xFF)
#define ISP_SOF_DEBUG_COUNT 0
@@ -2017,22 +2018,25 @@ static void msm_isp_input_disable(struct vfe_device *vfe_dev)
if (i != VFE_PIX_0 || ext_read)
continue;
/* halt camif */
- if (total_stream_count == 0)
+ if (total_stream_count == 0) {
vfe_dev->hw_info->vfe_ops.core_ops.
update_camif_state(vfe_dev,
DISABLE_CAMIF_IMMEDIATELY);
- else
+ } else {
vfe_dev->hw_info->vfe_ops.core_ops.
update_camif_state(vfe_dev, DISABLE_CAMIF);
+ }
}
-
/* halt and reset hardware if all streams are disabled */
if (total_stream_count == 0) {
vfe_dev->hw_info->vfe_ops.axi_ops.halt(vfe_dev, 1);
+ msm_isp_flush_tasklet(vfe_dev);
vfe_dev->hw_info->vfe_ops.core_ops.reset_hw(vfe_dev, 0, 1);
- vfe_dev->hw_info->vfe_ops.core_ops.init_hw_reg(vfe_dev);
-
+ if (msm_vfe_is_vfe48(vfe_dev))
+ vfe_dev->hw_info->vfe_ops.core_ops.reset_hw(vfe_dev,
+ 0, 1);
}
+
}
/**
@@ -2719,6 +2723,20 @@ static void __msm_isp_stop_axi_streams(struct vfe_device *vfe_dev,
for (i = 0; i < num_streams; i++) {
stream_info = streams[i];
+ msm_isp_update_intf_stream_cnt(stream_info, 0);
+ for (k = 0; k < stream_info->num_isp; k++) {
+ vfe_dev = stream_info->vfe_dev[k];
+ update_vfes[vfe_dev->pdev->id] = vfe_dev;
+ }
+ }
+ for (k = 0; k < MAX_VFE; k++) {
+ if (!update_vfes[k])
+ continue;
+ msm_isp_input_disable(update_vfes[k]);
+ }
+
+ for (i = 0; i < num_streams; i++) {
+ stream_info = streams[i];
spin_lock_irqsave(&stream_info->lock, flags);
/*
* since we can get here from start axi stream error path due
@@ -2743,12 +2761,10 @@ static void __msm_isp_stop_axi_streams(struct vfe_device *vfe_dev,
else
vfe_dev->hw_info->vfe_ops.axi_ops.
clear_wm_irq_mask(vfe_dev, stream_info);
- update_vfes[vfe_dev->pdev->id] = vfe_dev;
}
init_completion(&stream_info->inactive_comp);
stream_info->state = STOP_PENDING;
spin_unlock_irqrestore(&stream_info->lock, flags);
- msm_isp_update_intf_stream_cnt(stream_info, 0);
}
for (k = 0; k < MAX_VFE; k++) {
@@ -2843,7 +2859,6 @@ static void __msm_isp_stop_axi_streams(struct vfe_device *vfe_dev,
if (!update_vfes[k])
continue;
msm_isp_update_stream_bandwidth(update_vfes[k]);
- msm_isp_input_disable(update_vfes[k]);
}
for (i = 0; i < num_streams; i++) {
@@ -3777,8 +3792,9 @@ void msm_isp_process_axi_irq_stream(struct vfe_device *vfe_dev,
(~(pingpong_status >>
stream_info->wm[vfe_idx][i]) & 0x1)) {
spin_unlock_irqrestore(&stream_info->lock, flags);
- pr_err("%s: Write master ping pong mismatch. Status: 0x%x\n",
- __func__, pingpong_status);
+ pr_err("%s: Write master ping pong mismatch. Status: 0x%x %x\n",
+ __func__, pingpong_status,
+ stream_info->stream_src);
msm_isp_halt_send_error(vfe_dev,
ISP_EVENT_PING_PONG_MISMATCH);
return;
diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c
index c9656e748f09..df95e5cb9b99 100644
--- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c
+++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c
@@ -1535,9 +1535,6 @@ static void msm_ispif_release(struct ispif_device *ispif)
{
BUG_ON(!ispif);
- msm_ispif_reset(ispif);
- msm_ispif_reset_hw(ispif);
-
msm_camera_enable_irq(ispif->irq, 0);
ispif->ispif_state = ISPIF_POWER_DOWN;
diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
index e0d6977b24a6..106d76aae3bb 100644
--- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
+++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
@@ -2344,21 +2344,19 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev,
return -EINVAL;
}
- if (!new_frame->partial_frame_indicator) {
- if (cpp_frame_msg[new_frame->msg_len - 1] !=
- MSM_CPP_MSG_ID_TRAILER) {
- pr_err("Invalid frame message\n");
- return -EINVAL;
- }
+ if (cpp_frame_msg[new_frame->msg_len - 1] !=
+ MSM_CPP_MSG_ID_TRAILER) {
+ pr_err("Invalid frame message\n");
+ return -EINVAL;
+ }
- if ((stripe_base + new_frame->num_strips * stripe_size + 1) !=
- new_frame->msg_len) {
- pr_err("Invalid frame message,len=%d,expected=%d\n",
- new_frame->msg_len,
- (stripe_base +
- new_frame->num_strips * stripe_size + 1));
- return -EINVAL;
- }
+ if ((stripe_base + new_frame->num_strips * stripe_size + 1) !=
+ new_frame->msg_len) {
+ pr_err("Invalid frame message,len=%d,expected=%d\n",
+ new_frame->msg_len,
+ (stripe_base +
+ new_frame->num_strips * stripe_size + 1));
+ return -EINVAL;
}
if (cpp_dev->iommu_state != CPP_IOMMU_STATE_ATTACHED) {
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c
index 3671d5fa6479..e612c6ed11c7 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_common.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c
@@ -3705,6 +3705,10 @@ static void log_frame(struct msm_vidc_inst *inst, struct vidc_frame_data *data,
if (msm_comm_scale_clocks(inst->core))
dprintk(VIDC_WARN,
"Failed to scale clocks. Performance might be impacted\n");
+
+ if (msm_comm_vote_bus(inst->core))
+ dprintk(VIDC_WARN,
+ "Failed to scale bus. Performance might be impacted\n");
}
static int request_seq_header(struct msm_vidc_inst *inst,
diff --git a/drivers/misc/qcom/qdsp6v2/amrwb_in.c b/drivers/misc/qcom/qdsp6v2/amrwb_in.c
index 4f94ed2673e6..5e9dbca420a7 100644
--- a/drivers/misc/qcom/qdsp6v2/amrwb_in.c
+++ b/drivers/misc/qcom/qdsp6v2/amrwb_in.c
@@ -310,7 +310,7 @@ static int amrwb_in_open(struct inode *inode, struct file *file)
(void *)audio);
if (!audio->ac) {
- pr_err("%s:audio[%p]: Could not allocate memory for audio"
+ pr_err("%s:audio[%pK]: Could not allocate memory for audio"
"client\n", __func__, audio);
kfree(audio->enc_cfg);
kfree(audio);
diff --git a/drivers/misc/qcom/qdsp6v2/audio_aac.c b/drivers/misc/qcom/qdsp6v2/audio_aac.c
index e49d91d74514..94d563a211ec 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_aac.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_aac.c
@@ -2,7 +2,7 @@
*
* Copyright (C) 2008 Google, Inc.
* Copyright (C) 2008 HTC Corporation
- * Copyright (c) 2010-2015, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2016, The Linux Foundation. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -221,10 +221,10 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
break;
}
default: {
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_ioctl(file, cmd, arg);
if (rc)
- pr_err("%s[%p]:Failed in utils_ioctl: %d\n",
+ pr_err("%s[%pK]:Failed in utils_ioctl: %d\n",
__func__, audio, rc);
}
}
@@ -328,10 +328,10 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd,
break;
}
default: {
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_compat_ioctl(file, cmd, arg);
if (rc)
- pr_err("%s[%p]:Failed in utils_ioctl: %d\n",
+ pr_err("%s[%pK]:Failed in utils_ioctl: %d\n",
__func__, audio, rc);
}
}
diff --git a/drivers/misc/qcom/qdsp6v2/audio_alac.c b/drivers/misc/qcom/qdsp6v2/audio_alac.c
index 3de204c1ebc8..f25c8ae47b4c 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_alac.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_alac.c
@@ -52,7 +52,7 @@ static long audio_ioctl_shared(struct file *file, unsigned int cmd,
__func__, audio->pcm_cfg.channel_count);
}
- pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__,
+ pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__,
audio, audio->ac->session);
if (audio->feedback == NON_TUNNEL_MODE) {
/* Configure PCM output block */
diff --git a/drivers/misc/qcom/qdsp6v2/audio_amrnb.c b/drivers/misc/qcom/qdsp6v2/audio_amrnb.c
index 1625adb82be9..78bcdb74af0e 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_amrnb.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_amrnb.c
@@ -2,7 +2,7 @@
*
* Copyright (C) 2008 Google, Inc.
* Copyright (C) 2008 HTC Corporation
- * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -33,7 +33,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
switch (cmd) {
case AUDIO_START: {
- pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__,
+ pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__,
audio, audio->ac->session);
if (audio->feedback == NON_TUNNEL_MODE) {
/* Configure PCM output block */
@@ -62,7 +62,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
break;
}
default:
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_ioctl(file, cmd, arg);
}
return rc;
diff --git a/drivers/misc/qcom/qdsp6v2/audio_amrwb.c b/drivers/misc/qcom/qdsp6v2/audio_amrwb.c
index c7ff607414a5..2283cf26bda9 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_amrwb.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_amrwb.c
@@ -2,7 +2,7 @@
*
* Copyright (C) 2008 Google, Inc.
* Copyright (C) 2008 HTC Corporation
- * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -34,7 +34,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
switch (cmd) {
case AUDIO_START: {
- pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__,
+ pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__,
audio, audio->ac->session);
if (audio->feedback == NON_TUNNEL_MODE) {
/* Configure PCM output block */
@@ -65,7 +65,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
break;
}
default:
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_ioctl(file, cmd, arg);
}
return rc;
diff --git a/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c b/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c
index bfd730017d41..727a5369c2a9 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c
@@ -55,7 +55,7 @@ static long audio_ioctl_shared(struct file *file, unsigned int cmd,
switch (cmd) {
case AUDIO_START: {
- pr_err("%s[%p]: AUDIO_START session_id[%d]\n", __func__,
+ pr_err("%s[%pK]: AUDIO_START session_id[%d]\n", __func__,
audio, audio->ac->session);
if (audio->feedback == NON_TUNNEL_MODE) {
/* Configure PCM output block */
@@ -162,7 +162,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd,
break;
}
default: {
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_ioctl(file, cmd, arg);
break;
}
@@ -278,7 +278,7 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd,
break;
}
default: {
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_compat_ioctl(file, cmd, arg);
break;
}
diff --git a/drivers/misc/qcom/qdsp6v2/audio_ape.c b/drivers/misc/qcom/qdsp6v2/audio_ape.c
index 670ec555b8c6..d7d550c40dff 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_ape.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_ape.c
@@ -39,7 +39,7 @@ static long audio_ioctl_shared(struct file *file, unsigned int cmd,
case AUDIO_START: {
struct asm_ape_cfg ape_cfg;
struct msm_audio_ape_config *ape_config;
- pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__,
+ pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__,
audio, audio->ac->session);
if (audio->feedback == NON_TUNNEL_MODE) {
/* Configure PCM output block */
@@ -133,7 +133,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
break;
}
default: {
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_ioctl(file, cmd, arg);
if (rc)
pr_err("Failed in utils_ioctl: %d\n", rc);
@@ -231,7 +231,7 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd,
break;
}
default: {
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_compat_ioctl(file, cmd, arg);
if (rc)
pr_err("Failed in utils_ioctl: %d\n", rc);
diff --git a/drivers/misc/qcom/qdsp6v2/audio_evrc.c b/drivers/misc/qcom/qdsp6v2/audio_evrc.c
index 08ca94e62059..5a89f4e25a27 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_evrc.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_evrc.c
@@ -2,7 +2,7 @@
*
* Copyright (C) 2008 Google, Inc.
* Copyright (C) 2008 HTC Corporation
- * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -34,7 +34,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
switch (cmd) {
case AUDIO_START: {
- pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__,
+ pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__,
audio, audio->ac->session);
if (audio->feedback == NON_TUNNEL_MODE) {
/* Configure PCM output block */
@@ -65,7 +65,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
break;
}
default:
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_ioctl(file, cmd, arg);
}
return rc;
diff --git a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c
index 3632fc2b961b..940fd08654d2 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c
@@ -99,7 +99,7 @@ static void audio_effects_event_handler(uint32_t opcode, uint32_t token,
struct q6audio_effects *effects;
if (!payload || !priv) {
- pr_err("%s: invalid data to handle events, payload: %p, priv: %p\n",
+ pr_err("%s: invalid data to handle events, payload: %pK, priv: %pK\n",
__func__, payload, priv);
return;
}
@@ -705,7 +705,7 @@ static int audio_effects_release(struct inode *inode, struct file *file)
__func__);
rc = q6asm_cmd(effects->ac, CMD_CLOSE);
if (rc < 0)
- pr_err("%s[%p]:Failed to close the session rc=%d\n",
+ pr_err("%s[%pK]:Failed to close the session rc=%d\n",
__func__, effects, rc);
effects->opened = 0;
effects->started = 0;
diff --git a/drivers/misc/qcom/qdsp6v2/audio_mp3.c b/drivers/misc/qcom/qdsp6v2/audio_mp3.c
index 83e300721c8e..fa5132e83ff4 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_mp3.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_mp3.c
@@ -2,7 +2,7 @@
*
* Copyright (C) 2008 Google, Inc.
* Copyright (C) 2008 HTC Corporation
- * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -33,7 +33,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
int rc = 0;
switch (cmd) {
case AUDIO_START: {
- pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__,
+ pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__,
audio, audio->ac->session);
if (audio->feedback == NON_TUNNEL_MODE) {
/* Configure PCM output block */
@@ -69,7 +69,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
break;
}
default:
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_ioctl(file, cmd, arg);
}
return rc;
diff --git a/drivers/misc/qcom/qdsp6v2/audio_qcelp.c b/drivers/misc/qcom/qdsp6v2/audio_qcelp.c
index 653aee9c8eff..508a95b7bf79 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_qcelp.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_qcelp.c
@@ -2,7 +2,7 @@
*
* Copyright (C) 2008 Google, Inc.
* Copyright (C) 2008 HTC Corporation
- * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -36,7 +36,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
switch (cmd) {
case AUDIO_START: {
- pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__,
+ pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__,
audio, audio->ac->session);
if (audio->feedback == NON_TUNNEL_MODE) {
/* Configure PCM output block */
@@ -67,7 +67,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
break;
}
default:
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_ioctl(file, cmd, arg);
}
return rc;
diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils.c b/drivers/misc/qcom/qdsp6v2/audio_utils.c
index 840597314a5f..15d82d126df7 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_utils.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_utils.c
@@ -757,7 +757,7 @@ ssize_t audio_in_read(struct file *file,
count -= bytes_to_copy;
buf += bytes_to_copy;
} else {
- pr_err("%s:session id %d: short read data[%p] bytesavail[%d]bytesrequest[%zd]\n",
+ pr_err("%s:session id %d: short read data[%pK] bytesavail[%d]bytesrequest[%zd]\n",
__func__,
audio->ac->session,
data, size, count);
@@ -896,7 +896,7 @@ ssize_t audio_in_write(struct file *file,
buf += xfer;
}
mutex_unlock(&audio->write_lock);
- pr_debug("%s:session id %d: eos_condition 0x%x buf[0x%p] start[0x%p]\n",
+ pr_debug("%s:session id %d: eos_condition 0x%x buf[0x%pK] start[0x%pK]\n",
__func__, audio->ac->session,
nflags, buf, start);
if (nflags & AUD_EOS_SET) {
diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c
index 567c948b0efe..c963280e5bf5 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c
@@ -83,7 +83,7 @@ int insert_eos_buf(struct q6audio_aio *audio,
struct audio_aio_buffer_node *buf_node)
{
struct dec_meta_out *eos_buf = buf_node->kvaddr;
- pr_debug("%s[%p]:insert_eos_buf\n", __func__, audio);
+ pr_debug("%s[%pK]:insert_eos_buf\n", __func__, audio);
eos_buf->num_of_frames = 0xFFFFFFFF;
eos_buf->meta_out_dsp[0].offset_to_frame = 0x0;
eos_buf->meta_out_dsp[0].nflags = AUDIO_DEC_EOS_SET;
@@ -131,14 +131,14 @@ static int audio_aio_ion_lookup_vaddr(struct q6audio_aio *audio, void *addr,
}
if (match_count > 1) {
- pr_err("%s[%p]:multiple hits for vaddr %p, len %ld\n",
+ pr_err("%s[%pK]:multiple hits for vaddr %pK, len %ld\n",
__func__, audio, addr, len);
list_for_each_entry(region_elt, &audio->ion_region_queue,
list) {
if (addr >= region_elt->vaddr &&
addr < region_elt->vaddr + region_elt->len &&
addr + len <= region_elt->vaddr + region_elt->len)
- pr_err("\t%s[%p]:%p, %ld --> %pa\n",
+ pr_err("\t%s[%pK]:%pK, %ld --> %pK\n",
__func__, audio,
region_elt->vaddr,
region_elt->len,
@@ -158,7 +158,7 @@ static phys_addr_t audio_aio_ion_fixup(struct q6audio_aio *audio, void *addr,
ret = audio_aio_ion_lookup_vaddr(audio, addr, len, &region);
if (ret) {
- pr_err("%s[%p]:lookup (%p, %ld) failed\n",
+ pr_err("%s[%pK]:lookup (%pK, %ld) failed\n",
__func__, audio, addr, len);
return 0;
}
@@ -166,7 +166,7 @@ static phys_addr_t audio_aio_ion_fixup(struct q6audio_aio *audio, void *addr,
region->ref_cnt++;
else
region->ref_cnt--;
- pr_debug("%s[%p]:found region %p ref_cnt %d\n",
+ pr_debug("%s[%pK]:found region %pK ref_cnt %d\n",
__func__, audio, region, region->ref_cnt);
paddr = region->paddr + (addr - region->vaddr);
/* provide kernel virtual address for accessing meta information */
@@ -179,26 +179,26 @@ static int audio_aio_pause(struct q6audio_aio *audio)
{
int rc = -EINVAL;
- pr_debug("%s[%p], enabled = %d\n", __func__, audio,
+ pr_debug("%s[%pK], enabled = %d\n", __func__, audio,
audio->enabled);
if (audio->enabled) {
rc = q6asm_cmd(audio->ac, CMD_PAUSE);
if (rc < 0)
- pr_err("%s[%p]: pause cmd failed rc=%d\n",
+ pr_err("%s[%pK]: pause cmd failed rc=%d\n",
__func__, audio, rc);
if (rc == 0) {
/* Send suspend only if pause was successful */
rc = q6asm_cmd(audio->ac, CMD_SUSPEND);
if (rc < 0)
- pr_err("%s[%p]: suspend cmd failed rc=%d\n",
+ pr_err("%s[%pK]: suspend cmd failed rc=%d\n",
__func__, audio, rc);
} else
- pr_err("%s[%p]: not sending suspend since pause failed\n",
+ pr_err("%s[%pK]: not sending suspend since pause failed\n",
__func__, audio);
} else
- pr_err("%s[%p]: Driver not enabled\n", __func__, audio);
+ pr_err("%s[%pK]: Driver not enabled\n", __func__, audio);
return rc;
}
@@ -212,7 +212,7 @@ static int audio_aio_flush(struct q6audio_aio *audio)
if (!(audio->drv_status & ADRV_STATUS_PAUSE)) {
rc = audio_aio_pause(audio);
if (rc < 0)
- pr_err("%s[%p}: pause cmd failed rc=%d\n",
+ pr_err("%s[%pK}: pause cmd failed rc=%d\n",
__func__, audio,
rc);
else
@@ -220,13 +220,13 @@ static int audio_aio_flush(struct q6audio_aio *audio)
}
rc = q6asm_cmd(audio->ac, CMD_FLUSH);
if (rc < 0)
- pr_err("%s[%p]: flush cmd failed rc=%d\n",
+ pr_err("%s[%pK]: flush cmd failed rc=%d\n",
__func__, audio, rc);
/* Not in stop state, reenable the stream */
if (audio->stopped == 0) {
rc = audio_aio_enable(audio);
if (rc)
- pr_err("%s[%p]:audio re-enable failed\n",
+ pr_err("%s[%pK]:audio re-enable failed\n",
__func__, audio);
else {
audio->enabled = 1;
@@ -235,9 +235,9 @@ static int audio_aio_flush(struct q6audio_aio *audio)
}
}
}
- pr_debug("%s[%p]:in_bytes %d\n",
+ pr_debug("%s[%pK]:in_bytes %d\n",
__func__, audio, atomic_read(&audio->in_bytes));
- pr_debug("%s[%p]:in_samples %d\n",
+ pr_debug("%s[%pK]:in_samples %d\n",
__func__, audio, atomic_read(&audio->in_samples));
atomic_set(&audio->in_bytes, 0);
atomic_set(&audio->in_samples, 0);
@@ -250,7 +250,7 @@ static int audio_aio_outport_flush(struct q6audio_aio *audio)
rc = q6asm_cmd(audio->ac, CMD_OUT_FLUSH);
if (rc < 0)
- pr_err("%s[%p}: output port flush cmd failed rc=%d\n",
+ pr_err("%s[%pK}: output port flush cmd failed rc=%d\n",
__func__, audio, rc);
return rc;
}
@@ -278,19 +278,19 @@ void audio_aio_async_write_ack(struct q6audio_aio *audio, uint32_t token,
if (token == used_buf->token) {
list_del(&used_buf->list);
spin_unlock_irqrestore(&audio->dsp_lock, flags);
- pr_debug("%s[%p]:consumed buffer\n", __func__, audio);
+ pr_debug("%s[%pK]:consumed buffer\n", __func__, audio);
event_payload.aio_buf = used_buf->buf;
audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE,
event_payload);
kfree(used_buf);
if (list_empty(&audio->out_queue) &&
(audio->drv_status & ADRV_STATUS_FSYNC)) {
- pr_debug("%s[%p]: list is empty, reached EOS in Tunnel\n",
+ pr_debug("%s[%pK]: list is empty, reached EOS in Tunnel\n",
__func__, audio);
wake_up(&audio->write_wait);
}
} else {
- pr_err("%s[%p]:expected=%x ret=%x\n",
+ pr_err("%s[%pK]:expected=%x ret=%x\n",
__func__, audio, used_buf->token, token);
spin_unlock_irqrestore(&audio->dsp_lock, flags);
}
@@ -304,13 +304,13 @@ void audio_aio_async_out_flush(struct q6audio_aio *audio)
union msm_audio_event_payload payload;
unsigned long flags;
- pr_debug("%s[%p}\n", __func__, audio);
+ pr_debug("%s[%pK}\n", __func__, audio);
/* EOS followed by flush, EOS response not guranteed, free EOS i/p
buffer */
spin_lock_irqsave(&audio->dsp_lock, flags);
if (audio->eos_flag && (audio->eos_write_payload.aio_buf.buf_addr)) {
- pr_debug("%s[%p]: EOS followed by flush received,acknowledge"\
+ pr_debug("%s[%pK]: EOS followed by flush received,acknowledge"
" eos i/p buffer immediately\n", __func__, audio);
audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE,
audio->eos_write_payload);
@@ -324,7 +324,7 @@ void audio_aio_async_out_flush(struct q6audio_aio *audio)
payload.aio_buf = buf_node->buf;
audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE, payload);
kfree(buf_node);
- pr_debug("%s[%p]: Propagate WRITE_DONE during flush\n",
+ pr_debug("%s[%pK]: Propagate WRITE_DONE during flush\n",
__func__, audio);
}
}
@@ -335,14 +335,14 @@ void audio_aio_async_in_flush(struct q6audio_aio *audio)
struct list_head *ptr, *next;
union msm_audio_event_payload payload;
- pr_debug("%s[%p]\n", __func__, audio);
+ pr_debug("%s[%pK]\n", __func__, audio);
list_for_each_safe(ptr, next, &audio->in_queue) {
buf_node = list_entry(ptr, struct audio_aio_buffer_node, list);
list_del(&buf_node->list);
/* Forcefull send o/p eos buffer after flush, if no eos response
* received by dsp even after sending eos command */
if ((audio->eos_rsp != 1) && audio->eos_flag) {
- pr_debug("%s[%p]: send eos on o/p buffer during flush\n",
+ pr_debug("%s[%pK]: send eos on o/p buffer during flush\n",
__func__, audio);
payload.aio_buf = buf_node->buf;
payload.aio_buf.data_len =
@@ -355,7 +355,7 @@ void audio_aio_async_in_flush(struct q6audio_aio *audio)
}
audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, payload);
kfree(buf_node);
- pr_debug("%s[%p]: Propagate READ_DONE during flush\n",
+ pr_debug("%s[%pK]: Propagate READ_DONE during flush\n",
__func__, audio);
}
}
@@ -373,19 +373,19 @@ int audio_aio_disable(struct q6audio_aio *audio)
if (audio->opened) {
audio->enabled = 0;
audio->opened = 0;
- pr_debug("%s[%p]: inbytes[%d] insamples[%d]\n", __func__,
+ pr_debug("%s[%pK]: inbytes[%d] insamples[%d]\n", __func__,
audio, atomic_read(&audio->in_bytes),
atomic_read(&audio->in_samples));
/* Close the session */
rc = q6asm_cmd(audio->ac, CMD_CLOSE);
if (rc < 0)
- pr_err("%s[%p]:Failed to close the session rc=%d\n",
+ pr_err("%s[%pK]:Failed to close the session rc=%d\n",
__func__, audio, rc);
audio->stopped = 1;
wake_up(&audio->write_wait);
wake_up(&audio->cmd_wait);
}
- pr_debug("%s[%p]:enabled[%d]\n", __func__, audio, audio->enabled);
+ pr_debug("%s[%pK]:enabled[%d]\n", __func__, audio, audio->enabled);
return rc;
}
@@ -434,16 +434,16 @@ static void audio_aio_unmap_ion_region(struct q6audio_aio *audio)
struct list_head *ptr, *next;
int rc = -EINVAL;
- pr_debug("%s[%p]:\n", __func__, audio);
+ pr_debug("%s[%pK]:\n", __func__, audio);
list_for_each_safe(ptr, next, &audio->ion_region_queue) {
region = list_entry(ptr, struct audio_aio_ion_region, list);
if (region != NULL) {
- pr_debug("%s[%p]: phy_address = 0x%pa\n",
+ pr_debug("%s[%pK]: phy_address = 0x%pK\n",
__func__, audio, &region->paddr);
rc = q6asm_memory_unmap(audio->ac,
region->paddr, IN);
if (rc < 0)
- pr_err("%s[%p]: memory unmap failed\n",
+ pr_err("%s[%pK]: memory unmap failed\n",
__func__, audio);
}
}
@@ -460,20 +460,20 @@ static void audio_aio_listner(u32 evt_id, union auddev_evt_data *evt_payload,
switch (evt_id) {
case AUDDEV_EVT_STREAM_VOL_CHG:
audio->volume = evt_payload->session_vol;
- pr_debug("%s[%p]: AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d, enabled = %d\n",
+ pr_debug("%s[%pK]: AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d, enabled = %d\n",
__func__, audio, audio->volume, audio->enabled);
if (audio->enabled == 1) {
if (audio->ac) {
rc = q6asm_set_volume(audio->ac, audio->volume);
if (rc < 0) {
- pr_err("%s[%p]: Send Volume command failed rc=%d\n",
+ pr_err("%s[%pK]: Send Volume command failed rc=%d\n",
__func__, audio, rc);
}
}
}
break;
default:
- pr_err("%s[%p]:ERROR:wrong event\n", __func__, audio);
+ pr_err("%s[%pK]:ERROR:wrong event\n", __func__, audio);
break;
}
}
@@ -490,7 +490,7 @@ int register_volume_listener(struct q6audio_aio *audio)
audio_aio_listner,
(void *)audio);
if (rc < 0) {
- pr_err("%s[%p]: Event listener failed\n", __func__, audio);
+ pr_err("%s[%pK]: Event listener failed\n", __func__, audio);
rc = -EACCES;
}
return rc;
@@ -508,7 +508,7 @@ int enable_volume_ramp(struct q6audio_aio *audio)
if (audio->ac == NULL)
return -EINVAL;
- pr_debug("%s[%p]\n", __func__, audio);
+ pr_debug("%s[%pK]\n", __func__, audio);
softpause.enable = SOFT_PAUSE_ENABLE;
softpause.period = SOFT_PAUSE_PERIOD;
softpause.step = SOFT_PAUSE_STEP;
@@ -568,7 +568,7 @@ int enable_volume_ramp(struct q6audio_aio *audio)
int audio_aio_release(struct inode *inode, struct file *file)
{
struct q6audio_aio *audio = file->private_data;
- pr_debug("%s[%p]\n", __func__, audio);
+ pr_debug("%s[%pK]\n", __func__, audio);
mutex_lock(&audio->lock);
mutex_lock(&audio->read_lock);
mutex_lock(&audio->write_lock);
@@ -628,56 +628,56 @@ int audio_aio_fsync(struct file *file, loff_t start, loff_t end, int datasync)
audio->drv_status |= ADRV_STATUS_FSYNC;
mutex_unlock(&audio->lock);
- pr_debug("%s[%p]:\n", __func__, audio);
+ pr_debug("%s[%pK]:\n", __func__, audio);
audio->eos_rsp = 0;
- pr_debug("%s[%p]Wait for write done from DSP\n", __func__, audio);
+ pr_debug("%s[%pK]Wait for write done from DSP\n", __func__, audio);
rc = wait_event_interruptible(audio->write_wait,
(list_empty(&audio->out_queue)) ||
audio->wflush || audio->stopped);
if (audio->stopped || audio->wflush) {
- pr_debug("%s[%p]: Audio Flushed or Stopped,this is not EOS\n"
+ pr_debug("%s[%pK]: Audio Flushed or Stopped,this is not EOS\n"
, __func__, audio);
audio->wflush = 0;
rc = -EBUSY;
}
if (rc < 0) {
- pr_err("%s[%p]: wait event for list_empty failed, rc = %d\n",
+ pr_err("%s[%pK]: wait event for list_empty failed, rc = %d\n",
__func__, audio, rc);
goto done;
}
rc = q6asm_cmd(audio->ac, CMD_EOS);
- pr_debug("%s[%p]: EOS cmd sent to DSP\n", __func__, audio);
+ pr_debug("%s[%pK]: EOS cmd sent to DSP\n", __func__, audio);
if (rc < 0)
- pr_err("%s[%p]: q6asm_cmd failed, rc = %d",
+ pr_err("%s[%pK]: q6asm_cmd failed, rc = %d",
__func__, audio, rc);
- pr_debug("%s[%p]: wait for RENDERED_EOS from DSP\n"
+ pr_debug("%s[%pK]: wait for RENDERED_EOS from DSP\n"
, __func__, audio);
rc = wait_event_interruptible(audio->write_wait,
(audio->eos_rsp || audio->wflush ||
audio->stopped));
if (rc < 0) {
- pr_err("%s[%p]: wait event for eos_rsp failed, rc = %d\n",
+ pr_err("%s[%pK]: wait event for eos_rsp failed, rc = %d\n",
__func__, audio, rc);
goto done;
}
if (audio->stopped || audio->wflush) {
audio->wflush = 0;
- pr_debug("%s[%p]: Audio Flushed or Stopped,this is not EOS\n"
+ pr_debug("%s[%pK]: Audio Flushed or Stopped,this is not EOS\n"
, __func__, audio);
rc = -EBUSY;
}
if (audio->eos_rsp == 1)
- pr_debug("%s[%p]: EOS\n", __func__, audio);
+ pr_debug("%s[%pK]: EOS\n", __func__, audio);
done:
@@ -748,21 +748,21 @@ static long audio_aio_process_event_req_common(struct q6audio_aio *audio,
usr_evt->event_payload = drv_evt->payload;
list_add_tail(&drv_evt->list, &audio->free_event_queue);
} else {
- pr_err("%s[%p]:Unexpected path\n", __func__, audio);
+ pr_err("%s[%pK]:Unexpected path\n", __func__, audio);
spin_unlock_irqrestore(&audio->event_queue_lock, flags);
return -EPERM;
}
spin_unlock_irqrestore(&audio->event_queue_lock, flags);
if (drv_evt->event_type == AUDIO_EVENT_WRITE_DONE) {
- pr_debug("%s[%p]:posted AUDIO_EVENT_WRITE_DONE to user\n",
+ pr_debug("%s[%pK]:posted AUDIO_EVENT_WRITE_DONE to user\n",
__func__, audio);
mutex_lock(&audio->write_lock);
audio_aio_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr,
drv_evt->payload.aio_buf.buf_len, 0, 0);
mutex_unlock(&audio->write_lock);
} else if (drv_evt->event_type == AUDIO_EVENT_READ_DONE) {
- pr_debug("%s[%p]:posted AUDIO_EVENT_READ_DONE to user\n",
+ pr_debug("%s[%pK]:posted AUDIO_EVENT_READ_DONE to user\n",
__func__, audio);
mutex_lock(&audio->read_lock);
audio_aio_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr,
@@ -774,7 +774,7 @@ static long audio_aio_process_event_req_common(struct q6audio_aio *audio,
* Once EOS indicated
*/
if (audio->eos_rsp && !list_empty(&audio->in_queue)) {
- pr_debug("%s[%p]:Send flush command to release read buffers"\
+ pr_debug("%s[%pK]:Send flush command to release read buffers"
" held up in DSP\n", __func__, audio);
mutex_lock(&audio->lock);
audio_aio_flush(audio);
@@ -917,7 +917,7 @@ static int audio_aio_ion_check(struct q6audio_aio *audio,
list_for_each_entry(region_elt, &audio->ion_region_queue, list) {
if (CONTAINS(region_elt, &t) || CONTAINS(&t, region_elt) ||
OVERLAPS(region_elt, &t)) {
- pr_err("%s[%p]:region (vaddr %p len %ld) clashes with registered region (vaddr %p paddr %pa len %ld)\n",
+ pr_err("%s[%pK]:region (vaddr %pK len %ld) clashes with registered region (vaddr %pK paddr %pK len %ld)\n",
__func__, audio, vaddr, len,
region_elt->vaddr,
&region_elt->paddr, region_elt->len);
@@ -939,7 +939,7 @@ static int audio_aio_ion_add(struct q6audio_aio *audio,
unsigned long ionflag;
void *kvaddr = NULL;
- pr_debug("%s[%p]:\n", __func__, audio);
+ pr_debug("%s[%pK]:\n", __func__, audio);
region = kmalloc(sizeof(*region), GFP_KERNEL);
if (!region) {
@@ -968,14 +968,14 @@ static int audio_aio_ion_add(struct q6audio_aio *audio,
region->kvaddr = kvaddr;
region->len = len;
region->ref_cnt = 0;
- pr_debug("%s[%p]:add region paddr %pa vaddr %p, len %lu kvaddr %p\n",
+ pr_debug("%s[%pK]:add region paddr %pK vaddr %pK, len %lu kvaddr %pK\n",
__func__, audio,
&region->paddr, region->vaddr, region->len,
region->kvaddr);
list_add_tail(&region->list, &audio->ion_region_queue);
rc = q6asm_memory_map(audio->ac, paddr, IN, len, 1);
if (rc < 0) {
- pr_err("%s[%p]: memory map failed\n", __func__, audio);
+ pr_err("%s[%pK]: memory map failed\n", __func__, audio);
goto mmap_error;
} else {
goto end;
@@ -997,7 +997,7 @@ static int audio_aio_ion_remove(struct q6audio_aio *audio,
struct list_head *ptr, *next;
int rc = -EINVAL;
- pr_debug("%s[%p]:info fd %d vaddr %p\n",
+ pr_debug("%s[%pK]:info fd %d vaddr %pK\n",
__func__, audio, info->fd, info->vaddr);
list_for_each_safe(ptr, next, &audio->ion_region_queue) {
@@ -1006,17 +1006,17 @@ static int audio_aio_ion_remove(struct q6audio_aio *audio,
if ((region->fd == info->fd) &&
(region->vaddr == info->vaddr)) {
if (region->ref_cnt) {
- pr_debug("%s[%p]:region %p in use ref_cnt %d\n",
+ pr_debug("%s[%pK]:region %pK in use ref_cnt %d\n",
__func__, audio, region,
region->ref_cnt);
break;
}
- pr_debug("%s[%p]:remove region fd %d vaddr %p\n",
+ pr_debug("%s[%pK]:remove region fd %d vaddr %pK\n",
__func__, audio, info->fd, info->vaddr);
rc = q6asm_memory_unmap(audio->ac,
region->paddr, IN);
if (rc < 0)
- pr_err("%s[%p]: memory unmap failed\n",
+ pr_err("%s[%pK]: memory unmap failed\n",
__func__, audio);
list_del(&region->list);
@@ -1039,15 +1039,15 @@ static int audio_aio_async_write(struct q6audio_aio *audio,
struct audio_aio_write_param param;
if (!audio || !buf_node) {
- pr_err("%s NULL pointer audio=[0x%p], buf_node=[0x%p]\n",
+ pr_err("%s NULL pointer audio=[0x%pK], buf_node=[0x%pK]\n",
__func__, audio, buf_node);
return -EINVAL;
}
- pr_debug("%s[%p]: Send write buff %p phy %pa len %d meta_enable = %d\n",
+ pr_debug("%s[%pK]: Send write buff %pK phy %pK len %d meta_enable = %d\n",
__func__, audio, buf_node, &buf_node->paddr,
buf_node->buf.data_len,
audio->buf_cfg.meta_info_enable);
- pr_debug("%s[%p]: flags = 0x%x\n", __func__, audio,
+ pr_debug("%s[%pK]: flags = 0x%x\n", __func__, audio,
buf_node->meta_info.meta_in.nflags);
ac = audio->ac;
@@ -1076,7 +1076,7 @@ static int audio_aio_async_write(struct q6audio_aio *audio,
buf_node->token = ac->session;
rc = q6asm_async_write(ac, &param);
if (rc < 0)
- pr_err("%s[%p]:failed\n", __func__, audio);
+ pr_err("%s[%pK]:failed\n", __func__, audio);
return rc;
}
@@ -1095,8 +1095,6 @@ void audio_aio_post_event(struct q6audio_aio *audio, int type,
} else {
e_node = kmalloc(sizeof(struct audio_aio_event), GFP_ATOMIC);
if (!e_node) {
- pr_err("%s[%p]:No mem to post event %d\n",
- __func__, audio, type);
spin_unlock_irqrestore(&audio->event_queue_lock, flags);
return;
}
@@ -1117,7 +1115,7 @@ static int audio_aio_async_read(struct q6audio_aio *audio,
struct audio_aio_read_param param;
int rc;
- pr_debug("%s[%p]: Send read buff %p phy %pa len %d\n",
+ pr_debug("%s[%pK]: Send read buff %pK phy %pK len %d\n",
__func__, audio, buf_node,
&buf_node->paddr, buf_node->buf.buf_len);
ac = audio->ac;
@@ -1131,7 +1129,7 @@ static int audio_aio_async_read(struct q6audio_aio *audio,
buf_node->token = ac->session;
rc = q6asm_async_read(ac, &param);
if (rc < 0)
- pr_err("%s[%p]:failed\n", __func__, audio);
+ pr_err("%s[%pK]:failed\n", __func__, audio);
return rc;
}
@@ -1140,7 +1138,7 @@ static int audio_aio_buf_add_shared(struct q6audio_aio *audio, u32 dir,
{
unsigned long flags;
int ret = 0;
- pr_debug("%s[%p]:node %p dir %x buf_addr %p buf_len %d data_len %d\n",
+ pr_debug("%s[%pK]:node %pK dir %x buf_addr %pK buf_len %d data_len %d\n",
__func__, audio, buf_node, dir, buf_node->buf.buf_addr,
buf_node->buf.buf_len, buf_node->buf.data_len);
buf_node->paddr = audio_aio_ion_fixup(audio, buf_node->buf.buf_addr,
@@ -1165,7 +1163,7 @@ static int audio_aio_buf_add_shared(struct q6audio_aio *audio, u32 dir,
} else if (buf_node->meta_info.meta_in.nflags
& AUDIO_DEC_EOS_SET) {
if (!audio->wflush) {
- pr_debug("%s[%p]:Send EOS cmd at i/p\n",
+ pr_debug("%s[%pK]:Send EOS cmd at i/p\n",
__func__, audio);
/* Driver will forcefully post writedone event
* once eos ack recived from DSP
@@ -1211,7 +1209,7 @@ static int audio_aio_buf_add_shared(struct q6audio_aio *audio, u32 dir,
event_payload.aio_buf = buf_node->buf;
event_payload.aio_buf.data_len =
insert_eos_buf(audio, buf_node);
- pr_debug("%s[%p]: propagate READ_DONE as EOS done\n",\
+ pr_debug("%s[%pK]: propagate READ_DONE as EOS done\n",
__func__, audio);
audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE,
event_payload);
@@ -1280,7 +1278,8 @@ void audio_aio_ioport_reset(struct q6audio_aio *audio)
* abort due to flush
*/
if (audio->drv_status & ADRV_STATUS_FSYNC) {
- pr_debug("%s[%p]:fsync in progress\n", __func__, audio);
+ pr_debug("%s[%pK]:fsync in progress\n",
+ __func__, audio);
audio->drv_ops.out_flush(audio);
} else
audio->drv_ops.out_flush(audio);
@@ -1307,13 +1306,13 @@ int audio_aio_open(struct q6audio_aio *audio, struct file *file)
/* Only AIO interface */
if (file->f_flags & O_NONBLOCK) {
- pr_debug("%s[%p]:set to aio interface\n", __func__, audio);
+ pr_debug("%s[%pK]:set to aio interface\n", __func__, audio);
audio->drv_status |= ADRV_STATUS_AIO_INTF;
audio->drv_ops.out_flush = audio_aio_async_out_flush;
audio->drv_ops.in_flush = audio_aio_async_in_flush;
q6asm_set_io_mode(audio->ac, ASYNC_IO_MODE);
} else {
- pr_err("%s[%p]:SIO interface not supported\n",
+ pr_err("%s[%pK]:SIO interface not supported\n",
__func__, audio);
rc = -EACCES;
goto fail;
@@ -1346,7 +1345,7 @@ int audio_aio_open(struct q6audio_aio *audio, struct file *file)
if (e_node)
list_add_tail(&e_node->list, &audio->free_event_queue);
else {
- pr_err("%s[%p]:event pkt alloc failed\n",
+ pr_err("%s[%pK]:event pkt alloc failed\n",
__func__, audio);
rc = -ENOMEM;
goto cleanup;
@@ -1358,7 +1357,7 @@ int audio_aio_open(struct q6audio_aio *audio, struct file *file)
rc = -ENOMEM;
goto cleanup;
}
- pr_debug("Ion client create in audio_aio_open %p", audio->client);
+ pr_debug("Ion client create in audio_aio_open %pK", audio->client);
rc = register_volume_listener(audio);
if (rc < 0)
@@ -1392,11 +1391,11 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd,
break;
}
case AUDIO_OUTPORT_FLUSH: {
- pr_debug("%s[%p]:AUDIO_OUTPORT_FLUSH\n", __func__, audio);
+ pr_debug("%s[%pK]:AUDIO_OUTPORT_FLUSH\n", __func__, audio);
mutex_lock(&audio->read_lock);
rc = audio_aio_outport_flush(audio);
if (rc < 0) {
- pr_err("%s[%p]: AUDIO_OUTPORT_FLUSH failed\n",
+ pr_err("%s[%pK]: AUDIO_OUTPORT_FLUSH failed\n",
__func__, audio);
rc = -EINTR;
}
@@ -1404,13 +1403,13 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd,
break;
}
case AUDIO_STOP: {
- pr_debug("%s[%p]: AUDIO_STOP session_id[%d]\n", __func__,
+ pr_debug("%s[%pK]: AUDIO_STOP session_id[%d]\n", __func__,
audio, audio->ac->session);
mutex_lock(&audio->lock);
audio->stopped = 1;
rc = audio_aio_flush(audio);
if (rc < 0) {
- pr_err("%s[%p]:Audio Stop procedure failed rc=%d\n",
+ pr_err("%s[%pK]:Audio Stop procedure failed rc=%d\n",
__func__, audio, rc);
mutex_unlock(&audio->lock);
break;
@@ -1418,7 +1417,7 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd,
audio->enabled = 0;
audio->drv_status &= ~ADRV_STATUS_PAUSE;
if (audio->drv_status & ADRV_STATUS_FSYNC) {
- pr_debug("%s[%p] Waking up the audio_aio_fsync\n",
+ pr_debug("%s[%pK] Waking up the audio_aio_fsync\n",
__func__, audio);
wake_up(&audio->write_wait);
}
@@ -1426,12 +1425,12 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd,
break;
}
case AUDIO_PAUSE: {
- pr_debug("%s[%p]:AUDIO_PAUSE %ld\n", __func__, audio, arg);
+ pr_debug("%s[%pK]:AUDIO_PAUSE %ld\n", __func__, audio, arg);
mutex_lock(&audio->lock);
if (arg == 1) {
rc = audio_aio_pause(audio);
if (rc < 0) {
- pr_err("%s[%p]: pause FAILED rc=%d\n",
+ pr_err("%s[%pK]: pause FAILED rc=%d\n",
__func__, audio, rc);
mutex_unlock(&audio->lock);
break;
@@ -1441,7 +1440,7 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd,
if (audio->drv_status & ADRV_STATUS_PAUSE) {
rc = audio_aio_enable(audio);
if (rc)
- pr_err("%s[%p]: audio enable failed\n",
+ pr_err("%s[%pK]: audio enable failed\n",
__func__, audio);
else {
audio->drv_status &= ~ADRV_STATUS_PAUSE;
@@ -1453,13 +1452,13 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd,
break;
}
case AUDIO_FLUSH: {
- pr_debug("%s[%p]: AUDIO_FLUSH sessionid[%d]\n", __func__,
+ pr_debug("%s[%pK]: AUDIO_FLUSH sessionid[%d]\n", __func__,
audio, audio->ac->session);
mutex_lock(&audio->lock);
audio->rflush = 1;
audio->wflush = 1;
if (audio->drv_status & ADRV_STATUS_FSYNC) {
- pr_debug("%s[%p] Waking up the audio_aio_fsync\n",
+ pr_debug("%s[%pK] Waking up the audio_aio_fsync\n",
__func__, audio);
wake_up(&audio->write_wait);
}
@@ -1468,7 +1467,7 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd,
/* Flush input / Output buffer in software*/
audio_aio_ioport_reset(audio);
if (rc < 0) {
- pr_err("%s[%p]:AUDIO_FLUSH interrupted\n",
+ pr_err("%s[%pK]:AUDIO_FLUSH interrupted\n",
__func__, audio);
rc = -EINTR;
} else {
@@ -1498,12 +1497,12 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd,
case AUDIO_PM_AWAKE: {
if ((audio->audio_ws_mgr == NULL) ||
(audio->miscdevice == NULL)) {
- pr_err("%s[%p]: invalid ws_mgr or miscdevice",
+ pr_err("%s[%pK]: invalid ws_mgr or miscdevice",
__func__, audio);
rc = -EACCES;
break;
}
- pr_debug("%s[%p]:AUDIO_PM_AWAKE\n", __func__, audio);
+ pr_debug("%s[%pK]:AUDIO_PM_AWAKE\n", __func__, audio);
mutex_lock(&audio->lock);
if (!audio->wakelock_voted) {
audio->wakelock_voted = true;
@@ -1518,12 +1517,12 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd,
case AUDIO_PM_RELAX: {
if ((audio->audio_ws_mgr == NULL) ||
(audio->miscdevice == NULL)) {
- pr_err("%s[%p]: invalid ws_mgr or miscdevice",
+ pr_err("%s[%pK]: invalid ws_mgr or miscdevice",
__func__, audio);
rc = -EACCES;
break;
}
- pr_debug("%s[%p]:AUDIO_PM_RELAX\n", __func__, audio);
+ pr_debug("%s[%pK]:AUDIO_PM_RELAX\n", __func__, audio);
mutex_lock(&audio->lock);
if (audio->wakelock_voted) {
audio->wakelock_voted = false;
@@ -1582,7 +1581,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd,
break;
}
case AUDIO_GET_EVENT: {
- pr_debug("%s[%p]:AUDIO_GET_EVENT\n", __func__, audio);
+ pr_debug("%s[%pK]:AUDIO_GET_EVENT\n", __func__, audio);
if (mutex_trylock(&audio->get_event_lock)) {
rc = audio_aio_process_event_req(audio,
(void __user *)arg);
@@ -1622,7 +1621,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd,
memset(&cfg, 0, sizeof(cfg));
cfg.buffer_size = audio->str_cfg.buffer_size;
cfg.buffer_count = audio->str_cfg.buffer_count;
- pr_debug("%s[%p]:GET STREAM CFG %d %d\n",
+ pr_debug("%s[%pK]:GET STREAM CFG %d %d\n",
__func__, audio, cfg.buffer_size, cfg.buffer_count);
if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) {
pr_err(
@@ -1635,7 +1634,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd,
}
case AUDIO_SET_STREAM_CONFIG: {
struct msm_audio_stream_config cfg;
- pr_debug("%s[%p]:SET STREAM CONFIG\n", __func__, audio);
+ pr_debug("%s[%pK]:SET STREAM CONFIG\n", __func__, audio);
mutex_lock(&audio->lock);
if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) {
pr_err(
@@ -1665,7 +1664,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd,
}
case AUDIO_SET_CONFIG: {
struct msm_audio_config config;
- pr_err("%s[%p]:AUDIO_SET_CONFIG\n", __func__, audio);
+ pr_err("%s[%pK]:AUDIO_SET_CONFIG\n", __func__, audio);
mutex_lock(&audio->lock);
if (copy_from_user(&config, (void *)arg, sizeof(config))) {
pr_err(
@@ -1676,7 +1675,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd,
break;
}
if (audio->feedback != NON_TUNNEL_MODE) {
- pr_err("%s[%p]:Not sufficient permission to change the playback mode\n",
+ pr_err("%s[%pK]:Not sufficient permission to change the playback mode\n",
__func__, audio);
rc = -EACCES;
mutex_unlock(&audio->lock);
@@ -1716,14 +1715,14 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd,
}
audio->buf_cfg.meta_info_enable = cfg.meta_info_enable;
- pr_debug("%s[%p]:session id %d: Set-buf-cfg: meta[%d]",
+ pr_debug("%s[%pK]:session id %d: Set-buf-cfg: meta[%d]",
__func__, audio,
audio->ac->session, cfg.meta_info_enable);
mutex_unlock(&audio->lock);
break;
}
case AUDIO_GET_BUF_CFG: {
- pr_debug("%s[%p]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n",
+ pr_debug("%s[%pK]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n",
__func__, audio,
audio->ac->session, audio->buf_cfg.meta_info_enable,
audio->buf_cfg.frames_per_buf);
@@ -1741,7 +1740,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd,
}
case AUDIO_REGISTER_ION: {
struct msm_audio_ion_info info;
- pr_debug("%s[%p]:AUDIO_REGISTER_ION\n", __func__, audio);
+ pr_debug("%s[%pK]:AUDIO_REGISTER_ION\n", __func__, audio);
mutex_lock(&audio->lock);
if (copy_from_user(&info, (void *)arg, sizeof(info))) {
pr_err(
@@ -1761,7 +1760,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd,
case AUDIO_DEREGISTER_ION: {
struct msm_audio_ion_info info;
mutex_lock(&audio->lock);
- pr_debug("%s[%p]:AUDIO_DEREGISTER_ION\n", __func__, audio);
+ pr_debug("%s[%pK]:AUDIO_DEREGISTER_ION\n", __func__, audio);
if (copy_from_user(&info, (void *)arg, sizeof(info))) {
pr_err(
"%s: copy_from_user for AUDIO_DEREGISTER_ION failed\n",
@@ -1881,7 +1880,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd,
break;
}
case AUDIO_GET_EVENT_32: {
- pr_debug("%s[%p]:AUDIO_GET_EVENT\n", __func__, audio);
+ pr_debug("%s[%pK]:AUDIO_GET_EVENT\n", __func__, audio);
if (mutex_trylock(&audio->get_event_lock)) {
rc = audio_aio_process_event_req_compat(audio,
(void __user *)arg);
@@ -1921,7 +1920,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd,
memset(&cfg, 0, sizeof(cfg));
cfg.buffer_size = audio->str_cfg.buffer_size;
cfg.buffer_count = audio->str_cfg.buffer_count;
- pr_debug("%s[%p]:GET STREAM CFG %d %d\n",
+ pr_debug("%s[%pK]:GET STREAM CFG %d %d\n",
__func__, audio, cfg.buffer_size, cfg.buffer_count);
if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) {
pr_err("%s: copy_to_user for AUDIO_GET_STREAM_CONFIG_32 failed\n",
@@ -1934,7 +1933,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd,
case AUDIO_SET_STREAM_CONFIG_32: {
struct msm_audio_stream_config32 cfg_32;
struct msm_audio_stream_config cfg;
- pr_debug("%s[%p]:SET STREAM CONFIG\n", __func__, audio);
+ pr_debug("%s[%pK]:SET STREAM CONFIG\n", __func__, audio);
mutex_lock(&audio->lock);
if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) {
pr_err("%s: copy_from_user for AUDIO_SET_STREAM_CONFIG_32 failed\n",
@@ -1978,13 +1977,13 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd,
mutex_lock(&audio->lock);
if (audio->feedback != NON_TUNNEL_MODE) {
- pr_err("%s[%p]:Not sufficient permission to change the playback mode\n",
+ pr_err("%s[%pK]:Not sufficient permission to change the playback mode\n",
__func__, audio);
rc = -EACCES;
mutex_unlock(&audio->lock);
break;
}
- pr_err("%s[%p]:AUDIO_SET_CONFIG\n", __func__, audio);
+ pr_err("%s[%pK]:AUDIO_SET_CONFIG\n", __func__, audio);
if (copy_from_user(&config_32, (void *)arg,
sizeof(config_32))) {
pr_err("%s: copy_from_user for AUDIO_SET_CONFIG_32 failed\n",
@@ -2038,7 +2037,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd,
}
audio->buf_cfg.meta_info_enable = cfg.meta_info_enable;
- pr_debug("%s[%p]:session id %d: Set-buf-cfg: meta[%d]",
+ pr_debug("%s[%pK]:session id %d: Set-buf-cfg: meta[%d]",
__func__, audio,
audio->ac->session, cfg.meta_info_enable);
mutex_unlock(&audio->lock);
@@ -2046,7 +2045,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd,
}
case AUDIO_GET_BUF_CFG_32: {
struct msm_audio_buf_cfg32 cfg_32;
- pr_debug("%s[%p]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n",
+ pr_debug("%s[%pK]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n",
__func__, audio,
audio->ac->session, audio->buf_cfg.meta_info_enable,
audio->buf_cfg.frames_per_buf);
@@ -2067,7 +2066,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd,
case AUDIO_REGISTER_ION_32: {
struct msm_audio_ion_info32 info_32;
struct msm_audio_ion_info info;
- pr_debug("%s[%p]:AUDIO_REGISTER_ION\n", __func__, audio);
+ pr_debug("%s[%pK]:AUDIO_REGISTER_ION\n", __func__, audio);
mutex_lock(&audio->lock);
if (copy_from_user(&info_32, (void *)arg, sizeof(info_32))) {
pr_err("%s: copy_from_user for AUDIO_REGISTER_ION_32 failed\n",
@@ -2089,7 +2088,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd,
struct msm_audio_ion_info32 info_32;
struct msm_audio_ion_info info;
mutex_lock(&audio->lock);
- pr_debug("%s[%p]:AUDIO_DEREGISTER_ION\n", __func__, audio);
+ pr_debug("%s[%pK]:AUDIO_DEREGISTER_ION\n", __func__, audio);
if (copy_from_user(&info_32, (void *)arg, sizeof(info_32))) {
pr_err("%s: copy_from_user for AUDIO_DEREGISTER_ION_32 failed\n",
__func__);
diff --git a/drivers/misc/qcom/qdsp6v2/audio_wma.c b/drivers/misc/qcom/qdsp6v2/audio_wma.c
index 74f678da925a..b7dfdf23bec7 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_wma.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_wma.c
@@ -40,7 +40,7 @@ static long audio_ioctl_shared(struct file *file, unsigned int cmd,
case AUDIO_START: {
struct asm_wma_cfg wma_cfg;
struct msm_audio_wma_config_v2 *wma_config;
- pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__,
+ pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__,
audio, audio->ac->session);
if (audio->feedback == NON_TUNNEL_MODE) {
/* Configure PCM output block */
@@ -122,7 +122,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
break;
}
default: {
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_ioctl(file, cmd, arg);
if (rc)
pr_err("Failed in utils_ioctl: %d\n", rc);
@@ -211,7 +211,7 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd,
break;
}
default: {
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_compat_ioctl(file, cmd, arg);
if (rc)
pr_err("Failed in utils_ioctl: %d\n", rc);
diff --git a/drivers/misc/qcom/qdsp6v2/audio_wmapro.c b/drivers/misc/qcom/qdsp6v2/audio_wmapro.c
index 21ad33b7fd5d..d37a5789391c 100644
--- a/drivers/misc/qcom/qdsp6v2/audio_wmapro.c
+++ b/drivers/misc/qcom/qdsp6v2/audio_wmapro.c
@@ -173,7 +173,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
break;
}
default: {
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_ioctl(file, cmd, arg);
if (rc)
pr_err("Failed in utils_ioctl: %d\n", rc);
@@ -283,7 +283,7 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd,
break;
}
default: {
- pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio);
+ pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio);
rc = audio->codec_compat_ioctl(file, cmd, arg);
if (rc)
pr_err("Failed in utils_ioctl: %d\n", rc);
diff --git a/drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c b/drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c
index 6e82c8051886..09b83f354406 100644
--- a/drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c
+++ b/drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c
@@ -54,18 +54,18 @@ void audio_aio_cb(uint32_t opcode, uint32_t token,
switch (opcode) {
case ASM_DATA_EVENT_WRITE_DONE_V2:
- pr_debug("%s[%p]:ASM_DATA_EVENT_WRITE_DONE token = 0x%x\n",
+ pr_debug("%s[%pK]:ASM_DATA_EVENT_WRITE_DONE token = 0x%x\n",
__func__, audio, token);
audio_aio_async_write_ack(audio, token, payload);
break;
case ASM_DATA_EVENT_READ_DONE_V2:
- pr_debug("%s[%p]:ASM_DATA_EVENT_READ_DONE token = 0x%x\n",
+ pr_debug("%s[%pK]:ASM_DATA_EVENT_READ_DONE token = 0x%x\n",
__func__, audio, token);
audio_aio_async_read_ack(audio, token, payload);
break;
case ASM_DATA_EVENT_RENDERED_EOS:
/* EOS Handle */
- pr_debug("%s[%p]:ASM_DATA_CMDRSP_EOS\n", __func__, audio);
+ pr_debug("%s[%pK]:ASM_DATA_CMDRSP_EOS\n", __func__, audio);
if (audio->feedback) { /* Non-Tunnel mode */
audio->eos_rsp = 1;
/* propagate input EOS i/p buffer,
@@ -87,16 +87,16 @@ void audio_aio_cb(uint32_t opcode, uint32_t token,
break;
case ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2:
case ASM_STREAM_CMD_SET_ENCDEC_PARAM:
- pr_debug("%s[%p]:payload0[%x] payloa1d[%x]opcode= 0x%x\n",
+ pr_debug("%s[%pK]:payload0[%x] payloa1d[%x]opcode= 0x%x\n",
__func__, audio, payload[0], payload[1], opcode);
break;
case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY:
case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY:
- pr_debug("%s[%p]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, payload[0]-sr = %d, payload[1]-chl = %d, payload[2] = %d, payload[3] = %d\n",
+ pr_debug("%s[%pK]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, payload[0]-sr = %d, payload[1]-chl = %d, payload[2] = %d, payload[3] = %d\n",
__func__, audio, payload[0],
payload[1], payload[2], payload[3]);
- pr_debug("%s[%p]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, sr(prev) = %d, chl(prev) = %d,",
+ pr_debug("%s[%pK]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, sr(prev) = %d, chl(prev) = %d,",
__func__, audio, audio->pcm_cfg.sample_rate,
audio->pcm_cfg.channel_count);
@@ -130,7 +130,7 @@ void extract_meta_out_info(struct q6audio_aio *audio,
else
memset(&buf_node->meta_info.meta_in,
0, sizeof(struct dec_meta_in));
- pr_debug("%s[%p]:i/p: msw_ts 0x%d lsw_ts 0x%d nflags 0x%8x\n",
+ pr_debug("%s[%pK]:i/p: msw_ts %d lsw_ts %d nflags 0x%8x\n",
__func__, audio,
buf_node->meta_info.meta_in.ntimestamp.highpart,
buf_node->meta_info.meta_in.ntimestamp.lowpart,
@@ -145,7 +145,7 @@ void extract_meta_out_info(struct q6audio_aio *audio,
meta_data->meta_out_dsp[0].lsw_ts;
meta_data->meta_out_dsp[0].lsw_ts = temp;
- pr_debug("%s[%p]:o/p: msw_ts 0x%d lsw_ts 0x%d nflags 0x%8x, num_frames = %d\n",
+ pr_debug("%s[%pK]:o/p: msw_ts %d lsw_ts %d nflags 0x%8x, num_frames = %d\n",
__func__, audio,
((struct dec_meta_out *)buf_node->kvaddr)->\
meta_out_dsp[0].msw_ts,
@@ -201,7 +201,7 @@ void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token,
= payload[9];
event_payload.aio_buf.data_len = payload[4]\
+ payload[5] + sizeof(struct dec_meta_out);
- pr_debug("%s[%p]:nr of frames 0x%8x len=%d\n",
+ pr_debug("%s[%pK]:nr of frames 0x%8x len=%d\n",
__func__, audio,
filled_buf->meta_info.meta_out.num_of_frames,
event_payload.aio_buf.data_len);
@@ -213,7 +213,7 @@ void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token,
event_payload);
kfree(filled_buf);
} else {
- pr_err("%s[%p]:expected=%x ret=%x\n",
+ pr_err("%s[%pK]:expected=%x ret=%x\n",
__func__, audio, filled_buf->token, token);
spin_unlock_irqrestore(&audio->dsp_lock, flags);
}
diff --git a/drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c b/drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c
index 30274fd4b725..334e705ca8f1 100644
--- a/drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c
+++ b/drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c
@@ -208,7 +208,7 @@ static int q6usm_us_client_buf_free(unsigned int dir,
rc = q6usm_memory_unmap(port->phys, dir, usc->session,
*((uint32_t *)port->ext));
- pr_debug("%s: data[%p]phys[%llx][%p]\n", __func__,
+ pr_debug("%s: data[%pK]phys[%llx][%pK]\n", __func__,
(void *)port->data, (u64)port->phys, (void *)&port->phys);
msm_audio_ion_free(port->client, port->handle);
@@ -248,7 +248,7 @@ int q6usm_us_param_buf_free(unsigned int dir,
rc = q6usm_memory_unmap(port->param_phys, dir, usc->session,
*((uint32_t *)port->param_buf_mem_handle));
- pr_debug("%s: data[%p]phys[%llx][%p]\n", __func__,
+ pr_debug("%s: data[%pK]phys[%llx][%pK]\n", __func__,
(void *)port->param_buf, (u64)port->param_phys,
(void *)&port->param_phys);
@@ -362,7 +362,7 @@ struct us_client *q6usm_us_client_alloc(
spin_lock_init(&usc->port[lcnt].dsp_lock);
usc->port[lcnt].ext = (void *)p_mem_handle++;
usc->port[lcnt].param_buf_mem_handle = (void *)p_mem_handle++;
- pr_err("%s: usc->port[%d].ext=%p;\n",
+ pr_err("%s: usc->port[%d].ext=%pK;\n",
__func__, lcnt, usc->port[lcnt].ext);
}
atomic_set(&usc->cmd_state, 0);
@@ -417,7 +417,7 @@ int q6usm_us_client_buf_alloc(unsigned int dir,
port->buf_cnt = bufcnt;
port->buf_size = bufsz;
- pr_debug("%s: data[%p]; phys[%llx]; [%p]\n", __func__,
+ pr_debug("%s: data[%pK]; phys[%llx]; [%pK]\n", __func__,
(void *)port->data,
(u64)port->phys,
(void *)&port->phys);
@@ -482,7 +482,7 @@ int q6usm_us_param_buf_alloc(unsigned int dir,
}
port->param_buf_size = bufsz;
- pr_debug("%s: param_buf[%p]; param_phys[%llx]; [%p]\n", __func__,
+ pr_debug("%s: param_buf[%pK]; param_phys[%llx]; [%pK]\n", __func__,
(void *)port->param_buf,
(u64)port->param_phys,
(void *)&port->param_phys);
@@ -1335,7 +1335,7 @@ int q6usm_set_us_detection(struct us_client *usc,
if ((usc == NULL) ||
(detect_info_size == 0) ||
(detect_info == NULL)) {
- pr_err("%s: wrong input: usc=0x%p, inf_size=%d; info=0x%p",
+ pr_err("%s: wrong input: usc=0x%pK, inf_size=%d; info=0x%pK",
__func__,
usc,
detect_info_size,
diff --git a/drivers/misc/qcom/qdsp6v2/ultrasound/usfcdev.c b/drivers/misc/qcom/qdsp6v2/ultrasound/usfcdev.c
index 76bcc83e1c5e..a4d63f0c0d1a 100644
--- a/drivers/misc/qcom/qdsp6v2/ultrasound/usfcdev.c
+++ b/drivers/misc/qcom/qdsp6v2/ultrasound/usfcdev.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2013, 2016 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 and
@@ -170,7 +170,7 @@ static int usfcdev_connect(struct input_handler *handler, struct input_dev *dev,
}
usfc_handle->dev = dev;
ret = input_register_handle(usfc_handle);
- pr_debug("%s: name=[%s]; ind=%d; dev=0x%p\n",
+ pr_debug("%s: name=[%s]; ind=%d; dev=0x%pK\n",
__func__,
dev->name,
ind,
@@ -259,7 +259,7 @@ bool usfcdev_register(
bool rc = false;
if ((event_type_ind >= MAX_EVENT_TYPE_NUM) || !match_cb) {
- pr_err("%s: wrong input: event_type_ind=%d; match_cb=0x%p\n",
+ pr_err("%s: wrong input: event_type_ind=%d; match_cb=0x%pK\n",
__func__,
event_type_ind,
match_cb);
diff --git a/drivers/platform/msm/usb_bam.c b/drivers/platform/msm/usb_bam.c
index 43188c9d690e..5cb017fdf2d3 100644
--- a/drivers/platform/msm/usb_bam.c
+++ b/drivers/platform/msm/usb_bam.c
@@ -1323,6 +1323,9 @@ static void usb_bam_finish_suspend(enum usb_ctrl cur_bam)
__func__, ret);
goto no_lpm;
}
+ } else {
+ log_event_err("%s: pipe type is not B2B\n", __func__);
+ cons_empty = true;
}
spin_lock(&usb_bam_ipa_handshake_info_lock);
@@ -1959,8 +1962,8 @@ static void usb_bam_finish_resume(struct work_struct *w)
spin_unlock(&usb_bam_ipa_handshake_info_lock);
mutex_unlock(&info[cur_bam].suspend_resume_mutex);
- log_event_dbg("%s: done..PM Runtime PUT %d, count: %d\n",
- __func__, idx, get_pm_runtime_counter(bam_dev));
+ log_event_dbg("%s: done..PM Runtime PUT :%d\n",
+ __func__, get_pm_runtime_counter(bam_dev));
/* Put to match _get at the beginning of this routine */
pm_runtime_put(&ctx->usb_bam_pdev->dev);
}
@@ -2762,16 +2765,14 @@ static void usb_bam_sps_events(enum sps_callback_case sps_cb_case, void *user)
log_event_dbg("%s: received SPS_CALLBACK_BAM_TIMER_IRQ\n",
__func__);
- spin_lock(&ctx->usb_bam_lock);
-
bam = get_bam_type_from_core_name((char *)user);
if (bam < 0 || bam >= MAX_BAMS) {
log_event_err("%s: Invalid bam, type=%d ,name=%s\n",
__func__, bam, (char *)user);
- spin_unlock(&ctx->usb_bam_lock);
return;
}
ctx = &msm_usb_bam[bam];
+ spin_lock(&ctx->usb_bam_lock);
ctx->is_bam_inactivity = true;
log_event_dbg("%s: Inactivity happened on bam=%s,%d\n",
diff --git a/drivers/soc/qcom/qdsp6v2/apr.c b/drivers/soc/qcom/qdsp6v2/apr.c
index ee9b054dcc24..128ea434dcc8 100644
--- a/drivers/soc/qcom/qdsp6v2/apr.c
+++ b/drivers/soc/qcom/qdsp6v2/apr.c
@@ -54,6 +54,28 @@ struct apr_reset_work {
struct work_struct work;
};
+static bool apr_cf_debug;
+
+#ifdef CONFIG_DEBUG_FS
+static struct dentry *debugfs_apr_debug;
+static ssize_t apr_debug_write(struct file *filp, const char __user *ubuf,
+ size_t cnt, loff_t *ppos)
+{
+ char cmd;
+
+ if (copy_from_user(&cmd, ubuf, 1))
+ return -EFAULT;
+
+ apr_cf_debug = (cmd == '1') ? true : false;
+
+ return cnt;
+}
+
+static const struct file_operations apr_debug_ops = {
+ .write = apr_debug_write,
+};
+#endif
+
#define APR_PKT_INFO(x...) \
do { \
if (apr_pkt_ctx) \
@@ -343,8 +365,13 @@ int apr_send_pkt(void *handle, uint32_t *buf)
hdr->dest_domain = svc->dest_domain;
hdr->dest_svc = svc->id;
- APR_PKT_INFO("Tx: dest_svc[%d], opcode[0x%X], size[%d]",
- hdr->dest_svc, hdr->opcode, hdr->pkt_size);
+ if (unlikely(apr_cf_debug)) {
+ APR_PKT_INFO(
+ "Tx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X]",
+ (hdr->src_domain << 8) | hdr->src_svc,
+ (hdr->dest_domain << 8) | hdr->dest_svc, hdr->opcode,
+ hdr->token);
+ }
rc = apr_tal_write(clnt->handle, buf,
(struct apr_pkt_priv *)&svc->pkt_owner,
@@ -538,8 +565,6 @@ void apr_cb_func(void *buf, int len, void *priv)
return;
}
hdr = buf;
- APR_PKT_INFO("Rx: dest_svc[%d], opcode[0x%X], size[%d]",
- hdr->dest_svc, hdr->opcode, hdr->pkt_size);
ver = hdr->hdr_field;
ver = (ver & 0x000F);
@@ -631,9 +656,28 @@ void apr_cb_func(void *buf, int len, void *priv)
data.dest_port = hdr->dest_port;
data.token = hdr->token;
data.msg_type = msg_type;
+ data.payload = NULL;
if (data.payload_size > 0)
data.payload = (char *)hdr + hdr_size;
+ if (unlikely(apr_cf_debug)) {
+ if (hdr->opcode == APR_BASIC_RSP_RESULT && data.payload) {
+ uint32_t *ptr = data.payload;
+
+ APR_PKT_INFO(
+ "Rx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X] rc[0x%X]",
+ (hdr->src_domain << 8) | hdr->src_svc,
+ (hdr->dest_domain << 8) | hdr->dest_svc,
+ hdr->opcode, hdr->token, ptr[1]);
+ } else {
+ APR_PKT_INFO(
+ "Rx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X]",
+ (hdr->src_domain << 8) | hdr->src_svc,
+ (hdr->dest_domain << 8) | hdr->dest_svc, hdr->opcode,
+ hdr->token);
+ }
+ }
+
temp_port = ((data.dest_port >> 8) * 8) + (data.dest_port & 0xFF);
pr_debug("port = %d t_port = %d\n", data.src_port, temp_port);
if (c_svc->port_cnt && c_svc->port_fn[temp_port])
@@ -910,3 +954,14 @@ static int __init apr_late_init(void)
return ret;
}
late_initcall(apr_late_init);
+
+#ifdef CONFIG_DEBUG_FS
+static int __init apr_debug_init(void)
+{
+ debugfs_apr_debug = debugfs_create_file("msm_apr_debug",
+ S_IFREG | S_IRUGO, NULL, NULL,
+ &apr_debug_ops);
+ return 0;
+}
+device_initcall(apr_debug_init);
+#endif
diff --git a/drivers/soc/qcom/scm.c b/drivers/soc/qcom/scm.c
index 714c848ec9c0..b4713ac1b68b 100644
--- a/drivers/soc/qcom/scm.c
+++ b/drivers/soc/qcom/scm.c
@@ -56,9 +56,16 @@ DEFINE_MUTEX(scm_lmh_lock);
#define SMC_ATOMIC_MASK 0x80000000
#define IS_CALL_AVAIL_CMD 1
-#define SCM_BUF_LEN(__cmd_size, __resp_size) \
- (sizeof(struct scm_command) + sizeof(struct scm_response) + \
- __cmd_size + __resp_size)
+#define SCM_BUF_LEN(__cmd_size, __resp_size) ({ \
+ size_t x = __cmd_size + __resp_size; \
+ size_t y = sizeof(struct scm_command) + sizeof(struct scm_response); \
+ size_t result; \
+ if (x < __cmd_size || (x + y) < x) \
+ result = 0; \
+ else \
+ result = x + y; \
+ result; \
+ })
/**
* struct scm_command - one SCM command buffer
* @len: total available memory for command and response
@@ -356,8 +363,7 @@ int scm_call_noalloc(u32 svc_id, u32 cmd_id, const void *cmd_buf,
int ret;
size_t len = SCM_BUF_LEN(cmd_len, resp_len);
- if (cmd_len > scm_buf_len || resp_len > scm_buf_len ||
- len > scm_buf_len)
+ if (len == 0)
return -EINVAL;
if (!IS_ALIGNED((unsigned long)scm_buf, PAGE_SIZE))
@@ -780,7 +786,7 @@ int scm_call(u32 svc_id, u32 cmd_id, const void *cmd_buf, size_t cmd_len,
int ret;
size_t len = SCM_BUF_LEN(cmd_len, resp_len);
- if (cmd_len > len || resp_len > len)
+ if (len == 0 || PAGE_ALIGN(len) < len)
return -EINVAL;
cmd = kzalloc(PAGE_ALIGN(len), GFP_KERNEL);
diff --git a/drivers/soc/qcom/secure_buffer.c b/drivers/soc/qcom/secure_buffer.c
index d9ebc1edda9c..afe6b2309e27 100644
--- a/drivers/soc/qcom/secure_buffer.c
+++ b/drivers/soc/qcom/secure_buffer.c
@@ -52,7 +52,7 @@ struct mem_prot_info {
struct dest_vm_and_perm_info {
u32 vm;
u32 perm;
- u32 *ctx;
+ u64 ctx;
u32 ctx_size;
};
@@ -209,7 +209,7 @@ populate_dest_info(int *dest_vmids, int nelements, int *dest_perms,
for (i = 0; i < nelements; i++) {
dest_info[i].vm = dest_vmids[i];
dest_info[i].perm = dest_perms[i];
- dest_info[i].ctx = NULL;
+ dest_info[i].ctx = 0x0;
dest_info[i].ctx_size = 0;
}
diff --git a/drivers/staging/android/ion/ion_heap.c b/drivers/staging/android/ion/ion_heap.c
index b8bf80f02f4c..43d3f92cd418 100644
--- a/drivers/staging/android/ion/ion_heap.c
+++ b/drivers/staging/android/ion/ion_heap.c
@@ -2,7 +2,7 @@
* drivers/staging/android/ion/ion_heap.c
*
* Copyright (C) 2011 Google, Inc.
- * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -325,8 +325,9 @@ struct ion_heap *ion_heap_create(struct ion_platform_heap *heap_data)
switch (heap_data->type) {
case ION_HEAP_TYPE_SYSTEM_CONTIG:
- heap = ion_system_contig_heap_create(heap_data);
- break;
+ pr_err("%s: Heap type is disabled: %d\n", __func__,
+ heap_data->type);
+ return ERR_PTR(-EINVAL);
case ION_HEAP_TYPE_SYSTEM:
heap = ion_system_heap_create(heap_data);
break;
@@ -366,7 +367,8 @@ void ion_heap_destroy(struct ion_heap *heap)
switch (heap->type) {
case ION_HEAP_TYPE_SYSTEM_CONTIG:
- ion_system_contig_heap_destroy(heap);
+ pr_err("%s: Heap type is disabled: %d\n", __func__,
+ heap->type);
break;
case ION_HEAP_TYPE_SYSTEM:
ion_system_heap_destroy(heap);
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 687d51e25d4b..2450cc52fa24 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2130,24 +2130,11 @@ static int dwc3_gadget_stop(struct usb_gadget *g)
struct dwc3 *dwc = gadget_to_dwc(g);
unsigned long flags;
- pm_runtime_get_sync(dwc->dev);
- dbg_event(0xFF, "Stop gsync",
- atomic_read(&dwc->dev->power.usage_count));
- dwc3_gadget_disable_irq(dwc);
spin_lock_irqsave(&dwc->lock, flags);
-
- __dwc3_gadget_ep_disable(dwc->eps[0]);
- __dwc3_gadget_ep_disable(dwc->eps[1]);
-
dwc->gadget_driver = NULL;
-
spin_unlock_irqrestore(&dwc->lock, flags);
- pm_runtime_mark_last_busy(dwc->dev);
- pm_runtime_put_autosuspend(dwc->dev);
- dbg_event(0xFF, "Auto_susgsync", 0);
-
return 0;
}
@@ -2814,7 +2801,7 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
dwc3_notify_event(dwc, DWC3_CONTROLLER_NOTIFY_OTG_EVENT);
dwc3_usb3_phy_suspend(dwc, false);
- usb_gadget_vbus_draw(&dwc->gadget, 0);
+ usb_gadget_vbus_draw(&dwc->gadget, 100);
dwc3_reset_gadget(dwc);
dbg_event(0xFF, "BUS RST", 0);
diff --git a/drivers/usb/pd/policy_engine.c b/drivers/usb/pd/policy_engine.c
index e193182af225..8b82d3960752 100644
--- a/drivers/usb/pd/policy_engine.c
+++ b/drivers/usb/pd/policy_engine.c
@@ -21,6 +21,7 @@
#include <linux/power_supply.h>
#include <linux/regulator/consumer.h>
#include <linux/slab.h>
+#include <linux/spinlock.h>
#include <linux/workqueue.h>
#include <linux/extcon.h>
#include <linux/usb/usbpd.h>
@@ -264,6 +265,16 @@ struct vdm_tx {
int size;
};
+struct rx_msg {
+ u8 type;
+ u8 len;
+ u32 payload[7];
+ struct list_head entry;
+};
+
+#define IS_DATA(m, t) ((m) && ((m)->len) && ((m)->type == (t)))
+#define IS_CTRL(m, t) ((m) && !((m)->len) && ((m)->type == (t)))
+
struct usbpd {
struct device dev;
struct workqueue_struct *wq;
@@ -275,9 +286,8 @@ struct usbpd {
enum usbpd_state current_state;
bool hard_reset_recvd;
- u8 rx_msg_type;
- u8 rx_msg_len;
- u32 rx_payload[7];
+ struct list_head rx_q;
+ spinlock_t rx_lock;
u32 received_pdos[7];
int src_cap_id;
@@ -457,14 +467,10 @@ static int pd_select_pdo(struct usbpd *pd, int pdo_pos)
return 0;
}
-static int pd_eval_src_caps(struct usbpd *pd, const u32 *src_caps)
+static int pd_eval_src_caps(struct usbpd *pd)
{
union power_supply_propval val;
- u32 first_pdo = src_caps[0];
-
- /* save the PDOs so userspace can further evaluate */
- memcpy(&pd->received_pdos, src_caps, sizeof(pd->received_pdos));
- pd->src_cap_id++;
+ u32 first_pdo = pd->received_pdos[0];
if (PD_SRC_PDO_TYPE(first_pdo) != PD_SRC_PDO_TYPE_FIXED) {
usbpd_err(&pd->dev, "First src_cap invalid! %08x\n", first_pdo);
@@ -525,6 +531,8 @@ static void phy_sig_received(struct usbpd *pd, enum pd_sig_type type)
static void phy_msg_received(struct usbpd *pd, enum pd_msg_type type,
u8 *buf, size_t len)
{
+ struct rx_msg *rx_msg;
+ unsigned long flags;
u16 header;
if (type != SOP_MSG) {
@@ -567,16 +575,20 @@ static void phy_msg_received(struct usbpd *pd, enum pd_msg_type type,
return;
}
- /* block until previous message has been consumed by usbpd_sm */
- if (pd->rx_msg_type)
- flush_work(&pd->sm_work);
+ rx_msg = kzalloc(sizeof(*rx_msg), GFP_KERNEL);
+ if (!rx_msg)
+ return;
- pd->rx_msg_type = PD_MSG_HDR_TYPE(header);
- pd->rx_msg_len = PD_MSG_HDR_COUNT(header);
- memcpy(&pd->rx_payload, buf, len);
+ rx_msg->type = PD_MSG_HDR_TYPE(header);
+ rx_msg->len = PD_MSG_HDR_COUNT(header);
+ memcpy(&rx_msg->payload, buf, len);
+
+ spin_lock_irqsave(&pd->rx_lock, flags);
+ list_add_tail(&rx_msg->entry, &pd->rx_q);
+ spin_unlock_irqrestore(&pd->rx_lock, flags);
usbpd_dbg(&pd->dev, "received message: type(%d) len(%d)\n",
- pd->rx_msg_type, pd->rx_msg_len);
+ rx_msg->type, rx_msg->len);
kick_sm(pd, 0);
}
@@ -607,6 +619,7 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
FRAME_FILTER_EN_HARD_RESET
};
union power_supply_propval val = {0};
+ unsigned long flags;
int ret;
usbpd_dbg(&pd->dev, "%s -> %s\n",
@@ -638,8 +651,6 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
power_supply_set_property(pd->usb_psy,
POWER_SUPPLY_PROP_TYPEC_POWER_ROLE, &val);
- pd->rx_msg_len = 0;
- pd->rx_msg_type = 0;
pd->rx_msgid = -1;
if (!pd->in_pr_swap) {
@@ -804,8 +815,6 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
/* Reset protocol layer */
pd->tx_msgid = 0;
pd->rx_msgid = -1;
- pd->rx_msg_len = 0;
- pd->rx_msg_type = 0;
if (!pd->in_pr_swap) {
if (pd->pd_phy_opened) {
@@ -834,10 +843,10 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
/* fall-through */
case PE_SNK_WAIT_FOR_CAPABILITIES:
- if (pd->rx_msg_len && pd->rx_msg_type)
- kick_sm(pd, 0);
- else
+ spin_lock_irqsave(&pd->rx_lock, flags);
+ if (list_empty(&pd->rx_q))
kick_sm(pd, SINK_WAIT_CAP_TIME);
+ spin_unlock_irqrestore(&pd->rx_lock, flags);
break;
case PE_SNK_EVALUATE_CAPABILITY:
@@ -845,7 +854,7 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
pd->hard_reset_count = 0;
/* evaluate PDOs and select one */
- ret = pd_eval_src_caps(pd, pd->rx_payload);
+ ret = pd_eval_src_caps(pd);
if (ret < 0) {
usbpd_err(&pd->dev, "Invalid src_caps received. Skipping request\n");
break;
@@ -999,13 +1008,13 @@ int usbpd_send_svdm(struct usbpd *pd, u16 svid, u8 cmd,
}
EXPORT_SYMBOL(usbpd_send_svdm);
-static void handle_vdm_rx(struct usbpd *pd)
+static void handle_vdm_rx(struct usbpd *pd, struct rx_msg *rx_msg)
{
- u32 vdm_hdr = pd->rx_payload[0];
- u32 *vdos = &pd->rx_payload[1];
+ u32 vdm_hdr = rx_msg->payload[0];
+ u32 *vdos = &rx_msg->payload[1];
u16 svid = VDM_HDR_SVID(vdm_hdr);
u16 *psvid;
- u8 i, num_vdos = pd->rx_msg_len - 1; /* num objects minus header */
+ u8 i, num_vdos = rx_msg->len - 1; /* num objects minus header */
u8 cmd = SVDM_HDR_CMD(vdm_hdr);
u8 cmd_type = SVDM_HDR_CMD_TYPE(vdm_hdr);
struct usbpd_svid_handler *handler;
@@ -1330,14 +1339,27 @@ static void vconn_swap(struct usbpd *pd)
}
}
+static inline void rx_msg_cleanup(struct usbpd *pd)
+{
+ struct rx_msg *msg, *tmp;
+ unsigned long flags;
+
+ spin_lock_irqsave(&pd->rx_lock, flags);
+ list_for_each_entry_safe(msg, tmp, &pd->rx_q, entry) {
+ list_del(&msg->entry);
+ kfree(msg);
+ }
+ spin_unlock_irqrestore(&pd->rx_lock, flags);
+}
+
/* Handles current state and determines transitions */
static void usbpd_sm(struct work_struct *w)
{
struct usbpd *pd = container_of(w, struct usbpd, sm_work);
union power_supply_propval val = {0};
int ret;
- enum usbpd_control_msg_type ctrl_recvd = 0;
- enum usbpd_data_msg_type data_recvd = 0;
+ struct rx_msg *rx_msg = NULL;
+ unsigned long flags;
usbpd_dbg(&pd->dev, "handle state %s\n",
usbpd_state_strings[pd->current_state]);
@@ -1345,10 +1367,12 @@ static void usbpd_sm(struct work_struct *w)
hrtimer_cancel(&pd->timer);
pd->sm_queued = false;
- if (pd->rx_msg_len)
- data_recvd = pd->rx_msg_type;
- else
- ctrl_recvd = pd->rx_msg_type;
+ spin_lock_irqsave(&pd->rx_lock, flags);
+ if (!list_empty(&pd->rx_q)) {
+ rx_msg = list_first_entry(&pd->rx_q, struct rx_msg, entry);
+ list_del(&rx_msg->entry);
+ }
+ spin_unlock_irqrestore(&pd->rx_lock, flags);
/* Disconnect? */
if (pd->typec_mode == POWER_SUPPLY_TYPEC_NONE && !pd->in_pr_swap) {
@@ -1372,6 +1396,7 @@ static void usbpd_sm(struct work_struct *w)
pd->requested_voltage = 0;
pd->requested_current = 0;
memset(&pd->received_pdos, 0, sizeof(pd->received_pdos));
+ rx_msg_cleanup(pd);
val.intval = 0;
power_supply_set_property(pd->usb_psy,
@@ -1426,6 +1451,7 @@ static void usbpd_sm(struct work_struct *w)
POWER_SUPPLY_PROP_PD_IN_HARD_RESET, &val);
pd->in_pr_swap = false;
+ rx_msg_cleanup(pd);
reset_vdm_state(pd);
if (pd->current_pr == PR_SINK) {
@@ -1439,7 +1465,7 @@ static void usbpd_sm(struct work_struct *w)
}
/* Soft reset? */
- if (ctrl_recvd == MSG_SOFT_RESET) {
+ if (IS_CTRL(rx_msg, MSG_SOFT_RESET)) {
usbpd_dbg(&pd->dev, "Handle soft reset\n");
if (pd->current_pr == PR_SRC)
@@ -1519,10 +1545,10 @@ static void usbpd_sm(struct work_struct *w)
break;
case PE_SRC_SEND_CAPABILITIES_WAIT:
- if (data_recvd == MSG_REQUEST) {
- pd->rdo = pd->rx_payload[0];
+ if (IS_DATA(rx_msg, MSG_REQUEST)) {
+ pd->rdo = rx_msg->payload[0];
usbpd_set_state(pd, PE_SRC_NEGOTIATE_CAPABILITY);
- } else if (data_recvd || ctrl_recvd) {
+ } else if (rx_msg) {
usbpd_err(&pd->dev, "Unexpected message received\n");
usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
} else {
@@ -1531,7 +1557,7 @@ static void usbpd_sm(struct work_struct *w)
break;
case PE_SRC_READY:
- if (ctrl_recvd == MSG_GET_SOURCE_CAP) {
+ if (IS_CTRL(rx_msg, MSG_GET_SOURCE_CAP)) {
ret = pd_send_msg(pd, MSG_SOURCE_CAPABILITIES,
default_src_caps,
ARRAY_SIZE(default_src_caps), SOP_MSG);
@@ -1540,7 +1566,7 @@ static void usbpd_sm(struct work_struct *w)
usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
break;
}
- } else if (ctrl_recvd == MSG_GET_SINK_CAP) {
+ } else if (IS_CTRL(rx_msg, MSG_GET_SINK_CAP)) {
ret = pd_send_msg(pd, MSG_SINK_CAPABILITIES,
default_snk_caps,
ARRAY_SIZE(default_snk_caps), SOP_MSG);
@@ -1548,10 +1574,10 @@ static void usbpd_sm(struct work_struct *w)
usbpd_err(&pd->dev, "Error sending Sink Caps\n");
usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
}
- } else if (data_recvd == MSG_REQUEST) {
- pd->rdo = pd->rx_payload[0];
+ } else if (IS_DATA(rx_msg, MSG_REQUEST)) {
+ pd->rdo = rx_msg->payload[0];
usbpd_set_state(pd, PE_SRC_NEGOTIATE_CAPABILITY);
- } else if (ctrl_recvd == MSG_DR_SWAP) {
+ } else if (IS_CTRL(rx_msg, MSG_DR_SWAP)) {
if (pd->vdm_state == MODE_ENTERED) {
usbpd_set_state(pd, PE_SRC_HARD_RESET);
break;
@@ -1566,7 +1592,7 @@ static void usbpd_sm(struct work_struct *w)
dr_swap(pd);
kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE);
- } else if (ctrl_recvd == MSG_PR_SWAP) {
+ } else if (IS_CTRL(rx_msg, MSG_PR_SWAP)) {
/* lock in current mode */
set_power_role(pd, pd->current_pr);
@@ -1581,7 +1607,7 @@ static void usbpd_sm(struct work_struct *w)
pd->current_state = PE_PRS_SRC_SNK_TRANSITION_TO_OFF;
kick_sm(pd, SRC_TRANSITION_TIME);
break;
- } else if (ctrl_recvd == MSG_VCONN_SWAP) {
+ } else if (IS_CTRL(rx_msg, MSG_VCONN_SWAP)) {
ret = pd_send_msg(pd, MSG_ACCEPT, NULL, 0, SOP_MSG);
if (ret) {
usbpd_err(&pd->dev, "Error sending Accept\n");
@@ -1591,8 +1617,8 @@ static void usbpd_sm(struct work_struct *w)
vconn_swap(pd);
} else {
- if (data_recvd == MSG_VDM)
- handle_vdm_rx(pd);
+ if (IS_DATA(rx_msg, MSG_VDM))
+ handle_vdm_rx(pd, rx_msg);
else
handle_vdm_tx(pd);
}
@@ -1637,6 +1663,7 @@ static void usbpd_sm(struct work_struct *w)
pd_send_hard_reset(pd);
pd->in_explicit_contract = false;
+ rx_msg_cleanup(pd);
reset_vdm_state(pd);
pd->current_state = PE_SRC_TRANSITION_TO_DEFAULT;
@@ -1648,7 +1675,7 @@ static void usbpd_sm(struct work_struct *w)
break;
case PE_SNK_WAIT_FOR_CAPABILITIES:
- if (data_recvd == MSG_SOURCE_CAPABILITIES) {
+ if (IS_DATA(rx_msg, MSG_SOURCE_CAPABILITIES)) {
val.intval = 0;
power_supply_set_property(pd->usb_psy,
POWER_SUPPLY_PROP_PD_IN_HARD_RESET,
@@ -1658,6 +1685,11 @@ static void usbpd_sm(struct work_struct *w)
power_supply_set_property(pd->usb_psy,
POWER_SUPPLY_PROP_PD_ACTIVE, &val);
+ /* save the PDOs so userspace can further evaluate */
+ memcpy(&pd->received_pdos, rx_msg->payload,
+ sizeof(pd->received_pdos));
+ pd->src_cap_id++;
+
usbpd_set_state(pd, PE_SNK_EVALUATE_CAPABILITY);
} else if (pd->hard_reset_count < 3) {
usbpd_set_state(pd, PE_SNK_HARD_RESET);
@@ -1685,7 +1717,7 @@ static void usbpd_sm(struct work_struct *w)
break;
case PE_SNK_SELECT_CAPABILITY:
- if (ctrl_recvd == MSG_ACCEPT) {
+ if (IS_CTRL(rx_msg, MSG_ACCEPT)) {
/* prepare for voltage increase/decrease */
val.intval = pd->requested_voltage;
power_supply_set_property(pd->usb_psy,
@@ -1705,13 +1737,14 @@ static void usbpd_sm(struct work_struct *w)
pd->selected_pdo = pd->requested_pdo;
usbpd_set_state(pd, PE_SNK_TRANSITION_SINK);
- } else if (ctrl_recvd == MSG_REJECT || ctrl_recvd == MSG_WAIT) {
+ } else if (IS_CTRL(rx_msg, MSG_REJECT) ||
+ IS_CTRL(rx_msg, MSG_WAIT)) {
if (pd->in_explicit_contract)
usbpd_set_state(pd, PE_SNK_READY);
else
usbpd_set_state(pd,
PE_SNK_WAIT_FOR_CAPABILITIES);
- } else if (pd->rx_msg_type) {
+ } else if (rx_msg) {
usbpd_err(&pd->dev, "Invalid response to sink request\n");
usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
} else {
@@ -1721,7 +1754,7 @@ static void usbpd_sm(struct work_struct *w)
break;
case PE_SNK_TRANSITION_SINK:
- if (ctrl_recvd == MSG_PS_RDY) {
+ if (IS_CTRL(rx_msg, MSG_PS_RDY)) {
val.intval = pd->requested_voltage;
power_supply_set_property(pd->usb_psy,
pd->requested_voltage >= pd->current_voltage ?
@@ -1742,9 +1775,14 @@ static void usbpd_sm(struct work_struct *w)
break;
case PE_SNK_READY:
- if (data_recvd == MSG_SOURCE_CAPABILITIES) {
+ if (IS_DATA(rx_msg, MSG_SOURCE_CAPABILITIES)) {
+ /* save the PDOs so userspace can further evaluate */
+ memcpy(&pd->received_pdos, rx_msg->payload,
+ sizeof(pd->received_pdos));
+ pd->src_cap_id++;
+
usbpd_set_state(pd, PE_SNK_EVALUATE_CAPABILITY);
- } else if (ctrl_recvd == MSG_GET_SINK_CAP) {
+ } else if (IS_CTRL(rx_msg, MSG_GET_SINK_CAP)) {
ret = pd_send_msg(pd, MSG_SINK_CAPABILITIES,
default_snk_caps,
ARRAY_SIZE(default_snk_caps), SOP_MSG);
@@ -1752,7 +1790,7 @@ static void usbpd_sm(struct work_struct *w)
usbpd_err(&pd->dev, "Error sending Sink Caps\n");
usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
}
- } else if (ctrl_recvd == MSG_GET_SOURCE_CAP) {
+ } else if (IS_CTRL(rx_msg, MSG_GET_SOURCE_CAP)) {
ret = pd_send_msg(pd, MSG_SOURCE_CAPABILITIES,
default_src_caps,
ARRAY_SIZE(default_src_caps), SOP_MSG);
@@ -1761,7 +1799,7 @@ static void usbpd_sm(struct work_struct *w)
usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
break;
}
- } else if (ctrl_recvd == MSG_DR_SWAP) {
+ } else if (IS_CTRL(rx_msg, MSG_DR_SWAP)) {
if (pd->vdm_state == MODE_ENTERED) {
usbpd_set_state(pd, PE_SNK_HARD_RESET);
break;
@@ -1776,7 +1814,7 @@ static void usbpd_sm(struct work_struct *w)
dr_swap(pd);
kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE);
- } else if (ctrl_recvd == MSG_PR_SWAP) {
+ } else if (IS_CTRL(rx_msg, MSG_PR_SWAP)) {
/* lock in current mode */
set_power_role(pd, pd->current_pr);
@@ -1791,7 +1829,7 @@ static void usbpd_sm(struct work_struct *w)
pd->in_pr_swap = true;
usbpd_set_state(pd, PE_PRS_SNK_SRC_TRANSITION_TO_OFF);
break;
- } else if (ctrl_recvd == MSG_VCONN_SWAP) {
+ } else if (IS_CTRL(rx_msg, MSG_VCONN_SWAP)) {
/*
* if VCONN is connected to VBUS, make sure we are
* not in high voltage contract, otherwise reject.
@@ -1818,8 +1856,8 @@ static void usbpd_sm(struct work_struct *w)
vconn_swap(pd);
} else {
- if (data_recvd == MSG_VDM)
- handle_vdm_rx(pd);
+ if (IS_DATA(rx_msg, MSG_VDM))
+ handle_vdm_rx(pd, rx_msg);
else
handle_vdm_tx(pd);
}
@@ -1865,7 +1903,7 @@ static void usbpd_sm(struct work_struct *w)
case PE_SRC_SEND_SOFT_RESET:
case PE_SNK_SEND_SOFT_RESET:
- if (ctrl_recvd == MSG_ACCEPT) {
+ if (IS_CTRL(rx_msg, MSG_ACCEPT)) {
usbpd_set_state(pd, pd->current_pr == PR_SRC ?
PE_SRC_SEND_CAPABILITIES :
PE_SNK_WAIT_FOR_CAPABILITIES);
@@ -1902,7 +1940,7 @@ static void usbpd_sm(struct work_struct *w)
break;
case PE_DRS_SEND_DR_SWAP:
- if (ctrl_recvd == MSG_ACCEPT)
+ if (IS_CTRL(rx_msg, MSG_ACCEPT))
dr_swap(pd);
usbpd_set_state(pd, pd->current_pr == PR_SRC ?
@@ -1910,7 +1948,7 @@ static void usbpd_sm(struct work_struct *w)
break;
case PE_PRS_SRC_SNK_SEND_SWAP:
- if (ctrl_recvd != MSG_ACCEPT) {
+ if (!IS_CTRL(rx_msg, MSG_ACCEPT)) {
pd->current_state = PE_SRC_READY;
break;
}
@@ -1945,14 +1983,14 @@ static void usbpd_sm(struct work_struct *w)
break;
case PE_PRS_SRC_SNK_WAIT_SOURCE_ON:
- if (ctrl_recvd == MSG_PS_RDY)
+ if (IS_CTRL(rx_msg, MSG_PS_RDY))
usbpd_set_state(pd, PE_SNK_STARTUP);
else
usbpd_set_state(pd, PE_ERROR_RECOVERY);
break;
case PE_PRS_SNK_SRC_SEND_SWAP:
- if (ctrl_recvd != MSG_ACCEPT) {
+ if (!IS_CTRL(rx_msg, MSG_ACCEPT)) {
pd->current_state = PE_SNK_READY;
break;
}
@@ -1962,7 +2000,7 @@ static void usbpd_sm(struct work_struct *w)
break;
case PE_PRS_SNK_SRC_TRANSITION_TO_OFF:
- if (ctrl_recvd != MSG_PS_RDY) {
+ if (!IS_CTRL(rx_msg, MSG_PS_RDY)) {
usbpd_set_state(pd, PE_ERROR_RECOVERY);
break;
}
@@ -1992,7 +2030,7 @@ static void usbpd_sm(struct work_struct *w)
break;
case PE_VCS_WAIT_FOR_VCONN:
- if (ctrl_recvd == MSG_PS_RDY) {
+ if (IS_CTRL(rx_msg, MSG_PS_RDY)) {
/*
* hopefully redundant check but in case not enabled
* avoids unbalanced regulator disable count
@@ -2017,10 +2055,9 @@ static void usbpd_sm(struct work_struct *w)
break;
}
- /* Rx message should have been consumed now */
- pd->rx_msg_type = pd->rx_msg_len = 0;
-
sm_done:
+ kfree(rx_msg);
+
if (!pd->sm_queued)
pm_relax(&pd->dev);
}
@@ -2657,6 +2694,8 @@ struct usbpd *usbpd_create(struct device *parent)
pd->current_dr = DR_NONE;
list_add_tail(&pd->instance, &_usbpd);
+ spin_lock_init(&pd->rx_lock);
+ INIT_LIST_HEAD(&pd->rx_q);
INIT_LIST_HEAD(&pd->svid_handlers);
/* force read initial power_supply values */
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c
index 0316f4e86d39..bcd23d3c19f2 100644
--- a/drivers/video/fbdev/msm/mdss_fb.c
+++ b/drivers/video/fbdev/msm/mdss_fb.c
@@ -2703,7 +2703,9 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all)
* enabling ahead of unblank. for some special cases like
* adb shell stop/start.
*/
+ mutex_lock(&mfd->bl_lock);
mdss_fb_set_backlight(mfd, 0);
+ mutex_unlock(&mfd->bl_lock);
ret = mdss_fb_blank_sub(FB_BLANK_POWERDOWN, info,
mfd->op_enable);