Commit 5964c927 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull LED updates from Pavel Machek:
 "This is very quiet release for LEDs, pca963 got blinking support and
  that's pretty much it"

* tag 'leds-6.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/pavel/linux-leds:
  leds: pca963: fix misleading indentation
  dt-bindings: leds: Document mmc trigger
  leds: pca963x: fix blink with hw acceleration
parents bd9a3dba 4d163215
Loading
Loading
Loading
Loading
+21 −18
Original line number Diff line number Diff line
@@ -79,7 +79,8 @@ properties:
      the LED.
    $ref: /schemas/types.yaml#/definitions/string

    enum:
    oneOf:
      - enum:
            # LED will act as a back-light, controlled by the framebuffer system
          - backlight
            # LED will turn on (but for leds-gpio see "default-state" property in
@@ -97,6 +98,8 @@ properties:
            # LED alters the brightness for the specified duration with one software
            # timer (requires "led-pattern" property)
          - pattern
        # LED is triggered by SD/MMC activity
      - pattern: "^mmc[0-9]+$"

  led-pattern:
    description: |
+20 −2
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ struct pca963x_led {
	struct pca963x *chip;
	struct led_classdev led_cdev;
	int led_num; /* 0 .. 15 potentially */
	bool blinking;
	u8 gdc;
	u8 gfrq;
};
@@ -129,12 +130,21 @@ static int pca963x_brightness(struct pca963x_led *led,

	switch (brightness) {
	case LED_FULL:
		if (led->blinking) {
			val = (ledout & ~mask) | (PCA963X_LED_GRP_PWM << shift);
			ret = i2c_smbus_write_byte_data(client,
						PCA963X_PWM_BASE +
						led->led_num,
						LED_FULL);
		} else {
			val = (ledout & ~mask) | (PCA963X_LED_ON << shift);
		}
		ret = i2c_smbus_write_byte_data(client, ledout_addr, val);
		break;
	case LED_OFF:
		val = ledout & ~mask;
		ret = i2c_smbus_write_byte_data(client, ledout_addr, val);
		led->blinking = false;
		break;
	default:
		ret = i2c_smbus_write_byte_data(client,
@@ -144,7 +154,11 @@ static int pca963x_brightness(struct pca963x_led *led,
		if (ret < 0)
			return ret;

		if (led->blinking)
			val = (ledout & ~mask) | (PCA963X_LED_GRP_PWM << shift);
		else
			val = (ledout & ~mask) | (PCA963X_LED_PWM << shift);

		ret = i2c_smbus_write_byte_data(client, ledout_addr, val);
		break;
	}
@@ -181,6 +195,7 @@ static void pca963x_blink(struct pca963x_led *led)
	}

	mutex_unlock(&led->chip->mutex);
	led->blinking = true;
}

static int pca963x_power_state(struct pca963x_led *led)
@@ -275,6 +290,8 @@ static int pca963x_blink_set(struct led_classdev *led_cdev,
	led->gfrq = gfrq;

	pca963x_blink(led);
	led->led_cdev.brightness = LED_FULL;
	pca963x_led_set(led_cdev, LED_FULL);

	*delay_on = time_on;
	*delay_off = time_off;
@@ -337,6 +354,7 @@ static int pca963x_register_leds(struct i2c_client *client,
		led->led_cdev.brightness_set_blocking = pca963x_led_set;
		if (hw_blink)
			led->led_cdev.blink_set = pca963x_blink_set;
		led->blinking = false;

		init_data.fwnode = child;
		/* for backwards compatibility */