blob: 0dc87fe8b4d9b78eb1d616b74d0bea17f3379ce6 [file] [log] [blame]
/*
* Platform data for the chipidea USB dual role controller
*/
#ifndef __LINUX_USB_CHIPIDEA_H
#define __LINUX_USB_CHIPIDEA_H
#include <linux/platform_device.h>
enum ci_udc_operating_modes {
CI_UDC_DR_HOST = 0,
CI_UDC_DR_DEVICE,
CI_UDC_DR_OTG,
/*
* "static OTG": driver modules for host/device
* can be changed after linux boot
*/
CI_UDC_DR_DUAL_HOST, // dual_mode booting in host
CI_UDC_DR_DUAL_DEVICE,// dual_mode booting in device
CI_UDC_DR_DISABLE_HOST_WORKAROUND = 0x100, // Will do a reset if 10 "null" transfer are detected
};
struct ci13xxx;
struct ci13xxx_udc_driver {
const char *name;
/* offset of the capability registers */
uintptr_t capoffset;
unsigned power_budget;
unsigned long flags;
#define CI13XXX_REGS_SHARED BIT(0)
#define CI13XXX_REQUIRE_TRANSCEIVER BIT(1)
#define CI13XXX_PULLUP_ON_VBUS BIT(2)
#define CI13XXX_DISABLE_STREAMING BIT(3)
#define CI13XXX_CONTROLLER_RESET_EVENT 0
#define CI13XXX_CONTROLLER_STOPPED_EVENT 1
enum ci_udc_operating_modes operating_mode;
u8 workaround_reset_nb;
void (*notify_event) (struct ci13xxx *udc, unsigned event);
int (*init)(struct platform_device *, int (*ulpi_write)(struct platform_device *pdev, u8 addr, u8 val));
void (*exit)(struct platform_device *);
void (*set_vbus)(struct platform_device *, int value);
};
/* Default offset of capability registers */
#define DEF_CAPOFFSET 0x100
#endif