/* SPDX-License-Identifier: GPL-2.0 */ /* * usb notify header * * Copyright (C) 2011-2022 Samsung, Inc. * Author: Dongrak Shin * */ /* usb notify layer v3.7 */ #ifndef __LINUX_USB_NOTIFY_H__ #define __LINUX_USB_NOTIFY_H__ #include #include #include #include #if defined(CONFIG_USB_HW_PARAM) #include #endif #include enum otg_notify_events { NOTIFY_EVENT_NONE, NOTIFY_EVENT_VBUS, NOTIFY_EVENT_HOST, NOTIFY_EVENT_CHARGER, NOTIFY_EVENT_SMARTDOCK_TA, NOTIFY_EVENT_SMARTDOCK_USB, NOTIFY_EVENT_AUDIODOCK, NOTIFY_EVENT_LANHUB, NOTIFY_EVENT_LANHUB_TA, NOTIFY_EVENT_MMDOCK, NOTIFY_EVENT_HMT, NOTIFY_EVENT_GAMEPAD, NOTIFY_EVENT_POGO, NOTIFY_EVENT_HOST_RELOAD, NOTIFY_EVENT_DRIVE_VBUS, NOTIFY_EVENT_ALL_DISABLE, NOTIFY_EVENT_HOST_DISABLE, NOTIFY_EVENT_CLIENT_DISABLE, NOTIFY_EVENT_MDM_ON_OFF, NOTIFY_EVENT_OVERCURRENT, NOTIFY_EVENT_SMSC_OVC, NOTIFY_EVENT_SMTD_EXT_CURRENT, NOTIFY_EVENT_MMD_EXT_CURRENT, NOTIFY_EVENT_HMD_EXT_CURRENT, NOTIFY_EVENT_DEVICE_CONNECT, NOTIFY_EVENT_GAMEPAD_CONNECT, NOTIFY_EVENT_LANHUB_CONNECT, NOTIFY_EVENT_POWER_SOURCE, NOTIFY_EVENT_PD_CONTRACT, NOTIFY_EVENT_VBUS_RESET, NOTIFY_EVENT_RESERVE_BOOSTER, NOTIFY_EVENT_USB_CABLE, NOTIFY_EVENT_USBD_SUSPENDED, NOTIFY_EVENT_USBD_UNCONFIGURED, NOTIFY_EVENT_USBD_CONFIGURED, NOTIFY_EVENT_VBUSPOWER, NOTIFY_EVENT_DR_SWAP, NOTIFY_EVENT_VIRTUAL, }; #define VIRT_EVENT(a) (a+NOTIFY_EVENT_VIRTUAL) #define PHY_EVENT(a) (a%NOTIFY_EVENT_VIRTUAL) #define IS_VIRTUAL(a) (a >= NOTIFY_EVENT_VIRTUAL ? 1 : 0) enum otg_notify_event_status { NOTIFY_EVENT_DISABLED, NOTIFY_EVENT_DISABLING, NOTIFY_EVENT_ENABLED, NOTIFY_EVENT_ENABLING, NOTIFY_EVENT_BLOCKED, NOTIFY_EVENT_BLOCKING, }; enum otg_notify_evt_type { NOTIFY_EVENT_EXTRA = (1 << 0), NOTIFY_EVENT_STATE = (1 << 1), NOTIFY_EVENT_DELAY = (1 << 2), NOTIFY_EVENT_NEED_VBUSDRIVE = (1 << 3), NOTIFY_EVENT_NOBLOCKING = (1 << 4), NOTIFY_EVENT_NOSAVE = (1 << 5), NOTIFY_EVENT_NEED_HOST = (1 << 6), NOTIFY_EVENT_NEED_CLIENT = (1 << 7), }; enum otg_notify_block_type { NOTIFY_BLOCK_TYPE_NONE = 0, NOTIFY_BLOCK_TYPE_HOST = (1 << 0), NOTIFY_BLOCK_TYPE_CLIENT = (1 << 1), NOTIFY_BLOCK_TYPE_ALL = (1 << 0 | 1 << 1), }; enum otg_notify_mdm_type { NOTIFY_MDM_TYPE_OFF, NOTIFY_MDM_TYPE_ON, }; enum otg_notify_gpio { NOTIFY_VBUS, NOTIFY_REDRIVER, }; enum otg_op_pos { NOTIFY_OP_OFF, NOTIFY_OP_POST, NOTIFY_OP_PRE, }; enum ovc_check_value { HNOTIFY_LOW, HNOTIFY_HIGH, HNOTIFY_INITIAL, }; enum otg_notify_power_role { HNOTIFY_SINK, HNOTIFY_SOURCE, }; enum otg_notify_data_role { HNOTIFY_UFP, HNOTIFY_DFP, }; enum usb_certi_type { USB_CERTI_UNSUPPORT_ACCESSORY, USB_CERTI_NO_RESPONSE, USB_CERTI_HUB_DEPTH_EXCEED, USB_CERTI_HUB_POWER_EXCEED, USB_CERTI_HOST_RESOURCE_EXCEED, USB_CERTI_WARM_RESET, }; enum usb_err_type { USB_ERR_ABNORMAL_RESET, }; enum usb_itracker_type { NOTIFY_USB_CC_REPEAT, }; enum usb_current_state { NOTIFY_USB_UNCONFIGURED, NOTIFY_USB_SUSPENDED, NOTIFY_USB_CONFIGURED, }; enum usb_request_action_type { USB_REQUEST_NOTHING, USB_REQUEST_DUMPSTATE, }; struct otg_notify { int vbus_detect_gpio; int redriver_en_gpio; int is_wakelock; int is_host_wakelock; /*unused field*/ int unsupport_host; int smsc_ovc_poll_sec; int auto_drive_vbus; int booting_delay_sec; int disable_control; int device_check_sec; int pre_peri_delay_us; int booting_delay_sync_usb; int (*pre_gpio)(int gpio, int use); int (*post_gpio)(int gpio, int use); int (*vbus_drive)(bool enable); int (*set_host)(bool enable); int (*set_peripheral)(bool enable); int (*set_charger)(bool enable); int (*post_vbus_detect)(bool on); int (*set_lanhubta)(int enable); int (*set_battcall)(int event, int enable); int (*set_chg_current)(int state); void (*set_ldo_onoff)(void *data, unsigned int onoff); int (*get_gadget_speed)(void); int (*is_skip_list)(int index); int (*usb_maximum_speed)(int speed); void *o_data; void *u_notify; }; struct otg_booster { char *name; int (*booster)(bool enable); }; #if IS_ENABLED(CONFIG_USB_NOTIFY_LAYER) extern const char *event_string(enum otg_notify_events event); extern const char *status_string(enum otg_notify_event_status status); extern void send_usb_mdm_uevent(void); extern void send_usb_certi_uevent(int usb_certi); extern void send_usb_err_uevent(int usb_certi, int mode); extern void send_usb_itracker_uevent(int err_type); extern int usb_check_whitelist_for_mdm(struct usb_device *dev); extern int usb_otg_restart_accessory(struct usb_device *dev); extern void send_otg_notify(struct otg_notify *n, unsigned long event, int enable); extern int get_typec_status(struct otg_notify *n, int event); extern struct otg_booster *find_get_booster(struct otg_notify *n); extern int register_booster(struct otg_notify *n, struct otg_booster *b); extern int register_ovc_func(struct otg_notify *n, int (*check_state)(void *), void *data); extern int get_booster(struct otg_notify *n); extern int get_usb_mode(struct otg_notify *n); extern unsigned long get_cable_type(struct otg_notify *n); extern int is_usb_host(struct otg_notify *n); extern bool is_blocked(struct otg_notify *n, int type); extern bool is_snkdfp_usb_device_connected(struct otg_notify *n); extern int get_con_dev_max_speed(struct otg_notify *n); extern void set_con_dev_max_speed (struct otg_notify *n, int speed); extern void set_request_action(struct otg_notify *n, unsigned int request_action); extern int is_known_usbaudio(struct usb_device *dev); extern void set_usb_audio_cardnum(int card_num, int bundle, int attach); extern void send_usb_audio_uevent(struct usb_device *dev, int cardnum, int attach); extern int send_usb_notify_uevent (struct otg_notify *n, char *envp_ext[]); #if defined(CONFIG_USB_HW_PARAM) extern unsigned long long *get_hw_param(struct otg_notify *n, enum usb_hw_param index); extern int inc_hw_param(struct otg_notify *n, enum usb_hw_param index); extern int inc_hw_param_host(struct host_notify_dev *dev, enum usb_hw_param index); extern int register_hw_param_manager(struct otg_notify *n, unsigned long (*fptr)(int)); #endif extern void *get_notify_data(struct otg_notify *n); extern void set_notify_data(struct otg_notify *n, void *data); extern struct otg_notify *get_otg_notify(void); extern void enable_usb_notify(void); extern int set_otg_notify(struct otg_notify *n); extern void put_otg_notify(struct otg_notify *n); #else static inline const char *event_string(enum otg_notify_events event) {return NULL; } static inline const char *status_string(enum otg_notify_event_status status) {return NULL; } static inline void send_usb_mdm_uevent(void) {} static inline void send_usb_certi_uevent(int usb_certi) {} static inline void send_usb_err_uevent(int usb_certi, int mode) {} static inline void send_usb_itracker_uevent(int err_type) {} static inline int usb_check_whitelist_for_mdm(struct usb_device *dev) {return 0; } static inline int usb_otg_restart_accessory(struct usb_device *dev) {return 0; } static inline void send_otg_notify(struct otg_notify *n, unsigned long event, int enable) { } static inline int get_typec_status(struct otg_notify *n, int event) {return 0; } static inline struct otg_booster *find_get_booster(struct otg_notify *n) {return NULL; } static inline int register_booster(struct otg_notify *n, struct otg_booster *b) {return 0; } static inline int register_ovc_func(struct otg_notify *n, int (*check_state)(void *), void *data) {return 0; } static inline int get_booster(struct otg_notify *n) {return 0; } static inline int get_usb_mode(struct otg_notify *n) {return 0; } static inline unsigned long get_cable_type(struct otg_notify *n) {return 0; } static inline int is_usb_host(struct otg_notify *n) {return 0; } static inline bool is_blocked(struct otg_notify *n, int type) {return false; } static inline bool is_snkdfp_usb_device_connected(struct otg_notify *n) {return false; } static inline int get_con_dev_max_speed(struct otg_notify *n) {return 0; } static inline void set_con_dev_max_speed (struct otg_notify *n, int speed) {} static inline void set_request_action (struct otg_notify *n, unsigned int request_action) {} static inline int is_known_usbaudio(struct usb_device *dev) {return 0; } static inline void set_usb_audio_cardnum(int card_num, int bundle, int attach) {} static inline void send_usb_audio_uevent(struct usb_device *dev, int cardnum, int attach) {} static inline int send_usb_notify_uevent (struct otg_notify *n, char *envp_ext[]) {return 0; } #if defined(CONFIG_USB_HW_PARAM) static inline unsigned long long *get_hw_param(struct otg_notify *n, enum usb_hw_param index) {return NULL; } static inline int inc_hw_param(struct otg_notify *n, enum usb_hw_param index) {return 0; } static inline int inc_hw_param_host(struct host_notify_dev *dev, enum usb_hw_param index) {return 0; } static inline int register_hw_param_manager(struct otg_notify *n, unsigned long (*fptr)(int)) {return 0; } #endif static inline void *get_notify_data(struct otg_notify *n) {return NULL; } static inline void set_notify_data(struct otg_notify *n, void *data) {} static inline struct otg_notify *get_otg_notify(void) {return NULL; } static inline void enable_usb_notify(void) {} static inline int set_otg_notify(struct otg_notify *n) {return 0; } static inline void put_otg_notify(struct otg_notify *n) {} #endif #endif /* __LINUX_USB_NOTIFY_H__ */