.. | .. |
---|
160 | 160 | if (csi_idx < 2) { |
---|
161 | 161 | dcphy_hw = dphy->samsung_phy_group[csi_idx]; |
---|
162 | 162 | mutex_lock(&dcphy_hw->mutex); |
---|
| 163 | + dcphy_hw->dphy_dev[dcphy_hw->dphy_dev_num] = dphy; |
---|
163 | 164 | dcphy_hw->dphy_dev_num++; |
---|
164 | 165 | mutex_unlock(&dcphy_hw->mutex); |
---|
165 | 166 | dphy->samsung_phy = dcphy_hw; |
---|
.. | .. |
---|
199 | 200 | else |
---|
200 | 201 | dphy->phy_index = 5; |
---|
201 | 202 | } |
---|
| 203 | + dphy_hw->dphy_dev[dphy_hw->dphy_dev_num] = dphy; |
---|
202 | 204 | dphy_hw->dphy_dev_num++; |
---|
203 | 205 | dphy->dphy_hw = dphy_hw; |
---|
204 | 206 | dphy->phy_hw[index] = (void *)dphy_hw; |
---|
.. | .. |
---|
253 | 255 | return 0; |
---|
254 | 256 | } |
---|
255 | 257 | |
---|
| 258 | +static void rockchip_csi2_samsung_phy_remove_dphy_dev(struct csi2_dphy *dphy, |
---|
| 259 | + struct samsung_mipi_dcphy *dcphy_hw) |
---|
| 260 | +{ |
---|
| 261 | + int i = 0; |
---|
| 262 | + bool is_find_dev = false; |
---|
| 263 | + struct csi2_dphy *csi2_dphy = NULL; |
---|
| 264 | + |
---|
| 265 | + for (i = 0; i < dcphy_hw->dphy_dev_num; i++) { |
---|
| 266 | + csi2_dphy = dcphy_hw->dphy_dev[i]; |
---|
| 267 | + if (csi2_dphy && |
---|
| 268 | + csi2_dphy->phy_index == dphy->phy_index) |
---|
| 269 | + is_find_dev = true; |
---|
| 270 | + if (is_find_dev) { |
---|
| 271 | + if (i < dcphy_hw->dphy_dev_num - 1) |
---|
| 272 | + dcphy_hw->dphy_dev[i] = dcphy_hw->dphy_dev[i + 1]; |
---|
| 273 | + else |
---|
| 274 | + dcphy_hw->dphy_dev[i] = NULL; |
---|
| 275 | + } |
---|
| 276 | + } |
---|
| 277 | + if (is_find_dev) |
---|
| 278 | + dcphy_hw->dphy_dev_num--; |
---|
| 279 | +} |
---|
| 280 | + |
---|
| 281 | +static void rockchip_csi2_inno_phy_remove_dphy_dev(struct csi2_dphy *dphy, |
---|
| 282 | + struct csi2_dphy_hw *dphy_hw) |
---|
| 283 | +{ |
---|
| 284 | + int i = 0; |
---|
| 285 | + bool is_find_dev = false; |
---|
| 286 | + struct csi2_dphy *csi2_dphy = NULL; |
---|
| 287 | + |
---|
| 288 | + for (i = 0; i < dphy_hw->dphy_dev_num; i++) { |
---|
| 289 | + csi2_dphy = dphy_hw->dphy_dev[i]; |
---|
| 290 | + if (csi2_dphy && |
---|
| 291 | + csi2_dphy->phy_index == dphy->phy_index) |
---|
| 292 | + is_find_dev = true; |
---|
| 293 | + if (is_find_dev) { |
---|
| 294 | + if (i < dphy_hw->dphy_dev_num - 1) |
---|
| 295 | + dphy_hw->dphy_dev[i] = dphy_hw->dphy_dev[i + 1]; |
---|
| 296 | + else |
---|
| 297 | + dphy_hw->dphy_dev[i] = NULL; |
---|
| 298 | + } |
---|
| 299 | + } |
---|
| 300 | + if (is_find_dev) |
---|
| 301 | + dphy_hw->dphy_dev_num--; |
---|
| 302 | +} |
---|
| 303 | + |
---|
256 | 304 | static int rockchip_csi2_dphy_detach_hw(struct csi2_dphy *dphy, int csi_idx, int index) |
---|
257 | 305 | { |
---|
258 | 306 | struct csi2_dphy_hw *dphy_hw = NULL; |
---|
259 | 307 | struct samsung_mipi_dcphy *dcphy_hw = NULL; |
---|
260 | | - struct csi2_dphy *csi2_dphy = NULL; |
---|
261 | | - int i = 0; |
---|
262 | 308 | |
---|
263 | 309 | if (dphy->drv_data->chip_id == CHIP_ID_RK3568 || |
---|
264 | 310 | dphy->drv_data->chip_id == CHIP_ID_RV1106) { |
---|
.. | .. |
---|
269 | 315 | return -EINVAL; |
---|
270 | 316 | } |
---|
271 | 317 | mutex_lock(&dphy_hw->mutex); |
---|
272 | | - for (i = 0; i < dphy_hw->dphy_dev_num; i++) { |
---|
273 | | - csi2_dphy = dphy_hw->dphy_dev[i]; |
---|
274 | | - if (csi2_dphy && |
---|
275 | | - csi2_dphy->phy_index == dphy->phy_index) { |
---|
276 | | - dphy_hw->dphy_dev[i] = NULL; |
---|
277 | | - dphy_hw->dphy_dev_num--; |
---|
278 | | - break; |
---|
279 | | - } |
---|
280 | | - } |
---|
| 318 | + rockchip_csi2_inno_phy_remove_dphy_dev(dphy, dphy_hw); |
---|
281 | 319 | mutex_unlock(&dphy_hw->mutex); |
---|
282 | 320 | } else if (dphy->drv_data->chip_id == CHIP_ID_RK3588) { |
---|
283 | 321 | if (csi_idx < 2) { |
---|
.. | .. |
---|
288 | 326 | return -EINVAL; |
---|
289 | 327 | } |
---|
290 | 328 | mutex_lock(&dcphy_hw->mutex); |
---|
291 | | - dcphy_hw->dphy_dev_num--; |
---|
| 329 | + rockchip_csi2_samsung_phy_remove_dphy_dev(dphy, dcphy_hw); |
---|
292 | 330 | mutex_unlock(&dcphy_hw->mutex); |
---|
293 | 331 | } else { |
---|
294 | 332 | dphy_hw = (struct csi2_dphy_hw *)dphy->phy_hw[index]; |
---|
.. | .. |
---|
298 | 336 | return -EINVAL; |
---|
299 | 337 | } |
---|
300 | 338 | mutex_lock(&dphy_hw->mutex); |
---|
301 | | - dphy_hw->dphy_dev_num--; |
---|
| 339 | + rockchip_csi2_inno_phy_remove_dphy_dev(dphy, dphy_hw); |
---|
302 | 340 | mutex_unlock(&dphy_hw->mutex); |
---|
303 | 341 | } |
---|
304 | 342 | } else { |
---|
.. | .. |
---|
309 | 347 | return -EINVAL; |
---|
310 | 348 | } |
---|
311 | 349 | mutex_lock(&dphy_hw->mutex); |
---|
312 | | - dphy_hw->dphy_dev_num--; |
---|
| 350 | + rockchip_csi2_inno_phy_remove_dphy_dev(dphy, dphy_hw); |
---|
313 | 351 | mutex_unlock(&dphy_hw->mutex); |
---|
314 | 352 | } |
---|
315 | 353 | |
---|
.. | .. |
---|
651 | 689 | { |
---|
652 | 690 | struct csi2_dphy *dphy = to_csi2_dphy(sd); |
---|
653 | 691 | long ret = 0; |
---|
| 692 | + int i = 0; |
---|
| 693 | + int on = 0; |
---|
654 | 694 | |
---|
655 | 695 | switch (cmd) { |
---|
656 | 696 | case RKCIF_CMD_SET_CSI_IDX: |
---|
.. | .. |
---|
658 | 698 | dphy->drv_data->chip_id != CHIP_ID_RV1106) |
---|
659 | 699 | dphy->csi_info = *((struct rkcif_csi_info *)arg); |
---|
660 | 700 | break; |
---|
| 701 | + case RKMODULE_SET_QUICK_STREAM: |
---|
| 702 | + for (i = 0; i < dphy->csi_info.csi_num; i++) { |
---|
| 703 | + if (dphy->csi_info.dphy_vendor[i] == PHY_VENDOR_INNO) { |
---|
| 704 | + dphy->dphy_hw = (struct csi2_dphy_hw *)dphy->phy_hw[i]; |
---|
| 705 | + if (!dphy->dphy_hw || |
---|
| 706 | + !dphy->dphy_hw->quick_stream_off || |
---|
| 707 | + !dphy->dphy_hw->quick_stream_on) { |
---|
| 708 | + ret = -EINVAL; |
---|
| 709 | + break; |
---|
| 710 | + } |
---|
| 711 | + on = *(int *)arg; |
---|
| 712 | + if (on) |
---|
| 713 | + dphy->dphy_hw->quick_stream_on(dphy, sd); |
---|
| 714 | + else |
---|
| 715 | + dphy->dphy_hw->quick_stream_off(dphy, sd); |
---|
| 716 | + } |
---|
| 717 | + } |
---|
| 718 | + break; |
---|
661 | 719 | default: |
---|
662 | 720 | ret = -ENOIOCTLCMD; |
---|
663 | 721 | break; |
---|