Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: ccs: Add support for alternate analogue global gain

The CCS spec defines an alternative implementation for global analogue
gain. Add support for that in the driver.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>

authored by

Sakari Ailus and committed by
Mauro Carvalho Chehab
57801b6a a75210a6

+55
+55
drivers/media/i2c/ccs/ccs-core.c
··· 673 673 674 674 break; 675 675 676 + case V4L2_CID_CCS_ANALOGUE_LINEAR_GAIN: 677 + rval = ccs_write(sensor, ANALOG_LINEAR_GAIN_GLOBAL, ctrl->val); 678 + 679 + break; 680 + 681 + case V4L2_CID_CCS_ANALOGUE_EXPONENTIAL_GAIN: 682 + rval = ccs_write(sensor, ANALOG_EXPONENTIAL_GAIN_GLOBAL, 683 + ctrl->val); 684 + 685 + break; 686 + 676 687 case V4L2_CID_DIGITAL_GAIN: 677 688 if (CCS_LIM(sensor, DIGITAL_GAIN_CAPABILITY) == 678 689 CCS_DIGITAL_GAIN_CAPABILITY_GLOBAL) { ··· 830 819 max(CCS_LIM(sensor, ANALOG_GAIN_CODE_STEP), 831 820 1U), 832 821 CCS_LIM(sensor, ANALOG_GAIN_CODE_MIN)); 822 + } 823 + break; 824 + 825 + case CCS_ANALOG_GAIN_CAPABILITY_ALTERNATE_GLOBAL: { 826 + struct { 827 + const char *name; 828 + u32 id; 829 + u16 min, max, step; 830 + } const gain_ctrls[] = { 831 + { 832 + "Analogue Linear Gain", 833 + V4L2_CID_CCS_ANALOGUE_LINEAR_GAIN, 834 + CCS_LIM(sensor, ANALOG_LINEAR_GAIN_MIN), 835 + CCS_LIM(sensor, ANALOG_LINEAR_GAIN_MAX), 836 + max(CCS_LIM(sensor, 837 + ANALOG_LINEAR_GAIN_STEP_SIZE), 838 + 1U), 839 + }, 840 + { 841 + "Analogue Exponential Gain", 842 + V4L2_CID_CCS_ANALOGUE_EXPONENTIAL_GAIN, 843 + CCS_LIM(sensor, ANALOG_EXPONENTIAL_GAIN_MIN), 844 + CCS_LIM(sensor, ANALOG_EXPONENTIAL_GAIN_MAX), 845 + max(CCS_LIM(sensor, 846 + ANALOG_EXPONENTIAL_GAIN_STEP_SIZE), 847 + 1U), 848 + }, 849 + }; 850 + struct v4l2_ctrl_config ctrl_cfg = { 851 + .type = V4L2_CTRL_TYPE_INTEGER, 852 + .ops = &ccs_ctrl_ops, 853 + }; 854 + unsigned int i; 855 + 856 + for (i = 0; i < ARRAY_SIZE(gain_ctrls); i++) { 857 + ctrl_cfg.name = gain_ctrls[i].name; 858 + ctrl_cfg.min = ctrl_cfg.def = gain_ctrls[i].min; 859 + ctrl_cfg.max = gain_ctrls[i].max; 860 + ctrl_cfg.step = gain_ctrls[i].step; 861 + ctrl_cfg.id = gain_ctrls[i].id; 862 + 863 + v4l2_ctrl_new_custom(&sensor->pixel_array->ctrl_handler, 864 + &ctrl_cfg, NULL); 865 + } 833 866 } 834 867 } 835 868