Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'leds-5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/pavel/linux-leds

Pull LED updates from Pavel Machek:
"Besides the usual fixes and new drivers, we are changing CLASS_FLASH
to return success to make it easier to work with V4L2 stuff disabled,
and we are getting rid of enum that should have been plain integer
long time ago. I'm slightly nervous about potential warnings, but it
needed to be fixed at some point"

* tag 'leds-5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/pavel/linux-leds:
leds: lp50xx: Get rid of redundant explicit casting
leds: lp50xx: Update headers block to reflect reality
leds: lp50xx: Get rid of redundant check in lp50xx_enable_disable()
leds: lp50xx: Reduce level of dereferences
leds: lp50xx: Switch to new style i2c-driver probe function
leds: lp50xx: Don't spam logs when probe is deferred
leds: apu: extend support for PC Engines APU1 with newer firmware
leds: flash: Fix multicolor no-ops registration by return 0
leds: flash: Add flash registration with undefined CONFIG_LEDS_CLASS_FLASH
leds: lgm: Add LED controller driver for LGM SoC
dt-bindings: leds: Add bindings for Intel LGM SoC
leds: led-core: Get rid of enum led_brightness
leds: gpio: Set max brightness to 1
leds: lm3533: Switch to using the new API kobj_to_dev()
leds: ss4200: simplify the return expression of register_nasgpio_led()
leds: Use DEVICE_ATTR_{RW, RO, WO} macros

