Re: [PATCH 1/2] leds: ktd20xx: Add the KTD20xx family of the RGB LEDs driver from Kinetic

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Florian,

url:    https://github.com/0day-ci/linux/commits/Florian-Eckert/leds-Add-KTD20xx-RGB-LEDs-driver-from-Kinetic/20211109-181728
base:   git://git.kernel.org/pub/scm/linux/kernel/git/pavel/linux-leds.git for-next
config: i386-randconfig-m031-20211115 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>
Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>

smatch warnings:
drivers/leds/leds-ktd20xx.c:304 ktd20xx_probe_dt() warn: missing error code 'ret'
drivers/leds/leds-ktd20xx.c:492 current_color0_store() warn: unsigned 'value[i]' is never less than zero.
drivers/leds/leds-ktd20xx.c:566 current_color1_store() warn: unsigned 'value[i]' is never less than zero.
drivers/leds/leds-ktd20xx.c:661 faderate_store() warn: unsigned 'faderate' is never less than zero.

vim +/ret +304 drivers/leds/leds-ktd20xx.c

004e74105bb360 Florian Eckert 2021-11-09  281  static int ktd20xx_probe_dt(struct ktd20xx *chip)
004e74105bb360 Florian Eckert 2021-11-09  282  {
004e74105bb360 Florian Eckert 2021-11-09  283  	struct fwnode_handle *child = NULL;
004e74105bb360 Florian Eckert 2021-11-09  284  	struct led_init_data init_data = {};
004e74105bb360 Florian Eckert 2021-11-09  285  	struct led_classdev *led_cdev;
004e74105bb360 Florian Eckert 2021-11-09  286  	struct ktd20xx_led *led;
004e74105bb360 Florian Eckert 2021-11-09  287  	struct device *dev = &chip->client->dev;
004e74105bb360 Florian Eckert 2021-11-09  288  	u8 value[3] = { 0, 0, 0 };
004e74105bb360 Florian Eckert 2021-11-09  289  	int i = 0;
004e74105bb360 Florian Eckert 2021-11-09  290  	int ret = -EINVAL;
004e74105bb360 Florian Eckert 2021-11-09  291  	int color;
004e74105bb360 Florian Eckert 2021-11-09  292  
004e74105bb360 Florian Eckert 2021-11-09  293  	device_for_each_child_node(chip->dev, child) {
004e74105bb360 Florian Eckert 2021-11-09  294  		led = &chip->leds[i];
004e74105bb360 Florian Eckert 2021-11-09  295  
004e74105bb360 Florian Eckert 2021-11-09  296  		ret = fwnode_property_read_u32(child, "reg", &led->index);
004e74105bb360 Florian Eckert 2021-11-09  297  		if (ret) {
004e74105bb360 Florian Eckert 2021-11-09  298  			dev_err(dev, "missing property: reg\n");
004e74105bb360 Florian Eckert 2021-11-09  299  			goto child_out;
004e74105bb360 Florian Eckert 2021-11-09  300  		}
004e74105bb360 Florian Eckert 2021-11-09  301  		if (led->index >= KTD20XX_MAX_LEDS) {
004e74105bb360 Florian Eckert 2021-11-09  302  			dev_warn(dev, "property 'reg' must contain value between '0' and '%i'\n",
004e74105bb360 Florian Eckert 2021-11-09  303  					KTD20XX_MAX_LEDS);

ret = -EINVAL;

004e74105bb360 Florian Eckert 2021-11-09 @304  			goto child_out;
004e74105bb360 Florian Eckert 2021-11-09  305  		}
004e74105bb360 Florian Eckert 2021-11-09  306  
004e74105bb360 Florian Eckert 2021-11-09  307  		ret = fwnode_property_read_u32(child, "color", &color);
004e74105bb360 Florian Eckert 2021-11-09  308  		if (ret) {
004e74105bb360 Florian Eckert 2021-11-09  309  			dev_err(dev, "missing property: color\n");
004e74105bb360 Florian Eckert 2021-11-09  310  			goto child_out;
004e74105bb360 Florian Eckert 2021-11-09  311  		}
004e74105bb360 Florian Eckert 2021-11-09  312  		if (color != LED_COLOR_ID_RGB) {
004e74105bb360 Florian Eckert 2021-11-09  313  			dev_warn(dev, "property 'color' must contain value 'LED_COLOR_ID_RGB'\n");

ret = -EINVAL;

004e74105bb360 Florian Eckert 2021-11-09  314  			goto child_out;
004e74105bb360 Florian Eckert 2021-11-09  315  		}
004e74105bb360 Florian Eckert 2021-11-09  316  
004e74105bb360 Florian Eckert 2021-11-09  317  		/* Get default color register selection */
004e74105bb360 Florian Eckert 2021-11-09  318  		if (fwnode_property_read_u8_array(child, "kinetic,color-selection", value, 3))
004e74105bb360 Florian Eckert 2021-11-09  319  			dev_warn(dev, "no kinetic,color-selection property found, use default rgbt color selection from register 0.\n");
004e74105bb360 Florian Eckert 2021-11-09  320  
004e74105bb360 Florian Eckert 2021-11-09  321  		led->subled_info[0].color_index = LED_COLOR_ID_RED;
004e74105bb360 Florian Eckert 2021-11-09  322  		led->subled_info[0].channel = 0;
004e74105bb360 Florian Eckert 2021-11-09  323  		led->subled_info[0].intensity = value[0];
004e74105bb360 Florian Eckert 2021-11-09  324  		led->subled_info[1].color_index = LED_COLOR_ID_GREEN;
004e74105bb360 Florian Eckert 2021-11-09  325  		led->subled_info[1].channel = 1;
004e74105bb360 Florian Eckert 2021-11-09  326  		led->subled_info[1].intensity = value[1];
004e74105bb360 Florian Eckert 2021-11-09  327  		led->subled_info[2].color_index = LED_COLOR_ID_BLUE;
004e74105bb360 Florian Eckert 2021-11-09  328  		led->subled_info[2].channel = 2;
004e74105bb360 Florian Eckert 2021-11-09  329  		led->subled_info[2].intensity = value[2];
004e74105bb360 Florian Eckert 2021-11-09  330  
004e74105bb360 Florian Eckert 2021-11-09  331  		led->mc_cdev.subled_info = led->subled_info;
004e74105bb360 Florian Eckert 2021-11-09  332  		led->mc_cdev.num_colors = KTD20XX_LED_CHANNELS;
004e74105bb360 Florian Eckert 2021-11-09  333  
004e74105bb360 Florian Eckert 2021-11-09  334  		init_data.fwnode = child;
004e74105bb360 Florian Eckert 2021-11-09  335  
004e74105bb360 Florian Eckert 2021-11-09  336  		led->chip = chip;
004e74105bb360 Florian Eckert 2021-11-09  337  		led_cdev = &led->mc_cdev.led_cdev;
004e74105bb360 Florian Eckert 2021-11-09  338  		led_cdev->brightness_set_blocking = ktd20xx_brightness_set;
004e74105bb360 Florian Eckert 2021-11-09  339  
004e74105bb360 Florian Eckert 2021-11-09  340  		switch (led->index) {
004e74105bb360 Florian Eckert 2021-11-09  341  		case RGB_A1:
004e74105bb360 Florian Eckert 2021-11-09  342  			led->select = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  343  					chip->regmap, kt20xx_a1_select);
004e74105bb360 Florian Eckert 2021-11-09  344  			led->enable = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  345  					chip->regmap, kt20xx_a1_enable);
004e74105bb360 Florian Eckert 2021-11-09  346  			break;
004e74105bb360 Florian Eckert 2021-11-09  347  		case RGB_A2:
004e74105bb360 Florian Eckert 2021-11-09  348  			led->select = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  349  					chip->regmap, kt20xx_a2_select);
004e74105bb360 Florian Eckert 2021-11-09  350  			led->enable = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  351  					chip->regmap, kt20xx_a2_enable);
004e74105bb360 Florian Eckert 2021-11-09  352  			break;
004e74105bb360 Florian Eckert 2021-11-09  353  		case RGB_A3:
004e74105bb360 Florian Eckert 2021-11-09  354  			led->select = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  355  					chip->regmap, kt20xx_a3_select);
004e74105bb360 Florian Eckert 2021-11-09  356  			led->enable = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  357  					chip->regmap, kt20xx_a3_enable);
004e74105bb360 Florian Eckert 2021-11-09  358  			break;
004e74105bb360 Florian Eckert 2021-11-09  359  		case RGB_A4:
004e74105bb360 Florian Eckert 2021-11-09  360  			led->select = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  361  					chip->regmap, kt20xx_a4_select);
004e74105bb360 Florian Eckert 2021-11-09  362  			led->enable = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  363  					chip->regmap, kt20xx_a4_enable);
004e74105bb360 Florian Eckert 2021-11-09  364  			break;
004e74105bb360 Florian Eckert 2021-11-09  365  		case RGB_B1:
004e74105bb360 Florian Eckert 2021-11-09  366  			led->select = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  367  					chip->regmap, kt20xx_b1_select);
004e74105bb360 Florian Eckert 2021-11-09  368  			led->enable = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  369  					chip->regmap, kt20xx_b1_enable);
004e74105bb360 Florian Eckert 2021-11-09  370  			break;
004e74105bb360 Florian Eckert 2021-11-09  371  		case RGB_B2:
004e74105bb360 Florian Eckert 2021-11-09  372  			led->select = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  373  					chip->regmap, kt20xx_b2_select);
004e74105bb360 Florian Eckert 2021-11-09  374  			led->enable = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  375  					chip->regmap, kt20xx_b2_enable);
004e74105bb360 Florian Eckert 2021-11-09  376  			break;
004e74105bb360 Florian Eckert 2021-11-09  377  		case RGB_B3:
004e74105bb360 Florian Eckert 2021-11-09  378  			led->select = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  379  					chip->regmap, kt20xx_b3_select);
004e74105bb360 Florian Eckert 2021-11-09  380  			led->enable = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  381  					chip->regmap, kt20xx_b3_enable);
004e74105bb360 Florian Eckert 2021-11-09  382  			break;
004e74105bb360 Florian Eckert 2021-11-09  383  		case RGB_B4:
004e74105bb360 Florian Eckert 2021-11-09  384  			led->select = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  385  					chip->regmap, kt20xx_b4_select);
004e74105bb360 Florian Eckert 2021-11-09  386  			led->enable = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  387  					chip->regmap, kt20xx_b4_enable);
004e74105bb360 Florian Eckert 2021-11-09  388  			break;
004e74105bb360 Florian Eckert 2021-11-09  389  		case RGB_C1:
004e74105bb360 Florian Eckert 2021-11-09  390  			led->select = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  391  					chip->regmap, kt20xx_c1_select);
004e74105bb360 Florian Eckert 2021-11-09  392  			led->enable = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  393  					chip->regmap, kt20xx_c1_enable);
004e74105bb360 Florian Eckert 2021-11-09  394  			break;
004e74105bb360 Florian Eckert 2021-11-09  395  		case RGB_C2:
004e74105bb360 Florian Eckert 2021-11-09  396  			led->select = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  397  					chip->regmap, kt20xx_c2_select);
004e74105bb360 Florian Eckert 2021-11-09  398  			led->enable = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  399  					chip->regmap, kt20xx_c2_enable);
004e74105bb360 Florian Eckert 2021-11-09  400  			break;
004e74105bb360 Florian Eckert 2021-11-09  401  		case RGB_C3:
004e74105bb360 Florian Eckert 2021-11-09  402  			led->select = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  403  					chip->regmap, kt20xx_c3_select);
004e74105bb360 Florian Eckert 2021-11-09  404  			led->enable = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  405  					chip->regmap, kt20xx_c3_enable);
004e74105bb360 Florian Eckert 2021-11-09  406  			break;
004e74105bb360 Florian Eckert 2021-11-09  407  		case RGB_C4:
004e74105bb360 Florian Eckert 2021-11-09  408  			led->select = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  409  					chip->regmap, kt20xx_c4_select);
004e74105bb360 Florian Eckert 2021-11-09  410  			led->enable = devm_regmap_field_alloc(chip->dev,
004e74105bb360 Florian Eckert 2021-11-09  411  					chip->regmap, kt20xx_c4_enable);
004e74105bb360 Florian Eckert 2021-11-09  412  			break;
004e74105bb360 Florian Eckert 2021-11-09  413  		}
004e74105bb360 Florian Eckert 2021-11-09  414  
004e74105bb360 Florian Eckert 2021-11-09  415  		ret = devm_led_classdev_multicolor_register_ext(&chip->client->dev,
004e74105bb360 Florian Eckert 2021-11-09  416  			&led->mc_cdev,
004e74105bb360 Florian Eckert 2021-11-09  417  			&init_data);
004e74105bb360 Florian Eckert 2021-11-09  418  
004e74105bb360 Florian Eckert 2021-11-09  419  		if (ret) {
004e74105bb360 Florian Eckert 2021-11-09  420  			dev_err(&chip->client->dev, "led register err: %d\n", ret);
004e74105bb360 Florian Eckert 2021-11-09  421  			goto child_out;
004e74105bb360 Florian Eckert 2021-11-09  422  		}
004e74105bb360 Florian Eckert 2021-11-09  423  
004e74105bb360 Florian Eckert 2021-11-09  424  		i++;
004e74105bb360 Florian Eckert 2021-11-09  425  		fwnode_handle_put(child);
004e74105bb360 Florian Eckert 2021-11-09  426  	}
004e74105bb360 Florian Eckert 2021-11-09  427  
004e74105bb360 Florian Eckert 2021-11-09  428  	return 0;
004e74105bb360 Florian Eckert 2021-11-09  429  
004e74105bb360 Florian Eckert 2021-11-09  430  child_out:
004e74105bb360 Florian Eckert 2021-11-09  431  	fwnode_handle_put(child);
004e74105bb360 Florian Eckert 2021-11-09  432  	return ret;
004e74105bb360 Florian Eckert 2021-11-09  433  }
004e74105bb360 Florian Eckert 2021-11-09  434  
004e74105bb360 Florian Eckert 2021-11-09  435  /* Device attribute for color0 register
004e74105bb360 Florian Eckert 2021-11-09  436   *
004e74105bb360 Florian Eckert 2021-11-09  437   * The device attribute colour1 is intended to adjust the colour space.
004e74105bb360 Florian Eckert 2021-11-09  438   * The colour strength can be controlled via the current in 125uA steps.
004e74105bb360 Florian Eckert 2021-11-09  439   * The maximum current for the individual channels is limited to 24mA.
004e74105bb360 Florian Eckert 2021-11-09  440   * To set a new RGB value, 3 values must be passed. This value may not be
004e74105bb360 Florian Eckert 2021-11-09  441   * less than 0 and also not greater than 194. The chip can only process the
004e74105bb360 Florian Eckert 2021-11-09  442   * maximum current of 24mA. This means that any value greater than 194
004e74105bb360 Florian Eckert 2021-11-09  443   * cannot be set.
004e74105bb360 Florian Eckert 2021-11-09  444   */
004e74105bb360 Florian Eckert 2021-11-09  445  static ssize_t current_color0_show(struct device *dev,
004e74105bb360 Florian Eckert 2021-11-09  446  		struct device_attribute *a,
004e74105bb360 Florian Eckert 2021-11-09  447  		char *buf)
004e74105bb360 Florian Eckert 2021-11-09  448  {
004e74105bb360 Florian Eckert 2021-11-09  449  	struct i2c_client *client = to_i2c_client(dev);
004e74105bb360 Florian Eckert 2021-11-09  450  	struct ktd20xx *chip = i2c_get_clientdata(client);
004e74105bb360 Florian Eckert 2021-11-09  451  	unsigned int value;
004e74105bb360 Florian Eckert 2021-11-09  452  	int len = 0;
004e74105bb360 Florian Eckert 2021-11-09  453  
004e74105bb360 Florian Eckert 2021-11-09  454  	mutex_lock(&chip->lock);
004e74105bb360 Florian Eckert 2021-11-09  455  	regmap_read(chip->regmap, KTD20XX_IRED0, &value);
004e74105bb360 Florian Eckert 2021-11-09  456  	len += sprintf(buf + len, "%d", value);
004e74105bb360 Florian Eckert 2021-11-09  457  	len += sprintf(buf + len, " ");
004e74105bb360 Florian Eckert 2021-11-09  458  
004e74105bb360 Florian Eckert 2021-11-09  459  	regmap_read(chip->regmap, KTD20XX_IGRN0, &value);
004e74105bb360 Florian Eckert 2021-11-09  460  	len += sprintf(buf + len, "%d", value);
004e74105bb360 Florian Eckert 2021-11-09  461  	len += sprintf(buf + len, " ");
004e74105bb360 Florian Eckert 2021-11-09  462  
004e74105bb360 Florian Eckert 2021-11-09  463  	regmap_read(chip->regmap, KTD20XX_IBLU0, &value);
004e74105bb360 Florian Eckert 2021-11-09  464  	len += sprintf(buf + len, "%d", value);
004e74105bb360 Florian Eckert 2021-11-09  465  	mutex_unlock(&chip->lock);
004e74105bb360 Florian Eckert 2021-11-09  466  
004e74105bb360 Florian Eckert 2021-11-09  467  	buf[len++] = '\n';
004e74105bb360 Florian Eckert 2021-11-09  468  	return len;
004e74105bb360 Florian Eckert 2021-11-09  469  }
004e74105bb360 Florian Eckert 2021-11-09  470  
004e74105bb360 Florian Eckert 2021-11-09  471  static ssize_t current_color0_store(struct device *dev,
004e74105bb360 Florian Eckert 2021-11-09  472  		struct device_attribute *a,
004e74105bb360 Florian Eckert 2021-11-09  473  		const char *buf, size_t size)
004e74105bb360 Florian Eckert 2021-11-09  474  {
004e74105bb360 Florian Eckert 2021-11-09  475  	struct i2c_client *client = to_i2c_client(dev);
004e74105bb360 Florian Eckert 2021-11-09  476  	struct ktd20xx *chip = i2c_get_clientdata(client);
004e74105bb360 Florian Eckert 2021-11-09  477  	unsigned int value[3];
004e74105bb360 Florian Eckert 2021-11-09  478  	int i;
004e74105bb360 Florian Eckert 2021-11-09  479  	ssize_t ret;
004e74105bb360 Florian Eckert 2021-11-09  480  
004e74105bb360 Florian Eckert 2021-11-09  481  	ret = sscanf(buf, "%u %u %u", &value[0], &value[1], &value[2]);
004e74105bb360 Florian Eckert 2021-11-09  482  	if (ret < 3) {
004e74105bb360 Florian Eckert 2021-11-09  483  		ret = -EINVAL;
004e74105bb360 Florian Eckert 2021-11-09  484  		goto err_out;
004e74105bb360 Florian Eckert 2021-11-09  485  	}
004e74105bb360 Florian Eckert 2021-11-09  486  
004e74105bb360 Florian Eckert 2021-11-09  487  	for (i = 0; i < 3; i++) {
004e74105bb360 Florian Eckert 2021-11-09  488  		if (value[i] > 194) {
004e74105bb360 Florian Eckert 2021-11-09  489  			ret = -EINVAL;
004e74105bb360 Florian Eckert 2021-11-09  490  			goto err_out;
004e74105bb360 Florian Eckert 2021-11-09  491  		}
004e74105bb360 Florian Eckert 2021-11-09 @492  		if (value[i] < 0) {
                                                            ^^^^^^^^^^^^
Impossible

004e74105bb360 Florian Eckert 2021-11-09  493  			ret = -EINVAL;
004e74105bb360 Florian Eckert 2021-11-09  494  			goto err_out;
004e74105bb360 Florian Eckert 2021-11-09  495  		}
004e74105bb360 Florian Eckert 2021-11-09  496  	}
004e74105bb360 Florian Eckert 2021-11-09  497  
004e74105bb360 Florian Eckert 2021-11-09  498  	mutex_lock(&chip->lock);
004e74105bb360 Florian Eckert 2021-11-09  499  	regmap_write(chip->regmap, KTD20XX_IRED0, value[0]);
004e74105bb360 Florian Eckert 2021-11-09  500  	regmap_write(chip->regmap, KTD20XX_IGRN0, value[1]);
004e74105bb360 Florian Eckert 2021-11-09  501  	regmap_write(chip->regmap, KTD20XX_IBLU0, value[2]);
004e74105bb360 Florian Eckert 2021-11-09  502  	mutex_unlock(&chip->lock);
004e74105bb360 Florian Eckert 2021-11-09  503  	return size;
004e74105bb360 Florian Eckert 2021-11-09  504  
004e74105bb360 Florian Eckert 2021-11-09  505  err_out:
004e74105bb360 Florian Eckert 2021-11-09  506  	return ret;
004e74105bb360 Florian Eckert 2021-11-09  507  }

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux