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

Commit 8fe4de56 authored by Sriharsha Allenki's avatar Sriharsha Allenki
Browse files

usb: phy: Add support for init sequence for femto phy



Add support for power up init sequence to bring up the
Synopsys HS Femto phy in required configuration. Also
provide module param to be able to override the init
sequence passed from DT files.
Also, correct the MIN voltage for 1P8 regulator which
needs min and max to be the same as this is a fixed
regulator.

Change-Id: I50ae4cb382a3694922e1db097e689f2821ffd7ee
Signed-off-by: default avatarSriharsha Allenki <sallenki@codeaurora.org>
parent 4e48a9f1
Loading
Loading
Loading
Loading
+50 −1
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@
#define USB_HSPHY_3P3_VOL_MAX			3300000 /* uV */
#define USB_HSPHY_3P3_HPM_LOAD			16000	/* uA */

#define USB_HSPHY_1P8_VOL_MIN			1704000 /* uV */
#define USB_HSPHY_1P8_VOL_MIN			1800000 /* uV */
#define USB_HSPHY_1P8_VOL_MAX			1800000 /* uV */
#define USB_HSPHY_1P8_HPM_LOAD			19000	/* uA */

@@ -71,6 +71,17 @@ struct msm_snps_hsphy {
	struct mutex		phy_lock;
};

static char *override_phy_init;
module_param(override_phy_init, charp, 0644);
MODULE_PARM_DESC(override_phy_init,
		"Override SNPS HS PHY Init Settings");

struct hsphy_reg_val {
	u32 offset;
	u32 val;
	u32 delay;
};

static void msm_snps_hsphy_disable_clocks(struct msm_snps_hsphy *phy)
{
	dev_dbg(phy->phy.dev, "%s: clocks_enabled:%d\n",
@@ -250,6 +261,42 @@ static int msm_snps_phy_block_reset(struct msm_snps_hsphy *phy)
	return 0;
}

static void msm_snps_hsphy_por(struct msm_snps_hsphy *phy)
{
	struct hsphy_reg_val *reg = NULL;
	u32 aseq[20];
	u32 *seq, tmp;

	if (override_phy_init) {
		dev_dbg(phy->phy.dev, "Override HS PHY Init:%s\n",
							override_phy_init);
		get_options(override_phy_init, ARRAY_SIZE(aseq), aseq);
		seq = &aseq[1];
	} else {
		seq = phy->phy_init_seq;
	}

	reg = (struct hsphy_reg_val *)seq;
	if (!reg)
		return;

	while (reg->offset != -1) {
		writeb_relaxed(reg->val,
				phy->phy_csr_regs + reg->offset);

		tmp = readb_relaxed(phy->phy_csr_regs + reg->offset);
		if (tmp != reg->val)
			dev_err(phy->phy.dev, "write:%x to: %x failed\n",
						reg->val, reg->offset);
		if (reg->delay)
			usleep_range(reg->delay, reg->delay + 10);
		reg++;
	}

	/* Ensure that the above parameter overrides is successful. */
	mb();
}

static int msm_snps_hsphy_reset(struct msm_snps_hsphy *phy)
{
	int ret;
@@ -308,6 +355,8 @@ static int msm_snps_hsphy_init(struct usb_phy *uphy)
	if (ret)
		return ret;

	msm_snps_hsphy_por(phy);

	ret = msm_snps_hsphy_reset(phy);

	return ret;