+1196 -169
+113
Documentation/devicetree/bindings/leds/leds-lgm.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/leds/leds-lgm.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Intel Lightning Mountain (LGM) SoC LED Serial Shift Output (SSO) Controller driver 8 + 9 + maintainers: 10 + - Zhu, Yi Xin <Yixin.zhu@intel.com> 11 + - Amireddy Mallikarjuna reddy <mallikarjunax.reddy@intel.com> 12 + 13 + properties: 14 + compatible: 15 + const: intel,lgm-ssoled 16 + 17 + gpio-controller: true 18 + 19 + '#gpio-cells': 20 + const: 2 21 + 22 + ngpios: 23 + minimum: 0 24 + maximum: 32 25 + description: 26 + Number of GPIOs this controller provides. 27 + 28 + intel,sso-update-rate-hz: 29 + description: 30 + Blink frequency for SOUTs in Hz. 31 + 32 + led-controller: 33 + type: object 34 + description: 35 + This sub-node must contain a sub-node for each leds. 36 + 37 + additionalProperties: false 38 + 39 + patternProperties: 40 + "^led@[0-23]$": 41 + type: object 42 + 43 + properties: 44 + reg: 45 + description: Index of the LED. 46 + minimum: 0 47 + maximum: 2 48 + 49 + intel,sso-hw-trigger: 50 + type: boolean 51 + description: This property indicates Hardware driven/control LED. 52 + 53 + intel,sso-hw-blink: 54 + type: boolean 55 + description: This property indicates Enable LED blink by Hardware. 56 + 57 + intel,sso-blink-rate-hz: 58 + description: LED HW blink frequency. 59 + 60 + retain-state-suspended: 61 + type: boolean 62 + description: The suspend state of LED can be retained. 63 + 64 + retain-state-shutdown: 65 + type: boolean 66 + description: Retain the state of the LED on shutdown. 67 + 68 + required: 69 + - compatible 70 + - reg 71 + - clocks 72 + - clock-names 73 + - "#gpio-cells" 74 + - gpio-controller 75 + 76 + additionalProperties: false 77 + 78 + examples: 79 + - | 80 + #include <dt-bindings/clock/intel,lgm-clk.h> 81 + #include <dt-bindings/leds/common.h> 82 + 83 + ssogpio: ssogpio@e0d40000 { 84 + compatible = "intel,sso-led"; 85 + reg = <0xE0D40000 0x2E4>; 86 + gpio-controller; 87 + #gpio-cells = <2>; 88 + ngpios = <32>; 89 + pinctrl-names = "default"; 90 + pinctrl-0 = <&pinctrl_ledc>; 91 + clocks = <&cgu0 LGM_GCLK_LEDC0>, <&afeclk>; 92 + clock-names = "sso", "fpid"; 93 + intel,sso-update-rate-hz = <250000>; 94 + 95 + led-controller { 96 + #address-cells = <1>; 97 + #size-cells = <0>; 98 + 99 + led@0 { 100 + reg = <0>; 101 + function = "gphy"; 102 + color = <LED_COLOR_ID_GREEN>; 103 + led-gpio = <&ssogpio 0 0>; 104 + }; 105 + 106 + led@23 { 107 + reg = <23>; 108 + function = LED_FUNCTION_POWER; 109 + color = <LED_COLOR_ID_GREEN>; 110 + led-gpio = <&ssogpio 23 0>; 111 + }; 112 + }; 113 + };
+3
drivers/leds/Kconfig
··· 934 934 comment "LED Triggers" 935 935 source "drivers/leds/trigger/Kconfig" 936 936 937 + comment "LED Blink" 938 + source "drivers/leds/blink/Kconfig" 939 + 937 940 endif # NEW_LEDS
+3
drivers/leds/Makefile
··· 108 108 109 109 # LED Triggers 110 110 obj-$(CONFIG_LEDS_TRIGGERS) += trigger/ 111 + 112 + # LED Blink 113 + obj-$(CONFIG_LEDS_BLINK) += blink/
+20
drivers/leds/blink/Kconfig
··· 1 + menuconfig LEDS_BLINK 2 + bool "LED Blink support" 3 + depends on LEDS_CLASS 4 + help 5 + This option enables blink support for the leds class. 6 + If unsure, say Y. 7 + 8 + if LEDS_BLINK 9 + 10 + config LEDS_BLINK_LGM 11 + tristate "LED support for Intel LGM SoC series" 12 + depends on LEDS_CLASS 13 + depends on MFD_SYSCON 14 + depends on OF 15 + help 16 + Parallel to serial conversion, which is also called SSO controller, 17 + can drive external shift register for LED outputs. 18 + This enables LED support for Serial Shift Output controller(SSO). 19 + 20 + endif # LEDS_BLINK
+2
drivers/leds/blink/Makefile
··· 1 + # SPDX-License-Identifier: GPL-2.0 2 + obj-$(CONFIG_LEDS_BLINK_LGM) += leds-lgm-sso.o
+888
drivers/leds/blink/leds-lgm-sso.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Intel Lightning Mountain SoC LED Serial Shift Output Controller driver 4 + * 5 + * Copyright (c) 2020 Intel Corporation. 6 + */ 7 + 8 + #include <linux/bitfield.h> 9 + #include <linux/clk.h> 10 + #include <linux/gpio.h> 11 + #include <linux/init.h> 12 + #include <linux/kernel.h> 13 + #include <linux/leds.h> 14 + #include <linux/mfd/syscon.h> 15 + #include <linux/module.h> 16 + #include <linux/platform_device.h> 17 + #include <linux/property.h> 18 + #include <linux/regmap.h> 19 + #include <linux/sizes.h> 20 + #include <linux/uaccess.h> 21 + 22 + #define SSO_DEV_NAME "lgm-sso" 23 + 24 + #define LED_BLINK_H8_0 0x0 25 + #define LED_BLINK_H8_1 0x4 26 + #define GET_FREQ_OFFSET(pin, src) (((pin) * 6) + ((src) * 2)) 27 + #define GET_SRC_OFFSET(pinc) (((pin) * 6) + 4) 28 + 29 + #define DUTY_CYCLE(x) (0x8 + ((x) * 4)) 30 + #define SSO_CON0 0x2B0 31 + #define SSO_CON0_RZFL BIT(26) 32 + #define SSO_CON0_BLINK_R BIT(30) 33 + #define SSO_CON0_SWU BIT(31) 34 + 35 + #define SSO_CON1 0x2B4 36 + #define SSO_CON1_FCDSC GENMASK(21, 20) /* Fixed Divider Shift Clock */ 37 + #define SSO_CON1_FPID GENMASK(24, 23) 38 + #define SSO_CON1_GPTD GENMASK(26, 25) 39 + #define SSO_CON1_US GENMASK(31, 30) 40 + 41 + #define SSO_CPU 0x2B8 42 + #define SSO_CON2 0x2C4 43 + #define SSO_CON3 0x2C8 44 + 45 + /* Driver MACRO */ 46 + #define MAX_PIN_NUM_PER_BANK SZ_32 47 + #define MAX_GROUP_NUM SZ_4 48 + #define PINS_PER_GROUP SZ_8 49 + #define FPID_FREQ_RANK_MAX SZ_4 50 + #define SSO_LED_MAX_NUM SZ_32 51 + #define MAX_FREQ_RANK 10 52 + #define DEF_GPTC_CLK_RATE 200000000 53 + #define SSO_DEF_BRIGHTNESS LED_HALF 54 + #define DATA_CLK_EDGE 0 /* 0-rising, 1-falling */ 55 + 56 + static const u32 freq_div_tbl[] = {4000, 2000, 1000, 800}; 57 + static const int freq_tbl[] = {2, 4, 8, 10, 50000, 100000, 200000, 250000}; 58 + static const int shift_clk_freq_tbl[] = {25000000, 12500000, 6250000, 3125000}; 59 + 60 + /* 61 + * Update Source to update the SOUTs 62 + * SW - Software has to update the SWU bit 63 + * GPTC - General Purpose timer is used as clock source 64 + * FPID - Divided FSC clock (FPID) is used as clock source 65 + */ 66 + enum { 67 + US_SW = 0, 68 + US_GPTC = 1, 69 + US_FPID = 2 70 + }; 71 + 72 + enum { 73 + MAX_FPID_FREQ_RANK = 5, /* 1 to 4 */ 74 + MAX_GPTC_FREQ_RANK = 9, /* 5 to 8 */ 75 + MAX_GPTC_HS_FREQ_RANK = 10, /* 9 to 10 */ 76 + }; 77 + 78 + enum { 79 + LED_GRP0_PIN_MAX = 24, 80 + LED_GRP1_PIN_MAX = 29, 81 + LED_GRP2_PIN_MAX = 32, 82 + }; 83 + 84 + enum { 85 + LED_GRP0_0_23, 86 + LED_GRP1_24_28, 87 + LED_GRP2_29_31, 88 + LED_GROUP_MAX, 89 + }; 90 + 91 + enum { 92 + CLK_SRC_FPID = 0, 93 + CLK_SRC_GPTC = 1, 94 + CLK_SRC_GPTC_HS = 2, 95 + }; 96 + 97 + struct sso_led_priv; 98 + 99 + struct sso_led_desc { 100 + const char *name; 101 + const char *default_trigger; 102 + unsigned int brightness; 103 + unsigned int blink_rate; 104 + unsigned int retain_state_suspended:1; 105 + unsigned int retain_state_shutdown:1; 106 + unsigned int panic_indicator:1; 107 + unsigned int hw_blink:1; 108 + unsigned int hw_trig:1; 109 + unsigned int blinking:1; 110 + int freq_idx; 111 + u32 pin; 112 + }; 113 + 114 + struct sso_led { 115 + struct list_head list; 116 + struct led_classdev cdev; 117 + struct gpio_desc *gpiod; 118 + struct sso_led_desc desc; 119 + struct sso_led_priv *priv; 120 + }; 121 + 122 + struct sso_gpio { 123 + struct gpio_chip chip; 124 + int shift_clk_freq; 125 + int edge; 126 + int freq; 127 + u32 pins; 128 + u32 alloc_bitmap; 129 + }; 130 + 131 + struct sso_led_priv { 132 + struct regmap *mmap; 133 + struct device *dev; 134 + struct platform_device *pdev; 135 + struct clk *gclk; 136 + struct clk *fpid_clk; 137 + u32 fpid_clkrate; 138 + u32 gptc_clkrate; 139 + u32 freq[MAX_FREQ_RANK]; 140 + struct list_head led_list; 141 + struct sso_gpio gpio; 142 + }; 143 + 144 + static int sso_get_blink_rate_idx(struct sso_led_priv *priv, u32 rate) 145 + { 146 + int i; 147 + 148 + for (i = 0; i < MAX_FREQ_RANK; i++) { 149 + if (rate <= priv->freq[i]) 150 + return i; 151 + } 152 + 153 + return -1; 154 + } 155 + 156 + static unsigned int sso_led_pin_to_group(u32 pin) 157 + { 158 + if (pin < LED_GRP0_PIN_MAX) 159 + return LED_GRP0_0_23; 160 + else if (pin < LED_GRP1_PIN_MAX) 161 + return LED_GRP1_24_28; 162 + else 163 + return LED_GRP2_29_31; 164 + } 165 + 166 + static u32 sso_led_get_freq_src(int freq_idx) 167 + { 168 + if (freq_idx < MAX_FPID_FREQ_RANK) 169 + return CLK_SRC_FPID; 170 + else if (freq_idx < MAX_GPTC_FREQ_RANK) 171 + return CLK_SRC_GPTC; 172 + else 173 + return CLK_SRC_GPTC_HS; 174 + } 175 + 176 + static u32 sso_led_pin_blink_off(u32 pin, unsigned int group) 177 + { 178 + if (group == LED_GRP2_29_31) 179 + return pin - LED_GRP1_PIN_MAX; 180 + else if (group == LED_GRP1_24_28) 181 + return pin - LED_GRP0_PIN_MAX; 182 + else /* led 0 - 23 in led 32 location */ 183 + return SSO_LED_MAX_NUM - LED_GRP1_PIN_MAX; 184 + } 185 + 186 + static struct sso_led 187 + *cdev_to_sso_led_data(struct led_classdev *led_cdev) 188 + { 189 + return container_of(led_cdev, struct sso_led, cdev); 190 + } 191 + 192 + static void sso_led_freq_set(struct sso_led_priv *priv, u32 pin, int freq_idx) 193 + { 194 + u32 reg, off, freq_src, val_freq; 195 + u32 low, high, val; 196 + unsigned int group; 197 + 198 + if (!freq_idx) 199 + return; 200 + 201 + group = sso_led_pin_to_group(pin); 202 + freq_src = sso_led_get_freq_src(freq_idx); 203 + off = sso_led_pin_blink_off(pin, group); 204 + 205 + if (group == LED_GRP0_0_23) 206 + return; 207 + else if (group == LED_GRP1_24_28) 208 + reg = LED_BLINK_H8_0; 209 + else 210 + reg = LED_BLINK_H8_1; 211 + 212 + if (freq_src == CLK_SRC_FPID) 213 + val_freq = freq_idx - 1; 214 + else if (freq_src == CLK_SRC_GPTC) 215 + val_freq = freq_idx - MAX_FPID_FREQ_RANK; 216 + 217 + /* set blink rate idx */ 218 + if (freq_src != CLK_SRC_GPTC_HS) { 219 + low = GET_FREQ_OFFSET(off, freq_src); 220 + high = low + 2; 221 + val = val_freq << high; 222 + regmap_update_bits(priv->mmap, reg, GENMASK(high, low), val); 223 + } 224 + 225 + /* select clock source */ 226 + low = GET_SRC_OFFSET(off); 227 + high = low + 2; 228 + val = freq_src << high; 229 + regmap_update_bits(priv->mmap, reg, GENMASK(high, low), val); 230 + } 231 + 232 + static void sso_led_brightness_set(struct led_classdev *led_cdev, 233 + enum led_brightness brightness) 234 + { 235 + struct sso_led_priv *priv; 236 + struct sso_led_desc *desc; 237 + struct sso_led *led; 238 + int val; 239 + 240 + led = cdev_to_sso_led_data(led_cdev); 241 + priv = led->priv; 242 + desc = &led->desc; 243 + 244 + desc->brightness = brightness; 245 + regmap_write(priv->mmap, DUTY_CYCLE(desc->pin), brightness); 246 + 247 + if (brightness == LED_OFF) 248 + val = 0; 249 + else 250 + val = 1; 251 + 252 + /* HW blink off */ 253 + if (desc->hw_blink && !val && desc->blinking) { 254 + desc->blinking = 0; 255 + regmap_update_bits(priv->mmap, SSO_CON2, BIT(desc->pin), 0); 256 + } else if (desc->hw_blink && val && !desc->blinking) { 257 + desc->blinking = 1; 258 + regmap_update_bits(priv->mmap, SSO_CON2, BIT(desc->pin), 259 + 1 << desc->pin); 260 + } 261 + 262 + if (!desc->hw_trig && led->gpiod) 263 + gpiod_set_value(led->gpiod, val); 264 + } 265 + 266 + static enum led_brightness sso_led_brightness_get(struct led_classdev *led_cdev) 267 + { 268 + struct sso_led *led = cdev_to_sso_led_data(led_cdev); 269 + 270 + return (enum led_brightness)led->desc.brightness; 271 + } 272 + 273 + static int 274 + delay_to_freq_idx(struct sso_led *led, unsigned long *delay_on, 275 + unsigned long *delay_off) 276 + { 277 + struct sso_led_priv *priv = led->priv; 278 + unsigned long delay; 279 + int freq_idx; 280 + u32 freq; 281 + 282 + if (!*delay_on && !*delay_off) { 283 + *delay_on = *delay_off = (1000 / priv->freq[0]) / 2; 284 + return 0; 285 + } 286 + 287 + delay = *delay_on + *delay_off; 288 + freq = 1000 / delay; 289 + 290 + freq_idx = sso_get_blink_rate_idx(priv, freq); 291 + if (freq_idx == -1) 292 + freq_idx = MAX_FREQ_RANK - 1; 293 + 294 + delay = 1000 / priv->freq[freq_idx]; 295 + *delay_on = *delay_off = delay / 2; 296 + 297 + if (!*delay_on) 298 + *delay_on = *delay_off = 1; 299 + 300 + return freq_idx; 301 + } 302 + 303 + static int 304 + sso_led_blink_set(struct led_classdev *led_cdev, unsigned long *delay_on, 305 + unsigned long *delay_off) 306 + { 307 + struct sso_led_priv *priv; 308 + struct sso_led *led; 309 + int freq_idx; 310 + 311 + led = cdev_to_sso_led_data(led_cdev); 312 + priv = led->priv; 313 + freq_idx = delay_to_freq_idx(led, delay_on, delay_off); 314 + 315 + sso_led_freq_set(priv, led->desc.pin, freq_idx); 316 + regmap_update_bits(priv->mmap, SSO_CON2, BIT(led->desc.pin), 317 + 1 << led->desc.pin); 318 + led->desc.freq_idx = freq_idx; 319 + led->desc.blink_rate = priv->freq[freq_idx]; 320 + led->desc.blinking = 1; 321 + 322 + return 1; 323 + } 324 + 325 + static void sso_led_hw_cfg(struct sso_led_priv *priv, struct sso_led *led) 326 + { 327 + struct sso_led_desc *desc = &led->desc; 328 + 329 + /* set freq */ 330 + if (desc->hw_blink) { 331 + sso_led_freq_set(priv, desc->pin, desc->freq_idx); 332 + regmap_update_bits(priv->mmap, SSO_CON2, BIT(desc->pin), 333 + 1 << desc->pin); 334 + } 335 + 336 + if (desc->hw_trig) 337 + regmap_update_bits(priv->mmap, SSO_CON3, BIT(desc->pin), 338 + 1 << desc->pin); 339 + 340 + /* set brightness */ 341 + regmap_write(priv->mmap, DUTY_CYCLE(desc->pin), desc->brightness); 342 + 343 + /* enable output */ 344 + if (!desc->hw_trig && desc->brightness) 345 + gpiod_set_value(led->gpiod, 1); 346 + } 347 + 348 + static int sso_create_led(struct sso_led_priv *priv, struct sso_led *led, 349 + struct fwnode_handle *child) 350 + { 351 + struct sso_led_desc *desc = &led->desc; 352 + struct led_init_data init_data; 353 + int err; 354 + 355 + init_data.fwnode = child; 356 + init_data.devicename = SSO_DEV_NAME; 357 + init_data.default_label = ":"; 358 + 359 + led->cdev.default_trigger = desc->default_trigger; 360 + led->cdev.brightness_set = sso_led_brightness_set; 361 + led->cdev.brightness_get = sso_led_brightness_get; 362 + led->cdev.brightness = desc->brightness; 363 + led->cdev.max_brightness = LED_FULL; 364 + 365 + if (desc->retain_state_shutdown) 366 + led->cdev.flags |= LED_RETAIN_AT_SHUTDOWN; 367 + if (desc->retain_state_suspended) 368 + led->cdev.flags |= LED_CORE_SUSPENDRESUME; 369 + if (desc->panic_indicator) 370 + led->cdev.flags |= LED_PANIC_INDICATOR; 371 + 372 + if (desc->hw_blink) 373 + led->cdev.blink_set = sso_led_blink_set; 374 + 375 + sso_led_hw_cfg(priv, led); 376 + 377 + err = devm_led_classdev_register_ext(priv->dev, &led->cdev, &init_data); 378 + if (err) 379 + return err; 380 + 381 + list_add(&led->list, &priv->led_list); 382 + 383 + return 0; 384 + } 385 + 386 + static void sso_init_freq(struct sso_led_priv *priv) 387 + { 388 + int i; 389 + 390 + priv->freq[0] = 0; 391 + for (i = 1; i < MAX_FREQ_RANK; i++) { 392 + if (i < MAX_FPID_FREQ_RANK) { 393 + priv->freq[i] = priv->fpid_clkrate / freq_div_tbl[i - 1]; 394 + } else if (i < MAX_GPTC_FREQ_RANK) { 395 + priv->freq[i] = priv->gptc_clkrate / 396 + freq_div_tbl[i - MAX_FPID_FREQ_RANK]; 397 + } else if (i < MAX_GPTC_HS_FREQ_RANK) { 398 + priv->freq[i] = priv->gptc_clkrate; 399 + } 400 + } 401 + } 402 + 403 + static int sso_gpio_request(struct gpio_chip *chip, unsigned int offset) 404 + { 405 + struct sso_led_priv *priv = gpiochip_get_data(chip); 406 + 407 + if (priv->gpio.alloc_bitmap & BIT(offset)) 408 + return -EINVAL; 409 + 410 + priv->gpio.alloc_bitmap |= BIT(offset); 411 + regmap_write(priv->mmap, DUTY_CYCLE(offset), 0xFF); 412 + 413 + return 0; 414 + } 415 + 416 + static void sso_gpio_free(struct gpio_chip *chip, unsigned int offset) 417 + { 418 + struct sso_led_priv *priv = gpiochip_get_data(chip); 419 + 420 + priv->gpio.alloc_bitmap &= ~BIT(offset); 421 + regmap_write(priv->mmap, DUTY_CYCLE(offset), 0x0); 422 + } 423 + 424 + static int sso_gpio_get_dir(struct gpio_chip *chip, unsigned int offset) 425 + { 426 + return GPIOF_DIR_OUT; 427 + } 428 + 429 + static int 430 + sso_gpio_dir_out(struct gpio_chip *chip, unsigned int offset, int value) 431 + { 432 + struct sso_led_priv *priv = gpiochip_get_data(chip); 433 + bool bit = !!value; 434 + 435 + regmap_update_bits(priv->mmap, SSO_CPU, BIT(offset), bit << offset); 436 + if (!priv->gpio.freq) 437 + regmap_update_bits(priv->mmap, SSO_CON0, SSO_CON0_SWU, 438 + SSO_CON0_SWU); 439 + 440 + return 0; 441 + } 442 + 443 + static int sso_gpio_get(struct gpio_chip *chip, unsigned int offset) 444 + { 445 + struct sso_led_priv *priv = gpiochip_get_data(chip); 446 + u32 reg_val; 447 + 448 + regmap_read(priv->mmap, SSO_CPU, &reg_val); 449 + 450 + return !!(reg_val & BIT(offset)); 451 + } 452 + 453 + static void sso_gpio_set(struct gpio_chip *chip, unsigned int offset, int value) 454 + { 455 + struct sso_led_priv *priv = gpiochip_get_data(chip); 456 + 457 + regmap_update_bits(priv->mmap, SSO_CPU, BIT(offset), value << offset); 458 + if (!priv->gpio.freq) 459 + regmap_update_bits(priv->mmap, SSO_CON0, SSO_CON0_SWU, 460 + SSO_CON0_SWU); 461 + } 462 + 463 + static int sso_gpio_gc_init(struct device *dev, struct sso_led_priv *priv) 464 + { 465 + struct gpio_chip *gc = &priv->gpio.chip; 466 + 467 + gc->request = sso_gpio_request; 468 + gc->free = sso_gpio_free; 469 + gc->get_direction = sso_gpio_get_dir; 470 + gc->direction_output = sso_gpio_dir_out; 471 + gc->get = sso_gpio_get; 472 + gc->set = sso_gpio_set; 473 + 474 + gc->label = "lgm-sso"; 475 + gc->base = -1; 476 + /* To exclude pins from control, use "gpio-reserved-ranges" */ 477 + gc->ngpio = priv->gpio.pins; 478 + gc->parent = dev; 479 + gc->owner = THIS_MODULE; 480 + gc->of_node = dev->of_node; 481 + 482 + return devm_gpiochip_add_data(dev, gc, priv); 483 + } 484 + 485 + static int sso_gpio_get_freq_idx(int freq) 486 + { 487 + int idx; 488 + 489 + for (idx = 0; idx < ARRAY_SIZE(freq_tbl); idx++) { 490 + if (freq <= freq_tbl[idx]) 491 + return idx; 492 + } 493 + 494 + return -1; 495 + } 496 + 497 + static void sso_register_shift_clk(struct sso_led_priv *priv) 498 + { 499 + int idx, size = ARRAY_SIZE(shift_clk_freq_tbl); 500 + u32 val = 0; 501 + 502 + for (idx = 0; idx < size; idx++) { 503 + if (shift_clk_freq_tbl[idx] <= priv->gpio.shift_clk_freq) { 504 + val = idx; 505 + break; 506 + } 507 + } 508 + 509 + if (idx == size) 510 + dev_warn(priv->dev, "%s: Invalid freq %d\n", 511 + __func__, priv->gpio.shift_clk_freq); 512 + 513 + regmap_update_bits(priv->mmap, SSO_CON1, SSO_CON1_FCDSC, 514 + FIELD_PREP(SSO_CON1_FCDSC, val)); 515 + } 516 + 517 + static int sso_gpio_freq_set(struct sso_led_priv *priv) 518 + { 519 + int freq_idx; 520 + u32 val; 521 + 522 + freq_idx = sso_gpio_get_freq_idx(priv->gpio.freq); 523 + if (freq_idx == -1) 524 + freq_idx = ARRAY_SIZE(freq_tbl) - 1; 525 + 526 + val = freq_idx % FPID_FREQ_RANK_MAX; 527 + 528 + if (!priv->gpio.freq) { 529 + regmap_update_bits(priv->mmap, SSO_CON0, SSO_CON0_BLINK_R, 0); 530 + regmap_update_bits(priv->mmap, SSO_CON1, SSO_CON1_US, 531 + FIELD_PREP(SSO_CON1_US, US_SW)); 532 + } else if (freq_idx < FPID_FREQ_RANK_MAX) { 533 + regmap_update_bits(priv->mmap, SSO_CON0, SSO_CON0_BLINK_R, 534 + SSO_CON0_BLINK_R); 535 + regmap_update_bits(priv->mmap, SSO_CON1, SSO_CON1_US, 536 + FIELD_PREP(SSO_CON1_US, US_FPID)); 537 + regmap_update_bits(priv->mmap, SSO_CON1, SSO_CON1_FPID, 538 + FIELD_PREP(SSO_CON1_FPID, val)); 539 + } else { 540 + regmap_update_bits(priv->mmap, SSO_CON0, SSO_CON0_BLINK_R, 541 + SSO_CON0_BLINK_R); 542 + regmap_update_bits(priv->mmap, SSO_CON1, SSO_CON1_US, 543 + FIELD_PREP(SSO_CON1_US, US_GPTC)); 544 + regmap_update_bits(priv->mmap, SSO_CON1, SSO_CON1_GPTD, 545 + FIELD_PREP(SSO_CON1_GPTD, val)); 546 + } 547 + 548 + return 0; 549 + } 550 + 551 + static int sso_gpio_hw_init(struct sso_led_priv *priv) 552 + { 553 + u32 activate; 554 + int i, err; 555 + 556 + /* Clear all duty cycles */ 557 + for (i = 0; i < priv->gpio.pins; i++) { 558 + err = regmap_write(priv->mmap, DUTY_CYCLE(i), 0); 559 + if (err) 560 + return err; 561 + } 562 + 563 + /* 4 groups for total 32 pins */ 564 + for (i = 1; i <= MAX_GROUP_NUM; i++) { 565 + activate = !!(i * PINS_PER_GROUP <= priv->gpio.pins || 566 + priv->gpio.pins > (i - 1) * PINS_PER_GROUP); 567 + err = regmap_update_bits(priv->mmap, SSO_CON1, BIT(i - 1), 568 + activate << (i - 1)); 569 + if (err) 570 + return err; 571 + } 572 + 573 + /* NO HW directly controlled pin by default */ 574 + err = regmap_write(priv->mmap, SSO_CON3, 0); 575 + if (err) 576 + return err; 577 + 578 + /* NO BLINK for all pins */ 579 + err = regmap_write(priv->mmap, SSO_CON2, 0); 580 + if (err) 581 + return err; 582 + 583 + /* OUTPUT 0 by default */ 584 + err = regmap_write(priv->mmap, SSO_CPU, 0); 585 + if (err) 586 + return err; 587 + 588 + /* update edge */ 589 + err = regmap_update_bits(priv->mmap, SSO_CON0, SSO_CON0_RZFL, 590 + FIELD_PREP(SSO_CON0_RZFL, priv->gpio.edge)); 591 + if (err) 592 + return err; 593 + 594 + /* Set GPIO update rate */ 595 + sso_gpio_freq_set(priv); 596 + 597 + /* Register shift clock */ 598 + sso_register_shift_clk(priv); 599 + 600 + return 0; 601 + } 602 + 603 + static void sso_led_shutdown(struct sso_led *led) 604 + { 605 + struct sso_led_priv *priv = led->priv; 606 + 607 + /* unregister led */ 608 + devm_led_classdev_unregister(priv->dev, &led->cdev); 609 + 610 + /* clear HW control bit */ 611 + if (led->desc.hw_trig) 612 + regmap_update_bits(priv->mmap, SSO_CON3, BIT(led->desc.pin), 0); 613 + 614 + if (led->gpiod) 615 + devm_gpiod_put(priv->dev, led->gpiod); 616 + 617 + led->priv = NULL; 618 + } 619 + 620 + static int 621 + __sso_led_dt_parse(struct sso_led_priv *priv, struct fwnode_handle *fw_ssoled) 622 + { 623 + struct fwnode_handle *fwnode_child; 624 + struct device *dev = priv->dev; 625 + struct sso_led_desc *desc; 626 + struct sso_led *led; 627 + struct list_head *p; 628 + const char *tmp; 629 + u32 prop; 630 + int ret; 631 + 632 + fwnode_for_each_child_node(fw_ssoled, fwnode_child) { 633 + led = devm_kzalloc(dev, sizeof(*led), GFP_KERNEL); 634 + if (!led) 635 + return -ENOMEM; 636 + 637 + INIT_LIST_HEAD(&led->list); 638 + led->priv = priv; 639 + desc = &led->desc; 640 + 641 + led->gpiod = devm_fwnode_get_gpiod_from_child(dev, NULL, 642 + fwnode_child, 643 + GPIOD_ASIS, NULL); 644 + if (IS_ERR(led->gpiod)) { 645 + dev_err(dev, "led: get gpio fail!\n"); 646 + goto __dt_err; 647 + } 648 + 649 + fwnode_property_read_string(fwnode_child, 650 + "linux,default-trigger", 651 + &desc->default_trigger); 652 + 653 + if (fwnode_property_present(fwnode_child, 654 + "retain-state-suspended")) 655 + desc->retain_state_suspended = 1; 656 + 657 + if (fwnode_property_present(fwnode_child, 658 + "retain-state-shutdown")) 659 + desc->retain_state_shutdown = 1; 660 + 661 + if (fwnode_property_present(fwnode_child, "panic-indicator")) 662 + desc->panic_indicator = 1; 663 + 664 + ret = fwnode_property_read_u32(fwnode_child, "reg", &prop); 665 + if (ret != 0 || prop >= SSO_LED_MAX_NUM) { 666 + dev_err(dev, "invalid LED pin:%u\n", prop); 667 + goto __dt_err; 668 + } 669 + desc->pin = prop; 670 + 671 + if (fwnode_property_present(fwnode_child, "intel,sso-hw-blink")) 672 + desc->hw_blink = 1; 673 + 674 + desc->hw_trig = fwnode_property_read_bool(fwnode_child, 675 + "intel,sso-hw-trigger"); 676 + if (desc->hw_trig) { 677 + desc->default_trigger = NULL; 678 + desc->retain_state_shutdown = 0; 679 + desc->retain_state_suspended = 0; 680 + desc->panic_indicator = 0; 681 + desc->hw_blink = 0; 682 + } 683 + 684 + if (fwnode_property_read_u32(fwnode_child, 685 + "intel,sso-blink-rate-hz", &prop)) { 686 + /* default first freq rate */ 687 + desc->freq_idx = 0; 688 + desc->blink_rate = priv->freq[desc->freq_idx]; 689 + } else { 690 + desc->freq_idx = sso_get_blink_rate_idx(priv, prop); 691 + if (desc->freq_idx == -1) 692 + desc->freq_idx = MAX_FREQ_RANK - 1; 693 + 694 + desc->blink_rate = priv->freq[desc->freq_idx]; 695 + } 696 + 697 + if (!fwnode_property_read_string(fwnode_child, "default-state", &tmp)) { 698 + if (!strcmp(tmp, "on")) 699 + desc->brightness = LED_FULL; 700 + } 701 + 702 + if (sso_create_led(priv, led, fwnode_child)) 703 + goto __dt_err; 704 + } 705 + fwnode_handle_put(fw_ssoled); 706 + 707 + return 0; 708 + __dt_err: 709 + fwnode_handle_put(fw_ssoled); 710 + /* unregister leds */ 711 + list_for_each(p, &priv->led_list) { 712 + led = list_entry(p, struct sso_led, list); 713 + sso_led_shutdown(led); 714 + } 715 + 716 + return -EINVAL; 717 + } 718 + 719 + static int sso_led_dt_parse(struct sso_led_priv *priv) 720 + { 721 + struct fwnode_handle *fwnode = dev_fwnode(priv->dev); 722 + struct fwnode_handle *fw_ssoled; 723 + struct device *dev = priv->dev; 724 + int count; 725 + int ret; 726 + 727 + count = device_get_child_node_count(dev); 728 + if (!count) 729 + return 0; 730 + 731 + fw_ssoled = fwnode_get_named_child_node(fwnode, "ssoled"); 732 + if (fw_ssoled) { 733 + ret = __sso_led_dt_parse(priv, fw_ssoled); 734 + if (ret) 735 + return ret; 736 + } 737 + 738 + return 0; 739 + } 740 + 741 + static int sso_probe_gpios(struct sso_led_priv *priv) 742 + { 743 + struct device *dev = priv->dev; 744 + int ret; 745 + 746 + if (device_property_read_u32(dev, "ngpios", &priv->gpio.pins)) 747 + priv->gpio.pins = MAX_PIN_NUM_PER_BANK; 748 + 749 + if (priv->gpio.pins > MAX_PIN_NUM_PER_BANK) 750 + return -EINVAL; 751 + 752 + if (device_property_read_u32(dev, "intel,sso-update-rate-hz", 753 + &priv->gpio.freq)) 754 + priv->gpio.freq = 0; 755 + 756 + priv->gpio.edge = DATA_CLK_EDGE; 757 + priv->gpio.shift_clk_freq = -1; 758 + 759 + ret = sso_gpio_hw_init(priv); 760 + if (ret) 761 + return ret; 762 + 763 + return sso_gpio_gc_init(dev, priv); 764 + } 765 + 766 + static void sso_clk_disable(void *data) 767 + { 768 + struct sso_led_priv *priv = data; 769 + 770 + clk_disable_unprepare(priv->fpid_clk); 771 + clk_disable_unprepare(priv->gclk); 772 + } 773 + 774 + static int intel_sso_led_probe(struct platform_device *pdev) 775 + { 776 + struct device *dev = &pdev->dev; 777 + struct sso_led_priv *priv; 778 + int ret; 779 + 780 + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 781 + if (!priv) 782 + return -ENOMEM; 783 + 784 + priv->pdev = pdev; 785 + priv->dev = dev; 786 + 787 + /* gate clock */ 788 + priv->gclk = devm_clk_get(dev, "sso"); 789 + if (IS_ERR(priv->gclk)) { 790 + dev_err(dev, "get sso gate clock failed!\n"); 791 + return PTR_ERR(priv->gclk); 792 + } 793 + 794 + ret = clk_prepare_enable(priv->gclk); 795 + if (ret) { 796 + dev_err(dev, "Failed to prepate/enable sso gate clock!\n"); 797 + return ret; 798 + } 799 + 800 + priv->fpid_clk = devm_clk_get(dev, "fpid"); 801 + if (IS_ERR(priv->fpid_clk)) { 802 + dev_err(dev, "Failed to get fpid clock!\n"); 803 + return PTR_ERR(priv->fpid_clk); 804 + } 805 + 806 + ret = clk_prepare_enable(priv->fpid_clk); 807 + if (ret) { 808 + dev_err(dev, "Failed to prepare/enable fpid clock!\n"); 809 + return ret; 810 + } 811 + priv->fpid_clkrate = clk_get_rate(priv->fpid_clk); 812 + 813 + ret = devm_add_action_or_reset(dev, sso_clk_disable, priv); 814 + if (ret) { 815 + dev_err(dev, "Failed to devm_add_action_or_reset, %d\n", ret); 816 + return ret; 817 + } 818 + 819 + priv->mmap = syscon_node_to_regmap(dev->of_node); 820 + if (IS_ERR(priv->mmap)) { 821 + dev_err(dev, "Failed to map iomem!\n"); 822 + return PTR_ERR(priv->mmap); 823 + } 824 + 825 + ret = sso_probe_gpios(priv); 826 + if (ret) { 827 + regmap_exit(priv->mmap); 828 + return ret; 829 + } 830 + 831 + INIT_LIST_HEAD(&priv->led_list); 832 + 833 + platform_set_drvdata(pdev, priv); 834 + sso_init_freq(priv); 835 + 836 + priv->gptc_clkrate = DEF_GPTC_CLK_RATE; 837 + 838 + ret = sso_led_dt_parse(priv); 839 + if (ret) { 840 + regmap_exit(priv->mmap); 841 + return ret; 842 + } 843 + dev_info(priv->dev, "sso LED init success!\n"); 844 + 845 + return 0; 846 + } 847 + 848 + static int intel_sso_led_remove(struct platform_device *pdev) 849 + { 850 + struct sso_led_priv *priv; 851 + struct list_head *pos, *n; 852 + struct sso_led *led; 853 + 854 + priv = platform_get_drvdata(pdev); 855 + 856 + list_for_each_safe(pos, n, &priv->led_list) { 857 + list_del(pos); 858 + led = list_entry(pos, struct sso_led, list); 859 + sso_led_shutdown(led); 860 + } 861 + 862 + clk_disable_unprepare(priv->fpid_clk); 863 + clk_disable_unprepare(priv->gclk); 864 + regmap_exit(priv->mmap); 865 + 866 + return 0; 867 + } 868 + 869 + static const struct of_device_id of_sso_led_match[] = { 870 + { .compatible = "intel,lgm-ssoled" }, 871 + {} 872 + }; 873 + 874 + MODULE_DEVICE_TABLE(of, of_sso_led_match); 875 + 876 + static struct platform_driver intel_sso_led_driver = { 877 + .probe = intel_sso_led_probe, 878 + .remove = intel_sso_led_remove, 879 + .driver = { 880 + .name = "lgm-ssoled", 881 + .of_match_table = of_match_ptr(of_sso_led_match), 882 + }, 883 + }; 884 + 885 + module_platform_driver(intel_sso_led_driver); 886 + 887 + MODULE_DESCRIPTION("Intel SSO LED/GPIO driver"); 888 + MODULE_LICENSE("GPL v2");
+1 -2
drivers/leds/led-class.c
··· 145 145 device_remove_file(led_cdev->dev, &dev_attr_brightness_hw_changed); 146 146 } 147 147 148 - void led_classdev_notify_brightness_hw_changed(struct led_classdev *led_cdev, 149 - enum led_brightness brightness) 148 + void led_classdev_notify_brightness_hw_changed(struct led_classdev *led_cdev, unsigned int brightness) 150 149 { 151 150 if (WARN_ON(!led_cdev->brightness_hw_changed_kn)) 152 151 return;
+7 -13
drivers/leds/led-core.c
··· 39 39 }; 40 40 EXPORT_SYMBOL_GPL(led_colors); 41 41 42 - static int __led_set_brightness(struct led_classdev *led_cdev, 43 - enum led_brightness value) 42 + static int __led_set_brightness(struct led_classdev *led_cdev, unsigned int value) 44 43 { 45 44 if (!led_cdev->brightness_set) 46 45 return -ENOTSUPP; ··· 49 50 return 0; 50 51 } 51 52 52 - static int __led_set_brightness_blocking(struct led_classdev *led_cdev, 53 - enum led_brightness value) 53 + static int __led_set_brightness_blocking(struct led_classdev *led_cdev, unsigned int value) 54 54 { 55 55 if (!led_cdev->brightness_set_blocking) 56 56 return -ENOTSUPP; ··· 238 240 } 239 241 EXPORT_SYMBOL_GPL(led_stop_software_blink); 240 242 241 - void led_set_brightness(struct led_classdev *led_cdev, 242 - enum led_brightness brightness) 243 + void led_set_brightness(struct led_classdev *led_cdev, unsigned int brightness) 243 244 { 244 245 /* 245 246 * If software blink is active, delay brightness setting ··· 250 253 * work queue task to avoid problems in case we are called 251 254 * from hard irq context. 252 255 */ 253 - if (brightness == LED_OFF) { 256 + if (!brightness) { 254 257 set_bit(LED_BLINK_DISABLE, &led_cdev->work_flags); 255 258 schedule_work(&led_cdev->set_brightness_work); 256 259 } else { ··· 265 268 } 266 269 EXPORT_SYMBOL_GPL(led_set_brightness); 267 270 268 - void led_set_brightness_nopm(struct led_classdev *led_cdev, 269 - enum led_brightness value) 271 + void led_set_brightness_nopm(struct led_classdev *led_cdev, unsigned int value) 270 272 { 271 273 /* Use brightness_set op if available, it is guaranteed not to sleep */ 272 274 if (!__led_set_brightness(led_cdev, value)) ··· 277 281 } 278 282 EXPORT_SYMBOL_GPL(led_set_brightness_nopm); 279 283 280 - void led_set_brightness_nosleep(struct led_classdev *led_cdev, 281 - enum led_brightness value) 284 + void led_set_brightness_nosleep(struct led_classdev *led_cdev, unsigned int value) 282 285 { 283 286 led_cdev->brightness = min(value, led_cdev->max_brightness); 284 287 ··· 288 293 } 289 294 EXPORT_SYMBOL_GPL(led_set_brightness_nosleep); 290 295 291 - int led_set_brightness_sync(struct led_classdev *led_cdev, 292 - enum led_brightness value) 296 + int led_set_brightness_sync(struct led_classdev *led_cdev, unsigned int value) 293 297 { 294 298 if (led_cdev->blink_delay_on || led_cdev->blink_delay_off) 295 299 return -EBUSY;
+10 -1
drivers/leds/leds-apu.c
··· 83 83 }; 84 84 85 85 static const struct dmi_system_id apu_led_dmi_table[] __initconst = { 86 + /* PC Engines APU with factory bios "SageBios_PCEngines_APU-45" */ 86 87 { 87 88 .ident = "apu", 88 89 .matches = { 89 90 DMI_MATCH(DMI_SYS_VENDOR, "PC Engines"), 90 91 DMI_MATCH(DMI_PRODUCT_NAME, "APU") 92 + } 93 + }, 94 + /* PC Engines APU with "Mainline" bios >= 4.6.8 */ 95 + { 96 + .ident = "apu", 97 + .matches = { 98 + DMI_MATCH(DMI_SYS_VENDOR, "PC Engines"), 99 + DMI_MATCH(DMI_PRODUCT_NAME, "apu1") 91 100 } 92 101 }, 93 102 {} ··· 182 173 int err; 183 174 184 175 if (!(dmi_match(DMI_SYS_VENDOR, "PC Engines") && 185 - dmi_match(DMI_PRODUCT_NAME, "APU"))) { 176 + (dmi_match(DMI_PRODUCT_NAME, "APU") || dmi_match(DMI_PRODUCT_NAME, "apu1")))) { 186 177 pr_err("No PC Engines APUv1 board detected. For APUv2,3 support, enable CONFIG_PCENGINES_APU2\n"); 187 178 return -ENODEV; 188 179 }
+12 -12
drivers/leds/leds-blinkm.c
··· 192 192 return 0; 193 193 } 194 194 195 - static ssize_t show_red(struct device *dev, struct device_attribute *attr, 195 + static ssize_t red_show(struct device *dev, struct device_attribute *attr, 196 196 char *buf) 197 197 { 198 198 return show_color_common(dev, buf, RED); 199 199 } 200 200 201 - static ssize_t store_red(struct device *dev, struct device_attribute *attr, 201 + static ssize_t red_store(struct device *dev, struct device_attribute *attr, 202 202 const char *buf, size_t count) 203 203 { 204 204 int ret; ··· 209 209 return count; 210 210 } 211 211 212 - static DEVICE_ATTR(red, S_IRUGO | S_IWUSR, show_red, store_red); 212 + static DEVICE_ATTR_RW(red); 213 213 214 - static ssize_t show_green(struct device *dev, struct device_attribute *attr, 214 + static ssize_t green_show(struct device *dev, struct device_attribute *attr, 215 215 char *buf) 216 216 { 217 217 return show_color_common(dev, buf, GREEN); 218 218 } 219 219 220 - static ssize_t store_green(struct device *dev, struct device_attribute *attr, 220 + static ssize_t green_store(struct device *dev, struct device_attribute *attr, 221 221 const char *buf, size_t count) 222 222 { 223 223 ··· 229 229 return count; 230 230 } 231 231 232 - static DEVICE_ATTR(green, S_IRUGO | S_IWUSR, show_green, store_green); 232 + static DEVICE_ATTR_RW(green); 233 233 234 - static ssize_t show_blue(struct device *dev, struct device_attribute *attr, 234 + static ssize_t blue_show(struct device *dev, struct device_attribute *attr, 235 235 char *buf) 236 236 { 237 237 return show_color_common(dev, buf, BLUE); 238 238 } 239 239 240 - static ssize_t store_blue(struct device *dev, struct device_attribute *attr, 240 + static ssize_t blue_store(struct device *dev, struct device_attribute *attr, 241 241 const char *buf, size_t count) 242 242 { 243 243 int ret; ··· 248 248 return count; 249 249 } 250 250 251 - static DEVICE_ATTR(blue, S_IRUGO | S_IWUSR, show_blue, store_blue); 251 + static DEVICE_ATTR_RW(blue); 252 252 253 - static ssize_t show_test(struct device *dev, struct device_attribute *attr, 253 + static ssize_t test_show(struct device *dev, struct device_attribute *attr, 254 254 char *buf) 255 255 { 256 256 return scnprintf(buf, PAGE_SIZE, 257 257 "#Write into test to start test sequence!#\n"); 258 258 } 259 259 260 - static ssize_t store_test(struct device *dev, struct device_attribute *attr, 260 + static ssize_t test_store(struct device *dev, struct device_attribute *attr, 261 261 const char *buf, size_t count) 262 262 { 263 263 ··· 273 273 return count; 274 274 } 275 275 276 - static DEVICE_ATTR(test, S_IRUGO | S_IWUSR, show_test, store_test); 276 + static DEVICE_ATTR_RW(test); 277 277 278 278 /* TODO: HSB, fade, timeadj, script ... */ 279 279
+2 -1
drivers/leds/leds-gpio.c
··· 96 96 } else { 97 97 state = (template->default_state == LEDS_GPIO_DEFSTATE_ON); 98 98 } 99 - led_dat->cdev.brightness = state ? LED_FULL : LED_OFF; 99 + led_dat->cdev.brightness = state; 100 + led_dat->cdev.max_brightness = 1; 100 101 if (!template->retain_state_suspended) 101 102 led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; 102 103 if (template->panic_indicator)
+5 -5
drivers/leds/leds-lm3530.c
··· 346 346 } 347 347 } 348 348 349 - static ssize_t lm3530_mode_get(struct device *dev, 350 - struct device_attribute *attr, char *buf) 349 + static ssize_t mode_show(struct device *dev, 350 + struct device_attribute *attr, char *buf) 351 351 { 352 352 struct led_classdev *led_cdev = dev_get_drvdata(dev); 353 353 struct lm3530_data *drvdata; ··· 365 365 return len; 366 366 } 367 367 368 - static ssize_t lm3530_mode_set(struct device *dev, struct device_attribute 369 - *attr, const char *buf, size_t size) 368 + static ssize_t mode_store(struct device *dev, struct device_attribute 369 + *attr, const char *buf, size_t size) 370 370 { 371 371 struct led_classdev *led_cdev = dev_get_drvdata(dev); 372 372 struct lm3530_data *drvdata; ··· 397 397 398 398 return sizeof(drvdata->mode); 399 399 } 400 - static DEVICE_ATTR(mode, 0644, lm3530_mode_get, lm3530_mode_set); 400 + static DEVICE_ATTR_RW(mode); 401 401 402 402 static struct attribute *lm3530_attrs[] = { 403 403 &dev_attr_mode.attr,
+1 -1
drivers/leds/leds-lm3533.c
··· 608 608 static umode_t lm3533_led_attr_is_visible(struct kobject *kobj, 609 609 struct attribute *attr, int n) 610 610 { 611 - struct device *dev = container_of(kobj, struct device, kobj); 611 + struct device *dev = kobj_to_dev(kobj); 612 612 struct led_classdev *led_cdev = dev_get_drvdata(dev); 613 613 struct lm3533_led *led = to_lm3533_led(led_cdev); 614 614 umode_t mode = attr->mode;
+4 -4
drivers/leds/leds-lm355x.c
··· 349 349 } 350 350 351 351 /* indicator pattern only for lm3556*/ 352 - static ssize_t lm3556_indicator_pattern_store(struct device *dev, 353 - struct device_attribute *attr, 354 - const char *buf, size_t size) 352 + static ssize_t pattern_store(struct device *dev, 353 + struct device_attribute *attr, 354 + const char *buf, size_t size) 355 355 { 356 356 ssize_t ret; 357 357 struct led_classdev *led_cdev = dev_get_drvdata(dev); ··· 381 381 return ret; 382 382 } 383 383 384 - static DEVICE_ATTR(pattern, S_IWUSR, NULL, lm3556_indicator_pattern_store); 384 + static DEVICE_ATTR_WO(pattern); 385 385 386 386 static struct attribute *lm355x_indicator_attrs[] = { 387 387 &dev_attr_pattern.attr,
+8 -8
drivers/leds/leds-lm3642.c
··· 165 165 /* torch */ 166 166 167 167 /* torch pin config for lm3642 */ 168 - static ssize_t lm3642_torch_pin_store(struct device *dev, 169 - struct device_attribute *attr, 170 - const char *buf, size_t size) 168 + static ssize_t torch_pin_store(struct device *dev, 169 + struct device_attribute *attr, 170 + const char *buf, size_t size) 171 171 { 172 172 ssize_t ret; 173 173 struct led_classdev *led_cdev = dev_get_drvdata(dev); ··· 193 193 return size; 194 194 } 195 195 196 - static DEVICE_ATTR(torch_pin, S_IWUSR, NULL, lm3642_torch_pin_store); 196 + static DEVICE_ATTR_WO(torch_pin); 197 197 198 198 static int lm3642_torch_brightness_set(struct led_classdev *cdev, 199 199 enum led_brightness brightness) ··· 212 212 /* flash */ 213 213 214 214 /* strobe pin config for lm3642*/ 215 - static ssize_t lm3642_strobe_pin_store(struct device *dev, 216 - struct device_attribute *attr, 217 - const char *buf, size_t size) 215 + static ssize_t strobe_pin_store(struct device *dev, 216 + struct device_attribute *attr, 217 + const char *buf, size_t size) 218 218 { 219 219 ssize_t ret; 220 220 struct led_classdev *led_cdev = dev_get_drvdata(dev); ··· 240 240 return size; 241 241 } 242 242 243 - static DEVICE_ATTR(strobe_pin, S_IWUSR, NULL, lm3642_strobe_pin_store); 243 + static DEVICE_ATTR_WO(strobe_pin); 244 244 245 245 static int lm3642_strobe_brightness_set(struct led_classdev *cdev, 246 246 enum led_brightness brightness)
+37 -46
drivers/leds/leds-lp50xx.c
··· 6 6 #include <linux/i2c.h> 7 7 #include <linux/init.h> 8 8 #include <linux/leds.h> 9 + #include <linux/mod_devicetable.h> 9 10 #include <linux/module.h> 10 11 #include <linux/mutex.h> 11 - #include <linux/of.h> 12 - #include <linux/of_gpio.h> 13 12 #include <linux/regmap.h> 14 13 #include <linux/regulator/consumer.h> 15 14 #include <linux/slab.h> ··· 321 322 322 323 ret = regmap_write(led->priv->regmap, reg_val, brightness); 323 324 if (ret) { 324 - dev_err(&led->priv->client->dev, 325 + dev_err(led->priv->dev, 325 326 "Cannot write brightness value %d\n", ret); 326 327 goto out; 327 328 } ··· 337 338 ret = regmap_write(led->priv->regmap, reg_val, 338 339 mc_dev->subled_info[i].intensity); 339 340 if (ret) { 340 - dev_err(&led->priv->client->dev, 341 + dev_err(led->priv->dev, 341 342 "Cannot write intensity value %d\n", ret); 342 343 goto out; 343 344 } ··· 359 360 bank_enable_mask |= (1 << led_banks[i]); 360 361 } 361 362 362 - led_config_lo = (u8)(bank_enable_mask & 0xff); 363 - led_config_hi = (u8)(bank_enable_mask >> 8) & 0xff; 363 + led_config_lo = bank_enable_mask; 364 + led_config_hi = bank_enable_mask >> 8; 364 365 365 366 ret = regmap_write(priv->regmap, LP50XX_LED_CFG0, led_config_lo); 366 367 if (ret) ··· 381 382 { 382 383 int ret; 383 384 384 - if (priv->enable_gpio) { 385 - ret = gpiod_direction_output(priv->enable_gpio, enable_disable); 386 - if (ret) 387 - return ret; 388 - } 385 + ret = gpiod_direction_output(priv->enable_gpio, enable_disable); 386 + if (ret) 387 + return ret; 389 388 390 389 if (enable_disable) 391 390 return regmap_write(priv->regmap, LP50XX_DEV_CFG0, LP50XX_CHIP_EN); ··· 401 404 402 405 if (num_leds > 1) { 403 406 if (num_leds > priv->chip_info->max_modules) { 404 - dev_err(&priv->client->dev, "reg property is invalid\n"); 407 + dev_err(priv->dev, "reg property is invalid\n"); 405 408 return -EINVAL; 406 409 } 407 410 ··· 409 412 410 413 ret = fwnode_property_read_u32_array(child, "reg", led_banks, num_leds); 411 414 if (ret) { 412 - dev_err(&priv->client->dev, "reg property is missing\n"); 415 + dev_err(priv->dev, "reg property is missing\n"); 413 416 return ret; 414 417 } 415 418 416 419 ret = lp50xx_set_banks(priv, led_banks); 417 420 if (ret) { 418 - dev_err(&priv->client->dev, "Cannot setup banked LEDs\n"); 421 + dev_err(priv->dev, "Cannot setup banked LEDs\n"); 419 422 return ret; 420 423 } 421 424 ··· 423 426 } else { 424 427 ret = fwnode_property_read_u32(child, "reg", &led_number); 425 428 if (ret) { 426 - dev_err(&priv->client->dev, "led reg property missing\n"); 429 + dev_err(priv->dev, "led reg property missing\n"); 427 430 return ret; 428 431 } 429 432 430 433 if (led_number > priv->chip_info->num_leds) { 431 - dev_err(&priv->client->dev, "led-sources property is invalid\n"); 434 + dev_err(priv->dev, "led-sources property is invalid\n"); 432 435 return -EINVAL; 433 436 } 434 437 ··· 452 455 int i = 0; 453 456 454 457 priv->enable_gpio = devm_gpiod_get_optional(priv->dev, "enable", GPIOD_OUT_LOW); 455 - if (IS_ERR(priv->enable_gpio)) { 456 - ret = PTR_ERR(priv->enable_gpio); 457 - dev_err(&priv->client->dev, "Failed to get enable gpio: %d\n", 458 - ret); 459 - return ret; 460 - } 458 + if (IS_ERR(priv->enable_gpio)) 459 + return dev_err_probe(priv->dev, PTR_ERR(priv->enable_gpio), 460 + "Failed to get enable GPIO\n"); 461 461 462 462 priv->regulator = devm_regulator_get(priv->dev, "vled"); 463 463 if (IS_ERR(priv->regulator)) ··· 464 470 led = &priv->leds[i]; 465 471 ret = fwnode_property_count_u32(child, "reg"); 466 472 if (ret < 0) { 467 - dev_err(&priv->client->dev, "reg property is invalid\n"); 473 + dev_err(priv->dev, "reg property is invalid\n"); 468 474 goto child_out; 469 475 } 470 476 ··· 504 510 led_cdev = &led->mc_cdev.led_cdev; 505 511 led_cdev->brightness_set_blocking = lp50xx_brightness_set; 506 512 507 - ret = devm_led_classdev_multicolor_register_ext(&priv->client->dev, 513 + ret = devm_led_classdev_multicolor_register_ext(priv->dev, 508 514 &led->mc_cdev, 509 515 &init_data); 510 516 if (ret) { 511 - dev_err(&priv->client->dev, "led register err: %d\n", 512 - ret); 517 + dev_err(priv->dev, "led register err: %d\n", ret); 513 518 goto child_out; 514 519 } 515 520 i++; ··· 522 529 return ret; 523 530 } 524 531 525 - static int lp50xx_probe(struct i2c_client *client, 526 - const struct i2c_device_id *id) 532 + static int lp50xx_probe(struct i2c_client *client) 527 533 { 528 534 struct lp50xx *led; 529 535 int count; ··· 542 550 mutex_init(&led->lock); 543 551 led->client = client; 544 552 led->dev = &client->dev; 545 - led->chip_info = &lp50xx_chip_info_tbl[id->driver_data]; 553 + led->chip_info = device_get_match_data(&client->dev); 546 554 i2c_set_clientdata(client, led); 547 555 led->regmap = devm_regmap_init_i2c(client, 548 556 led->chip_info->lp50xx_regmap_config); ··· 571 579 572 580 ret = lp50xx_enable_disable(led, 0); 573 581 if (ret) { 574 - dev_err(&led->client->dev, "Failed to disable chip\n"); 582 + dev_err(led->dev, "Failed to disable chip\n"); 575 583 return ret; 576 584 } 577 585 578 586 if (led->regulator) { 579 587 ret = regulator_disable(led->regulator); 580 588 if (ret) 581 - dev_err(&led->client->dev, 582 - "Failed to disable regulator\n"); 589 + dev_err(led->dev, "Failed to disable regulator\n"); 583 590 } 584 591 585 592 mutex_destroy(&led->lock); ··· 587 596 } 588 597 589 598 static const struct i2c_device_id lp50xx_id[] = { 590 - { "lp5009", LP5009 }, 591 - { "lp5012", LP5012 }, 592 - { "lp5018", LP5018 }, 593 - { "lp5024", LP5024 }, 594 - { "lp5030", LP5030 }, 595 - { "lp5036", LP5036 }, 599 + { "lp5009", (kernel_ulong_t)&lp50xx_chip_info_tbl[LP5009] }, 600 + { "lp5012", (kernel_ulong_t)&lp50xx_chip_info_tbl[LP5012] }, 601 + { "lp5018", (kernel_ulong_t)&lp50xx_chip_info_tbl[LP5018] }, 602 + { "lp5024", (kernel_ulong_t)&lp50xx_chip_info_tbl[LP5024] }, 603 + { "lp5030", (kernel_ulong_t)&lp50xx_chip_info_tbl[LP5030] }, 604 + { "lp5036", (kernel_ulong_t)&lp50xx_chip_info_tbl[LP5036] }, 596 605 { } 597 606 }; 598 607 MODULE_DEVICE_TABLE(i2c, lp50xx_id); 599 608 600 609 static const struct of_device_id of_lp50xx_leds_match[] = { 601 - { .compatible = "ti,lp5009", .data = (void *)LP5009 }, 602 - { .compatible = "ti,lp5012", .data = (void *)LP5012 }, 603 - { .compatible = "ti,lp5018", .data = (void *)LP5018 }, 604 - { .compatible = "ti,lp5024", .data = (void *)LP5024 }, 605 - { .compatible = "ti,lp5030", .data = (void *)LP5030 }, 606 - { .compatible = "ti,lp5036", .data = (void *)LP5036 }, 607 - {}, 610 + { .compatible = "ti,lp5009", .data = &lp50xx_chip_info_tbl[LP5009] }, 611 + { .compatible = "ti,lp5012", .data = &lp50xx_chip_info_tbl[LP5012] }, 612 + { .compatible = "ti,lp5018", .data = &lp50xx_chip_info_tbl[LP5018] }, 613 + { .compatible = "ti,lp5024", .data = &lp50xx_chip_info_tbl[LP5024] }, 614 + { .compatible = "ti,lp5030", .data = &lp50xx_chip_info_tbl[LP5030] }, 615 + { .compatible = "ti,lp5036", .data = &lp50xx_chip_info_tbl[LP5036] }, 616 + {} 608 617 }; 609 618 MODULE_DEVICE_TABLE(of, of_lp50xx_leds_match); 610 619 ··· 613 622 .name = "lp50xx", 614 623 .of_match_table = of_lp50xx_leds_match, 615 624 }, 616 - .probe = lp50xx_probe, 625 + .probe_new = lp50xx_probe, 617 626 .remove = lp50xx_remove, 618 627 .id_table = lp50xx_id, 619 628 };
+6 -6
drivers/leds/leds-max8997.c
··· 160 160 } 161 161 } 162 162 163 - static ssize_t max8997_led_show_mode(struct device *dev, 164 - struct device_attribute *attr, char *buf) 163 + static ssize_t mode_show(struct device *dev, 164 + struct device_attribute *attr, char *buf) 165 165 { 166 166 struct led_classdev *led_cdev = dev_get_drvdata(dev); 167 167 struct max8997_led *led = ··· 193 193 return ret; 194 194 } 195 195 196 - static ssize_t max8997_led_store_mode(struct device *dev, 197 - struct device_attribute *attr, 198 - const char *buf, size_t size) 196 + static ssize_t mode_store(struct device *dev, 197 + struct device_attribute *attr, 198 + const char *buf, size_t size) 199 199 { 200 200 struct led_classdev *led_cdev = dev_get_drvdata(dev); 201 201 struct max8997_led *led = ··· 222 222 return size; 223 223 } 224 224 225 - static DEVICE_ATTR(mode, 0644, max8997_led_show_mode, max8997_led_store_mode); 225 + static DEVICE_ATTR_RW(mode); 226 226 227 227 static struct attribute *max8997_attrs[] = { 228 228 &dev_attr_mode.attr,
+6 -6
drivers/leds/leds-netxbig.c
··· 204 204 spin_unlock_irqrestore(&led_dat->lock, flags); 205 205 } 206 206 207 - static ssize_t netxbig_led_sata_store(struct device *dev, 208 - struct device_attribute *attr, 209 - const char *buff, size_t count) 207 + static ssize_t sata_store(struct device *dev, 208 + struct device_attribute *attr, 209 + const char *buff, size_t count) 210 210 { 211 211 struct led_classdev *led_cdev = dev_get_drvdata(dev); 212 212 struct netxbig_led_data *led_dat = ··· 255 255 return ret; 256 256 } 257 257 258 - static ssize_t netxbig_led_sata_show(struct device *dev, 259 - struct device_attribute *attr, char *buf) 258 + static ssize_t sata_show(struct device *dev, 259 + struct device_attribute *attr, char *buf) 260 260 { 261 261 struct led_classdev *led_cdev = dev_get_drvdata(dev); 262 262 struct netxbig_led_data *led_dat = ··· 265 265 return sprintf(buf, "%d\n", led_dat->sata); 266 266 } 267 267 268 - static DEVICE_ATTR(sata, 0644, netxbig_led_sata_show, netxbig_led_sata_store); 268 + static DEVICE_ATTR_RW(sata); 269 269 270 270 static struct attribute *netxbig_led_attrs[] = { 271 271 &dev_attr_sata.attr,
+7 -11
drivers/leds/leds-ss4200.c
··· 441 441 nasgpio_led_set_brightness(&amber->led_cdev, LED_FULL); 442 442 } 443 443 444 - static ssize_t nas_led_blink_show(struct device *dev, 445 - struct device_attribute *attr, char *buf) 444 + static ssize_t blink_show(struct device *dev, 445 + struct device_attribute *attr, char *buf) 446 446 { 447 447 struct led_classdev *led = dev_get_drvdata(dev); 448 448 int blinking = 0; ··· 451 451 return sprintf(buf, "%u\n", blinking); 452 452 } 453 453 454 - static ssize_t nas_led_blink_store(struct device *dev, 455 - struct device_attribute *attr, 456 - const char *buf, size_t size) 454 + static ssize_t blink_store(struct device *dev, 455 + struct device_attribute *attr, 456 + const char *buf, size_t size) 457 457 { 458 458 int ret; 459 459 struct led_classdev *led = dev_get_drvdata(dev); ··· 468 468 return size; 469 469 } 470 470 471 - static DEVICE_ATTR(blink, 0644, nas_led_blink_show, nas_led_blink_store); 471 + static DEVICE_ATTR_RW(blink); 472 472 473 473 static struct attribute *nasgpio_led_attrs[] = { 474 474 &dev_attr_blink.attr, ··· 478 478 479 479 static int register_nasgpio_led(int led_nr) 480 480 { 481 - int ret; 482 481 struct nasgpio_led *nas_led = &nasgpio_leds[led_nr]; 483 482 struct led_classdev *led = get_classdev_for_led_nr(led_nr); 484 483 ··· 488 489 led->brightness_set = nasgpio_led_set_brightness; 489 490 led->blink_set = nasgpio_led_set_blink; 490 491 led->groups = nasgpio_led_groups; 491 - ret = led_classdev_register(&nas_gpio_pci_dev->dev, led); 492 - if (ret) 493 - return ret; 494 492 495 - return 0; 493 + return led_classdev_register(&nas_gpio_pci_dev->dev, led); 496 494 } 497 495 498 496 static void unregister_nasgpio_led(int led_nr)
+6 -6
drivers/leds/leds-wm831x-status.c
··· 155 155 "soft", 156 156 }; 157 157 158 - static ssize_t wm831x_status_src_show(struct device *dev, 159 - struct device_attribute *attr, char *buf) 158 + static ssize_t src_show(struct device *dev, 159 + struct device_attribute *attr, char *buf) 160 160 { 161 161 struct led_classdev *led_cdev = dev_get_drvdata(dev); 162 162 struct wm831x_status *led = to_wm831x_status(led_cdev); ··· 178 178 return ret; 179 179 } 180 180 181 - static ssize_t wm831x_status_src_store(struct device *dev, 182 - struct device_attribute *attr, 183 - const char *buf, size_t size) 181 + static ssize_t src_store(struct device *dev, 182 + struct device_attribute *attr, 183 + const char *buf, size_t size) 184 184 { 185 185 struct led_classdev *led_cdev = dev_get_drvdata(dev); 186 186 struct wm831x_status *led = to_wm831x_status(led_cdev); ··· 197 197 return size; 198 198 } 199 199 200 - static DEVICE_ATTR(src, 0644, wm831x_status_src_show, wm831x_status_src_store); 200 + static DEVICE_ATTR_RW(src); 201 201 202 202 static struct attribute *wm831x_status_attrs[] = { 203 203 &dev_attr_src.attr,
+2 -4
drivers/leds/leds.h
··· 19 19 20 20 void led_init_core(struct led_classdev *led_cdev); 21 21 void led_stop_software_blink(struct led_classdev *led_cdev); 22 - void led_set_brightness_nopm(struct led_classdev *led_cdev, 23 - enum led_brightness value); 24 - void led_set_brightness_nosleep(struct led_classdev *led_cdev, 25 - enum led_brightness value); 22 + void led_set_brightness_nopm(struct led_classdev *led_cdev, unsigned int value); 23 + void led_set_brightness_nosleep(struct led_classdev *led_cdev, unsigned int value); 26 24 ssize_t led_trigger_read(struct file *filp, struct kobject *kobj, 27 25 struct bin_attribute *attr, char *buf, 28 26 loff_t pos, size_t count);
+33 -9
include/linux/led-class-flash.h
··· 85 85 return container_of(lcdev, struct led_classdev_flash, led_cdev); 86 86 } 87 87 88 + #if IS_ENABLED(CONFIG_LEDS_CLASS_FLASH) 88 89 /** 89 90 * led_classdev_flash_register_ext - register a new object of LED class with 90 91 * init data and with support for flash LEDs ··· 98 97 int led_classdev_flash_register_ext(struct device *parent, 99 98 struct led_classdev_flash *fled_cdev, 100 99 struct led_init_data *init_data); 101 - 102 - static inline int led_classdev_flash_register(struct device *parent, 103 - struct led_classdev_flash *fled_cdev) 104 - { 105 - return led_classdev_flash_register_ext(parent, fled_cdev, NULL); 106 - } 107 100 108 101 /** 109 102 * led_classdev_flash_unregister - unregisters an object of led_classdev class ··· 113 118 struct led_init_data *init_data); 114 119 115 120 121 + void devm_led_classdev_flash_unregister(struct device *parent, 122 + struct led_classdev_flash *fled_cdev); 123 + 124 + #else 125 + 126 + static inline int led_classdev_flash_register_ext(struct device *parent, 127 + struct led_classdev_flash *fled_cdev, 128 + struct led_init_data *init_data) 129 + { 130 + return 0; 131 + } 132 + 133 + static inline void led_classdev_flash_unregister(struct led_classdev_flash *fled_cdev) {}; 134 + static inline int devm_led_classdev_flash_register_ext(struct device *parent, 135 + struct led_classdev_flash *fled_cdev, 136 + struct led_init_data *init_data) 137 + { 138 + return 0; 139 + } 140 + 141 + static inline void devm_led_classdev_flash_unregister(struct device *parent, 142 + struct led_classdev_flash *fled_cdev) 143 + {}; 144 + 145 + #endif /* IS_ENABLED(CONFIG_LEDS_CLASS_FLASH) */ 146 + 147 + static inline int led_classdev_flash_register(struct device *parent, 148 + struct led_classdev_flash *fled_cdev) 149 + { 150 + return led_classdev_flash_register_ext(parent, fled_cdev, NULL); 151 + } 152 + 116 153 static inline int devm_led_classdev_flash_register(struct device *parent, 117 154 struct led_classdev_flash *fled_cdev) 118 155 { 119 156 return devm_led_classdev_flash_register_ext(parent, fled_cdev, NULL); 120 157 } 121 - 122 - void devm_led_classdev_flash_unregister(struct device *parent, 123 - struct led_classdev_flash *fled_cdev); 124 158 125 159 /** 126 160 * led_set_flash_strobe - setup flash strobe
+15 -27
include/linux/led-class-multicolor.h
··· 44 44 struct led_classdev_mc *mcled_cdev, 45 45 struct led_init_data *init_data); 46 46 47 - static inline int led_classdev_multicolor_register(struct device *parent, 48 - struct led_classdev_mc *mcled_cdev) 49 - { 50 - return led_classdev_multicolor_register_ext(parent, mcled_cdev, NULL); 51 - } 52 - 53 47 /** 54 48 * led_classdev_multicolor_unregister - unregisters an object of led_classdev 55 49 * class with support for multicolor LEDs ··· 62 68 struct led_classdev_mc *mcled_cdev, 63 69 struct led_init_data *init_data); 64 70 65 - static inline int devm_led_classdev_multicolor_register(struct device *parent, 66 - struct led_classdev_mc *mcled_cdev) 67 - { 68 - return devm_led_classdev_multicolor_register_ext(parent, mcled_cdev, 69 - NULL); 70 - } 71 - 72 71 void devm_led_classdev_multicolor_unregister(struct device *parent, 73 72 struct led_classdev_mc *mcled_cdev); 74 73 #else ··· 70 83 struct led_classdev_mc *mcled_cdev, 71 84 struct led_init_data *init_data) 72 85 { 73 - return -EINVAL; 74 - } 75 - 76 - static inline int led_classdev_multicolor_register(struct device *parent, 77 - struct led_classdev_mc *mcled_cdev) 78 - { 79 - return led_classdev_multicolor_register_ext(parent, mcled_cdev, NULL); 86 + return 0; 80 87 } 81 88 82 89 static inline void led_classdev_multicolor_unregister(struct led_classdev_mc *mcled_cdev) {}; 83 90 static inline int led_mc_calc_color_components(struct led_classdev_mc *mcled_cdev, 84 91 enum led_brightness brightness) 85 92 { 86 - return -EINVAL; 93 + return 0; 87 94 } 88 95 89 96 static inline int devm_led_classdev_multicolor_register_ext(struct device *parent, 90 97 struct led_classdev_mc *mcled_cdev, 91 98 struct led_init_data *init_data) 92 99 { 93 - return -EINVAL; 100 + return 0; 101 + } 102 + 103 + static inline void devm_led_classdev_multicolor_unregister(struct device *parent, 104 + struct led_classdev_mc *mcled_cdev) 105 + {}; 106 + 107 + #endif /* IS_ENABLED(CONFIG_LEDS_CLASS_MULTICOLOR) */ 108 + 109 + static inline int led_classdev_multicolor_register(struct device *parent, 110 + struct led_classdev_mc *mcled_cdev) 111 + { 112 + return led_classdev_multicolor_register_ext(parent, mcled_cdev, NULL); 94 113 } 95 114 96 115 static inline int devm_led_classdev_multicolor_register(struct device *parent, ··· 106 113 NULL); 107 114 } 108 115 109 - static inline void devm_led_classdev_multicolor_unregister(struct device *parent, 110 - struct led_classdev_mc *mcled_cdev) 111 - {}; 112 - 113 - #endif /* IS_ENABLED(CONFIG_LEDS_CLASS_MULTICOLOR) */ 114 116 #endif /* _LINUX_MULTICOLOR_LEDS_H_INCLUDED */
+5 -7
include/linux/leds.h
··· 63 63 64 64 struct led_classdev { 65 65 const char *name; 66 - enum led_brightness brightness; 67 - enum led_brightness max_brightness; 66 + unsigned int brightness; 67 + unsigned int max_brightness; 68 68 int flags; 69 69 70 70 /* Lower 16 bits reflect status */ ··· 253 253 * software blink timer that implements blinking when the 254 254 * hardware doesn't. This function is guaranteed not to sleep. 255 255 */ 256 - void led_set_brightness(struct led_classdev *led_cdev, 257 - enum led_brightness brightness); 256 + void led_set_brightness(struct led_classdev *led_cdev, unsigned int brightness); 258 257 259 258 /** 260 259 * led_set_brightness_sync - set LED brightness synchronously ··· 266 267 * 267 268 * Returns: 0 on success or negative error value on failure 268 269 */ 269 - int led_set_brightness_sync(struct led_classdev *led_cdev, 270 - enum led_brightness value); 270 + int led_set_brightness_sync(struct led_classdev *led_cdev, unsigned int value); 271 271 272 272 /** 273 273 * led_update_brightness - update LED brightness ··· 563 565 564 566 #ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED 565 567 void led_classdev_notify_brightness_hw_changed( 566 - struct led_classdev *led_cdev, enum led_brightness brightness); 568 + struct led_classdev *led_cdev, unsigned int brightness); 567 569 #else 568 570 static inline void led_classdev_notify_brightness_hw_changed( 569 571 struct led_classdev *led_cdev, enum led_brightness brightness) { }