.. | .. |
---|
136 | 136 | const char *module_facing; |
---|
137 | 137 | const char *module_name; |
---|
138 | 138 | const char *len_name; |
---|
| 139 | + enum rkmodule_sync_mode sync_mode; |
---|
139 | 140 | u32 cur_vts; |
---|
140 | 141 | |
---|
141 | 142 | bool has_init_exp; |
---|
.. | .. |
---|
150 | 151 | |
---|
151 | 152 | static const s64 link_freq_menu_items[] = { |
---|
152 | 153 | MIPI_FREQ_400M, |
---|
| 154 | +}; |
---|
| 155 | + |
---|
| 156 | +static const struct reg_sequence gc1084_master_mode_regs[] = { |
---|
| 157 | + {0x0068, 0x85}, |
---|
| 158 | + {0x0d6a, 0x80}, |
---|
| 159 | + {0x0069, 0x00}, |
---|
| 160 | + {0x006a, 0x02}, |
---|
| 161 | + {0x0d69, 0x04}, |
---|
| 162 | +}; |
---|
| 163 | + |
---|
| 164 | +static const struct reg_sequence gc1084_slave_mode_regs[] = { |
---|
| 165 | + {0x0d67, 0x00}, |
---|
| 166 | + {0x0d69, 0x03}, |
---|
| 167 | + {0x0d6a, 0x08}, |
---|
| 168 | + {0x0d6b, 0x50}, |
---|
| 169 | + {0x0d6c, 0x00}, |
---|
| 170 | + {0x0d6d, 0x53}, |
---|
| 171 | + {0x0d6e, 0x00}, |
---|
| 172 | + {0x0d6f, 0x10}, |
---|
| 173 | + {0x0d70, 0x00}, |
---|
| 174 | + {0x0d71, 0x12}, |
---|
153 | 175 | }; |
---|
154 | 176 | |
---|
155 | 177 | /* |
---|
.. | .. |
---|
629 | 651 | u32 stream = 0; |
---|
630 | 652 | u64 delay_us = 0; |
---|
631 | 653 | u32 fps = 0; |
---|
| 654 | + u32 *sync_mode = NULL; |
---|
632 | 655 | |
---|
633 | 656 | switch (cmd) { |
---|
634 | 657 | case RKMODULE_GET_HDR_CFG: |
---|
.. | .. |
---|
654 | 677 | delay_us = 1000000 / (gc1084->cur_mode->vts_def * fps / gc1084->cur_vts); |
---|
655 | 678 | usleep_range(delay_us, delay_us + 2000); |
---|
656 | 679 | } |
---|
| 680 | + break; |
---|
| 681 | + case RKMODULE_GET_SYNC_MODE: |
---|
| 682 | + sync_mode = (u32 *)arg; |
---|
| 683 | + *sync_mode = gc1084->sync_mode; |
---|
| 684 | + break; |
---|
| 685 | + case RKMODULE_SET_SYNC_MODE: |
---|
| 686 | + sync_mode = (u32 *)arg; |
---|
| 687 | + gc1084->sync_mode = *sync_mode; |
---|
657 | 688 | break; |
---|
658 | 689 | default: |
---|
659 | 690 | ret = -ENOIOCTLCMD; |
---|
.. | .. |
---|
686 | 717 | } |
---|
687 | 718 | } |
---|
688 | 719 | |
---|
| 720 | + if (gc1084->sync_mode == INTERNAL_MASTER_MODE) { |
---|
| 721 | + ret = regmap_multi_reg_write(gc1084->regmap, gc1084_master_mode_regs, |
---|
| 722 | + ARRAY_SIZE(gc1084_master_mode_regs)); |
---|
| 723 | + if (ret) |
---|
| 724 | + dev_err(gc1084->dev, |
---|
| 725 | + "write internal master mode reg failed %d\n", ret); |
---|
| 726 | + } else if (gc1084->sync_mode == EXTERNAL_MASTER_MODE) { |
---|
| 727 | + ret = regmap_multi_reg_write(gc1084->regmap, gc1084_slave_mode_regs, |
---|
| 728 | + ARRAY_SIZE(gc1084_slave_mode_regs)); |
---|
| 729 | + if (ret) |
---|
| 730 | + dev_err(gc1084->dev, |
---|
| 731 | + "write external master mode reg failed %d\n", ret); |
---|
| 732 | + } else if (gc1084->sync_mode == SLAVE_MODE) { |
---|
| 733 | + ret = regmap_multi_reg_write(gc1084->regmap, gc1084_slave_mode_regs, |
---|
| 734 | + ARRAY_SIZE(gc1084_slave_mode_regs)); |
---|
| 735 | + if (ret) |
---|
| 736 | + dev_err(gc1084->dev, "write slave mode reg failed %d\n", ret); |
---|
| 737 | + } |
---|
| 738 | + |
---|
689 | 739 | return gc1084_write_reg(gc1084, GC1084_REG_CTRL_MODE, |
---|
690 | 740 | GC1084_MODE_STREAMING); |
---|
691 | 741 | } |
---|
.. | .. |
---|
707 | 757 | struct preisp_hdrae_exp_s *hdrae; |
---|
708 | 758 | long ret = 0; |
---|
709 | 759 | u32 stream = 0; |
---|
| 760 | + u32 sync_mode; |
---|
710 | 761 | |
---|
711 | 762 | switch (cmd) { |
---|
712 | 763 | case RKMODULE_GET_MODULE_INFO: |
---|
.. | .. |
---|
771 | 822 | ret = copy_from_user(&stream, up, sizeof(u32)); |
---|
772 | 823 | if (!ret) |
---|
773 | 824 | ret = gc1084_ioctl(sd, cmd, &stream); |
---|
| 825 | + else |
---|
| 826 | + ret = -EFAULT; |
---|
| 827 | + break; |
---|
| 828 | + case RKMODULE_GET_SYNC_MODE: |
---|
| 829 | + ret = gc1084_ioctl(sd, cmd, &sync_mode); |
---|
| 830 | + if (!ret) { |
---|
| 831 | + ret = copy_to_user(up, &sync_mode, sizeof(u32)); |
---|
| 832 | + if (ret) |
---|
| 833 | + ret = -EFAULT; |
---|
| 834 | + } |
---|
| 835 | + break; |
---|
| 836 | + case RKMODULE_SET_SYNC_MODE: |
---|
| 837 | + ret = copy_from_user(&sync_mode, up, sizeof(u32)); |
---|
| 838 | + if (!ret) |
---|
| 839 | + ret = gc1084_ioctl(sd, cmd, &sync_mode); |
---|
774 | 840 | else |
---|
775 | 841 | ret = -EFAULT; |
---|
776 | 842 | break; |
---|
.. | .. |
---|
1096 | 1162 | struct v4l2_subdev *sd; |
---|
1097 | 1163 | char facing[2]; |
---|
1098 | 1164 | int ret; |
---|
| 1165 | + const char *sync_mode_name = NULL; |
---|
1099 | 1166 | |
---|
1100 | 1167 | dev_info(dev, "driver version: %02x.%02x.%02x", |
---|
1101 | 1168 | DRIVER_VERSION >> 16, |
---|
.. | .. |
---|
1126 | 1193 | return -EINVAL; |
---|
1127 | 1194 | } |
---|
1128 | 1195 | |
---|
| 1196 | + ret = of_property_read_string(node, RKMODULE_CAMERA_SYNC_MODE, |
---|
| 1197 | + &sync_mode_name); |
---|
| 1198 | + if (ret) { |
---|
| 1199 | + gc1084->sync_mode = NO_SYNC_MODE; |
---|
| 1200 | + dev_err(dev, "could not get sync mode!\n"); |
---|
| 1201 | + } else { |
---|
| 1202 | + if (strcmp(sync_mode_name, RKMODULE_EXTERNAL_MASTER_MODE) == 0) |
---|
| 1203 | + gc1084->sync_mode = EXTERNAL_MASTER_MODE; |
---|
| 1204 | + else if (strcmp(sync_mode_name, RKMODULE_INTERNAL_MASTER_MODE) == 0) |
---|
| 1205 | + gc1084->sync_mode = INTERNAL_MASTER_MODE; |
---|
| 1206 | + else if (strcmp(sync_mode_name, RKMODULE_SLAVE_MODE) == 0) |
---|
| 1207 | + gc1084->sync_mode = SLAVE_MODE; |
---|
| 1208 | + } |
---|
| 1209 | + |
---|
1129 | 1210 | gc1084->xvclk = devm_clk_get(gc1084->dev, "xvclk"); |
---|
1130 | 1211 | if (IS_ERR(gc1084->xvclk)) { |
---|
1131 | 1212 | dev_err(gc1084->dev, "Failed to get xvclk\n"); |
---|