Loading drivers/platform/msm/mhi_dev/mhi.c +71 −2 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ #include <linux/vmalloc.h> #include <linux/wakelock.h> #include "mhi.h" #include <linux/msm_mhi_dev.h> #include "mhi_hwio.h" #include "mhi_sm.h" Loading Loading @@ -825,6 +825,19 @@ int mhi_dev_send_ee_event(struct mhi_dev *mhi, enum mhi_dev_execenv exec_env) } EXPORT_SYMBOL(mhi_dev_send_ee_event); static void mhi_dev_trigger_cb(void) { struct mhi_dev_ready_cb_info *info; enum mhi_ctrl_info state_data; list_for_each_entry(info, &mhi_ctx->client_cb_list, list) if (info->cb) { mhi_ctrl_state_info(info->cb_data.channel, &state_data); info->cb_data.ctrl_info = state_data; info->cb(&info->cb_data); } } int mhi_dev_trigger_hw_acc_wakeup(struct mhi_dev *mhi) { int rc = 0; Loading Loading @@ -986,6 +999,8 @@ send_start_completion_event: pr_err("Error sending command completion event\n"); mhi_update_state_info(ch_id, MHI_STATE_CONNECTED); /* Trigger callback to clients */ mhi_dev_trigger_cb(); if (ch_id == MHI_CLIENT_MBIM_OUT) { rc = kobject_uevent_env(&mhi_ctx->dev->kobj, KOBJ_CHANGE, connected); Loading Loading @@ -2397,6 +2412,53 @@ static void mhi_ring_init_cb(void *data) queue_work(mhi->ring_init_wq, &mhi->ring_init_cb_work); } int mhi_register_state_cb(void (*mhi_state_cb) (struct mhi_dev_client_cb_data *cb_data), void *data, enum mhi_client_channel channel) { struct mhi_dev_ready_cb_info *cb_info = NULL; if (!mhi_ctx) { pr_err("MHI device not ready\n"); return -ENXIO; } if (channel > MHI_MAX_CHANNELS) { pr_err("Invalid channel :%d\n", channel); return -EINVAL; } mutex_lock(&mhi_ctx->mhi_lock); cb_info = kmalloc(sizeof(struct mhi_dev_ready_cb_info), GFP_KERNEL); if (!cb_info) { mutex_unlock(&mhi_ctx->mhi_lock); return -ENOMEM; } cb_info->cb = mhi_state_cb; cb_info->cb_data.user_data = data; cb_info->cb_data.channel = channel; list_add_tail(&cb_info->list, &mhi_ctx->client_cb_list); /** * If channel is open during registration, no callback is issued. * Instead return -EEXIST to notify the client. Clients request * is added to the list to notify future state change notification. * Channel struct may not be allocated yet if this function is called * early during boot - add an explicit check for non-null "ch". */ if (mhi_ctx->ch && (mhi_ctx->ch[channel].state == MHI_DEV_CH_STARTED)) { mutex_unlock(&mhi_ctx->mhi_lock); return -EEXIST; } mutex_unlock(&mhi_ctx->mhi_lock); return 0; } EXPORT_SYMBOL(mhi_register_state_cb); static void mhi_update_state_info(uint32_t uevent_idx, enum mhi_ctrl_info info) { struct mhi_dev_client_cb_reason reason; Loading Loading @@ -2770,7 +2832,6 @@ static int mhi_dev_resume_mmio_mhi_init(struct mhi_dev *mhi_ctx) INIT_LIST_HEAD(&mhi_ctx->event_ring_list); INIT_LIST_HEAD(&mhi_ctx->process_ring_list); mutex_init(&mhi_ctx->mhi_lock); mutex_init(&mhi_ctx->mhi_event_lock); mutex_init(&mhi_ctx->mhi_write_test); Loading Loading @@ -2920,6 +2981,14 @@ static int mhi_dev_probe(struct platform_device *pdev) dev_err(&pdev->dev, "Failed to create IPC logging context\n"); } /* * The below list and mutex should be initialized * before calling mhi_uci_init to avoid crash in * mhi_register_state_cb when accessing these. */ INIT_LIST_HEAD(&mhi_ctx->client_cb_list); mutex_init(&mhi_ctx->mhi_lock); mhi_uci_init(); mhi_update_state_info(MHI_DEV_UEVENT_CTRL, MHI_STATE_CONFIGURED); Loading drivers/platform/msm/mhi_dev/mhi_dev_net.c +2 −2 Original line number Diff line number Diff line /* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, 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 Loading Loading @@ -26,7 +26,7 @@ #include <linux/errno.h> #include <linux/ktime.h> #include "mhi.h" #include <linux/msm_mhi_dev.h> #define MHI_NET_DRIVER_NAME "mhi_dev_net_drv" #define MHI_NET_DEV_NAME "mhi_dev_net%d" Loading drivers/platform/msm/mhi_dev/mhi_mmio.c +2 −2 Original line number Diff line number Diff line /* Copyright (c) 2015, 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2015, 2017-2018, 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 Loading @@ -25,7 +25,7 @@ #include <linux/completion.h> #include <linux/platform_device.h> #include "mhi.h" #include <linux/msm_mhi_dev.h> #include "mhi_hwio.h" int mhi_dev_mmio_read(struct mhi_dev *dev, uint32_t offset, Loading drivers/platform/msm/mhi_dev/mhi_ring.c +1 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ #include <linux/completion.h> #include <linux/platform_device.h> #include "mhi.h" #include <linux/msm_mhi_dev.h> static uint32_t mhi_dev_ring_addr2ofst(struct mhi_dev_ring *ring, uint64_t p) { Loading drivers/platform/msm/mhi_dev/mhi_sm.h +2 −2 Original line number Diff line number Diff line /* Copyright (c) 2015,2017 The Linux Foundation. All rights reserved. /* Copyright (c) 2015,2017-2018, 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 Loading @@ -13,7 +13,7 @@ #ifndef MHI_SM_H #define MHI_SM_H #include "mhi.h" #include <linux/msm_mhi_dev.h> #include <linux/slab.h> #include <linux/msm_ep_pcie.h> Loading Loading
drivers/platform/msm/mhi_dev/mhi.c +71 −2 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ #include <linux/vmalloc.h> #include <linux/wakelock.h> #include "mhi.h" #include <linux/msm_mhi_dev.h> #include "mhi_hwio.h" #include "mhi_sm.h" Loading Loading @@ -825,6 +825,19 @@ int mhi_dev_send_ee_event(struct mhi_dev *mhi, enum mhi_dev_execenv exec_env) } EXPORT_SYMBOL(mhi_dev_send_ee_event); static void mhi_dev_trigger_cb(void) { struct mhi_dev_ready_cb_info *info; enum mhi_ctrl_info state_data; list_for_each_entry(info, &mhi_ctx->client_cb_list, list) if (info->cb) { mhi_ctrl_state_info(info->cb_data.channel, &state_data); info->cb_data.ctrl_info = state_data; info->cb(&info->cb_data); } } int mhi_dev_trigger_hw_acc_wakeup(struct mhi_dev *mhi) { int rc = 0; Loading Loading @@ -986,6 +999,8 @@ send_start_completion_event: pr_err("Error sending command completion event\n"); mhi_update_state_info(ch_id, MHI_STATE_CONNECTED); /* Trigger callback to clients */ mhi_dev_trigger_cb(); if (ch_id == MHI_CLIENT_MBIM_OUT) { rc = kobject_uevent_env(&mhi_ctx->dev->kobj, KOBJ_CHANGE, connected); Loading Loading @@ -2397,6 +2412,53 @@ static void mhi_ring_init_cb(void *data) queue_work(mhi->ring_init_wq, &mhi->ring_init_cb_work); } int mhi_register_state_cb(void (*mhi_state_cb) (struct mhi_dev_client_cb_data *cb_data), void *data, enum mhi_client_channel channel) { struct mhi_dev_ready_cb_info *cb_info = NULL; if (!mhi_ctx) { pr_err("MHI device not ready\n"); return -ENXIO; } if (channel > MHI_MAX_CHANNELS) { pr_err("Invalid channel :%d\n", channel); return -EINVAL; } mutex_lock(&mhi_ctx->mhi_lock); cb_info = kmalloc(sizeof(struct mhi_dev_ready_cb_info), GFP_KERNEL); if (!cb_info) { mutex_unlock(&mhi_ctx->mhi_lock); return -ENOMEM; } cb_info->cb = mhi_state_cb; cb_info->cb_data.user_data = data; cb_info->cb_data.channel = channel; list_add_tail(&cb_info->list, &mhi_ctx->client_cb_list); /** * If channel is open during registration, no callback is issued. * Instead return -EEXIST to notify the client. Clients request * is added to the list to notify future state change notification. * Channel struct may not be allocated yet if this function is called * early during boot - add an explicit check for non-null "ch". */ if (mhi_ctx->ch && (mhi_ctx->ch[channel].state == MHI_DEV_CH_STARTED)) { mutex_unlock(&mhi_ctx->mhi_lock); return -EEXIST; } mutex_unlock(&mhi_ctx->mhi_lock); return 0; } EXPORT_SYMBOL(mhi_register_state_cb); static void mhi_update_state_info(uint32_t uevent_idx, enum mhi_ctrl_info info) { struct mhi_dev_client_cb_reason reason; Loading Loading @@ -2770,7 +2832,6 @@ static int mhi_dev_resume_mmio_mhi_init(struct mhi_dev *mhi_ctx) INIT_LIST_HEAD(&mhi_ctx->event_ring_list); INIT_LIST_HEAD(&mhi_ctx->process_ring_list); mutex_init(&mhi_ctx->mhi_lock); mutex_init(&mhi_ctx->mhi_event_lock); mutex_init(&mhi_ctx->mhi_write_test); Loading Loading @@ -2920,6 +2981,14 @@ static int mhi_dev_probe(struct platform_device *pdev) dev_err(&pdev->dev, "Failed to create IPC logging context\n"); } /* * The below list and mutex should be initialized * before calling mhi_uci_init to avoid crash in * mhi_register_state_cb when accessing these. */ INIT_LIST_HEAD(&mhi_ctx->client_cb_list); mutex_init(&mhi_ctx->mhi_lock); mhi_uci_init(); mhi_update_state_info(MHI_DEV_UEVENT_CTRL, MHI_STATE_CONFIGURED); Loading
drivers/platform/msm/mhi_dev/mhi_dev_net.c +2 −2 Original line number Diff line number Diff line /* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, 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 Loading Loading @@ -26,7 +26,7 @@ #include <linux/errno.h> #include <linux/ktime.h> #include "mhi.h" #include <linux/msm_mhi_dev.h> #define MHI_NET_DRIVER_NAME "mhi_dev_net_drv" #define MHI_NET_DEV_NAME "mhi_dev_net%d" Loading
drivers/platform/msm/mhi_dev/mhi_mmio.c +2 −2 Original line number Diff line number Diff line /* Copyright (c) 2015, 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2015, 2017-2018, 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 Loading @@ -25,7 +25,7 @@ #include <linux/completion.h> #include <linux/platform_device.h> #include "mhi.h" #include <linux/msm_mhi_dev.h> #include "mhi_hwio.h" int mhi_dev_mmio_read(struct mhi_dev *dev, uint32_t offset, Loading
drivers/platform/msm/mhi_dev/mhi_ring.c +1 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ #include <linux/completion.h> #include <linux/platform_device.h> #include "mhi.h" #include <linux/msm_mhi_dev.h> static uint32_t mhi_dev_ring_addr2ofst(struct mhi_dev_ring *ring, uint64_t p) { Loading
drivers/platform/msm/mhi_dev/mhi_sm.h +2 −2 Original line number Diff line number Diff line /* Copyright (c) 2015,2017 The Linux Foundation. All rights reserved. /* Copyright (c) 2015,2017-2018, 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 Loading @@ -13,7 +13,7 @@ #ifndef MHI_SM_H #define MHI_SM_H #include "mhi.h" #include <linux/msm_mhi_dev.h> #include <linux/slab.h> #include <linux/msm_ep_pcie.h> Loading