You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
5.9 KiB
200 lines
5.9 KiB
/* linux/include/asm-arm/arch-msm/hsusb.h |
|
* |
|
* Copyright (C) 2008 Google, Inc. |
|
* Author: Brian Swetland <swetland@google.com> |
|
* Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved. |
|
* |
|
* This software is licensed under the terms of the GNU General Public |
|
* License version 2, as published by the Free Software Foundation, and |
|
* may be copied, distributed, and modified under those terms. |
|
* |
|
* 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 __ASM_ARCH_MSM_HSUSB_H |
|
#define __ASM_ARCH_MSM_HSUSB_H |
|
|
|
#include <linux/extcon.h> |
|
#include <linux/types.h> |
|
#include <linux/usb/otg.h> |
|
#include <linux/clk.h> |
|
|
|
/** |
|
* OTG control |
|
* |
|
* OTG_NO_CONTROL Id/VBUS notifications not required. Useful in host |
|
* only configuration. |
|
* OTG_PHY_CONTROL Id/VBUS notifications comes form USB PHY. |
|
* OTG_PMIC_CONTROL Id/VBUS notifications comes from PMIC hardware. |
|
* OTG_USER_CONTROL Id/VBUS notifcations comes from User via sysfs. |
|
* |
|
*/ |
|
enum otg_control_type { |
|
OTG_NO_CONTROL = 0, |
|
OTG_PHY_CONTROL, |
|
OTG_PMIC_CONTROL, |
|
OTG_USER_CONTROL, |
|
}; |
|
|
|
/** |
|
* PHY used in |
|
* |
|
* INVALID_PHY Unsupported PHY |
|
* CI_45NM_INTEGRATED_PHY Chipidea 45nm integrated PHY |
|
* SNPS_28NM_INTEGRATED_PHY Synopsis 28nm integrated PHY |
|
* |
|
*/ |
|
enum msm_usb_phy_type { |
|
INVALID_PHY = 0, |
|
CI_45NM_INTEGRATED_PHY, |
|
SNPS_28NM_INTEGRATED_PHY, |
|
}; |
|
|
|
#define IDEV_CHG_MAX 1500 |
|
#define IUNIT 100 |
|
|
|
/** |
|
* Different states involved in USB charger detection. |
|
* |
|
* USB_CHG_STATE_UNDEFINED USB charger is not connected or detection |
|
* process is not yet started. |
|
* USB_CHG_STATE_WAIT_FOR_DCD Waiting for Data pins contact. |
|
* USB_CHG_STATE_DCD_DONE Data pin contact is detected. |
|
* USB_CHG_STATE_PRIMARY_DONE Primary detection is completed (Detects |
|
* between SDP and DCP/CDP). |
|
* USB_CHG_STATE_SECONDARY_DONE Secondary detection is completed (Detects |
|
* between DCP and CDP). |
|
* USB_CHG_STATE_DETECTED USB charger type is determined. |
|
* |
|
*/ |
|
enum usb_chg_state { |
|
USB_CHG_STATE_UNDEFINED = 0, |
|
USB_CHG_STATE_WAIT_FOR_DCD, |
|
USB_CHG_STATE_DCD_DONE, |
|
USB_CHG_STATE_PRIMARY_DONE, |
|
USB_CHG_STATE_SECONDARY_DONE, |
|
USB_CHG_STATE_DETECTED, |
|
}; |
|
|
|
/** |
|
* USB charger types |
|
* |
|
* USB_INVALID_CHARGER Invalid USB charger. |
|
* USB_SDP_CHARGER Standard downstream port. Refers to a downstream port |
|
* on USB2.0 compliant host/hub. |
|
* USB_DCP_CHARGER Dedicated charger port (AC charger/ Wall charger). |
|
* USB_CDP_CHARGER Charging downstream port. Enumeration can happen and |
|
* IDEV_CHG_MAX can be drawn irrespective of USB state. |
|
* |
|
*/ |
|
enum usb_chg_type { |
|
USB_INVALID_CHARGER = 0, |
|
USB_SDP_CHARGER, |
|
USB_DCP_CHARGER, |
|
USB_CDP_CHARGER, |
|
}; |
|
|
|
/** |
|
* struct msm_otg_platform_data - platform device data |
|
* for msm_otg driver. |
|
* @phy_init_seq: PHY configuration sequence values. Value of -1 is reserved as |
|
* "do not overwrite default vaule at this address". |
|
* @phy_init_sz: PHY configuration sequence size. |
|
* @vbus_power: VBUS power on/off routine. |
|
* @power_budget: VBUS power budget in mA (0 will be treated as 500mA). |
|
* @mode: Supported mode (OTG/peripheral/host). |
|
* @otg_control: OTG switch controlled by user/Id pin |
|
*/ |
|
struct msm_otg_platform_data { |
|
int *phy_init_seq; |
|
int phy_init_sz; |
|
void (*vbus_power)(bool on); |
|
unsigned power_budget; |
|
enum usb_dr_mode mode; |
|
enum otg_control_type otg_control; |
|
enum msm_usb_phy_type phy_type; |
|
void (*setup_gpio)(enum usb_otg_state state); |
|
}; |
|
|
|
/** |
|
* struct msm_usb_cable - structure for exteternal connector cable |
|
* state tracking |
|
* @nb: hold event notification callback |
|
* @conn: used for notification registration |
|
*/ |
|
struct msm_usb_cable { |
|
struct notifier_block nb; |
|
struct extcon_dev *extcon; |
|
}; |
|
|
|
/** |
|
* struct msm_otg: OTG driver data. Shared by HCD and DCD. |
|
* @otg: USB OTG Transceiver structure. |
|
* @pdata: otg device platform data. |
|
* @irq: IRQ number assigned for HSUSB controller. |
|
* @clk: clock struct of usb_hs_clk. |
|
* @pclk: clock struct of usb_hs_pclk. |
|
* @core_clk: clock struct of usb_hs_core_clk. |
|
* @regs: ioremapped register base address. |
|
* @inputs: OTG state machine inputs(Id, SessValid etc). |
|
* @sm_work: OTG state machine work. |
|
* @in_lpm: indicates low power mode (LPM) state. |
|
* @async_int: Async interrupt arrived. |
|
* @cur_power: The amount of mA available from downstream port. |
|
* @chg_work: Charger detection work. |
|
* @chg_state: The state of charger detection process. |
|
* @chg_type: The type of charger attached. |
|
* @dcd_retires: The retry count used to track Data contact |
|
* detection process. |
|
* @manual_pullup: true if VBUS is not routed to USB controller/phy |
|
* and controller driver therefore enables pull-up explicitly before |
|
* starting controller using usbcmd run/stop bit. |
|
* @vbus: VBUS signal state trakining, using extcon framework |
|
* @id: ID signal state trakining, using extcon framework |
|
* @switch_gpio: Descriptor for GPIO used to control external Dual |
|
* SPDT USB Switch. |
|
* @reboot: Used to inform the driver to route USB D+/D- line to Device |
|
* connector |
|
*/ |
|
struct msm_otg { |
|
struct usb_phy phy; |
|
struct msm_otg_platform_data *pdata; |
|
int irq; |
|
struct clk *clk; |
|
struct clk *pclk; |
|
struct clk *core_clk; |
|
void __iomem *regs; |
|
#define ID 0 |
|
#define B_SESS_VLD 1 |
|
unsigned long inputs; |
|
struct work_struct sm_work; |
|
atomic_t in_lpm; |
|
int async_int; |
|
unsigned cur_power; |
|
int phy_number; |
|
struct delayed_work chg_work; |
|
enum usb_chg_state chg_state; |
|
enum usb_chg_type chg_type; |
|
u8 dcd_retries; |
|
struct regulator *v3p3; |
|
struct regulator *v1p8; |
|
struct regulator *vddcx; |
|
|
|
struct reset_control *phy_rst; |
|
struct reset_control *link_rst; |
|
int vdd_levels[3]; |
|
|
|
bool manual_pullup; |
|
|
|
struct msm_usb_cable vbus; |
|
struct msm_usb_cable id; |
|
|
|
struct gpio_desc *switch_gpio; |
|
struct notifier_block reboot; |
|
}; |
|
|
|
#endif
|
|
|