Loading drivers/platform/msm/usb_bam.c +117 −115 Original line number Diff line number Diff line Loading @@ -102,46 +102,46 @@ struct usb_bam_ctx_type { }; static char *bam_enable_strings[MAX_BAMS] = { [SSUSB_BAM] = "ssusb", [HSUSB_BAM] = "hsusb", [HSIC_BAM] = "hsic", [DWC3_CTRL] = "ssusb", [CI_CTRL] = "hsusb", [HSIC_CTRL] = "hsic", }; struct ipa_rm_bam { enum usb_bam bam; enum usb_ctrl bam; char *str; bool initialized; }; static struct ipa_rm_bam ipa_rm_bams[] = { { .bam = SSUSB_BAM, .bam = DWC3_CTRL, .initialized = false }, { .bam = HSUSB_BAM, .bam = CI_CTRL, .initialized = false }, { .bam = HSIC_BAM, .bam = HSIC_CTRL, .initialized = false } }; /* * HSUSB_BAM & SSUSB_BAM shouldn't be used simultaneously * CI_CTRL & DWC3_CTRL shouldn't be used simultaneously * since both share the same prod & cons rm resourses */ static enum ipa_client_type ipa_rm_resource_prod[MAX_BAMS] = { [HSUSB_BAM] = IPA_RM_RESOURCE_USB_PROD, [HSIC_BAM] = IPA_RM_RESOURCE_HSIC_PROD, [SSUSB_BAM] = IPA_RM_RESOURCE_USB_PROD, [CI_CTRL] = IPA_RM_RESOURCE_USB_PROD, [HSIC_CTRL] = IPA_RM_RESOURCE_HSIC_PROD, [DWC3_CTRL] = IPA_RM_RESOURCE_USB_PROD, }; static enum ipa_client_type ipa_rm_resource_cons[MAX_BAMS] = { [HSUSB_BAM] = IPA_RM_RESOURCE_USB_CONS, [HSIC_BAM] = IPA_RM_RESOURCE_HSIC_CONS, [SSUSB_BAM] = IPA_RM_RESOURCE_USB_CONS, [CI_CTRL] = IPA_RM_RESOURCE_USB_CONS, [HSIC_CTRL] = IPA_RM_RESOURCE_HSIC_CONS, [DWC3_CTRL] = IPA_RM_RESOURCE_USB_CONS, }; static int usb_cons_request_resource(void); Loading @@ -153,15 +153,15 @@ static int hsic_cons_release_resource(void); static int (*request_resource_cb[MAX_BAMS])(void) = { [HSUSB_BAM] = usb_cons_request_resource, [HSIC_BAM] = hsic_cons_request_resource, [SSUSB_BAM] = ss_usb_cons_request_resource, [CI_CTRL] = usb_cons_request_resource, [HSIC_CTRL] = hsic_cons_request_resource, [DWC3_CTRL] = ss_usb_cons_request_resource, }; static int (*release_resource_cb[MAX_BAMS])(void) = { [HSUSB_BAM] = usb_cons_release_resource, [HSIC_BAM] = hsic_cons_release_resource, [SSUSB_BAM] = ss_usb_cons_release_resource, [CI_CTRL] = usb_cons_release_resource, [HSIC_CTRL] = hsic_cons_release_resource, [DWC3_CTRL] = ss_usb_cons_release_resource, }; struct usb_bam_ipa_handshake_info { Loading @@ -169,7 +169,7 @@ struct usb_bam_ipa_handshake_info { enum ipa_rm_event cur_cons_state; enum usb_bam_mode cur_bam_mode; enum usb_bam bam_type; enum usb_ctrl bam_type; bool lpm_wait_handshake; int connect_complete; bool lpm_wait_pipes; Loading Loading @@ -218,26 +218,26 @@ static bool probe_finished; static int __usb_bam_register_wake_cb(int idx, int (*callback)(void *user), void *param, bool trigger_cb_per_pipe); static void wait_for_prod_release(enum usb_bam cur_bam); static void wait_for_prod_release(enum usb_ctrl cur_bam); void msm_bam_set_hsic_host_dev(struct device *dev) { if (dev) { /* Hold the device until allowing lpm */ info[HSIC_BAM].in_lpm = false; info[HSIC_CTRL].in_lpm = false; pr_debug("%s: Getting hsic device %x\n", __func__, (int)dev); pm_runtime_get(dev); } else if (host_info[HSIC_BAM].dev) { } else if (host_info[HSIC_CTRL].dev) { pr_debug("%s: Putting hsic device %x\n", __func__, (int)host_info[HSIC_BAM].dev); (int)host_info[HSIC_CTRL].dev); /* Just free previous device*/ info[HSIC_BAM].in_lpm = true; pm_runtime_put(host_info[HSIC_BAM].dev); info[HSIC_CTRL].in_lpm = true; pm_runtime_put(host_info[HSIC_CTRL].dev); } host_info[HSIC_BAM].dev = dev; host_info[HSIC_BAM].in_lpm = false; host_info[HSIC_CTRL].dev = dev; host_info[HSIC_CTRL].in_lpm = false; } void msm_bam_set_usb_dev(struct device *dev) Loading @@ -248,29 +248,29 @@ void msm_bam_set_usb_dev(struct device *dev) void msm_bam_set_usb_host_dev(struct device *dev) { host_info[HSUSB_BAM].dev = dev; host_info[HSUSB_BAM].in_lpm = false; host_info[CI_CTRL].dev = dev; host_info[CI_CTRL].in_lpm = false; } static int get_bam_type_from_core_name(const char *name) { if (strnstr(name, bam_enable_strings[SSUSB_BAM], if (strnstr(name, bam_enable_strings[DWC3_CTRL], USB_BAM_MAX_STR_LEN) || strnstr(name, "dwc3", USB_BAM_MAX_STR_LEN)) return SSUSB_BAM; else if (strnstr(name, bam_enable_strings[HSIC_BAM], return DWC3_CTRL; else if (strnstr(name, bam_enable_strings[HSIC_CTRL], USB_BAM_MAX_STR_LEN)) return HSIC_BAM; else if (strnstr(name, bam_enable_strings[HSUSB_BAM], return HSIC_CTRL; else if (strnstr(name, bam_enable_strings[CI_CTRL], USB_BAM_MAX_STR_LEN) || strnstr(name, "ci", USB_BAM_MAX_STR_LEN)) return HSUSB_BAM; return CI_CTRL; pr_err("%s: invalid BAM name(%s)\n", __func__, name); return -EINVAL; } static bool bam_use_private_mem(enum usb_bam bam) static bool bam_use_private_mem(enum usb_ctrl bam) { int i; Loading @@ -282,7 +282,7 @@ static bool bam_use_private_mem(enum usb_bam bam) return false; } static void usb_bam_set_inactivity_timer(enum usb_bam bam) static void usb_bam_set_inactivity_timer(enum usb_ctrl bam) { struct sps_timer_ctrl timer_ctrl; struct usb_bam_pipe_connect *pipe_connect; Loading Loading @@ -323,7 +323,7 @@ static void usb_bam_set_inactivity_timer(enum usb_bam bam) static int connect_pipe(u8 idx, u32 *usb_pipe_idx) { int ret, ram1_value; enum usb_bam bam; enum usb_ctrl bam; struct usb_bam_sps_type usb_bam_sps = ctx.usb_bam_sps; struct sps_pipe **pipe = &(usb_bam_sps.sps_pipes[idx]); struct sps_connect *sps_connection = &usb_bam_sps.sps_connections[idx]; Loading Loading @@ -411,7 +411,7 @@ static int connect_pipe(u8 idx, u32 *usb_pipe_idx) */ bam = pipe_connect->bam_type; if (bam == HSUSB_BAM) if (bam == CI_CTRL) ram1_value = 0x4; else ram1_value = 0x7; Loading Loading @@ -771,11 +771,11 @@ static bool _hsic_host_bam_resume_core(void) pr_debug("%s: enter\n", __func__); /* Exit from "full suspend" in case of hsic host */ if (host_info[HSIC_BAM].dev && info[HSIC_BAM].in_lpm) { if (host_info[HSIC_CTRL].dev && info[HSIC_CTRL].in_lpm) { pr_debug("%s: Getting hsic device %x\n", __func__, (int)host_info[HSIC_BAM].dev); pm_runtime_get(host_info[HSIC_BAM].dev); info[HSIC_BAM].in_lpm = false; (int)host_info[HSIC_CTRL].dev); pm_runtime_get(host_info[HSIC_CTRL].dev); info[HSIC_CTRL].in_lpm = false; return true; } return false; Loading @@ -789,7 +789,7 @@ static bool _hsic_device_bam_resume_core(void) return false; } static void _usb_bam_suspend_core(enum usb_bam bam_type, bool disconnect) static void _usb_bam_suspend_core(enum usb_ctrl bam_type, bool disconnect) { pr_debug("%s: enter bam=%s\n", __func__, bam_enable_strings[bam_type]); Loading Loading @@ -824,27 +824,27 @@ static void _hsic_host_bam_suspend_core(void) { pr_debug("%s: enter\n", __func__); if (host_info[HSIC_BAM].dev && !info[HSIC_BAM].in_lpm) { if (host_info[HSIC_CTRL].dev && !info[HSIC_CTRL].in_lpm) { pr_debug("%s: Putting hsic host device %x\n", __func__, (int)host_info[HSIC_BAM].dev); pm_runtime_put(host_info[HSIC_BAM].dev); info[HSIC_BAM].in_lpm = true; (int)host_info[HSIC_CTRL].dev); pm_runtime_put(host_info[HSIC_CTRL].dev); info[HSIC_CTRL].in_lpm = true; } } static void usb_bam_suspend_core(enum usb_bam bam_type, static void usb_bam_suspend_core(enum usb_ctrl bam_type, enum usb_bam_mode bam_mode, bool disconnect) { pr_debug("%s: enter bam=%s\n", __func__, bam_enable_strings[bam_type]); switch (bam_type) { case HSUSB_BAM: /* TODO: This needs the correct handling for SSUSB_BAM */ case SSUSB_BAM: case CI_CTRL: /* TODO: This needs the correct handling for DWC3_CTRL */ case DWC3_CTRL: _usb_bam_suspend_core(bam_type, disconnect); break; case HSIC_BAM: case HSIC_CTRL: if (bam_mode == USB_BAM_DEVICE) _hsic_device_bam_suspend_core(); else /* USB_BAM_HOST */ Loading @@ -856,18 +856,18 @@ static void usb_bam_suspend_core(enum usb_bam bam_type, } } static bool usb_bam_resume_core(enum usb_bam bam_type, static bool usb_bam_resume_core(enum usb_ctrl bam_type, enum usb_bam_mode bam_mode) { pr_debug("%s: enter bam=%s\n", __func__, bam_enable_strings[bam_type]); switch (bam_type) { case HSUSB_BAM: /* TODO: This needs the correct handling for SSUSB_BAM */ case SSUSB_BAM: case CI_CTRL: /* TODO: This needs the correct handling for DWC3_CTRL */ case DWC3_CTRL: return _usb_bam_resume_core(); break; case HSIC_BAM: case HSIC_CTRL: if (bam_mode == USB_BAM_DEVICE) return _hsic_device_bam_resume_core(); else /* USB_BAM_HOST */ Loading @@ -881,7 +881,7 @@ static bool usb_bam_resume_core(enum usb_bam bam_type, static int usb_bam_disconnect_ipa_prod( struct usb_bam_connect_ipa_params *ipa_params, enum usb_bam cur_bam, enum usb_bam_mode bam_mode) enum usb_ctrl cur_bam, enum usb_bam_mode bam_mode) { int ret; u8 idx = 0; Loading Loading @@ -953,7 +953,7 @@ static int usb_bam_disconnect_ipa_prod( static int usb_bam_disconnect_ipa_cons( struct usb_bam_connect_ipa_params *ipa_params, enum usb_bam cur_bam) enum usb_ctrl cur_bam) { int ret; u8 idx = 0; Loading Loading @@ -1031,11 +1031,11 @@ int usb_bam_connect(int idx, u32 *bam_pipe_idx) int ret; struct usb_bam_pipe_connect *pipe_connect = &usb_bam_connections[idx]; struct msm_usb_bam_platform_data *pdata; enum usb_bam cur_bam; enum usb_ctrl cur_bam; enum usb_bam_mode cur_mode; if (!ctx.usb_bam_pdev) { pr_err("%s: usb_bam device not found\n", __func__); pr_err("%s: usb_ctrl device not found\n", __func__); return -ENODEV; } Loading Loading @@ -1181,7 +1181,7 @@ static void stop_cons_transfers(struct usb_bam_pipe_connect *pipe_connect) } } static void resume_suspended_pipes(enum usb_bam cur_bam) static void resume_suspended_pipes(enum usb_ctrl cur_bam) { u32 idx, dst_idx; struct usb_bam_pipe_connect *pipe_connect; Loading @@ -1204,7 +1204,7 @@ static void resume_suspended_pipes(enum usb_bam cur_bam) } } static inline int all_pipes_suspended(enum usb_bam cur_bam) static inline int all_pipes_suspended(enum usb_ctrl cur_bam) { pr_debug("%s: pipes_suspended=%d pipes_enabled_per_bam=%d", __func__, info[cur_bam].pipes_suspended, Loading @@ -1214,7 +1214,7 @@ static inline int all_pipes_suspended(enum usb_bam cur_bam) ctx.pipes_enabled_per_bam[cur_bam]); } static void usb_bam_finish_suspend(enum usb_bam cur_bam) static void usb_bam_finish_suspend(enum usb_ctrl cur_bam) { int ret; u32 cons_empty, idx, dst_idx; Loading Loading @@ -1319,7 +1319,7 @@ no_lpm: void usb_bam_finish_suspend_(struct work_struct *w) { enum usb_bam cur_bam; enum usb_ctrl cur_bam; struct usb_bam_ipa_handshake_info *info_ptr; info_ptr = container_of(w, struct usb_bam_ipa_handshake_info, Loading @@ -1334,7 +1334,7 @@ void usb_bam_finish_suspend_(struct work_struct *w) static void usb_prod_notify_cb(void *user_data, enum ipa_rm_event event, unsigned long data) { enum usb_bam *cur_bam = (void *)user_data; enum usb_ctrl *cur_bam = (void *)user_data; switch (event) { case IPA_RM_RESOURCE_GRANTED: Loading @@ -1361,7 +1361,7 @@ static void usb_prod_notify_cb(void *user_data, enum ipa_rm_event event, * NOTE: This function should be called in a context that hold * usb_bam_lock. */ static void usb_bam_resume_host(enum usb_bam bam_type) static void usb_bam_resume_host(enum usb_ctrl bam_type) { int i; struct usb_bam_pipe_connect *pipe_iter; Loading @@ -1378,7 +1378,7 @@ static void usb_bam_resume_host(enum usb_bam bam_type) } } static int cons_request_resource(enum usb_bam cur_bam) static int cons_request_resource(enum usb_ctrl cur_bam) { int ret = -EINPROGRESS; Loading Loading @@ -1446,21 +1446,21 @@ static int cons_request_resource(enum usb_bam cur_bam) static int ss_usb_cons_request_resource(void) { return cons_request_resource(SSUSB_BAM); return cons_request_resource(DWC3_CTRL); } static int usb_cons_request_resource(void) { return cons_request_resource(HSUSB_BAM); return cons_request_resource(CI_CTRL); } static int hsic_cons_request_resource(void) { return cons_request_resource(HSIC_BAM); return cons_request_resource(HSIC_CTRL); } static int cons_release_resource(enum usb_bam cur_bam) static int cons_release_resource(enum usb_ctrl cur_bam) { pr_debug("%s: Release %s_CONS resource\n", __func__, bam_enable_strings[cur_bam]); Loading Loading @@ -1499,24 +1499,24 @@ static int cons_release_resource(enum usb_bam cur_bam) static int hsic_cons_release_resource(void) { return cons_release_resource(HSIC_BAM); return cons_release_resource(HSIC_CTRL); } static int usb_cons_release_resource(void) { return cons_release_resource(HSUSB_BAM); return cons_release_resource(CI_CTRL); } static int ss_usb_cons_release_resource(void) { return cons_release_resource(SSUSB_BAM); return cons_release_resource(DWC3_CTRL); } static void usb_bam_ipa_create_resources(void) { struct ipa_rm_create_params usb_prod_create_params; struct ipa_rm_create_params usb_cons_create_params; enum usb_bam cur_bam; enum usb_ctrl cur_bam; int ret, i; for (i = 0; i < ARRAY_SIZE(ipa_rm_bams); i++) { Loading Loading @@ -1560,7 +1560,7 @@ static void usb_bam_ipa_create_resources(void) } } static void wait_for_prod_granted(enum usb_bam cur_bam) static void wait_for_prod_granted(enum usb_ctrl cur_bam) { int ret; Loading Loading @@ -1590,7 +1590,7 @@ static void wait_for_prod_granted(enum usb_bam cur_bam) pr_err("%s: ipa_rm_request_resource ret =%d\n", __func__, ret); } void notify_usb_connected(enum usb_bam cur_bam) void notify_usb_connected(enum usb_ctrl cur_bam) { pr_debug("%s: enter\n", __func__); Loading @@ -1607,7 +1607,7 @@ void notify_usb_connected(enum usb_bam cur_bam) } } static void wait_for_prod_release(enum usb_bam cur_bam) static void wait_for_prod_release(enum usb_ctrl cur_bam) { int ret; Loading Loading @@ -1683,7 +1683,7 @@ static bool check_pipes_empty(u8 src_idx, u8 dst_idx) void usb_bam_suspend(struct usb_bam_connect_ipa_params *ipa_params) { struct usb_bam_pipe_connect *pipe_connect; enum usb_bam cur_bam; enum usb_ctrl cur_bam; enum usb_bam_mode bam_mode; u8 src_idx, dst_idx; Loading Loading @@ -1736,7 +1736,7 @@ static void usb_bam_start_suspend(struct work_struct *w) { struct usb_bam_pipe_connect *pipe_connect; struct usb_bam_ipa_handshake_info *info_ptr; enum usb_bam cur_bam; enum usb_ctrl cur_bam; u8 src_idx, dst_idx; int pipes_to_suspend; Loading Loading @@ -1803,7 +1803,7 @@ static void usb_bam_start_suspend(struct work_struct *w) static void usb_bam_finish_resume(struct work_struct *w) { /* TODO: Change this when HSIC device support is introduced */ enum usb_bam cur_bam; enum usb_ctrl cur_bam; struct usb_bam_ipa_handshake_info *info_ptr; struct usb_bam_pipe_connect *pipe_connect; u32 idx, dst_idx, suspended; Loading Loading @@ -1881,7 +1881,7 @@ static void usb_bam_finish_resume(struct work_struct *w) void usb_bam_resume(struct usb_bam_connect_ipa_params *ipa_params) { enum usb_bam cur_bam; enum usb_ctrl cur_bam; u8 src_idx, dst_idx; struct usb_bam_pipe_connect *pipe_connect; Loading Loading @@ -1915,7 +1915,7 @@ void usb_bam_resume(struct usb_bam_connect_ipa_params *ipa_params) queue_work(ctx.usb_bam_wq, &info[cur_bam].resume_work); } void _msm_bam_wait_for_host_prod_granted(enum usb_bam bam_type) void _msm_bam_wait_for_host_prod_granted(enum usb_ctrl bam_type) { spin_lock(&usb_bam_lock); Loading @@ -1935,10 +1935,10 @@ void _msm_bam_wait_for_host_prod_granted(enum usb_bam bam_type) void msm_bam_wait_for_hsic_host_prod_granted(void) { pr_debug("%s: start\n", __func__); _msm_bam_wait_for_host_prod_granted(HSIC_BAM); _msm_bam_wait_for_host_prod_granted(HSIC_CTRL); } void _msm_bam_host_notify_on_resume(enum usb_bam bam_type) void _msm_bam_host_notify_on_resume(enum usb_ctrl bam_type) { spin_lock(&usb_bam_lock); pr_debug("%s: enter bam=%s\n", __func__, bam_enable_strings[bam_type]); Loading @@ -1960,7 +1960,7 @@ void _msm_bam_host_notify_on_resume(enum usb_bam bam_type) spin_unlock(&usb_bam_lock); } bool msm_bam_host_lpm_ok(enum usb_bam bam_type) bool msm_bam_host_lpm_ok(enum usb_ctrl bam_type) { int i; struct usb_bam_pipe_connect *pipe_iter; Loading Loading @@ -2029,13 +2029,13 @@ bool msm_bam_host_lpm_ok(enum usb_bam bam_type) void msm_bam_hsic_host_notify_on_resume(void) { _msm_bam_host_notify_on_resume(HSIC_BAM); _msm_bam_host_notify_on_resume(HSIC_CTRL); } int usb_bam_connect_ipa(struct usb_bam_connect_ipa_params *ipa_params) { u8 idx; enum usb_bam cur_bam; enum usb_ctrl cur_bam; enum usb_bam_mode cur_mode; struct usb_bam_pipe_connect *pipe_connect; int ret; Loading Loading @@ -2108,12 +2108,12 @@ int usb_bam_connect_ipa(struct usb_bam_connect_ipa_params *ipa_params) (ctx.pipes_enabled_per_bam[cur_bam] == 0) && bam2bam) { spin_unlock(&usb_bam_lock); if (cur_bam != HSIC_BAM) if (cur_bam != HSIC_CTRL) msm_hw_bam_disable(1); sps_device_reset(ctx.h_bam[cur_bam]); if (cur_bam != HSIC_BAM) if (cur_bam != HSIC_CTRL) msm_hw_bam_disable(0); /* On re-connect assume out from lpm for HOST BAM */ Loading Loading @@ -2361,7 +2361,7 @@ static void usb_bam_wake_cb(struct sps_event_notify *notify) container_of(event_info, struct usb_bam_pipe_connect, event); enum usb_bam bam = pipe_connect->bam_type; enum usb_ctrl bam = pipe_connect->bam_type; spin_lock(&usb_bam_lock); Loading Loading @@ -2605,7 +2605,7 @@ int usb_bam_disconnect_ipa(struct usb_bam_connect_ipa_params *ipa_params) int ret; u8 idx = 0; struct usb_bam_pipe_connect *pipe_connect; enum usb_bam cur_bam; enum usb_ctrl cur_bam; enum usb_bam_mode bam_mode; if (!ipa_params->prod_clnt_hdl && !ipa_params->cons_clnt_hdl) { Loading Loading @@ -2662,7 +2662,7 @@ int usb_bam_a2_reset(bool to_reconnect) struct usb_bam_pipe_connect *pipe_connect; int i; int ret = 0, ret_int; enum usb_bam bam = 0; enum usb_ctrl bam = 0; bool to_reset_bam = false; int reconnect_pipe_idx[ctx.max_connections]; Loading Loading @@ -2989,7 +2989,7 @@ static int usb_bam_init(int bam_type) } /* Check if USB3 pipe memory needs to be enabled */ if (bam_type == SSUSB_BAM && bam_use_private_mem(bam_type)) { if (bam_type == DWC3_CTRL && bam_use_private_mem(bam_type)) { pr_debug("%s: Enabling USB private memory for: %s\n", __func__, bam_enable_strings[bam_type]); Loading Loading @@ -3025,7 +3025,7 @@ static int usb_bam_init(int bam_type) * HSUSB and HSIC Cores don't support RESET ACK signal to BAMs * Hence, let BAM to ignore acknowledge from USB while resetting PIPE */ if (pdata->ignore_core_reset_ack && bam_type != SSUSB_BAM) if (pdata->ignore_core_reset_ack && bam_type != DWC3_CTRL) props->options = SPS_BAM_NO_EXT_P_RST; if (pdata->disable_clk_gating) Loading Loading @@ -3120,9 +3120,9 @@ static ssize_t usb_bam_store_inactivity_timer(struct device *dev, if (strnstr(buff, "help", USB_BAM_MAX_STR_LEN)) { pr_info("Usage: <bam_name> <ms>,<bam_name> <ms>,...\n"); pr_info("\tbam_name: [%s, %s, %s]\n", bam_enable_strings[SSUSB_BAM], bam_enable_strings[HSUSB_BAM], bam_enable_strings[HSIC_BAM]); bam_enable_strings[DWC3_CTRL], bam_enable_strings[CI_CTRL], bam_enable_strings[HSIC_CTRL]); pr_info("\tms: time in ms. Use 0 to disable timer\n"); return count; } Loading Loading @@ -3271,7 +3271,7 @@ EXPORT_SYMBOL(usb_bam_get_qdss_idx); bool usb_bam_get_prod_granted(u8 idx) { struct usb_bam_pipe_connect *pipe_connect = &usb_bam_connections[idx]; enum usb_bam cur_bam = pipe_connect->bam_type; enum usb_ctrl cur_bam = pipe_connect->bam_type; return (info[cur_bam].cur_prod_state == IPA_RM_RESOURCE_GRANTED); } Loading Loading @@ -3340,7 +3340,7 @@ int usb_bam_get_connection_idx(const char *core_name, enum peer_bam client, } EXPORT_SYMBOL(usb_bam_get_connection_idx); bool msm_bam_device_lpm_ok(enum usb_bam bam_type) bool msm_bam_device_lpm_ok(enum usb_ctrl bam_type) { pr_debug("%s: enter bam%s\n", __func__, bam_enable_strings[bam_type]); Loading Loading @@ -3368,14 +3368,15 @@ bool msm_bam_device_lpm_ok(enum usb_bam bam_type) } } bool msm_bam_usb_lpm_ok(void) bool msm_bam_usb_lpm_ok(enum usb_ctrl bam) { pr_debug("%s: enter mode %d\n", __func__, info[HSUSB_BAM].cur_bam_mode); pr_debug("%s: enter mode %d on %s\n", __func__, info[bam].cur_bam_mode, bam_enable_strings[bam]); if (info[HSUSB_BAM].cur_bam_mode == USB_BAM_DEVICE) return msm_bam_device_lpm_ok(HSUSB_BAM); if (info[bam].cur_bam_mode == USB_BAM_DEVICE) return msm_bam_device_lpm_ok(bam); else /* USB_BAM_HOST */ { return msm_bam_host_lpm_ok(HSUSB_BAM); return msm_bam_host_lpm_ok(bam); } } EXPORT_SYMBOL(msm_bam_usb_lpm_ok); Loading @@ -3384,22 +3385,23 @@ bool msm_bam_hsic_lpm_ok(void) { pr_debug("%s: enter\n", __func__); if (info[HSIC_BAM].cur_bam_mode == USB_BAM_DEVICE) return msm_bam_device_lpm_ok(HSIC_BAM); if (info[HSIC_CTRL].cur_bam_mode == USB_BAM_DEVICE) return msm_bam_device_lpm_ok(HSIC_CTRL); else /* USB_BAM_HOST */ { return msm_bam_host_lpm_ok(HSIC_BAM); return msm_bam_host_lpm_ok(HSIC_CTRL); } } EXPORT_SYMBOL(msm_bam_hsic_lpm_ok); /* TODO: make this for SSUSB_BAM when lpm support is in place */ void msm_bam_notify_lpm_resume() void msm_bam_notify_lpm_resume(enum usb_ctrl bam) { /* * If core was resumed from lpm, just clear the * pending indication, in case it is set. */ info[HSUSB_BAM].pending_lpm = 0; pr_debug("%s: notifying lpm resume on %s\n", __func__, bam_enable_strings[bam]); info[bam].pending_lpm = 0; } EXPORT_SYMBOL(msm_bam_notify_lpm_resume); Loading drivers/usb/phy/phy-msm-usb.c +2 −2 Original line number Diff line number Diff line Loading @@ -889,7 +889,7 @@ static int msm_otg_suspend(struct msm_otg *motg) return 0; if (motg->pdata->delay_lpm_hndshk_on_disconnect && !msm_bam_usb_lpm_ok()) !msm_bam_usb_lpm_ok(CI_CTRL)) return -EBUSY; motg->ui_enabled = 0; Loading Loading @@ -1159,7 +1159,7 @@ static int msm_otg_resume(struct msm_otg *motg) return 0; if (motg->pdata->delay_lpm_hndshk_on_disconnect) msm_bam_notify_lpm_resume(); msm_bam_notify_lpm_resume(CI_CTRL); if (motg->ui_enabled) { motg->ui_enabled = 0; Loading include/linux/usb/msm_hsusb.h +14 −4 Original line number Diff line number Diff line Loading @@ -190,6 +190,16 @@ enum usb_vdd_value { VDD_VAL_MAX, }; /** * Supported USB controllers */ enum usb_ctrl { DWC3_CTRL = 0, /* DWC3 controller */ CI_CTRL, /* ChipIdea controller */ HSIC_CTRL, /* HSIC controller */ NUM_CTRL, }; /** * struct msm_otg_platform_data - platform device data * for msm_otg driver. Loading Loading @@ -579,8 +589,8 @@ struct usb_ext_notification { void *ctxt; }; #ifdef CONFIG_USB_BAM bool msm_bam_usb_lpm_ok(void); void msm_bam_notify_lpm_resume(void); bool msm_bam_usb_lpm_ok(enum usb_ctrl ctrl); void msm_bam_notify_lpm_resume(enum usb_ctrl ctrl); void msm_bam_set_usb_host_dev(struct device *dev); void msm_bam_set_hsic_host_dev(struct device *dev); void msm_bam_set_usb_dev(struct device *dev); Loading @@ -590,8 +600,8 @@ bool msm_bam_hsic_lpm_ok(void); void msm_bam_usb_host_notify_on_resume(void); void msm_bam_hsic_host_notify_on_resume(void); #else static inline bool msm_bam_usb_lpm_ok(void) { return true; } static inline void msm_bam_notify_lpm_resume(void) {} static inline bool msm_bam_usb_lpm_ok(enum usb_ctrl ctrl) { return true; } static inline void msm_bam_notify_lpm_resume(enum usb_ctrl ctrl) {} static inline void msm_bam_set_usb_host_dev(struct device *dev) {} static inline void msm_bam_set_hsic_host_dev(struct device *dev) {} static inline void msm_bam_set_usb_dev(struct device *dev) {} Loading include/linux/usb_bam.h +3 −7 Original line number Diff line number Diff line Loading @@ -16,12 +16,8 @@ #include <linux/ipa.h> #include <linux/usb/msm_hsusb.h> enum usb_bam { SSUSB_BAM = 0, HSUSB_BAM, HSIC_BAM, MAX_BAMS, }; #define MAX_BAMS NUM_CTRL /* Bam per USB controllers */ enum usb_bam_mode { USB_BAM_DEVICE = 0, Loading Loading @@ -138,7 +134,7 @@ struct usb_bam_pipe_connect { u32 pipe_num; enum usb_pipe_mem_type mem_type; enum usb_bam_pipe_dir dir; enum usb_bam bam_type; enum usb_ctrl bam_type; enum usb_bam_mode bam_mode; enum peer_bam peer_bam; enum usb_bam_pipe_type pipe_type; Loading Loading
drivers/platform/msm/usb_bam.c +117 −115 Original line number Diff line number Diff line Loading @@ -102,46 +102,46 @@ struct usb_bam_ctx_type { }; static char *bam_enable_strings[MAX_BAMS] = { [SSUSB_BAM] = "ssusb", [HSUSB_BAM] = "hsusb", [HSIC_BAM] = "hsic", [DWC3_CTRL] = "ssusb", [CI_CTRL] = "hsusb", [HSIC_CTRL] = "hsic", }; struct ipa_rm_bam { enum usb_bam bam; enum usb_ctrl bam; char *str; bool initialized; }; static struct ipa_rm_bam ipa_rm_bams[] = { { .bam = SSUSB_BAM, .bam = DWC3_CTRL, .initialized = false }, { .bam = HSUSB_BAM, .bam = CI_CTRL, .initialized = false }, { .bam = HSIC_BAM, .bam = HSIC_CTRL, .initialized = false } }; /* * HSUSB_BAM & SSUSB_BAM shouldn't be used simultaneously * CI_CTRL & DWC3_CTRL shouldn't be used simultaneously * since both share the same prod & cons rm resourses */ static enum ipa_client_type ipa_rm_resource_prod[MAX_BAMS] = { [HSUSB_BAM] = IPA_RM_RESOURCE_USB_PROD, [HSIC_BAM] = IPA_RM_RESOURCE_HSIC_PROD, [SSUSB_BAM] = IPA_RM_RESOURCE_USB_PROD, [CI_CTRL] = IPA_RM_RESOURCE_USB_PROD, [HSIC_CTRL] = IPA_RM_RESOURCE_HSIC_PROD, [DWC3_CTRL] = IPA_RM_RESOURCE_USB_PROD, }; static enum ipa_client_type ipa_rm_resource_cons[MAX_BAMS] = { [HSUSB_BAM] = IPA_RM_RESOURCE_USB_CONS, [HSIC_BAM] = IPA_RM_RESOURCE_HSIC_CONS, [SSUSB_BAM] = IPA_RM_RESOURCE_USB_CONS, [CI_CTRL] = IPA_RM_RESOURCE_USB_CONS, [HSIC_CTRL] = IPA_RM_RESOURCE_HSIC_CONS, [DWC3_CTRL] = IPA_RM_RESOURCE_USB_CONS, }; static int usb_cons_request_resource(void); Loading @@ -153,15 +153,15 @@ static int hsic_cons_release_resource(void); static int (*request_resource_cb[MAX_BAMS])(void) = { [HSUSB_BAM] = usb_cons_request_resource, [HSIC_BAM] = hsic_cons_request_resource, [SSUSB_BAM] = ss_usb_cons_request_resource, [CI_CTRL] = usb_cons_request_resource, [HSIC_CTRL] = hsic_cons_request_resource, [DWC3_CTRL] = ss_usb_cons_request_resource, }; static int (*release_resource_cb[MAX_BAMS])(void) = { [HSUSB_BAM] = usb_cons_release_resource, [HSIC_BAM] = hsic_cons_release_resource, [SSUSB_BAM] = ss_usb_cons_release_resource, [CI_CTRL] = usb_cons_release_resource, [HSIC_CTRL] = hsic_cons_release_resource, [DWC3_CTRL] = ss_usb_cons_release_resource, }; struct usb_bam_ipa_handshake_info { Loading @@ -169,7 +169,7 @@ struct usb_bam_ipa_handshake_info { enum ipa_rm_event cur_cons_state; enum usb_bam_mode cur_bam_mode; enum usb_bam bam_type; enum usb_ctrl bam_type; bool lpm_wait_handshake; int connect_complete; bool lpm_wait_pipes; Loading Loading @@ -218,26 +218,26 @@ static bool probe_finished; static int __usb_bam_register_wake_cb(int idx, int (*callback)(void *user), void *param, bool trigger_cb_per_pipe); static void wait_for_prod_release(enum usb_bam cur_bam); static void wait_for_prod_release(enum usb_ctrl cur_bam); void msm_bam_set_hsic_host_dev(struct device *dev) { if (dev) { /* Hold the device until allowing lpm */ info[HSIC_BAM].in_lpm = false; info[HSIC_CTRL].in_lpm = false; pr_debug("%s: Getting hsic device %x\n", __func__, (int)dev); pm_runtime_get(dev); } else if (host_info[HSIC_BAM].dev) { } else if (host_info[HSIC_CTRL].dev) { pr_debug("%s: Putting hsic device %x\n", __func__, (int)host_info[HSIC_BAM].dev); (int)host_info[HSIC_CTRL].dev); /* Just free previous device*/ info[HSIC_BAM].in_lpm = true; pm_runtime_put(host_info[HSIC_BAM].dev); info[HSIC_CTRL].in_lpm = true; pm_runtime_put(host_info[HSIC_CTRL].dev); } host_info[HSIC_BAM].dev = dev; host_info[HSIC_BAM].in_lpm = false; host_info[HSIC_CTRL].dev = dev; host_info[HSIC_CTRL].in_lpm = false; } void msm_bam_set_usb_dev(struct device *dev) Loading @@ -248,29 +248,29 @@ void msm_bam_set_usb_dev(struct device *dev) void msm_bam_set_usb_host_dev(struct device *dev) { host_info[HSUSB_BAM].dev = dev; host_info[HSUSB_BAM].in_lpm = false; host_info[CI_CTRL].dev = dev; host_info[CI_CTRL].in_lpm = false; } static int get_bam_type_from_core_name(const char *name) { if (strnstr(name, bam_enable_strings[SSUSB_BAM], if (strnstr(name, bam_enable_strings[DWC3_CTRL], USB_BAM_MAX_STR_LEN) || strnstr(name, "dwc3", USB_BAM_MAX_STR_LEN)) return SSUSB_BAM; else if (strnstr(name, bam_enable_strings[HSIC_BAM], return DWC3_CTRL; else if (strnstr(name, bam_enable_strings[HSIC_CTRL], USB_BAM_MAX_STR_LEN)) return HSIC_BAM; else if (strnstr(name, bam_enable_strings[HSUSB_BAM], return HSIC_CTRL; else if (strnstr(name, bam_enable_strings[CI_CTRL], USB_BAM_MAX_STR_LEN) || strnstr(name, "ci", USB_BAM_MAX_STR_LEN)) return HSUSB_BAM; return CI_CTRL; pr_err("%s: invalid BAM name(%s)\n", __func__, name); return -EINVAL; } static bool bam_use_private_mem(enum usb_bam bam) static bool bam_use_private_mem(enum usb_ctrl bam) { int i; Loading @@ -282,7 +282,7 @@ static bool bam_use_private_mem(enum usb_bam bam) return false; } static void usb_bam_set_inactivity_timer(enum usb_bam bam) static void usb_bam_set_inactivity_timer(enum usb_ctrl bam) { struct sps_timer_ctrl timer_ctrl; struct usb_bam_pipe_connect *pipe_connect; Loading Loading @@ -323,7 +323,7 @@ static void usb_bam_set_inactivity_timer(enum usb_bam bam) static int connect_pipe(u8 idx, u32 *usb_pipe_idx) { int ret, ram1_value; enum usb_bam bam; enum usb_ctrl bam; struct usb_bam_sps_type usb_bam_sps = ctx.usb_bam_sps; struct sps_pipe **pipe = &(usb_bam_sps.sps_pipes[idx]); struct sps_connect *sps_connection = &usb_bam_sps.sps_connections[idx]; Loading Loading @@ -411,7 +411,7 @@ static int connect_pipe(u8 idx, u32 *usb_pipe_idx) */ bam = pipe_connect->bam_type; if (bam == HSUSB_BAM) if (bam == CI_CTRL) ram1_value = 0x4; else ram1_value = 0x7; Loading Loading @@ -771,11 +771,11 @@ static bool _hsic_host_bam_resume_core(void) pr_debug("%s: enter\n", __func__); /* Exit from "full suspend" in case of hsic host */ if (host_info[HSIC_BAM].dev && info[HSIC_BAM].in_lpm) { if (host_info[HSIC_CTRL].dev && info[HSIC_CTRL].in_lpm) { pr_debug("%s: Getting hsic device %x\n", __func__, (int)host_info[HSIC_BAM].dev); pm_runtime_get(host_info[HSIC_BAM].dev); info[HSIC_BAM].in_lpm = false; (int)host_info[HSIC_CTRL].dev); pm_runtime_get(host_info[HSIC_CTRL].dev); info[HSIC_CTRL].in_lpm = false; return true; } return false; Loading @@ -789,7 +789,7 @@ static bool _hsic_device_bam_resume_core(void) return false; } static void _usb_bam_suspend_core(enum usb_bam bam_type, bool disconnect) static void _usb_bam_suspend_core(enum usb_ctrl bam_type, bool disconnect) { pr_debug("%s: enter bam=%s\n", __func__, bam_enable_strings[bam_type]); Loading Loading @@ -824,27 +824,27 @@ static void _hsic_host_bam_suspend_core(void) { pr_debug("%s: enter\n", __func__); if (host_info[HSIC_BAM].dev && !info[HSIC_BAM].in_lpm) { if (host_info[HSIC_CTRL].dev && !info[HSIC_CTRL].in_lpm) { pr_debug("%s: Putting hsic host device %x\n", __func__, (int)host_info[HSIC_BAM].dev); pm_runtime_put(host_info[HSIC_BAM].dev); info[HSIC_BAM].in_lpm = true; (int)host_info[HSIC_CTRL].dev); pm_runtime_put(host_info[HSIC_CTRL].dev); info[HSIC_CTRL].in_lpm = true; } } static void usb_bam_suspend_core(enum usb_bam bam_type, static void usb_bam_suspend_core(enum usb_ctrl bam_type, enum usb_bam_mode bam_mode, bool disconnect) { pr_debug("%s: enter bam=%s\n", __func__, bam_enable_strings[bam_type]); switch (bam_type) { case HSUSB_BAM: /* TODO: This needs the correct handling for SSUSB_BAM */ case SSUSB_BAM: case CI_CTRL: /* TODO: This needs the correct handling for DWC3_CTRL */ case DWC3_CTRL: _usb_bam_suspend_core(bam_type, disconnect); break; case HSIC_BAM: case HSIC_CTRL: if (bam_mode == USB_BAM_DEVICE) _hsic_device_bam_suspend_core(); else /* USB_BAM_HOST */ Loading @@ -856,18 +856,18 @@ static void usb_bam_suspend_core(enum usb_bam bam_type, } } static bool usb_bam_resume_core(enum usb_bam bam_type, static bool usb_bam_resume_core(enum usb_ctrl bam_type, enum usb_bam_mode bam_mode) { pr_debug("%s: enter bam=%s\n", __func__, bam_enable_strings[bam_type]); switch (bam_type) { case HSUSB_BAM: /* TODO: This needs the correct handling for SSUSB_BAM */ case SSUSB_BAM: case CI_CTRL: /* TODO: This needs the correct handling for DWC3_CTRL */ case DWC3_CTRL: return _usb_bam_resume_core(); break; case HSIC_BAM: case HSIC_CTRL: if (bam_mode == USB_BAM_DEVICE) return _hsic_device_bam_resume_core(); else /* USB_BAM_HOST */ Loading @@ -881,7 +881,7 @@ static bool usb_bam_resume_core(enum usb_bam bam_type, static int usb_bam_disconnect_ipa_prod( struct usb_bam_connect_ipa_params *ipa_params, enum usb_bam cur_bam, enum usb_bam_mode bam_mode) enum usb_ctrl cur_bam, enum usb_bam_mode bam_mode) { int ret; u8 idx = 0; Loading Loading @@ -953,7 +953,7 @@ static int usb_bam_disconnect_ipa_prod( static int usb_bam_disconnect_ipa_cons( struct usb_bam_connect_ipa_params *ipa_params, enum usb_bam cur_bam) enum usb_ctrl cur_bam) { int ret; u8 idx = 0; Loading Loading @@ -1031,11 +1031,11 @@ int usb_bam_connect(int idx, u32 *bam_pipe_idx) int ret; struct usb_bam_pipe_connect *pipe_connect = &usb_bam_connections[idx]; struct msm_usb_bam_platform_data *pdata; enum usb_bam cur_bam; enum usb_ctrl cur_bam; enum usb_bam_mode cur_mode; if (!ctx.usb_bam_pdev) { pr_err("%s: usb_bam device not found\n", __func__); pr_err("%s: usb_ctrl device not found\n", __func__); return -ENODEV; } Loading Loading @@ -1181,7 +1181,7 @@ static void stop_cons_transfers(struct usb_bam_pipe_connect *pipe_connect) } } static void resume_suspended_pipes(enum usb_bam cur_bam) static void resume_suspended_pipes(enum usb_ctrl cur_bam) { u32 idx, dst_idx; struct usb_bam_pipe_connect *pipe_connect; Loading @@ -1204,7 +1204,7 @@ static void resume_suspended_pipes(enum usb_bam cur_bam) } } static inline int all_pipes_suspended(enum usb_bam cur_bam) static inline int all_pipes_suspended(enum usb_ctrl cur_bam) { pr_debug("%s: pipes_suspended=%d pipes_enabled_per_bam=%d", __func__, info[cur_bam].pipes_suspended, Loading @@ -1214,7 +1214,7 @@ static inline int all_pipes_suspended(enum usb_bam cur_bam) ctx.pipes_enabled_per_bam[cur_bam]); } static void usb_bam_finish_suspend(enum usb_bam cur_bam) static void usb_bam_finish_suspend(enum usb_ctrl cur_bam) { int ret; u32 cons_empty, idx, dst_idx; Loading Loading @@ -1319,7 +1319,7 @@ no_lpm: void usb_bam_finish_suspend_(struct work_struct *w) { enum usb_bam cur_bam; enum usb_ctrl cur_bam; struct usb_bam_ipa_handshake_info *info_ptr; info_ptr = container_of(w, struct usb_bam_ipa_handshake_info, Loading @@ -1334,7 +1334,7 @@ void usb_bam_finish_suspend_(struct work_struct *w) static void usb_prod_notify_cb(void *user_data, enum ipa_rm_event event, unsigned long data) { enum usb_bam *cur_bam = (void *)user_data; enum usb_ctrl *cur_bam = (void *)user_data; switch (event) { case IPA_RM_RESOURCE_GRANTED: Loading @@ -1361,7 +1361,7 @@ static void usb_prod_notify_cb(void *user_data, enum ipa_rm_event event, * NOTE: This function should be called in a context that hold * usb_bam_lock. */ static void usb_bam_resume_host(enum usb_bam bam_type) static void usb_bam_resume_host(enum usb_ctrl bam_type) { int i; struct usb_bam_pipe_connect *pipe_iter; Loading @@ -1378,7 +1378,7 @@ static void usb_bam_resume_host(enum usb_bam bam_type) } } static int cons_request_resource(enum usb_bam cur_bam) static int cons_request_resource(enum usb_ctrl cur_bam) { int ret = -EINPROGRESS; Loading Loading @@ -1446,21 +1446,21 @@ static int cons_request_resource(enum usb_bam cur_bam) static int ss_usb_cons_request_resource(void) { return cons_request_resource(SSUSB_BAM); return cons_request_resource(DWC3_CTRL); } static int usb_cons_request_resource(void) { return cons_request_resource(HSUSB_BAM); return cons_request_resource(CI_CTRL); } static int hsic_cons_request_resource(void) { return cons_request_resource(HSIC_BAM); return cons_request_resource(HSIC_CTRL); } static int cons_release_resource(enum usb_bam cur_bam) static int cons_release_resource(enum usb_ctrl cur_bam) { pr_debug("%s: Release %s_CONS resource\n", __func__, bam_enable_strings[cur_bam]); Loading Loading @@ -1499,24 +1499,24 @@ static int cons_release_resource(enum usb_bam cur_bam) static int hsic_cons_release_resource(void) { return cons_release_resource(HSIC_BAM); return cons_release_resource(HSIC_CTRL); } static int usb_cons_release_resource(void) { return cons_release_resource(HSUSB_BAM); return cons_release_resource(CI_CTRL); } static int ss_usb_cons_release_resource(void) { return cons_release_resource(SSUSB_BAM); return cons_release_resource(DWC3_CTRL); } static void usb_bam_ipa_create_resources(void) { struct ipa_rm_create_params usb_prod_create_params; struct ipa_rm_create_params usb_cons_create_params; enum usb_bam cur_bam; enum usb_ctrl cur_bam; int ret, i; for (i = 0; i < ARRAY_SIZE(ipa_rm_bams); i++) { Loading Loading @@ -1560,7 +1560,7 @@ static void usb_bam_ipa_create_resources(void) } } static void wait_for_prod_granted(enum usb_bam cur_bam) static void wait_for_prod_granted(enum usb_ctrl cur_bam) { int ret; Loading Loading @@ -1590,7 +1590,7 @@ static void wait_for_prod_granted(enum usb_bam cur_bam) pr_err("%s: ipa_rm_request_resource ret =%d\n", __func__, ret); } void notify_usb_connected(enum usb_bam cur_bam) void notify_usb_connected(enum usb_ctrl cur_bam) { pr_debug("%s: enter\n", __func__); Loading @@ -1607,7 +1607,7 @@ void notify_usb_connected(enum usb_bam cur_bam) } } static void wait_for_prod_release(enum usb_bam cur_bam) static void wait_for_prod_release(enum usb_ctrl cur_bam) { int ret; Loading Loading @@ -1683,7 +1683,7 @@ static bool check_pipes_empty(u8 src_idx, u8 dst_idx) void usb_bam_suspend(struct usb_bam_connect_ipa_params *ipa_params) { struct usb_bam_pipe_connect *pipe_connect; enum usb_bam cur_bam; enum usb_ctrl cur_bam; enum usb_bam_mode bam_mode; u8 src_idx, dst_idx; Loading Loading @@ -1736,7 +1736,7 @@ static void usb_bam_start_suspend(struct work_struct *w) { struct usb_bam_pipe_connect *pipe_connect; struct usb_bam_ipa_handshake_info *info_ptr; enum usb_bam cur_bam; enum usb_ctrl cur_bam; u8 src_idx, dst_idx; int pipes_to_suspend; Loading Loading @@ -1803,7 +1803,7 @@ static void usb_bam_start_suspend(struct work_struct *w) static void usb_bam_finish_resume(struct work_struct *w) { /* TODO: Change this when HSIC device support is introduced */ enum usb_bam cur_bam; enum usb_ctrl cur_bam; struct usb_bam_ipa_handshake_info *info_ptr; struct usb_bam_pipe_connect *pipe_connect; u32 idx, dst_idx, suspended; Loading Loading @@ -1881,7 +1881,7 @@ static void usb_bam_finish_resume(struct work_struct *w) void usb_bam_resume(struct usb_bam_connect_ipa_params *ipa_params) { enum usb_bam cur_bam; enum usb_ctrl cur_bam; u8 src_idx, dst_idx; struct usb_bam_pipe_connect *pipe_connect; Loading Loading @@ -1915,7 +1915,7 @@ void usb_bam_resume(struct usb_bam_connect_ipa_params *ipa_params) queue_work(ctx.usb_bam_wq, &info[cur_bam].resume_work); } void _msm_bam_wait_for_host_prod_granted(enum usb_bam bam_type) void _msm_bam_wait_for_host_prod_granted(enum usb_ctrl bam_type) { spin_lock(&usb_bam_lock); Loading @@ -1935,10 +1935,10 @@ void _msm_bam_wait_for_host_prod_granted(enum usb_bam bam_type) void msm_bam_wait_for_hsic_host_prod_granted(void) { pr_debug("%s: start\n", __func__); _msm_bam_wait_for_host_prod_granted(HSIC_BAM); _msm_bam_wait_for_host_prod_granted(HSIC_CTRL); } void _msm_bam_host_notify_on_resume(enum usb_bam bam_type) void _msm_bam_host_notify_on_resume(enum usb_ctrl bam_type) { spin_lock(&usb_bam_lock); pr_debug("%s: enter bam=%s\n", __func__, bam_enable_strings[bam_type]); Loading @@ -1960,7 +1960,7 @@ void _msm_bam_host_notify_on_resume(enum usb_bam bam_type) spin_unlock(&usb_bam_lock); } bool msm_bam_host_lpm_ok(enum usb_bam bam_type) bool msm_bam_host_lpm_ok(enum usb_ctrl bam_type) { int i; struct usb_bam_pipe_connect *pipe_iter; Loading Loading @@ -2029,13 +2029,13 @@ bool msm_bam_host_lpm_ok(enum usb_bam bam_type) void msm_bam_hsic_host_notify_on_resume(void) { _msm_bam_host_notify_on_resume(HSIC_BAM); _msm_bam_host_notify_on_resume(HSIC_CTRL); } int usb_bam_connect_ipa(struct usb_bam_connect_ipa_params *ipa_params) { u8 idx; enum usb_bam cur_bam; enum usb_ctrl cur_bam; enum usb_bam_mode cur_mode; struct usb_bam_pipe_connect *pipe_connect; int ret; Loading Loading @@ -2108,12 +2108,12 @@ int usb_bam_connect_ipa(struct usb_bam_connect_ipa_params *ipa_params) (ctx.pipes_enabled_per_bam[cur_bam] == 0) && bam2bam) { spin_unlock(&usb_bam_lock); if (cur_bam != HSIC_BAM) if (cur_bam != HSIC_CTRL) msm_hw_bam_disable(1); sps_device_reset(ctx.h_bam[cur_bam]); if (cur_bam != HSIC_BAM) if (cur_bam != HSIC_CTRL) msm_hw_bam_disable(0); /* On re-connect assume out from lpm for HOST BAM */ Loading Loading @@ -2361,7 +2361,7 @@ static void usb_bam_wake_cb(struct sps_event_notify *notify) container_of(event_info, struct usb_bam_pipe_connect, event); enum usb_bam bam = pipe_connect->bam_type; enum usb_ctrl bam = pipe_connect->bam_type; spin_lock(&usb_bam_lock); Loading Loading @@ -2605,7 +2605,7 @@ int usb_bam_disconnect_ipa(struct usb_bam_connect_ipa_params *ipa_params) int ret; u8 idx = 0; struct usb_bam_pipe_connect *pipe_connect; enum usb_bam cur_bam; enum usb_ctrl cur_bam; enum usb_bam_mode bam_mode; if (!ipa_params->prod_clnt_hdl && !ipa_params->cons_clnt_hdl) { Loading Loading @@ -2662,7 +2662,7 @@ int usb_bam_a2_reset(bool to_reconnect) struct usb_bam_pipe_connect *pipe_connect; int i; int ret = 0, ret_int; enum usb_bam bam = 0; enum usb_ctrl bam = 0; bool to_reset_bam = false; int reconnect_pipe_idx[ctx.max_connections]; Loading Loading @@ -2989,7 +2989,7 @@ static int usb_bam_init(int bam_type) } /* Check if USB3 pipe memory needs to be enabled */ if (bam_type == SSUSB_BAM && bam_use_private_mem(bam_type)) { if (bam_type == DWC3_CTRL && bam_use_private_mem(bam_type)) { pr_debug("%s: Enabling USB private memory for: %s\n", __func__, bam_enable_strings[bam_type]); Loading Loading @@ -3025,7 +3025,7 @@ static int usb_bam_init(int bam_type) * HSUSB and HSIC Cores don't support RESET ACK signal to BAMs * Hence, let BAM to ignore acknowledge from USB while resetting PIPE */ if (pdata->ignore_core_reset_ack && bam_type != SSUSB_BAM) if (pdata->ignore_core_reset_ack && bam_type != DWC3_CTRL) props->options = SPS_BAM_NO_EXT_P_RST; if (pdata->disable_clk_gating) Loading Loading @@ -3120,9 +3120,9 @@ static ssize_t usb_bam_store_inactivity_timer(struct device *dev, if (strnstr(buff, "help", USB_BAM_MAX_STR_LEN)) { pr_info("Usage: <bam_name> <ms>,<bam_name> <ms>,...\n"); pr_info("\tbam_name: [%s, %s, %s]\n", bam_enable_strings[SSUSB_BAM], bam_enable_strings[HSUSB_BAM], bam_enable_strings[HSIC_BAM]); bam_enable_strings[DWC3_CTRL], bam_enable_strings[CI_CTRL], bam_enable_strings[HSIC_CTRL]); pr_info("\tms: time in ms. Use 0 to disable timer\n"); return count; } Loading Loading @@ -3271,7 +3271,7 @@ EXPORT_SYMBOL(usb_bam_get_qdss_idx); bool usb_bam_get_prod_granted(u8 idx) { struct usb_bam_pipe_connect *pipe_connect = &usb_bam_connections[idx]; enum usb_bam cur_bam = pipe_connect->bam_type; enum usb_ctrl cur_bam = pipe_connect->bam_type; return (info[cur_bam].cur_prod_state == IPA_RM_RESOURCE_GRANTED); } Loading Loading @@ -3340,7 +3340,7 @@ int usb_bam_get_connection_idx(const char *core_name, enum peer_bam client, } EXPORT_SYMBOL(usb_bam_get_connection_idx); bool msm_bam_device_lpm_ok(enum usb_bam bam_type) bool msm_bam_device_lpm_ok(enum usb_ctrl bam_type) { pr_debug("%s: enter bam%s\n", __func__, bam_enable_strings[bam_type]); Loading Loading @@ -3368,14 +3368,15 @@ bool msm_bam_device_lpm_ok(enum usb_bam bam_type) } } bool msm_bam_usb_lpm_ok(void) bool msm_bam_usb_lpm_ok(enum usb_ctrl bam) { pr_debug("%s: enter mode %d\n", __func__, info[HSUSB_BAM].cur_bam_mode); pr_debug("%s: enter mode %d on %s\n", __func__, info[bam].cur_bam_mode, bam_enable_strings[bam]); if (info[HSUSB_BAM].cur_bam_mode == USB_BAM_DEVICE) return msm_bam_device_lpm_ok(HSUSB_BAM); if (info[bam].cur_bam_mode == USB_BAM_DEVICE) return msm_bam_device_lpm_ok(bam); else /* USB_BAM_HOST */ { return msm_bam_host_lpm_ok(HSUSB_BAM); return msm_bam_host_lpm_ok(bam); } } EXPORT_SYMBOL(msm_bam_usb_lpm_ok); Loading @@ -3384,22 +3385,23 @@ bool msm_bam_hsic_lpm_ok(void) { pr_debug("%s: enter\n", __func__); if (info[HSIC_BAM].cur_bam_mode == USB_BAM_DEVICE) return msm_bam_device_lpm_ok(HSIC_BAM); if (info[HSIC_CTRL].cur_bam_mode == USB_BAM_DEVICE) return msm_bam_device_lpm_ok(HSIC_CTRL); else /* USB_BAM_HOST */ { return msm_bam_host_lpm_ok(HSIC_BAM); return msm_bam_host_lpm_ok(HSIC_CTRL); } } EXPORT_SYMBOL(msm_bam_hsic_lpm_ok); /* TODO: make this for SSUSB_BAM when lpm support is in place */ void msm_bam_notify_lpm_resume() void msm_bam_notify_lpm_resume(enum usb_ctrl bam) { /* * If core was resumed from lpm, just clear the * pending indication, in case it is set. */ info[HSUSB_BAM].pending_lpm = 0; pr_debug("%s: notifying lpm resume on %s\n", __func__, bam_enable_strings[bam]); info[bam].pending_lpm = 0; } EXPORT_SYMBOL(msm_bam_notify_lpm_resume); Loading
drivers/usb/phy/phy-msm-usb.c +2 −2 Original line number Diff line number Diff line Loading @@ -889,7 +889,7 @@ static int msm_otg_suspend(struct msm_otg *motg) return 0; if (motg->pdata->delay_lpm_hndshk_on_disconnect && !msm_bam_usb_lpm_ok()) !msm_bam_usb_lpm_ok(CI_CTRL)) return -EBUSY; motg->ui_enabled = 0; Loading Loading @@ -1159,7 +1159,7 @@ static int msm_otg_resume(struct msm_otg *motg) return 0; if (motg->pdata->delay_lpm_hndshk_on_disconnect) msm_bam_notify_lpm_resume(); msm_bam_notify_lpm_resume(CI_CTRL); if (motg->ui_enabled) { motg->ui_enabled = 0; Loading
include/linux/usb/msm_hsusb.h +14 −4 Original line number Diff line number Diff line Loading @@ -190,6 +190,16 @@ enum usb_vdd_value { VDD_VAL_MAX, }; /** * Supported USB controllers */ enum usb_ctrl { DWC3_CTRL = 0, /* DWC3 controller */ CI_CTRL, /* ChipIdea controller */ HSIC_CTRL, /* HSIC controller */ NUM_CTRL, }; /** * struct msm_otg_platform_data - platform device data * for msm_otg driver. Loading Loading @@ -579,8 +589,8 @@ struct usb_ext_notification { void *ctxt; }; #ifdef CONFIG_USB_BAM bool msm_bam_usb_lpm_ok(void); void msm_bam_notify_lpm_resume(void); bool msm_bam_usb_lpm_ok(enum usb_ctrl ctrl); void msm_bam_notify_lpm_resume(enum usb_ctrl ctrl); void msm_bam_set_usb_host_dev(struct device *dev); void msm_bam_set_hsic_host_dev(struct device *dev); void msm_bam_set_usb_dev(struct device *dev); Loading @@ -590,8 +600,8 @@ bool msm_bam_hsic_lpm_ok(void); void msm_bam_usb_host_notify_on_resume(void); void msm_bam_hsic_host_notify_on_resume(void); #else static inline bool msm_bam_usb_lpm_ok(void) { return true; } static inline void msm_bam_notify_lpm_resume(void) {} static inline bool msm_bam_usb_lpm_ok(enum usb_ctrl ctrl) { return true; } static inline void msm_bam_notify_lpm_resume(enum usb_ctrl ctrl) {} static inline void msm_bam_set_usb_host_dev(struct device *dev) {} static inline void msm_bam_set_hsic_host_dev(struct device *dev) {} static inline void msm_bam_set_usb_dev(struct device *dev) {} Loading
include/linux/usb_bam.h +3 −7 Original line number Diff line number Diff line Loading @@ -16,12 +16,8 @@ #include <linux/ipa.h> #include <linux/usb/msm_hsusb.h> enum usb_bam { SSUSB_BAM = 0, HSUSB_BAM, HSIC_BAM, MAX_BAMS, }; #define MAX_BAMS NUM_CTRL /* Bam per USB controllers */ enum usb_bam_mode { USB_BAM_DEVICE = 0, Loading Loading @@ -138,7 +134,7 @@ struct usb_bam_pipe_connect { u32 pipe_num; enum usb_pipe_mem_type mem_type; enum usb_bam_pipe_dir dir; enum usb_bam bam_type; enum usb_ctrl bam_type; enum usb_bam_mode bam_mode; enum peer_bam peer_bam; enum usb_bam_pipe_type pipe_type; Loading