summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorPhilip Rakity <prakity@nvidia.com>2014-02-11 16:06:52 +0000
committerMandar Padmawar <mpadmawar@nvidia.com>2014-06-03 07:36:19 -0700
commite8380680f669666c7fe13d4b419db1078e948e8d (patch)
tree70c977ea7c9d451d29e7d09ff0b5c4eb7eef2bd9 /drivers/usb
parent41093db171190ea08132ee7504c1f565d98f38e7 (diff)
phy usb: add Maxim Fast Charger information
Maxim 14675 charger support at the PHY layer Bug 1321188 Bug 1456402 (cherry picked from commit 2ab5c72ab40adfdc34d5334a4c2c4648ccdac42e) Change-Id: I31d672e82f9f3a4ccf5a8db75df8f7e12f30a63b Reviewed-on: http://git-master/r/400490 Signed-off-by: Philip Rakity <prakity@nvidia.com> Reviewed-on: http://git-master/r/417035 Reviewed-by: Mandar Padmawar <mpadmawar@nvidia.com> Tested-by: Mandar Padmawar <mpadmawar@nvidia.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/phy/phy-tegra-usb.c11
-rw-r--r--drivers/usb/phy/tegra11x_usb_phy.c42
-rw-r--r--drivers/usb/phy/tegra_usb_phy.h1
3 files changed, 54 insertions, 0 deletions
diff --git a/drivers/usb/phy/phy-tegra-usb.c b/drivers/usb/phy/phy-tegra-usb.c
index ce98e7258fc3..e16cd53991b7 100644
--- a/drivers/usb/phy/phy-tegra-usb.c
+++ b/drivers/usb/phy/phy-tegra-usb.c
@@ -631,6 +631,17 @@ bool tegra_usb_phy_qc2_charger_detected(struct tegra_usb_phy *phy,
return status;
}
+bool tegra_usb_phy_maxim_charger_detected(struct tegra_usb_phy *phy)
+{
+ bool status = 0;
+
+ DBG("%s(%d) inst:[%d]\n", __func__, __LINE__, phy->inst);
+ if (phy->ops && phy->ops->maxim_charger_14675)
+ status = phy->ops->maxim_charger_14675(phy);
+
+ return status;
+}
+
bool tegra_usb_phy_nv_charger_detected(struct tegra_usb_phy *phy)
{
bool status = 0;
diff --git a/drivers/usb/phy/tegra11x_usb_phy.c b/drivers/usb/phy/tegra11x_usb_phy.c
index 3d9afad16148..34d64d5326f9 100644
--- a/drivers/usb/phy/tegra11x_usb_phy.c
+++ b/drivers/usb/phy/tegra11x_usb_phy.c
@@ -281,6 +281,9 @@
#define TDP_SRC_ON_MS 100
#define TDPSRC_CON_MS 40
+/* Maxim Debounce Timer */
+#define MAXIM_DEBOUNCE_TIME 120
+
/* Force port resume wait time in micro second on remote resume */
#define FPR_WAIT_TIME_US 25000
@@ -1563,6 +1566,44 @@ static bool cdp_charger_detection(struct tegra_usb_phy *phy)
return status;
}
+static bool maxim_charger_detection(struct tegra_usb_phy *phy)
+{
+ void __iomem *base = phy->regs;
+ unsigned long val;
+ unsigned long org_flags;
+ int status;
+
+ /*
+ * Enable charger detection logic
+ * 3.3V on D+, Sink D- (high speed usb)
+ * Maxim charger will remove short !! -- DCP will not
+ */
+ org_flags = utmi_phy_set_dp_dm_pull_up_down(phy,
+ FORCE_PULLUP_DP | DISABLE_PULLUP_DM |
+ DISABLE_PULLDN_DP | DISABLE_PULLDN_DM);
+ val = readl(base + UTMIP_BAT_CHRG_CFG0);
+ val &= ~(UTMIP_OP_SRC_EN | UTMIP_ON_SINK_EN);
+ val &= ~(UTMIP_ON_SRC_EN | UTMIP_OP_SINK_EN);
+ val |= UTMIP_ON_SINK_EN;
+ writel(val, base + UTMIP_BAT_CHRG_CFG0);
+
+ /* Source should be on at least 120 ms per Maxim spec */
+ msleep(MAXIM_DEBOUNCE_TIME);
+
+ val = readl(base + USB_PHY_VBUS_WAKEUP_ID);
+ if (val & VDAT_DET_STS) {
+ status = false;
+ DBG("%s: Maxim charger not found\n", __func__);
+ utmi_phy_set_dp_dm_pull_up_down(phy, org_flags);
+ } else {
+ status = true;
+ DBG("%s: Maxim Charger detected\n", __func__);
+ }
+
+ disable_charger_detection(base);
+ return status;
+}
+
static bool utmi_phy_qc2_charger_detect(struct tegra_usb_phy *phy,
int max_voltage)
{
@@ -2474,6 +2515,7 @@ static struct tegra_usb_phy_ops utmi_phy_ops = {
.qc2_charger_detect = utmi_phy_qc2_charger_detect,
.cdp_charger_detect = cdp_charger_detection,
.nv_charger_detect = utmi_phy_nv_charger_detect,
+ .maxim_charger_14675 = maxim_charger_detection,
.apple_charger_1000ma_detect = utmi_phy_apple_charger_1000ma_detect,
.apple_charger_2000ma_detect = utmi_phy_apple_charger_2000ma_detect,
.apple_charger_500ma_detect = utmi_phy_apple_charger_500ma_detect,
diff --git a/drivers/usb/phy/tegra_usb_phy.h b/drivers/usb/phy/tegra_usb_phy.h
index 213c24e19617..2f74e48aab74 100644
--- a/drivers/usb/phy/tegra_usb_phy.h
+++ b/drivers/usb/phy/tegra_usb_phy.h
@@ -69,6 +69,7 @@ struct tegra_usb_phy_ops {
bool (*charger_detect)(struct tegra_usb_phy *phy);
bool (*cdp_charger_detect)(struct tegra_usb_phy *phy);
bool (*qc2_charger_detect)(struct tegra_usb_phy *phy, int max_voltage);
+ bool (*maxim_charger_14675)(struct tegra_usb_phy *phy);
bool (*nv_charger_detect)(struct tegra_usb_phy *phy);
bool (*apple_charger_1000ma_detect)(struct tegra_usb_phy *phy);
bool (*apple_charger_2000ma_detect)(struct tegra_usb_phy *phy);