| .. | .. |
|---|
| 20 | 20 | #include <linux/regmap.h> |
|---|
| 21 | 21 | #include <linux/pm_runtime.h> |
|---|
| 22 | 22 | #include <linux/proc_fs.h> |
|---|
| 23 | | -#include <linux/mfd/syscon.h> |
|---|
| 24 | | -#include <linux/rockchip/cpu.h> |
|---|
| 25 | 23 | #include <soc/rockchip/pm_domains.h> |
|---|
| 26 | 24 | |
|---|
| 27 | 25 | #include "rockchip_iep2_regs.h" |
|---|
| .. | .. |
|---|
| 268 | 266 | |
|---|
| 269 | 267 | mem_region = mpp_task_attach_fd(&task->mpp_task, usr_fd); |
|---|
| 270 | 268 | if (IS_ERR(mem_region)) { |
|---|
| 271 | | - mpp_debug(DEBUG_IOMMU, "reg[%3d]: %08x failed\n", |
|---|
| 272 | | - iep2_addr_rnum[i], paddr[i]); |
|---|
| 269 | + mpp_err("reg[%03d]: %08x failed\n", |
|---|
| 270 | + iep2_addr_rnum[i], paddr[i]); |
|---|
| 273 | 271 | return PTR_ERR(mem_region); |
|---|
| 274 | 272 | } |
|---|
| 275 | 273 | |
|---|
| .. | .. |
|---|
| 979 | 977 | return -ENOMEM; |
|---|
| 980 | 978 | |
|---|
| 981 | 979 | mpp = &iep->mpp; |
|---|
| 982 | | - platform_set_drvdata(pdev, iep); |
|---|
| 980 | + platform_set_drvdata(pdev, mpp); |
|---|
| 983 | 981 | |
|---|
| 984 | 982 | if (pdev->dev.of_node) { |
|---|
| 985 | 983 | match = of_match_node(mpp_iep2_match, pdev->dev.of_node); |
|---|
| .. | .. |
|---|
| 1015 | 1013 | static int iep2_remove(struct platform_device *pdev) |
|---|
| 1016 | 1014 | { |
|---|
| 1017 | 1015 | struct device *dev = &pdev->dev; |
|---|
| 1018 | | - struct iep2_dev *iep = platform_get_drvdata(pdev); |
|---|
| 1016 | + struct mpp_dev *mpp = dev_get_drvdata(dev); |
|---|
| 1017 | + struct iep2_dev *iep = to_iep2_dev(mpp); |
|---|
| 1019 | 1018 | |
|---|
| 1020 | 1019 | dma_free_coherent(dev, iep->roi.size, iep->roi.vaddr, iep->roi.iova); |
|---|
| 1021 | 1020 | |
|---|
| 1022 | 1021 | dev_info(dev, "remove device\n"); |
|---|
| 1023 | | - mpp_dev_remove(&iep->mpp); |
|---|
| 1024 | | - iep2_procfs_remove(&iep->mpp); |
|---|
| 1022 | + mpp_dev_remove(mpp); |
|---|
| 1023 | + iep2_procfs_remove(mpp); |
|---|
| 1025 | 1024 | |
|---|
| 1026 | 1025 | return 0; |
|---|
| 1027 | 1026 | } |
|---|
| 1028 | | - |
|---|
| 1029 | | -static void iep2_shutdown(struct platform_device *pdev) |
|---|
| 1030 | | -{ |
|---|
| 1031 | | - int ret; |
|---|
| 1032 | | - int val; |
|---|
| 1033 | | - struct device *dev = &pdev->dev; |
|---|
| 1034 | | - struct iep2_dev *iep = platform_get_drvdata(pdev); |
|---|
| 1035 | | - struct mpp_dev *mpp = &iep->mpp; |
|---|
| 1036 | | - |
|---|
| 1037 | | - dev_info(dev, "shutdown device\n"); |
|---|
| 1038 | | - |
|---|
| 1039 | | - atomic_inc(&mpp->srv->shutdown_request); |
|---|
| 1040 | | - ret = readx_poll_timeout(atomic_read, |
|---|
| 1041 | | - &mpp->task_count, |
|---|
| 1042 | | - val, val == 0, 20000, 200000); |
|---|
| 1043 | | - if (ret == -ETIMEDOUT) |
|---|
| 1044 | | - dev_err(dev, "wait total running time out\n"); |
|---|
| 1045 | | -} |
|---|
| 1046 | | - |
|---|
| 1047 | | -static int iep2_runtime_suspend(struct device *dev) |
|---|
| 1048 | | -{ |
|---|
| 1049 | | - struct mpp_dev *mpp = dev_get_drvdata(dev); |
|---|
| 1050 | | - struct mpp_grf_info *info = mpp->grf_info; |
|---|
| 1051 | | - struct mpp_taskqueue *queue = mpp->queue; |
|---|
| 1052 | | - |
|---|
| 1053 | | - if (cpu_is_rk3528() && info && info->mem_offset) { |
|---|
| 1054 | | - mutex_lock(&queue->ref_lock); |
|---|
| 1055 | | - if (!atomic_dec_if_positive(&queue->runtime_cnt)) { |
|---|
| 1056 | | - regmap_write(info->grf, info->mem_offset, |
|---|
| 1057 | | - info->val_mem_off); |
|---|
| 1058 | | - } |
|---|
| 1059 | | - mutex_unlock(&queue->ref_lock); |
|---|
| 1060 | | - } |
|---|
| 1061 | | - |
|---|
| 1062 | | - return 0; |
|---|
| 1063 | | -} |
|---|
| 1064 | | - |
|---|
| 1065 | | -static int iep2_runtime_resume(struct device *dev) |
|---|
| 1066 | | -{ |
|---|
| 1067 | | - struct mpp_dev *mpp = dev_get_drvdata(dev); |
|---|
| 1068 | | - struct mpp_grf_info *info = mpp->grf_info; |
|---|
| 1069 | | - struct mpp_taskqueue *queue = mpp->queue; |
|---|
| 1070 | | - |
|---|
| 1071 | | - if (cpu_is_rk3528() && info && info->mem_offset) { |
|---|
| 1072 | | - mutex_lock(&queue->ref_lock); |
|---|
| 1073 | | - regmap_write(info->grf, info->mem_offset, |
|---|
| 1074 | | - info->val_mem_on); |
|---|
| 1075 | | - atomic_inc(&queue->runtime_cnt); |
|---|
| 1076 | | - mutex_unlock(&queue->ref_lock); |
|---|
| 1077 | | - } |
|---|
| 1078 | | - |
|---|
| 1079 | | - return 0; |
|---|
| 1080 | | -} |
|---|
| 1081 | | - |
|---|
| 1082 | | -static const struct dev_pm_ops iep2_pm_ops = { |
|---|
| 1083 | | - .runtime_suspend = iep2_runtime_suspend, |
|---|
| 1084 | | - .runtime_resume = iep2_runtime_resume, |
|---|
| 1085 | | -}; |
|---|
| 1086 | 1027 | |
|---|
| 1087 | 1028 | struct platform_driver rockchip_iep2_driver = { |
|---|
| 1088 | 1029 | .probe = iep2_probe, |
|---|
| 1089 | 1030 | .remove = iep2_remove, |
|---|
| 1090 | | - .shutdown = iep2_shutdown, |
|---|
| 1031 | + .shutdown = mpp_dev_shutdown, |
|---|
| 1091 | 1032 | .driver = { |
|---|
| 1092 | 1033 | .name = IEP2_DRIVER_NAME, |
|---|
| 1093 | | - .pm = &iep2_pm_ops, |
|---|
| 1094 | 1034 | .of_match_table = of_match_ptr(mpp_iep2_match), |
|---|
| 1095 | 1035 | }, |
|---|
| 1096 | 1036 | }; |
|---|