On 9/17/2023 4:30 PM, Jonathan Cameron wrote: > On Fri, 15 Sep 2023 10:46:57 +0530 > Basavaraj Natikar <Basavaraj.Natikar@xxxxxxx> wrote: > >> In most cases, ambient color sensors also support light color temperature. >> As a result, add support of light color temperature. >> >> Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@xxxxxxx> >> --- >> drivers/iio/light/hid-sensor-als.c | 33 ++++++++++++++++++++++++++++++ >> include/linux/hid-sensor-ids.h | 1 + >> 2 files changed, 34 insertions(+) >> >> diff --git a/drivers/iio/light/hid-sensor-als.c b/drivers/iio/light/hid-sensor-als.c >> index 48879e233aec..220fb93fea6d 100644 >> --- a/drivers/iio/light/hid-sensor-als.c >> +++ b/drivers/iio/light/hid-sensor-als.c >> @@ -16,6 +16,7 @@ >> enum { >> CHANNEL_SCAN_INDEX_INTENSITY = 0, >> CHANNEL_SCAN_INDEX_ILLUM = 1, > Either drop, the = 1 or keep consistency for TEMP. > I don't think the = 1 is useful so I'd drop it. > >> + CHANNEL_SCAN_INDEX_COLOR_TEMP, >> CHANNEL_SCAN_INDEX_MAX >> }; >> >> @@ -65,6 +66,18 @@ static const struct iio_chan_spec als_channels[] = { >> BIT(IIO_CHAN_INFO_HYSTERESIS_RELATIVE), >> .scan_index = CHANNEL_SCAN_INDEX_ILLUM, >> }, >> + { >> + .type = IIO_TEMP, > Using a temperature channel for color temp is a bit of a stretch, > Particularly as it's likely we will see light sensors with actual > air temperature sensors in them at somepoint even if we don't have > any already. > > So this needs a new channel type > IIO_COLORTEMP or similar. > > Units for this probably want to be kelvin unlike the mili decrees centigrade > used for IIO_TEMP. > >> + .modified = 1, >> + .channel2 = IIO_MOD_TEMP_AMBIENT, > I don't really see the modifier as useful here. That exists for thermocouple > type systems where it is necessary to know ambient vs sample temperatures. Sure Jonathan, I will address all comments in this series in v2. Also, can i add new channel type IIO_COLORTEMP with following channel index for light color temperature ? { .type = IIO_COLORTEMP, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ) | BIT(IIO_CHAN_INFO_HYSTERESIS) | BIT(IIO_CHAN_INFO_HYSTERESIS_RELATIVE), .scan_index = CHANNEL_SCAN_INDEX_COLOR_TEMP, } Thanks, -- Basavaraj > > >> + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), >> + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | >> + BIT(IIO_CHAN_INFO_SCALE) | >> + BIT(IIO_CHAN_INFO_SAMP_FREQ) | >> + BIT(IIO_CHAN_INFO_HYSTERESIS) | >> + BIT(IIO_CHAN_INFO_HYSTERESIS_RELATIVE), >> + .scan_index = CHANNEL_SCAN_INDEX_COLOR_TEMP, >> + }, >> IIO_CHAN_SOFT_TIMESTAMP(CHANNEL_SCAN_INDEX_TIMESTAMP) >> }; >> >> @@ -103,6 +116,11 @@ static int als_read_raw(struct iio_dev *indio_dev, >> min = als_state->als_illum[chan->scan_index].logical_minimum; >> address = HID_USAGE_SENSOR_LIGHT_ILLUM; >> break; >> + case CHANNEL_SCAN_INDEX_COLOR_TEMP: >> + report_id = als_state->als_illum[chan->scan_index].report_id; >> + min = als_state->als_illum[chan->scan_index].logical_minimum; >> + address = HID_USAGE_SENSOR_LIGHT_COLOR_TEMPERATURE; >> + break; >> default: >> report_id = -1; >> break; >> @@ -223,6 +241,10 @@ static int als_capture_sample(struct hid_sensor_hub_device *hsdev, >> als_state->scan.illum[CHANNEL_SCAN_INDEX_ILLUM] = sample_data; >> ret = 0; >> break; >> + case HID_USAGE_SENSOR_LIGHT_COLOR_TEMPERATURE: >> + als_state->scan.illum[CHANNEL_SCAN_INDEX_COLOR_TEMP] = sample_data; >> + ret = 0; >> + break; >> case HID_USAGE_SENSOR_TIME_TIMESTAMP: >> als_state->timestamp = hid_sensor_convert_timestamp(&als_state->common_attributes, >> *(s64 *)raw_data); >> @@ -256,6 +278,17 @@ static int als_parse_report(struct platform_device *pdev, >> st->als_illum[i].report_id); >> } >> >> + ret = sensor_hub_input_get_attribute_info(hsdev, HID_INPUT_REPORT, usage_id, >> + HID_USAGE_SENSOR_LIGHT_COLOR_TEMPERATURE, >> + &st->als_illum[CHANNEL_SCAN_INDEX_COLOR_TEMP]); >> + if (ret < 0) >> + return ret; >> + als_adjust_channel_bit_mask(channels, CHANNEL_SCAN_INDEX_COLOR_TEMP, >> + st->als_illum[CHANNEL_SCAN_INDEX_COLOR_TEMP].size); >> + >> + dev_dbg(&pdev->dev, "als %x:%x\n", st->als_illum[CHANNEL_SCAN_INDEX_COLOR_TEMP].index, >> + st->als_illum[CHANNEL_SCAN_INDEX_COLOR_TEMP].report_id); >> + >> st->scale_precision = hid_sensor_format_scale(usage_id, >> &st->als_illum[CHANNEL_SCAN_INDEX_INTENSITY], >> &st->scale_pre_decml, &st->scale_post_decml); >> diff --git a/include/linux/hid-sensor-ids.h b/include/linux/hid-sensor-ids.h >> index 13b1e65fbdcc..8af4fb3e0254 100644 >> --- a/include/linux/hid-sensor-ids.h >> +++ b/include/linux/hid-sensor-ids.h >> @@ -21,6 +21,7 @@ >> #define HID_USAGE_SENSOR_ALS 0x200041 >> #define HID_USAGE_SENSOR_DATA_LIGHT 0x2004d0 >> #define HID_USAGE_SENSOR_LIGHT_ILLUM 0x2004d1 >> +#define HID_USAGE_SENSOR_LIGHT_COLOR_TEMPERATURE 0x2004d2 >> >> /* PROX (200011) */ >> #define HID_USAGE_SENSOR_PROX 0x200011