Hi![...]
+ for (i = 0; i < mcled_cdev->num_colors; i++)
+ mcled_cdev->multicolor_info[i].color_brightness = brightness *
+ mcled_cdev->multicolor_info[i].color_led_intensity /
+ led_cdev->max_brightness;
It would be good to get this under ~80 characters. Perhaps shorter
identifiers would help... shortening multicolor_ to mc_?
+static ssize_t multi_led_intensity_store(struct device *dev,
+ struct device_attribute *intensity_attr,
+ const char *buf, size_t size)
+{
+ struct led_classdev *led_cdev = dev_get_drvdata(dev);
+ struct led_classdev_mc *mcled_cdev = lcdev_to_mccdev(led_cdev);
+ int nrchars, offset = 0;
+ int intensity_value[LED_COLOR_ID_MAX];
+ int i;
+ ssize_t ret;
+
+ mutex_lock(&led_cdev->led_access);
+
+ for (i = 0; i < mcled_cdev->num_colors; i++) {
+ ret = sscanf(buf + offset, "%i%n",
+ &intensity_value[i], &nrchars);
+ if (ret != 1) {
+ dev_err(led_cdev->dev,
dev_dbg, at most. It is user-triggerable.
+ "Incorrect number of LEDs expected %i values intensity was not applied\n",
+ mcled_cdev->num_colors);
+ goto err_out;
Should not we return -ERRNO to userspace on error?
+ }
+ offset += nrchars;
+ }
This checks for "not enough" intensities. Do we need check for "too
many" intensities?
+static ssize_t multi_led_intensity_show(struct device *dev,
+ struct device_attribute *intensity_attr,
+ char *buf)
+{
+ struct led_classdev *led_cdev = dev_get_drvdata(dev);
+ struct led_classdev_mc *mcled_cdev = lcdev_to_mccdev(led_cdev);
+ int len = 0;
+ int i;
+
+ for (i = 0; i < mcled_cdev->num_colors; i++)
+ len += sprintf(buf + len, "%d ",
+ mcled_cdev->multicolor_info[i].color_led_intensity);
+
+ len += sprintf(buf + len, "%s", "\n");
This will result in extra " " before end of line.
Please don't use "%s", "\n" to add single character. "\n" would be enough.
+ struct led_classdev *led_cdev = dev_get_drvdata(dev);
+ struct led_classdev_mc *mcled_cdev = lcdev_to_mccdev(led_cdev);
+ int len = 0;
+ int index;
+ int i;
+
+ for (i = 0; i < mcled_cdev->num_colors; i++) {
+ index = mcled_cdev->multicolor_info[i].color_index;
+ len += sprintf(buf + len, "%s ", led_colors[index]);
+ }
+
+ len += sprintf(buf + len, "%s", "\n");
Same here.
+int led_classdev_multicolor_register_ext(struct device *parent,
+ struct led_classdev_mc *mcled_cdev,
+ struct led_init_data *init_data)
+{
+ struct led_classdev *led_cdev;
+
+ if (!mcled_cdev)
+ return -EINVAL;
+
+ if (!mcled_cdev->num_colors)
+ return -EINVAL;
if (num_colors > max)... ?
+#ifndef __LINUX_MULTICOLOR_LEDS_H_INCLUDED
+#define __LINUX_MULTICOLOR_LEDS_H_INCLUDED
Usual style is "_LINUX_MULTICOLOR_LEDS_H".
+#else
+
+static inline int led_classdev_multicolor_register_ext(struct device *parent,
double space after "inline".
+ struct led_classdev_mc *mcled_cdev,
+ struct led_init_data *init_data)
+{
+ return -EINVAL;
+}
Do we need to include these stubs? I guess it is okay to have them,
OTOH I'd expect drivers to depend on MULTICOLOR being available...