Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5c059efa authored by Hardik Kantilal Patel's avatar Hardik Kantilal Patel
Browse files

wcnss: LDO change for WCNSS



Send LDO notification through SMD channel to FW which use
to update the pmic pam map.

CRs-Fixed: 660361
Change-Id: I00d62940f79ece9457e671788a94e3b4ac8ed2a7
Signed-off-by: default avatarHardik Kantilal Patel <hkpatel@codeaurora.org>
parent 7a941268
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -39,6 +39,15 @@ using a smaller count for this buffer will reduce the memory usage.
- qcom,is-pronto-vt: boolean flag to determine the pronto hardware version
in use. subsequently Pronto and IRIS voltage regulator range is configured
according to the ponto HW version
- qcom,wcnss-pm : <Core rail LDO#, PA rail LDO#, XO settling time,
		   RPM power collapse enabled, standalone power collapse enabled>
	Power manager related parameter for LDO configuration.
	11     -  WCN CORE rail LDO number
	21     -  WCN PA rail LDO number
	1200   -  WCN XO settling time (usec)
	1      -  WCN RPM power collapse enabled
	1      -  WCN standalone power collapse enabled


Example:

@@ -73,4 +82,5 @@ Example:
        clocks = <&clock_rpm clk_xo_wlan_clk>,
                   <&clock_rpm clk_rf_clk2>;
        clock-names = "xo", "rf_clk";
	qcom,wcnss-pm = <11 21 1200 1 1>;
    };
+51 −0
Original line number Diff line number Diff line
@@ -185,6 +185,7 @@ static DEFINE_SPINLOCK(reg_spinlock);
#define	WCNSS_VBATT_LEVEL_IND         (WCNSS_CTRL_MSG_START + 8)
#define	WCNSS_BUILD_VER_REQ           (WCNSS_CTRL_MSG_START + 9)
#define	WCNSS_BUILD_VER_RSP           (WCNSS_CTRL_MSG_START + 10)
#define	WCNSS_PM_CONFIG_REQ           (WCNSS_CTRL_MSG_START + 11)

/* max 20mhz channel count */
#define WCNSS_MAX_CH_NUM			45
@@ -350,6 +351,7 @@ static struct {
	struct delayed_work wcnss_work;
	struct delayed_work vbatt_work;
	struct work_struct wcnssctrl_version_work;
	struct work_struct wcnss_pm_config_work;
	struct work_struct wcnssctrl_nvbin_dnld_work;
	struct work_struct wcnssctrl_rx_work;
	struct wake_lock wcnss_wake_lock;
@@ -920,6 +922,7 @@ static void wcnss_smd_notify_event(void *data, unsigned int event)
		pr_debug("wcnss: opening WCNSS SMD channel :%s",
				WCNSS_CTRL_CHANNEL);
		schedule_work(&penv->wcnssctrl_version_work);
		schedule_work(&penv->wcnss_pm_config_work);

		break;

@@ -1831,6 +1834,53 @@ static void wcnss_send_version_req(struct work_struct *worker)
	return;
}

static void wcnss_send_pm_config(struct work_struct *worker)
{
	struct smd_msg_hdr *hdr;
	unsigned char *msg = NULL;
	int rc, prop_len;
	u32 *payload;

	if (!of_find_property(penv->pdev->dev.of_node,
			"qcom,wcnss-pm", &prop_len))
		return;

	msg = kmalloc((sizeof(struct smd_msg_hdr) + prop_len), GFP_KERNEL);

	if (NULL == msg) {
		pr_err("wcnss: %s: failed to allocate memory\n", __func__);
		return;
	}

	payload = (u32 *)(msg + sizeof(struct smd_msg_hdr));

	prop_len /= sizeof(int);

	rc = of_property_read_u32_array(penv->pdev->dev.of_node,
			"qcom,wcnss-pm", payload, prop_len);
	if (rc < 0) {
		pr_err("wcnss: property read failed\n");
		kfree(msg);
		return;
	}

	pr_debug("%s:size=%d: <%d, %d, %d, %d, %d>\n", __func__,
			prop_len, *payload, *(payload+1), *(payload+2),
			*(payload+3), *(payload+4));

	hdr = (struct smd_msg_hdr *)msg;
	hdr->msg_type = WCNSS_PM_CONFIG_REQ;
	hdr->msg_len = sizeof(struct smd_msg_hdr) + prop_len;

	rc = wcnss_smd_tx(msg, hdr->msg_len);
	if (rc < 0)
		pr_err("wcnss: smd tx failed\n");

	kfree(msg);
	return;
}


static DECLARE_RWSEM(wcnss_pm_sem);

static void wcnss_nvbin_dnld(void)
@@ -2258,6 +2308,7 @@ wcnss_trigger_config(struct platform_device *pdev)
	}
	INIT_WORK(&penv->wcnssctrl_rx_work, wcnssctrl_rx_handler);
	INIT_WORK(&penv->wcnssctrl_version_work, wcnss_send_version_req);
	INIT_WORK(&penv->wcnss_pm_config_work, wcnss_send_pm_config);
	INIT_WORK(&penv->wcnssctrl_nvbin_dnld_work, wcnss_nvbin_dnld_main);

	wake_lock_init(&penv->wcnss_wake_lock, WAKE_LOCK_SUSPEND, "wcnss");