diff options
| -rw-r--r-- | drivers/media/platform/s5p-mfc/regs-mfc-v6.h | 1 | ||||
| -rw-r--r-- | drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c | 25 |
2 files changed, 25 insertions, 1 deletions
diff --git a/drivers/media/platform/s5p-mfc/regs-mfc-v6.h b/drivers/media/platform/s5p-mfc/regs-mfc-v6.h index 51cb2dd0e13a..83e01f3466e9 100644 --- a/drivers/media/platform/s5p-mfc/regs-mfc-v6.h +++ b/drivers/media/platform/s5p-mfc/regs-mfc-v6.h | |||
| @@ -71,6 +71,7 @@ | |||
| 71 | #define S5P_FIMV_R2H_CMD_ENC_BUFFER_FUL_RET_V6 16 | 71 | #define S5P_FIMV_R2H_CMD_ENC_BUFFER_FUL_RET_V6 16 |
| 72 | #define S5P_FIMV_R2H_CMD_ERR_RET_V6 32 | 72 | #define S5P_FIMV_R2H_CMD_ERR_RET_V6 32 |
| 73 | 73 | ||
| 74 | #define S5P_FIMV_MFC_BUS_RESET_CTRL 0x7110 | ||
| 74 | #define S5P_FIMV_FW_VERSION_V6 0xf000 | 75 | #define S5P_FIMV_FW_VERSION_V6 0xf000 |
| 75 | 76 | ||
| 76 | #define S5P_FIMV_INSTANCE_ID_V6 0xf008 | 77 | #define S5P_FIMV_INSTANCE_ID_V6 0xf008 |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c b/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c index f5bb6b2b3a5f..0d3661b5eaf1 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c | |||
| @@ -129,6 +129,25 @@ int s5p_mfc_release_firmware(struct s5p_mfc_dev *dev) | |||
| 129 | return 0; | 129 | return 0; |
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | int s5p_mfc_bus_reset(struct s5p_mfc_dev *dev) | ||
| 133 | { | ||
| 134 | unsigned int status; | ||
| 135 | unsigned long timeout; | ||
| 136 | |||
| 137 | /* Reset */ | ||
| 138 | mfc_write(dev, 0x1, S5P_FIMV_MFC_BUS_RESET_CTRL); | ||
| 139 | timeout = jiffies + msecs_to_jiffies(MFC_BW_TIMEOUT); | ||
| 140 | /* Check bus status */ | ||
| 141 | do { | ||
| 142 | if (time_after(jiffies, timeout)) { | ||
| 143 | mfc_err("Timeout while resetting MFC.\n"); | ||
| 144 | return -EIO; | ||
| 145 | } | ||
| 146 | status = mfc_read(dev, S5P_FIMV_MFC_BUS_RESET_CTRL); | ||
| 147 | } while ((status & 0x2) == 0); | ||
| 148 | return 0; | ||
| 149 | } | ||
| 150 | |||
| 132 | /* Reset the device */ | 151 | /* Reset the device */ |
| 133 | int s5p_mfc_reset(struct s5p_mfc_dev *dev) | 152 | int s5p_mfc_reset(struct s5p_mfc_dev *dev) |
| 134 | { | 153 | { |
| @@ -147,11 +166,15 @@ int s5p_mfc_reset(struct s5p_mfc_dev *dev) | |||
| 147 | for (i = 0; i < S5P_FIMV_REG_CLEAR_COUNT_V6; i++) | 166 | for (i = 0; i < S5P_FIMV_REG_CLEAR_COUNT_V6; i++) |
| 148 | mfc_write(dev, 0, S5P_FIMV_REG_CLEAR_BEGIN_V6 + (i*4)); | 167 | mfc_write(dev, 0, S5P_FIMV_REG_CLEAR_BEGIN_V6 + (i*4)); |
| 149 | 168 | ||
| 169 | /* check bus reset control before reset */ | ||
| 170 | if (dev->risc_on) | ||
| 171 | if (s5p_mfc_bus_reset(dev)) | ||
| 172 | return -EIO; | ||
| 150 | /* Reset | 173 | /* Reset |
| 151 | * set RISC_ON to 0 during power_on & wake_up. | 174 | * set RISC_ON to 0 during power_on & wake_up. |
| 152 | * V6 needs RISC_ON set to 0 during reset also. | 175 | * V6 needs RISC_ON set to 0 during reset also. |
| 153 | */ | 176 | */ |
| 154 | if ((!dev->risc_on) || (!IS_MFCV7(dev))) | 177 | if ((!dev->risc_on) || (!IS_MFCV7_PLUS(dev))) |
| 155 | mfc_write(dev, 0, S5P_FIMV_RISC_ON_V6); | 178 | mfc_write(dev, 0, S5P_FIMV_RISC_ON_V6); |
| 156 | 179 | ||
| 157 | mfc_write(dev, 0x1FFF, S5P_FIMV_MFC_RESET_V6); | 180 | mfc_write(dev, 0x1FFF, S5P_FIMV_MFC_RESET_V6); |
