122 lines
3.5 KiB
C
122 lines
3.5 KiB
C
|
/**
|
||
|
* dwc3_otg.h - DesignWare USB3 DRD Controller OTG
|
||
|
*
|
||
|
* Copyright (c) 2012-2013, 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_DWC3_OTG_H
|
||
|
#define __LINUX_USB_DWC3_OTG_H
|
||
|
|
||
|
#include <linux/workqueue.h>
|
||
|
#include <linux/power_supply.h>
|
||
|
|
||
|
#include <linux/usb/otg.h>
|
||
|
#include "power.h"
|
||
|
|
||
|
#define DWC3_IDEV_CHG_MAX 1500
|
||
|
|
||
|
struct dwc3_charger;
|
||
|
|
||
|
/**
|
||
|
* struct dwc3_otg: OTG driver data. Shared by HCD and DCD.
|
||
|
* @otg: USB OTG Transceiver structure.
|
||
|
* @irq: IRQ number assigned for HSUSB controller.
|
||
|
* @regs: ioremapped register base address.
|
||
|
* @sm_work: OTG state machine work.
|
||
|
* @charger: DWC3 external charger detector
|
||
|
* @inputs: OTG state machine inputs
|
||
|
*/
|
||
|
struct dwc3_otg {
|
||
|
struct usb_otg otg;
|
||
|
int irq;
|
||
|
struct dwc3 *dwc;
|
||
|
void __iomem *regs;
|
||
|
struct regulator *vbus_otg;
|
||
|
struct work_struct sm_work;
|
||
|
struct dwc3_charger *charger;
|
||
|
struct dwc3_ext_xceiv *ext_xceiv;
|
||
|
#define ID 0
|
||
|
#define B_SESS_VLD 1
|
||
|
unsigned long inputs;
|
||
|
struct power_supply *psy;
|
||
|
struct completion dwc3_xcvr_vbus_init;
|
||
|
int host_bus_suspend;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* USB charger types
|
||
|
*
|
||
|
* DWC3_INVALID_CHARGER Invalid USB charger.
|
||
|
* DWC3_SDP_CHARGER Standard downstream port. Refers to a downstream port
|
||
|
* on USB compliant host/hub.
|
||
|
* DWC3_DCP_CHARGER Dedicated charger port (AC charger/ Wall charger).
|
||
|
* DWC3_CDP_CHARGER Charging downstream port. Enumeration can happen and
|
||
|
* IDEV_CHG_MAX can be drawn irrespective of USB state.
|
||
|
* DWC3_PROPRIETARY_CHARGER A proprietary charger pull DP and DM to specific
|
||
|
* voltages between 2.0-3.3v for identification.
|
||
|
*/
|
||
|
enum dwc3_chg_type {
|
||
|
DWC3_INVALID_CHARGER = 0,
|
||
|
DWC3_SDP_CHARGER,
|
||
|
DWC3_DCP_CHARGER,
|
||
|
DWC3_CDP_CHARGER,
|
||
|
DWC3_PROPRIETARY_CHARGER,
|
||
|
};
|
||
|
|
||
|
struct dwc3_charger {
|
||
|
enum dwc3_chg_type chg_type;
|
||
|
unsigned max_power;
|
||
|
bool charging_disabled;
|
||
|
|
||
|
bool skip_chg_detect;
|
||
|
|
||
|
/* start/stop charger detection, provided by external charger module */
|
||
|
void (*start_detection)(struct dwc3_charger *charger, bool start);
|
||
|
|
||
|
/* to notify OTG about charger detection completion, provided by OTG */
|
||
|
void (*notify_detection_complete)(struct usb_otg *otg,
|
||
|
struct dwc3_charger *charger);
|
||
|
};
|
||
|
|
||
|
/* for external charger driver */
|
||
|
extern int dwc3_set_charger(struct usb_otg *otg, struct dwc3_charger *charger);
|
||
|
|
||
|
enum dwc3_ext_events {
|
||
|
DWC3_EVENT_NONE = 0, /* no change event */
|
||
|
DWC3_EVENT_PHY_RESUME, /* PHY has come out of LPM */
|
||
|
DWC3_EVENT_XCEIV_STATE, /* XCEIV state (id/bsv) has changed */
|
||
|
};
|
||
|
|
||
|
enum dwc3_id_state {
|
||
|
DWC3_ID_GROUND = 0,
|
||
|
DWC3_ID_FLOAT,
|
||
|
};
|
||
|
|
||
|
/* external transceiver that can perform connect/disconnect monitoring in LPM */
|
||
|
struct dwc3_ext_xceiv {
|
||
|
enum dwc3_id_state id;
|
||
|
bool bsv;
|
||
|
bool otg_capability;
|
||
|
|
||
|
/* to notify OTG about LPM exit event, provided by OTG */
|
||
|
void (*notify_ext_events)(struct usb_otg *otg,
|
||
|
enum dwc3_ext_events ext_event);
|
||
|
/* for block reset USB core */
|
||
|
void (*ext_block_reset)(bool core_reset);
|
||
|
};
|
||
|
|
||
|
/* for external transceiver driver */
|
||
|
extern int dwc3_set_ext_xceiv(struct usb_otg *otg,
|
||
|
struct dwc3_ext_xceiv *ext_xceiv);
|
||
|
|
||
|
#endif /* __LINUX_USB_DWC3_OTG_H */
|