summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@quicinc.com>2017-07-26 19:22:45 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-07-26 19:22:44 -0700
commit827f654338c1bfbee65c4d5802c40743b660e57b (patch)
tree79e1ddb18daaafd5aa298d979c7f5fac80066cd4
parent1c9a156e417584445917ee219583ea37a6895b70 (diff)
parent898db47a7810c2ffce83c89d6944933bce84fd46 (diff)
Merge "msm: ipa3: disable clock gating for MISC"
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa.c23
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa_i.h1
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa_utils.c22
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c16
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.h9
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg_i.h3
6 files changed, 73 insertions, 1 deletions
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c
index 7ed83fb74fcc..393ca58a763d 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c
@@ -1654,6 +1654,21 @@ int ipa3_setup_dflt_rt_tables(void)
return 0;
}
+static int ipa3_clkon_cfg_wa(void)
+{
+ struct ipahal_reg_clkon_cfg clkon_cfg = { 0 };
+ int ret = 0;
+
+ clkon_cfg.cgc_open_misc = 1;
+
+ if (ipa3_cfg_clkon_cfg(&clkon_cfg)) {
+ IPAERR("fail to set cgc_open_misc = 1\n");
+ ret = -EPERM;
+ }
+
+ return ret;
+}
+
static int ipa3_setup_exception_path(void)
{
struct ipa_ioc_add_hdr *hdr;
@@ -4063,8 +4078,14 @@ static int ipa3_post_init(const struct ipa3_plat_drv_res *resource_p,
ipa3_trigger_ipa_ready_cbs();
complete_all(&ipa3_ctx->init_completion_obj);
- pr_info("IPA driver initialization was successful.\n");
+ /* WA to disable MISC clock gating for IPA_HW_v3_1 */
+ if (ipa3_ctx->ipa_hw_type == IPA_HW_v3_1) {
+ pr_info(" WA to set cgc_open_misc = 1\n");
+ ipa3_clkon_cfg_wa();
+ }
+
+ pr_info("IPA driver initialization was successful\n");
return 0;
fail_teth_bridge_driver_init:
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h
index a890e88a8f61..4278dc45aad2 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h
@@ -1877,6 +1877,7 @@ void ipa3_dump_buff_internal(void *base, dma_addr_t phy_base, u32 size);
#else
#define IPA_DUMP_BUFF(base, phy_base, size)
#endif
+int ipa3_cfg_clkon_cfg(struct ipahal_reg_clkon_cfg *clkon_cfg);
int ipa3_init_mem_partition(struct device_node *dev_node);
int ipa3_controller_static_bind(struct ipa3_controller *controller,
enum ipa_hw_type ipa_hw_type);
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c
index 1fa1196dda63..e8bd0cd2ffb5 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c
@@ -795,6 +795,28 @@ void _ipa_sram_settings_read_v3_0(void)
}
/**
+ * ipa3_cfg_clkon_cfg() - configure IPA clkon_cfg
+ * @clkon_cfg: IPA clkon_cfg
+ *
+ * Return codes:
+ * 0: success
+ */
+int ipa3_cfg_clkon_cfg(struct ipahal_reg_clkon_cfg *clkon_cfg)
+{
+
+ IPA_ACTIVE_CLIENTS_INC_SIMPLE();
+
+ IPADBG("cgc_open_misc = %d\n",
+ clkon_cfg->cgc_open_misc);
+
+ ipahal_write_reg_fields(IPA_CLKON_CFG, clkon_cfg);
+
+ IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
+
+ return 0;
+}
+
+/**
* ipa3_cfg_route() - configure IPA route
* @route: IPA route
*
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c
index 585f9e6bd492..0db9f30181a7 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c
@@ -19,6 +19,7 @@
#include "ipahal_reg_i.h"
static const char *ipareg_name_to_str[IPA_REG_MAX] = {
+ __stringify(IPA_CLKON_CFG),
__stringify(IPA_ROUTE),
__stringify(IPA_IRQ_STTS_EE_n),
__stringify(IPA_IRQ_EN_EE_n),
@@ -858,6 +859,18 @@ static void ipareg_construct_endp_init_hdr_n(enum ipahal_reg_name reg,
IPA_ENDP_INIT_HDR_n_HDR_LEN_BMSK);
}
+static void ipareg_construct_clkon_cfg(enum ipahal_reg_name reg,
+ const void *fields, u32 *val)
+{
+ struct ipahal_reg_clkon_cfg *clkon_cfg;
+
+ clkon_cfg = (struct ipahal_reg_clkon_cfg *)fields;
+
+ IPA_SETFIELD_IN_REG(*val, clkon_cfg->cgc_open_misc,
+ IPA_CLKON_CFG_CGC_OPEN_MISC_SHFT,
+ IPA_CLKON_CFG_CGC_OPEN_MISC_BMSK);
+}
+
static void ipareg_construct_route(enum ipahal_reg_name reg,
const void *fields, u32 *val)
{
@@ -1159,6 +1172,9 @@ static struct ipahal_reg_obj ipahal_reg_objs[IPA_HW_MAX][IPA_REG_MAX] = {
/* IPAv3.1 */
+ [IPA_HW_v3_1][IPA_CLKON_CFG] = {
+ ipareg_construct_clkon_cfg, ipareg_parse_dummy,
+ 0x00000044, 0},
[IPA_HW_v3_1][IPA_IRQ_SUSPEND_INFO_EE_n] = {
ipareg_construct_dummy, ipareg_parse_dummy,
0x00003030, 0x1000},
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.h b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.h
index c37415f13380..4db09475d5e2 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.h
+++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.h
@@ -22,6 +22,7 @@
* array as well.
*/
enum ipahal_reg_name {
+ IPA_CLKON_CFG,
IPA_ROUTE,
IPA_IRQ_STTS_EE_n,
IPA_IRQ_EN_EE_n,
@@ -90,6 +91,14 @@ enum ipahal_reg_name {
};
/*
+ * struct ipahal_reg_clkon_cfg - IPA clock on configuration register
+ * @cgc_open_misc: clock gating needs for MISC
+ */
+struct ipahal_reg_clkon_cfg {
+ u32 cgc_open_misc;
+};
+
+/*
* struct ipahal_reg_route - IPA route register
* @route_dis: route disable
* @route_def_pipe: route default pipe
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg_i.h b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg_i.h
index ac97e5ac0494..37458c4d0697 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg_i.h
+++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg_i.h
@@ -21,6 +21,9 @@ int ipahal_reg_init(enum ipa_hw_type ipa_hw_type);
#define IPA_GETFIELD_FROM_REG(reg, shift, mask) \
(((reg) & (mask)) >> (shift))
+/* IPA_CLKON_CFG register */
+#define IPA_CLKON_CFG_CGC_OPEN_MISC_SHFT 0x3
+#define IPA_CLKON_CFG_CGC_OPEN_MISC_BMSK 0x8
/* IPA_ROUTE register */
#define IPA_ROUTE_ROUTE_DIS_SHFT 0x0