/* Copyright (c) 2009-2012, 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 * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #ifndef __LINUX_USB_GADGET_MSM72K_OTG_H__ #define __LINUX_USB_GADGET_MSM72K_OTG_H__ #include #include #include #include #include #include #include #define OTGSC_BSVIE (1 << 27) #define OTGSC_IDIE (1 << 24) #define OTGSC_IDPU (1 << 5) #define OTGSC_BSVIS (1 << 19) #define OTGSC_ID (1 << 8) #define OTGSC_IDIS (1 << 16) #define OTGSC_BSV (1 << 11) #define OTGSC_DPIE (1 << 30) #define OTGSC_DPIS (1 << 22) #define OTGSC_HADP (1 << 6) #define OTGSC_IDPU (1 << 5) #define ULPI_STP_CTRL (1 << 30) #define ASYNC_INTR_CTRL (1 << 29) #define ULPI_SYNC_STATE (1 << 27) #define PORTSC_PHCD (1 << 23) #define PORTSC_CSC (1 << 1) #define disable_phy_clk() (writel(readl(USB_PORTSC) | PORTSC_PHCD, USB_PORTSC)) #define enable_phy_clk() (writel(readl(USB_PORTSC) & ~PORTSC_PHCD, USB_PORTSC)) #define is_phy_clk_disabled() (readl(USB_PORTSC) & PORTSC_PHCD) #define is_phy_active() (readl_relaxed(USB_ULPI_VIEWPORT) &\ ULPI_SYNC_STATE) #define is_usb_active() (!(readl(USB_PORTSC) & PORTSC_SUSP)) /* Timeout (in msec) values (min - max) associated with OTG timers */ #define TA_WAIT_VRISE 100 /* ( - 100) */ #define TA_WAIT_VFALL 500 /* ( - 1000) */ /* * This option is set for embedded hosts or OTG devices in which leakage * currents are very minimal. */ #ifdef CONFIG_MSM_OTG_ENABLE_A_WAIT_BCON_TIMEOUT #define TA_WAIT_BCON 30000 /* (1100 - 30000) */ #else #define TA_WAIT_BCON -1 #endif /* AIDL_BDIS should be 500 */ #define TA_AIDL_BDIS 200 /* (200 - ) */ #define TA_BIDL_ADIS 155 /* (155 - 200) */ #define TB_SRP_FAIL 6000 /* (5000 - 6000) */ #define TB_ASE0_BRST 155 /* (155 - ) */ /* TB_SSEND_SRP and TB_SE0_SRP are combined */ #define TB_SRP_INIT 2000 /* (1500 - ) */ /* Timeout variables */ #define A_WAIT_VRISE 0 #define A_WAIT_VFALL 1 #define A_WAIT_BCON 2 #define A_AIDL_BDIS 3 #define A_BIDL_ADIS 4 #define B_SRP_FAIL 5 #define B_ASE0_BRST 6 /* Internal flags like a_set_b_hnp_en, b_hnp_en are maintained * in usb_bus and usb_gadget */ #define A_BUS_DROP 0 #define A_BUS_REQ 1 #define A_SRP_DET 2 #define A_VBUS_VLD 3 #define B_CONN 4 #define ID 5 #define ADP_CHANGE 6 #define POWER_UP 7 #define A_CLR_ERR 8 #define A_BUS_RESUME 9 #define A_BUS_SUSPEND 10 #define A_CONN 11 #define B_BUS_REQ 12 #define B_SESS_VLD 13 #define ID_A 14 #define ID_B 15 #define ID_C 16 #define USB_IDCHG_MIN 500 #define USB_IDCHG_MAX 1500 #define USB_IB_UNCFG 2 #define OTG_ID_POLL_MS 1000 struct msm_otg { struct usb_phy phy; /* usb clocks */ struct clk *alt_core_clk; struct clk *iface_clk; struct clk *core_clk; /* clk regime has created dummy clock id for phy so * that generic clk_reset api can be used to reset phy */ struct clk *phy_reset_clk; int irq; int vbus_on_irq; int id_irq; void __iomem *regs; atomic_t in_lpm; /* charger-type is modified by gadget for legacy chargers * and OTG modifies it for ACA */ atomic_t chg_type; void (*start_host) (struct usb_bus *bus, int suspend); /* Enable/disable the clocks */ int (*set_clk) (struct usb_phy *phy, int on); /* Reset phy and link */ void (*reset) (struct usb_phy *phy, int phy_reset); /* pmic notfications apis */ u8 pmic_vbus_notif_supp; u8 pmic_id_notif_supp; struct msm_otg_platform_data *pdata; spinlock_t lock; /* protects OTG state */ struct wake_lock wlock; unsigned long b_last_se0_sess; /* SRP initial condition check */ unsigned long inputs; unsigned long tmouts; u8 active_tmout; struct hrtimer timer; struct workqueue_struct *wq; struct work_struct sm_work; /* state machine work */ struct work_struct otg_resume_work; struct notifier_block usbdev_nb; struct msm_xo_voter *xo_handle; /*handle to vote for TCXO D1 buffer*/ unsigned curr_power; #ifdef CONFIG_USB_MSM_ACA struct timer_list id_timer; /* drives id_status polling */ unsigned b_max_power; /* ACA: max power of accessory*/ #endif }; static inline int can_phy_power_collapse(struct msm_otg *dev) { if (!dev || !dev->pdata) return -ENODEV; return dev->pdata->phy_can_powercollapse; } #endif