struct hid_sensor_hub_callbacks callbacks;
        struct hid_sensor_common common_attributes;
        struct hid_sensor_hub_attribute_info als[CHANNEL_SCAN_INDEX_MAX];
+       struct iio_chan_spec channels[CHANNEL_SCAN_INDEX_MAX + 1];
        struct {
                u32 illum[CHANNEL_SCAN_INDEX_MAX];
                u64 timestamp __aligned(8);
        int scale_post_decml;
        int scale_precision;
        int value_offset;
+       int num_channels;
        s64 timestamp;
+       unsigned long als_scan_mask[2];
+};
+
+/* The order of usage ids must match scan index starting from CHANNEL_SCAN_INDEX_INTENSITY */
+static const u32 als_usage_ids[] = {
+       HID_USAGE_SENSOR_LIGHT_ILLUM,
+       HID_USAGE_SENSOR_LIGHT_ILLUM,
 };
 
 static const u32 als_sensitivity_addresses[] = {
 /* Parse report which is specific to an usage id*/
 static int als_parse_report(struct platform_device *pdev,
                                struct hid_sensor_hub_device *hsdev,
-                               struct iio_chan_spec *channels,
                                unsigned usage_id,
                                struct als_state *st)
 {
-       int ret;
+       struct iio_chan_spec *channels;
+       int ret, index = 0;
        int i;
 
-       for (i = 0; i <= CHANNEL_SCAN_INDEX_ILLUM; ++i) {
+       channels = st->channels;
+
+       for (i = 0; i < CHANNEL_SCAN_INDEX_MAX; ++i) {
                ret = sensor_hub_input_get_attribute_info(hsdev,
                                                HID_INPUT_REPORT,
                                                usage_id,
-                                               HID_USAGE_SENSOR_LIGHT_ILLUM,
+                                               als_usage_ids[i],
                                                &st->als[i]);
                if (ret < 0)
-                       return ret;
-               als_adjust_channel_bit_mask(channels, i, st->als[i].size);
+                       continue;
+
+               channels[index] = als_channels[i];
+               st->als_scan_mask[0] |= BIT(i);
+               als_adjust_channel_bit_mask(channels, index, st->als[i].size);
+               ++index;
 
                dev_dbg(&pdev->dev, "als %x:%x\n", st->als[i].index,
                        st->als[i].report_id);
        }
 
+       st->num_channels = index;
+       /* Return success even if one usage id is present */
+       if (index)
+               ret = 0;
+
        st->scale_precision = hid_sensor_format_scale(usage_id,
                                &st->als[CHANNEL_SCAN_INDEX_INTENSITY],
                                &st->scale_pre_decml, &st->scale_post_decml);
                return ret;
        }
 
-       indio_dev->channels = devm_kmemdup(&pdev->dev, als_channels,
-                                          sizeof(als_channels), GFP_KERNEL);
-       if (!indio_dev->channels) {
-               dev_err(&pdev->dev, "failed to duplicate channels\n");
-               return -ENOMEM;
-       }
-
        ret = als_parse_report(pdev, hsdev,
-                              (struct iio_chan_spec *)indio_dev->channels,
                               hsdev->usage,
                               als_state);
        if (ret) {
                return ret;
        }
 
-       indio_dev->num_channels =
-                               ARRAY_SIZE(als_channels);
+       /* Add timestamp channel */
+       als_state->channels[als_state->num_channels] = als_channels[CHANNEL_SCAN_INDEX_TIMESTAMP];
+
+       /* +1 for adding timestamp channel */
+       indio_dev->num_channels = als_state->num_channels + 1;
+
+       indio_dev->channels = als_state->channels;
+       indio_dev->available_scan_masks = als_state->als_scan_mask;
+
        indio_dev->info = &als_info;
        indio_dev->name = name;
        indio_dev->modes = INDIO_DIRECT_MODE;