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

Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds

Pull LED subsystem updates from Bryan Wu:
- lp55xx device tree updates
- mc13xxx driver updates
- some clean up

* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds:
leds: mc13783: Fix "uninitialized variable" warning
leds: Convert led class driver from legacy pm ops to dev_pm_ops
leds: leds-mc13783: Add MC13892 LED support
leds: leds-mc13783: Prepare driver to support MC13892 LEDs
leds: renesas-tpu: cleanup a small type issue
leds: use platform_{get,set}_drvdata()
leds: leds-gpio: Let device core handle pinctrl
leds: lp5562: Properly setup of_device_id table
leds: lp5523: Properly setup of_device_id table
leds: lp5521: Properly setup of_device_id table
leds: lp5562: support the device tree feature
leds: lp55xx: support dynamic channel settings in the device tree structure
leds: leds-ns2: remove unnecessary platform_set_drvdata()
leds: leds-mc13783: remove unnecessary platform_set_drvdata()
leds: leds-gpio: remove unnecessary platform_set_drvdata()
leds: atmel-pwm: remove unnecessary platform_set_drvdata()
leds: lp55xx: add support for Device Tree bindings

+552 -345
+147
Documentation/devicetree/bindings/leds/leds-lp55xx.txt
··· 1 + Binding for TI/National Semiconductor LP55xx Led Drivers 2 + 3 + Required properties: 4 + - compatible: "national,lp5521" or "national,lp5523" or "ti,lp5562" 5 + - reg: I2C slave address 6 + - clock-mode: Input clock mode, (0: automode, 1: internal, 2: external) 7 + 8 + Each child has own specific current settings 9 + - led-cur: Current setting at each led channel (mA x10, 0 if led is not connected) 10 + - max-cur: Maximun current at each led channel. 11 + 12 + Optional properties: 13 + - label: Used for naming LEDs 14 + 15 + Alternatively, each child can have specific channel name 16 + - chan-name: Name of each channel name 17 + 18 + example 1) LP5521 19 + 3 LED channels, external clock used. Channel names are 'lp5521_pri:channel0', 20 + 'lp5521_pri:channel1' and 'lp5521_pri:channel2' 21 + 22 + lp5521@32 { 23 + compatible = "national,lp5521"; 24 + reg = <0x32>; 25 + label = "lp5521_pri"; 26 + clock-mode = /bits/ 8 <2>; 27 + 28 + chan0 { 29 + led-cur = /bits/ 8 <0x2f>; 30 + max-cur = /bits/ 8 <0x5f>; 31 + }; 32 + 33 + chan1 { 34 + led-cur = /bits/ 8 <0x2f>; 35 + max-cur = /bits/ 8 <0x5f>; 36 + }; 37 + 38 + chan2 { 39 + led-cur = /bits/ 8 <0x2f>; 40 + max-cur = /bits/ 8 <0x5f>; 41 + }; 42 + }; 43 + 44 + example 2) LP5523 45 + 9 LED channels with specific name. Internal clock used. 46 + The I2C slave address is configurable with ASEL1 and ASEL0 pins. 47 + Available addresses are 32/33/34/35h. 48 + 49 + ASEL1 ASEL0 Address 50 + ------------------------- 51 + GND GND 32h 52 + GND VEN 33h 53 + VEN GND 34h 54 + VEN VEN 35h 55 + 56 + lp5523@32 { 57 + compatible = "national,lp5523"; 58 + reg = <0x32>; 59 + clock-mode = /bits/ 8 <1>; 60 + 61 + chan0 { 62 + chan-name = "d1"; 63 + led-cur = /bits/ 8 <0x14>; 64 + max-cur = /bits/ 8 <0x20>; 65 + }; 66 + 67 + chan1 { 68 + chan-name = "d2"; 69 + led-cur = /bits/ 8 <0x14>; 70 + max-cur = /bits/ 8 <0x20>; 71 + }; 72 + 73 + chan2 { 74 + chan-name = "d3"; 75 + led-cur = /bits/ 8 <0x14>; 76 + max-cur = /bits/ 8 <0x20>; 77 + }; 78 + 79 + chan3 { 80 + chan-name = "d4"; 81 + led-cur = /bits/ 8 <0x14>; 82 + max-cur = /bits/ 8 <0x20>; 83 + }; 84 + 85 + chan4 { 86 + chan-name = "d5"; 87 + led-cur = /bits/ 8 <0x14>; 88 + max-cur = /bits/ 8 <0x20>; 89 + }; 90 + 91 + chan5 { 92 + chan-name = "d6"; 93 + led-cur = /bits/ 8 <0x14>; 94 + max-cur = /bits/ 8 <0x20>; 95 + }; 96 + 97 + chan6 { 98 + chan-name = "d7"; 99 + led-cur = /bits/ 8 <0x14>; 100 + max-cur = /bits/ 8 <0x20>; 101 + }; 102 + 103 + chan7 { 104 + chan-name = "d8"; 105 + led-cur = /bits/ 8 <0x14>; 106 + max-cur = /bits/ 8 <0x20>; 107 + }; 108 + 109 + chan8 { 110 + chan-name = "d9"; 111 + led-cur = /bits/ 8 <0x14>; 112 + max-cur = /bits/ 8 <0x20>; 113 + }; 114 + }; 115 + 116 + example 3) LP5562 117 + 4 channels are defined. 118 + 119 + lp5562@30 { 120 + compatible = "ti,lp5562"; 121 + reg = <0x30>; 122 + clock-mode = /bits/8 <2>; 123 + 124 + chan0 { 125 + chan-name = "R"; 126 + led-cur = /bits/ 8 <0x20>; 127 + max-cur = /bits/ 8 <0x60>; 128 + }; 129 + 130 + chan1 { 131 + chan-name = "G"; 132 + led-cur = /bits/ 8 <0x20>; 133 + max-cur = /bits/ 8 <0x60>; 134 + }; 135 + 136 + chan2 { 137 + chan-name = "B"; 138 + led-cur = /bits/ 8 <0x20>; 139 + max-cur = /bits/ 8 <0x60>; 140 + }; 141 + 142 + chan3 { 143 + chan-name = "W"; 144 + led-cur = /bits/ 8 <0x20>; 145 + max-cur = /bits/ 8 <0x60>; 146 + }; 147 + };
+5 -4
arch/arm/mach-imx/mach-mx31moboard.c
··· 268 268 static struct mc13xxx_leds_platform_data moboard_leds = { 269 269 .num_leds = ARRAY_SIZE(moboard_led), 270 270 .led = moboard_led, 271 - .flags = MC13783_LED_SLEWLIMTC, 272 - .abmode = MC13783_LED_AB_DISABLED, 273 - .tc1_period = MC13783_LED_PERIOD_10MS, 274 - .tc2_period = MC13783_LED_PERIOD_10MS, 271 + .led_control[0] = MC13783_LED_C0_ENABLE | MC13783_LED_C0_ABMODE(0), 272 + .led_control[1] = MC13783_LED_C1_SLEWLIM, 273 + .led_control[2] = MC13783_LED_C2_SLEWLIM, 274 + .led_control[3] = MC13783_LED_C3_PERIOD(0), 275 + .led_control[4] = MC13783_LED_C3_PERIOD(0), 275 276 }; 276 277 277 278 static struct mc13xxx_buttons_platform_data moboard_buttons = {
+3 -3
drivers/leds/Kconfig
··· 388 388 notebooks that have an external LED. 389 389 390 390 config LEDS_MC13783 391 - tristate "LED Support for MC13783 PMIC" 391 + tristate "LED Support for MC13XXX PMIC" 392 392 depends on LEDS_CLASS 393 - depends on MFD_MC13783 393 + depends on MFD_MC13XXX 394 394 help 395 395 This option enable support for on-chip LED drivers found 396 - on Freescale Semiconductor MC13783 PMIC. 396 + on Freescale Semiconductor MC13783/MC13892 PMIC. 397 397 398 398 config LEDS_NS2 399 399 tristate "LED support for Network Space v2 GPIO LEDs"
+7 -3
drivers/leds/led-class.c
··· 156 156 } 157 157 EXPORT_SYMBOL_GPL(led_classdev_resume); 158 158 159 - static int led_suspend(struct device *dev, pm_message_t state) 159 + static int led_suspend(struct device *dev) 160 160 { 161 161 struct led_classdev *led_cdev = dev_get_drvdata(dev); 162 162 ··· 175 175 176 176 return 0; 177 177 } 178 + 179 + static const struct dev_pm_ops leds_class_dev_pm_ops = { 180 + .suspend = led_suspend, 181 + .resume = led_resume, 182 + }; 178 183 179 184 /** 180 185 * led_classdev_register - register a new object of led_classdev class. ··· 257 252 leds_class = class_create(THIS_MODULE, "leds"); 258 253 if (IS_ERR(leds_class)) 259 254 return PTR_ERR(leds_class); 260 - leds_class->suspend = led_suspend; 261 - leds_class->resume = led_resume; 255 + leds_class->pm = &leds_class_dev_pm_ops; 262 256 leds_class->dev_attrs = led_class_attrs; 263 257 return 0; 264 258 }
+1 -1
drivers/leds/leds-88pm860x.c
··· 204 204 sprintf(data->name, "led1-blue"); 205 205 break; 206 206 } 207 - dev_set_drvdata(&pdev->dev, data); 207 + platform_set_drvdata(pdev, data); 208 208 data->chip = chip; 209 209 data->i2c = (chip->id == CHIP_PM8606) ? chip->client : chip->companion; 210 210 data->port = pdev->id;
-1
drivers/leds/leds-atmel-pwm.c
··· 129 129 pwm_channel_free(&led->pwmc); 130 130 } 131 131 132 - platform_set_drvdata(pdev, NULL); 133 132 return 0; 134 133 } 135 134
-8
drivers/leds/leds-gpio.c
··· 20 20 #include <linux/slab.h> 21 21 #include <linux/workqueue.h> 22 22 #include <linux/module.h> 23 - #include <linux/pinctrl/consumer.h> 24 23 #include <linux/err.h> 25 24 26 25 struct gpio_led_data { ··· 235 236 { 236 237 struct gpio_led_platform_data *pdata = pdev->dev.platform_data; 237 238 struct gpio_leds_priv *priv; 238 - struct pinctrl *pinctrl; 239 239 int i, ret = 0; 240 240 241 - pinctrl = devm_pinctrl_get_select_default(&pdev->dev); 242 - if (IS_ERR(pinctrl)) 243 - dev_warn(&pdev->dev, 244 - "pins are not configured from the driver\n"); 245 241 246 242 if (pdata && pdata->num_leds) { 247 243 priv = devm_kzalloc(&pdev->dev, ··· 275 281 276 282 for (i = 0; i < priv->num_leds; i++) 277 283 delete_gpio_led(&priv->leds[i]); 278 - 279 - platform_set_drvdata(pdev, NULL); 280 284 281 285 return 0; 282 286 }
+22 -4
drivers/leds/leds-lp5521.c
··· 31 31 #include <linux/mutex.h> 32 32 #include <linux/platform_data/leds-lp55xx.h> 33 33 #include <linux/slab.h> 34 + #include <linux/of.h> 34 35 35 36 #include "leds-lp55xx-common.h" 36 37 ··· 417 416 int ret; 418 417 struct lp55xx_chip *chip; 419 418 struct lp55xx_led *led; 420 - struct lp55xx_platform_data *pdata = client->dev.platform_data; 419 + struct lp55xx_platform_data *pdata; 420 + struct device_node *np = client->dev.of_node; 421 421 422 - if (!pdata) { 423 - dev_err(&client->dev, "no platform data\n"); 424 - return -EINVAL; 422 + if (!client->dev.platform_data) { 423 + if (np) { 424 + ret = lp55xx_of_populate_pdata(&client->dev, np); 425 + if (ret < 0) 426 + return ret; 427 + } else { 428 + dev_err(&client->dev, "no platform data\n"); 429 + return -EINVAL; 430 + } 425 431 } 432 + pdata = client->dev.platform_data; 426 433 427 434 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); 428 435 if (!chip) ··· 494 485 }; 495 486 MODULE_DEVICE_TABLE(i2c, lp5521_id); 496 487 488 + #ifdef CONFIG_OF 489 + static const struct of_device_id of_lp5521_leds_match[] = { 490 + { .compatible = "national,lp5521", }, 491 + {}, 492 + }; 493 + 494 + MODULE_DEVICE_TABLE(of, of_lp5521_leds_match); 495 + #endif 497 496 static struct i2c_driver lp5521_driver = { 498 497 .driver = { 499 498 .name = "lp5521", 499 + .of_match_table = of_match_ptr(of_lp5521_leds_match), 500 500 }, 501 501 .probe = lp5521_probe, 502 502 .remove = lp5521_remove,
+22 -4
drivers/leds/leds-lp5523.c
··· 429 429 int ret; 430 430 struct lp55xx_chip *chip; 431 431 struct lp55xx_led *led; 432 - struct lp55xx_platform_data *pdata = client->dev.platform_data; 432 + struct lp55xx_platform_data *pdata; 433 + struct device_node *np = client->dev.of_node; 433 434 434 - if (!pdata) { 435 - dev_err(&client->dev, "no platform data\n"); 436 - return -EINVAL; 435 + if (!client->dev.platform_data) { 436 + if (np) { 437 + ret = lp55xx_of_populate_pdata(&client->dev, np); 438 + if (ret < 0) 439 + return ret; 440 + } else { 441 + dev_err(&client->dev, "no platform data\n"); 442 + return -EINVAL; 443 + } 437 444 } 445 + pdata = client->dev.platform_data; 438 446 439 447 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); 440 448 if (!chip) ··· 508 500 509 501 MODULE_DEVICE_TABLE(i2c, lp5523_id); 510 502 503 + #ifdef CONFIG_OF 504 + static const struct of_device_id of_lp5523_leds_match[] = { 505 + { .compatible = "national,lp5523", }, 506 + {}, 507 + }; 508 + 509 + MODULE_DEVICE_TABLE(of, of_lp5523_leds_match); 510 + #endif 511 + 511 512 static struct i2c_driver lp5523_driver = { 512 513 .driver = { 513 514 .name = "lp5523x", 515 + .of_match_table = of_match_ptr(of_lp5523_leds_match), 514 516 }, 515 517 .probe = lp5523_probe, 516 518 .remove = lp5523_remove,
+22 -4
drivers/leds/leds-lp5562.c
··· 515 515 int ret; 516 516 struct lp55xx_chip *chip; 517 517 struct lp55xx_led *led; 518 - struct lp55xx_platform_data *pdata = client->dev.platform_data; 518 + struct lp55xx_platform_data *pdata; 519 + struct device_node *np = client->dev.of_node; 519 520 520 - if (!pdata) { 521 - dev_err(&client->dev, "no platform data\n"); 522 - return -EINVAL; 521 + if (!client->dev.platform_data) { 522 + if (np) { 523 + ret = lp55xx_of_populate_pdata(&client->dev, np); 524 + if (ret < 0) 525 + return ret; 526 + } else { 527 + dev_err(&client->dev, "no platform data\n"); 528 + return -EINVAL; 529 + } 523 530 } 531 + pdata = client->dev.platform_data; 524 532 525 533 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); 526 534 if (!chip) ··· 591 583 }; 592 584 MODULE_DEVICE_TABLE(i2c, lp5562_id); 593 585 586 + #ifdef CONFIG_OF 587 + static const struct of_device_id of_lp5562_leds_match[] = { 588 + { .compatible = "ti,lp5562", }, 589 + {}, 590 + }; 591 + 592 + MODULE_DEVICE_TABLE(of, of_lp5562_leds_match); 593 + #endif 594 + 594 595 static struct i2c_driver lp5562_driver = { 595 596 .driver = { 596 597 .name = "lp5562", 598 + .of_match_table = of_match_ptr(of_lp5562_leds_match), 597 599 }, 598 600 .probe = lp5562_probe, 599 601 .remove = lp5562_remove,
+45
drivers/leds/leds-lp55xx-common.c
··· 19 19 #include <linux/leds.h> 20 20 #include <linux/module.h> 21 21 #include <linux/platform_data/leds-lp55xx.h> 22 + #include <linux/slab.h> 22 23 23 24 #include "leds-lp55xx-common.h" 24 25 ··· 554 553 sysfs_remove_group(&dev->kobj, &lp55xx_engine_attr_group); 555 554 } 556 555 EXPORT_SYMBOL_GPL(lp55xx_unregister_sysfs); 556 + 557 + int lp55xx_of_populate_pdata(struct device *dev, struct device_node *np) 558 + { 559 + struct device_node *child; 560 + struct lp55xx_platform_data *pdata; 561 + struct lp55xx_led_config *cfg; 562 + int num_channels; 563 + int i = 0; 564 + 565 + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); 566 + if (!pdata) 567 + return -ENOMEM; 568 + 569 + num_channels = of_get_child_count(np); 570 + if (num_channels == 0) { 571 + dev_err(dev, "no LED channels\n"); 572 + return -EINVAL; 573 + } 574 + 575 + cfg = devm_kzalloc(dev, sizeof(*cfg) * num_channels, GFP_KERNEL); 576 + if (!cfg) 577 + return -ENOMEM; 578 + 579 + pdata->led_config = &cfg[0]; 580 + pdata->num_channels = num_channels; 581 + 582 + for_each_child_of_node(np, child) { 583 + cfg[i].chan_nr = i; 584 + 585 + of_property_read_string(child, "chan-name", &cfg[i].name); 586 + of_property_read_u8(child, "led-cur", &cfg[i].led_current); 587 + of_property_read_u8(child, "max-cur", &cfg[i].max_current); 588 + 589 + i++; 590 + } 591 + 592 + of_property_read_string(np, "label", &pdata->label); 593 + of_property_read_u8(np, "clock-mode", &pdata->clock_mode); 594 + 595 + dev->platform_data = pdata; 596 + 597 + return 0; 598 + } 599 + EXPORT_SYMBOL_GPL(lp55xx_of_populate_pdata); 557 600 558 601 MODULE_AUTHOR("Milo Kim <milo.kim@ti.com>"); 559 602 MODULE_DESCRIPTION("LP55xx Common Driver");
+4
drivers/leds/leds-lp55xx-common.h
··· 135 135 extern int lp55xx_register_sysfs(struct lp55xx_chip *chip); 136 136 extern void lp55xx_unregister_sysfs(struct lp55xx_chip *chip); 137 137 138 + /* common device tree population function */ 139 + extern int lp55xx_of_populate_pdata(struct device *dev, 140 + struct device_node *np); 141 + 138 142 #endif /* _LEDS_LP55XX_COMMON_H */
+217 -254
drivers/leds/leds-mc13783.c
··· 1 1 /* 2 - * LEDs driver for Freescale MC13783 2 + * LEDs driver for Freescale MC13783/MC13892 3 3 * 4 4 * Copyright (C) 2010 Philippe Rétornaz 5 5 * ··· 22 22 #include <linux/leds.h> 23 23 #include <linux/workqueue.h> 24 24 #include <linux/mfd/mc13xxx.h> 25 - #include <linux/slab.h> 26 25 27 - struct mc13783_led { 26 + #define MC13XXX_REG_LED_CONTROL(x) (51 + (x)) 27 + 28 + struct mc13xxx_led_devtype { 29 + int led_min; 30 + int led_max; 31 + int num_regs; 32 + }; 33 + 34 + struct mc13xxx_led { 28 35 struct led_classdev cdev; 29 36 struct work_struct work; 30 37 struct mc13xxx *master; ··· 39 32 int id; 40 33 }; 41 34 42 - #define MC13783_REG_LED_CONTROL_0 51 43 - #define MC13783_LED_C0_ENABLE_BIT (1 << 0) 44 - #define MC13783_LED_C0_TRIODE_MD_BIT (1 << 7) 45 - #define MC13783_LED_C0_TRIODE_AD_BIT (1 << 8) 46 - #define MC13783_LED_C0_TRIODE_KP_BIT (1 << 9) 47 - #define MC13783_LED_C0_BOOST_BIT (1 << 10) 48 - #define MC13783_LED_C0_ABMODE_MASK 0x7 49 - #define MC13783_LED_C0_ABMODE 11 50 - #define MC13783_LED_C0_ABREF_MASK 0x3 51 - #define MC13783_LED_C0_ABREF 14 35 + struct mc13xxx_leds { 36 + struct mc13xxx_led_devtype *devtype; 37 + int num_leds; 38 + struct mc13xxx_led led[0]; 39 + }; 52 40 53 - #define MC13783_REG_LED_CONTROL_1 52 54 - #define MC13783_LED_C1_TC1HALF_BIT (1 << 18) 55 - 56 - #define MC13783_REG_LED_CONTROL_2 53 57 - #define MC13783_LED_C2_BL_P_MASK 0xf 58 - #define MC13783_LED_C2_MD_P 9 59 - #define MC13783_LED_C2_AD_P 13 60 - #define MC13783_LED_C2_KP_P 17 61 - #define MC13783_LED_C2_BL_C_MASK 0x7 62 - #define MC13783_LED_C2_MD_C 0 63 - #define MC13783_LED_C2_AD_C 3 64 - #define MC13783_LED_C2_KP_C 6 65 - 66 - #define MC13783_REG_LED_CONTROL_3 54 67 - #define MC13783_LED_C3_TC_P 6 68 - #define MC13783_LED_C3_TC_P_MASK 0x1f 69 - 70 - #define MC13783_REG_LED_CONTROL_4 55 71 - #define MC13783_REG_LED_CONTROL_5 56 72 - 73 - #define MC13783_LED_Cx_PERIOD 21 74 - #define MC13783_LED_Cx_PERIOD_MASK 0x3 75 - #define MC13783_LED_Cx_SLEWLIM_BIT (1 << 23) 76 - #define MC13783_LED_Cx_TRIODE_TC_BIT (1 << 23) 77 - #define MC13783_LED_Cx_TC_C_MASK 0x3 78 - 79 - static void mc13783_led_work(struct work_struct *work) 41 + static void mc13xxx_led_work(struct work_struct *work) 80 42 { 81 - struct mc13783_led *led = container_of(work, struct mc13783_led, work); 82 - int reg = 0; 83 - int mask = 0; 84 - int value = 0; 85 - int bank, off, shift; 43 + struct mc13xxx_led *led = container_of(work, struct mc13xxx_led, work); 44 + int reg, mask, value, bank, off, shift; 86 45 87 46 switch (led->id) { 88 47 case MC13783_LED_MD: 89 - reg = MC13783_REG_LED_CONTROL_2; 90 - mask = MC13783_LED_C2_BL_P_MASK << MC13783_LED_C2_MD_P; 91 - value = (led->new_brightness >> 4) << MC13783_LED_C2_MD_P; 48 + reg = MC13XXX_REG_LED_CONTROL(2); 49 + shift = 9; 50 + mask = 0x0f; 51 + value = led->new_brightness >> 4; 92 52 break; 93 53 case MC13783_LED_AD: 94 - reg = MC13783_REG_LED_CONTROL_2; 95 - mask = MC13783_LED_C2_BL_P_MASK << MC13783_LED_C2_AD_P; 96 - value = (led->new_brightness >> 4) << MC13783_LED_C2_AD_P; 54 + reg = MC13XXX_REG_LED_CONTROL(2); 55 + shift = 13; 56 + mask = 0x0f; 57 + value = led->new_brightness >> 4; 97 58 break; 98 59 case MC13783_LED_KP: 99 - reg = MC13783_REG_LED_CONTROL_2; 100 - mask = MC13783_LED_C2_BL_P_MASK << MC13783_LED_C2_KP_P; 101 - value = (led->new_brightness >> 4) << MC13783_LED_C2_KP_P; 60 + reg = MC13XXX_REG_LED_CONTROL(2); 61 + shift = 17; 62 + mask = 0x0f; 63 + value = led->new_brightness >> 4; 102 64 break; 103 65 case MC13783_LED_R1: 104 66 case MC13783_LED_G1: ··· 79 103 case MC13783_LED_G3: 80 104 case MC13783_LED_B3: 81 105 off = led->id - MC13783_LED_R1; 82 - bank = off/3; 83 - reg = MC13783_REG_LED_CONTROL_3 + off/3; 84 - shift = (off - bank * 3) * 5 + MC13783_LED_C3_TC_P; 85 - value = (led->new_brightness >> 3) << shift; 86 - mask = MC13783_LED_C3_TC_P_MASK << shift; 106 + bank = off / 3; 107 + reg = MC13XXX_REG_LED_CONTROL(3) + bank; 108 + shift = (off - bank * 3) * 5 + 6; 109 + value = led->new_brightness >> 3; 110 + mask = 0x1f; 87 111 break; 112 + case MC13892_LED_MD: 113 + reg = MC13XXX_REG_LED_CONTROL(0); 114 + shift = 3; 115 + mask = 0x3f; 116 + value = led->new_brightness >> 2; 117 + break; 118 + case MC13892_LED_AD: 119 + reg = MC13XXX_REG_LED_CONTROL(0); 120 + shift = 15; 121 + mask = 0x3f; 122 + value = led->new_brightness >> 2; 123 + break; 124 + case MC13892_LED_KP: 125 + reg = MC13XXX_REG_LED_CONTROL(1); 126 + shift = 3; 127 + mask = 0x3f; 128 + value = led->new_brightness >> 2; 129 + break; 130 + case MC13892_LED_R: 131 + case MC13892_LED_G: 132 + case MC13892_LED_B: 133 + off = led->id - MC13892_LED_R; 134 + bank = off / 2; 135 + reg = MC13XXX_REG_LED_CONTROL(2) + bank; 136 + shift = (off - bank * 2) * 12 + 3; 137 + value = led->new_brightness >> 2; 138 + mask = 0x3f; 139 + break; 140 + default: 141 + BUG(); 88 142 } 89 143 90 144 mc13xxx_lock(led->master); 91 - 92 - mc13xxx_reg_rmw(led->master, reg, mask, value); 93 - 145 + mc13xxx_reg_rmw(led->master, reg, mask << shift, value << shift); 94 146 mc13xxx_unlock(led->master); 95 147 } 96 148 97 - static void mc13783_led_set(struct led_classdev *led_cdev, 98 - enum led_brightness value) 149 + static void mc13xxx_led_set(struct led_classdev *led_cdev, 150 + enum led_brightness value) 99 151 { 100 - struct mc13783_led *led; 152 + struct mc13xxx_led *led = 153 + container_of(led_cdev, struct mc13xxx_led, cdev); 101 154 102 - led = container_of(led_cdev, struct mc13783_led, cdev); 103 155 led->new_brightness = value; 104 156 schedule_work(&led->work); 105 157 } 106 158 107 - static int mc13783_led_setup(struct mc13783_led *led, int max_current) 159 + static int __init mc13xxx_led_setup(struct mc13xxx_led *led, int max_current) 108 160 { 109 - int shift = 0; 110 - int mask = 0; 111 - int value = 0; 112 - int reg = 0; 113 - int ret, bank; 161 + int shift, mask, reg, ret, bank; 114 162 115 163 switch (led->id) { 116 164 case MC13783_LED_MD: 117 - shift = MC13783_LED_C2_MD_C; 118 - mask = MC13783_LED_C2_BL_C_MASK; 119 - value = max_current & MC13783_LED_C2_BL_C_MASK; 120 - reg = MC13783_REG_LED_CONTROL_2; 165 + reg = MC13XXX_REG_LED_CONTROL(2); 166 + shift = 0; 167 + mask = 0x07; 121 168 break; 122 169 case MC13783_LED_AD: 123 - shift = MC13783_LED_C2_AD_C; 124 - mask = MC13783_LED_C2_BL_C_MASK; 125 - value = max_current & MC13783_LED_C2_BL_C_MASK; 126 - reg = MC13783_REG_LED_CONTROL_2; 170 + reg = MC13XXX_REG_LED_CONTROL(2); 171 + shift = 3; 172 + mask = 0x07; 127 173 break; 128 174 case MC13783_LED_KP: 129 - shift = MC13783_LED_C2_KP_C; 130 - mask = MC13783_LED_C2_BL_C_MASK; 131 - value = max_current & MC13783_LED_C2_BL_C_MASK; 132 - reg = MC13783_REG_LED_CONTROL_2; 175 + reg = MC13XXX_REG_LED_CONTROL(2); 176 + shift = 6; 177 + mask = 0x07; 133 178 break; 134 179 case MC13783_LED_R1: 135 180 case MC13783_LED_G1: ··· 161 164 case MC13783_LED_R3: 162 165 case MC13783_LED_G3: 163 166 case MC13783_LED_B3: 164 - bank = (led->id - MC13783_LED_R1)/3; 165 - reg = MC13783_REG_LED_CONTROL_3 + bank; 167 + bank = (led->id - MC13783_LED_R1) / 3; 168 + reg = MC13XXX_REG_LED_CONTROL(3) + bank; 166 169 shift = ((led->id - MC13783_LED_R1) - bank * 3) * 2; 167 - mask = MC13783_LED_Cx_TC_C_MASK; 168 - value = max_current & MC13783_LED_Cx_TC_C_MASK; 170 + mask = 0x03; 169 171 break; 172 + case MC13892_LED_MD: 173 + reg = MC13XXX_REG_LED_CONTROL(0); 174 + shift = 9; 175 + mask = 0x07; 176 + break; 177 + case MC13892_LED_AD: 178 + reg = MC13XXX_REG_LED_CONTROL(0); 179 + shift = 21; 180 + mask = 0x07; 181 + break; 182 + case MC13892_LED_KP: 183 + reg = MC13XXX_REG_LED_CONTROL(1); 184 + shift = 9; 185 + mask = 0x07; 186 + break; 187 + case MC13892_LED_R: 188 + case MC13892_LED_G: 189 + case MC13892_LED_B: 190 + bank = (led->id - MC13892_LED_R) / 2; 191 + reg = MC13XXX_REG_LED_CONTROL(2) + bank; 192 + shift = ((led->id - MC13892_LED_R) - bank * 2) * 12 + 9; 193 + mask = 0x07; 194 + break; 195 + default: 196 + BUG(); 170 197 } 171 198 172 199 mc13xxx_lock(led->master); 173 - 174 200 ret = mc13xxx_reg_rmw(led->master, reg, mask << shift, 175 - value << shift); 176 - 201 + max_current << shift); 177 202 mc13xxx_unlock(led->master); 203 + 178 204 return ret; 179 205 } 180 206 181 - static int mc13783_leds_prepare(struct platform_device *pdev) 207 + static int __init mc13xxx_led_probe(struct platform_device *pdev) 182 208 { 183 209 struct mc13xxx_leds_platform_data *pdata = dev_get_platdata(&pdev->dev); 184 - struct mc13xxx *dev = dev_get_drvdata(pdev->dev.parent); 185 - int ret = 0; 186 - int reg = 0; 210 + struct mc13xxx *mcdev = dev_get_drvdata(pdev->dev.parent); 211 + struct mc13xxx_led_devtype *devtype = 212 + (struct mc13xxx_led_devtype *)pdev->id_entry->driver_data; 213 + struct mc13xxx_leds *leds; 214 + int i, id, num_leds, ret = -ENODATA; 215 + u32 reg, init_led = 0; 187 216 188 - mc13xxx_lock(dev); 189 - 190 - if (pdata->flags & MC13783_LED_TC1HALF) 191 - reg |= MC13783_LED_C1_TC1HALF_BIT; 192 - 193 - if (pdata->flags & MC13783_LED_SLEWLIMTC) 194 - reg |= MC13783_LED_Cx_SLEWLIM_BIT; 195 - 196 - ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_1, reg); 197 - if (ret) 198 - goto out; 199 - 200 - reg = (pdata->bl_period & MC13783_LED_Cx_PERIOD_MASK) << 201 - MC13783_LED_Cx_PERIOD; 202 - 203 - if (pdata->flags & MC13783_LED_SLEWLIMBL) 204 - reg |= MC13783_LED_Cx_SLEWLIM_BIT; 205 - 206 - ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_2, reg); 207 - if (ret) 208 - goto out; 209 - 210 - reg = (pdata->tc1_period & MC13783_LED_Cx_PERIOD_MASK) << 211 - MC13783_LED_Cx_PERIOD; 212 - 213 - if (pdata->flags & MC13783_LED_TRIODE_TC1) 214 - reg |= MC13783_LED_Cx_TRIODE_TC_BIT; 215 - 216 - ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_3, reg); 217 - if (ret) 218 - goto out; 219 - 220 - reg = (pdata->tc2_period & MC13783_LED_Cx_PERIOD_MASK) << 221 - MC13783_LED_Cx_PERIOD; 222 - 223 - if (pdata->flags & MC13783_LED_TRIODE_TC2) 224 - reg |= MC13783_LED_Cx_TRIODE_TC_BIT; 225 - 226 - ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_4, reg); 227 - if (ret) 228 - goto out; 229 - 230 - reg = (pdata->tc3_period & MC13783_LED_Cx_PERIOD_MASK) << 231 - MC13783_LED_Cx_PERIOD; 232 - 233 - if (pdata->flags & MC13783_LED_TRIODE_TC3) 234 - reg |= MC13783_LED_Cx_TRIODE_TC_BIT; 235 - 236 - ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_5, reg); 237 - if (ret) 238 - goto out; 239 - 240 - reg = MC13783_LED_C0_ENABLE_BIT; 241 - if (pdata->flags & MC13783_LED_TRIODE_MD) 242 - reg |= MC13783_LED_C0_TRIODE_MD_BIT; 243 - if (pdata->flags & MC13783_LED_TRIODE_AD) 244 - reg |= MC13783_LED_C0_TRIODE_AD_BIT; 245 - if (pdata->flags & MC13783_LED_TRIODE_KP) 246 - reg |= MC13783_LED_C0_TRIODE_KP_BIT; 247 - if (pdata->flags & MC13783_LED_BOOST_EN) 248 - reg |= MC13783_LED_C0_BOOST_BIT; 249 - 250 - reg |= (pdata->abmode & MC13783_LED_C0_ABMODE_MASK) << 251 - MC13783_LED_C0_ABMODE; 252 - reg |= (pdata->abref & MC13783_LED_C0_ABREF_MASK) << 253 - MC13783_LED_C0_ABREF; 254 - 255 - ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_0, reg); 256 - 257 - out: 258 - mc13xxx_unlock(dev); 259 - return ret; 260 - } 261 - 262 - static int mc13783_led_probe(struct platform_device *pdev) 263 - { 264 - struct mc13xxx_leds_platform_data *pdata = dev_get_platdata(&pdev->dev); 265 - struct mc13xxx_led_platform_data *led_cur; 266 - struct mc13783_led *led, *led_dat; 267 - int ret, i; 268 - int init_led = 0; 269 - 270 - if (pdata == NULL) { 271 - dev_err(&pdev->dev, "missing platform data\n"); 217 + if (!pdata) { 218 + dev_err(&pdev->dev, "Missing platform data\n"); 272 219 return -ENODEV; 273 220 } 274 221 275 - if (pdata->num_leds < 1 || pdata->num_leds > (MC13783_LED_MAX + 1)) { 276 - dev_err(&pdev->dev, "Invalid led count %d\n", pdata->num_leds); 222 + num_leds = pdata->num_leds; 223 + 224 + if ((num_leds < 1) || 225 + (num_leds > (devtype->led_max - devtype->led_min + 1))) { 226 + dev_err(&pdev->dev, "Invalid LED count %d\n", num_leds); 277 227 return -EINVAL; 278 228 } 279 229 280 - led = devm_kzalloc(&pdev->dev, pdata->num_leds * sizeof(*led), 281 - GFP_KERNEL); 282 - if (led == NULL) { 283 - dev_err(&pdev->dev, "failed to alloc memory\n"); 230 + leds = devm_kzalloc(&pdev->dev, num_leds * sizeof(struct mc13xxx_led) + 231 + sizeof(struct mc13xxx_leds), GFP_KERNEL); 232 + if (!leds) 284 233 return -ENOMEM; 285 - } 286 234 287 - ret = mc13783_leds_prepare(pdev); 235 + leds->devtype = devtype; 236 + leds->num_leds = num_leds; 237 + platform_set_drvdata(pdev, leds); 238 + 239 + mc13xxx_lock(mcdev); 240 + for (i = 0; i < devtype->num_regs; i++) { 241 + reg = pdata->led_control[i]; 242 + WARN_ON(reg >= (1 << 24)); 243 + ret = mc13xxx_reg_write(mcdev, MC13XXX_REG_LED_CONTROL(i), reg); 244 + if (ret) 245 + break; 246 + } 247 + mc13xxx_unlock(mcdev); 248 + 288 249 if (ret) { 289 - dev_err(&pdev->dev, "unable to init led driver\n"); 250 + dev_err(&pdev->dev, "Unable to init LED driver\n"); 290 251 return ret; 291 252 } 292 253 293 - for (i = 0; i < pdata->num_leds; i++) { 294 - led_dat = &led[i]; 295 - led_cur = &pdata->led[i]; 254 + for (i = 0; i < num_leds; i++) { 255 + const char *name, *trig; 256 + char max_current; 296 257 297 - if (led_cur->id > MC13783_LED_MAX || led_cur->id < 0) { 298 - dev_err(&pdev->dev, "invalid id %d\n", led_cur->id); 299 - ret = -EINVAL; 300 - goto err_register; 258 + ret = -EINVAL; 259 + 260 + id = pdata->led[i].id; 261 + name = pdata->led[i].name; 262 + trig = pdata->led[i].default_trigger; 263 + max_current = pdata->led[i].max_current; 264 + 265 + if ((id > devtype->led_max) || (id < devtype->led_min)) { 266 + dev_err(&pdev->dev, "Invalid ID %i\n", id); 267 + break; 301 268 } 302 269 303 - if (init_led & (1 << led_cur->id)) { 304 - dev_err(&pdev->dev, "led %d already initialized\n", 305 - led_cur->id); 306 - ret = -EINVAL; 307 - goto err_register; 270 + if (init_led & (1 << id)) { 271 + dev_warn(&pdev->dev, 272 + "LED %i already initialized\n", id); 273 + break; 308 274 } 309 275 310 - init_led |= 1 << led_cur->id; 311 - led_dat->cdev.name = led_cur->name; 312 - led_dat->cdev.default_trigger = led_cur->default_trigger; 313 - led_dat->cdev.brightness_set = mc13783_led_set; 314 - led_dat->cdev.brightness = LED_OFF; 315 - led_dat->id = led_cur->id; 316 - led_dat->master = dev_get_drvdata(pdev->dev.parent); 276 + init_led |= 1 << id; 277 + leds->led[i].id = id; 278 + leds->led[i].master = mcdev; 279 + leds->led[i].cdev.name = name; 280 + leds->led[i].cdev.default_trigger = trig; 281 + leds->led[i].cdev.brightness_set = mc13xxx_led_set; 282 + leds->led[i].cdev.brightness = LED_OFF; 317 283 318 - INIT_WORK(&led_dat->work, mc13783_led_work); 284 + INIT_WORK(&leds->led[i].work, mc13xxx_led_work); 319 285 320 - ret = led_classdev_register(pdev->dev.parent, &led_dat->cdev); 286 + ret = mc13xxx_led_setup(&leds->led[i], max_current); 321 287 if (ret) { 322 - dev_err(&pdev->dev, "failed to register led %d\n", 323 - led_dat->id); 324 - goto err_register; 288 + dev_err(&pdev->dev, "Unable to setup LED %i\n", id); 289 + break; 325 290 } 326 - 327 - ret = mc13783_led_setup(led_dat, led_cur->max_current); 291 + ret = led_classdev_register(pdev->dev.parent, 292 + &leds->led[i].cdev); 328 293 if (ret) { 329 - dev_err(&pdev->dev, "unable to init led %d\n", 330 - led_dat->id); 331 - i++; 332 - goto err_register; 294 + dev_err(&pdev->dev, "Failed to register LED %i\n", id); 295 + break; 333 296 } 334 297 } 335 298 336 - platform_set_drvdata(pdev, led); 337 - return 0; 338 - 339 - err_register: 340 - for (i = i - 1; i >= 0; i--) { 341 - led_classdev_unregister(&led[i].cdev); 342 - cancel_work_sync(&led[i].work); 343 - } 299 + if (ret) 300 + while (--i >= 0) { 301 + led_classdev_unregister(&leds->led[i].cdev); 302 + cancel_work_sync(&leds->led[i].work); 303 + } 344 304 345 305 return ret; 346 306 } 347 307 348 - static int mc13783_led_remove(struct platform_device *pdev) 308 + static int mc13xxx_led_remove(struct platform_device *pdev) 349 309 { 350 - struct mc13xxx_leds_platform_data *pdata = dev_get_platdata(&pdev->dev); 351 - struct mc13783_led *led = platform_get_drvdata(pdev); 352 - struct mc13xxx *dev = dev_get_drvdata(pdev->dev.parent); 310 + struct mc13xxx *mcdev = dev_get_drvdata(pdev->dev.parent); 311 + struct mc13xxx_leds *leds = platform_get_drvdata(pdev); 353 312 int i; 354 313 355 - for (i = 0; i < pdata->num_leds; i++) { 356 - led_classdev_unregister(&led[i].cdev); 357 - cancel_work_sync(&led[i].work); 314 + for (i = 0; i < leds->num_leds; i++) { 315 + led_classdev_unregister(&leds->led[i].cdev); 316 + cancel_work_sync(&leds->led[i].work); 358 317 } 359 318 360 - mc13xxx_lock(dev); 319 + mc13xxx_lock(mcdev); 320 + for (i = 0; i < leds->devtype->num_regs; i++) 321 + mc13xxx_reg_write(mcdev, MC13XXX_REG_LED_CONTROL(i), 0); 322 + mc13xxx_unlock(mcdev); 361 323 362 - mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_0, 0); 363 - mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_1, 0); 364 - mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_2, 0); 365 - mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_3, 0); 366 - mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_4, 0); 367 - mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_5, 0); 368 - 369 - mc13xxx_unlock(dev); 370 - 371 - platform_set_drvdata(pdev, NULL); 372 324 return 0; 373 325 } 374 326 375 - static struct platform_driver mc13783_led_driver = { 376 - .driver = { 377 - .name = "mc13783-led", 378 - .owner = THIS_MODULE, 379 - }, 380 - .probe = mc13783_led_probe, 381 - .remove = mc13783_led_remove, 327 + static const struct mc13xxx_led_devtype mc13783_led_devtype = { 328 + .led_min = MC13783_LED_MD, 329 + .led_max = MC13783_LED_B3, 330 + .num_regs = 6, 382 331 }; 383 332 384 - module_platform_driver(mc13783_led_driver); 333 + static const struct mc13xxx_led_devtype mc13892_led_devtype = { 334 + .led_min = MC13892_LED_MD, 335 + .led_max = MC13892_LED_B, 336 + .num_regs = 4, 337 + }; 385 338 386 - MODULE_DESCRIPTION("LEDs driver for Freescale MC13783 PMIC"); 339 + static const struct platform_device_id mc13xxx_led_id_table[] = { 340 + { "mc13783-led", (kernel_ulong_t)&mc13783_led_devtype, }, 341 + { "mc13892-led", (kernel_ulong_t)&mc13892_led_devtype, }, 342 + { } 343 + }; 344 + MODULE_DEVICE_TABLE(platform, mc13xxx_led_id_table); 345 + 346 + static struct platform_driver mc13xxx_led_driver = { 347 + .driver = { 348 + .name = "mc13xxx-led", 349 + .owner = THIS_MODULE, 350 + }, 351 + .remove = mc13xxx_led_remove, 352 + .id_table = mc13xxx_led_id_table, 353 + }; 354 + module_platform_driver_probe(mc13xxx_led_driver, mc13xxx_led_probe); 355 + 356 + MODULE_DESCRIPTION("LEDs driver for Freescale MC13XXX PMIC"); 387 357 MODULE_AUTHOR("Philippe Retornaz <philippe.retornaz@epfl.ch>"); 388 358 MODULE_LICENSE("GPL"); 389 - MODULE_ALIAS("platform:mc13783-led");
-2
drivers/leds/leds-ns2.c
··· 374 374 for (i = 0; i < priv->num_leds; i++) 375 375 delete_ns2_led(&priv->leds_data[i]); 376 376 377 - platform_set_drvdata(pdev, NULL); 378 - 379 377 return 0; 380 378 } 381 379
+4 -4
drivers/leds/leds-renesas-tpu.c
··· 63 63 #define TGRC 8 /* Timer general register C (+0x20) */ 64 64 #define TGRD 9 /* Timer general register D (+0x24) */ 65 65 66 - static inline unsigned short r_tpu_read(struct r_tpu_priv *p, int reg_nr) 66 + static inline u16 r_tpu_read(struct r_tpu_priv *p, int reg_nr) 67 67 { 68 68 struct led_renesas_tpu_config *cfg = p->pdev->dev.platform_data; 69 69 void __iomem *base = p->mapbase; ··· 75 75 return ioread16(base + offs); 76 76 } 77 77 78 - static inline void r_tpu_write(struct r_tpu_priv *p, int reg_nr, 79 - unsigned short value) 78 + static inline void r_tpu_write(struct r_tpu_priv *p, int reg_nr, u16 value) 80 79 { 81 80 struct led_renesas_tpu_config *cfg = p->pdev->dev.platform_data; 82 81 void __iomem *base = p->mapbase; ··· 92 93 static void r_tpu_start_stop_ch(struct r_tpu_priv *p, int start) 93 94 { 94 95 struct led_renesas_tpu_config *cfg = p->pdev->dev.platform_data; 95 - unsigned long flags, value; 96 + unsigned long flags; 97 + u16 value; 96 98 97 99 /* start stop register shared by multiple timer channels */ 98 100 spin_lock_irqsave(&r_tpu_lock, flags);
+2 -2
drivers/leds/leds-sunfire.c
··· 159 159 } 160 160 } 161 161 162 - dev_set_drvdata(&pdev->dev, p); 162 + platform_set_drvdata(pdev, p); 163 163 164 164 return 0; 165 165 } 166 166 167 167 static int sunfire_led_generic_remove(struct platform_device *pdev) 168 168 { 169 - struct sunfire_drvdata *p = dev_get_drvdata(&pdev->dev); 169 + struct sunfire_drvdata *p = platform_get_drvdata(pdev); 170 170 int i; 171 171 172 172 for (i = 0; i < NUM_LEDS_PER_BOARD; i++)
+1 -1
drivers/leds/leds-wm831x-status.c
··· 241 241 GFP_KERNEL); 242 242 if (!drvdata) 243 243 return -ENOMEM; 244 - dev_set_drvdata(&pdev->dev, drvdata); 244 + platform_set_drvdata(pdev, drvdata); 245 245 246 246 drvdata->wm831x = wm831x; 247 247 drvdata->reg = res->start;
+50 -50
include/linux/mfd/mc13xxx.h
··· 78 78 struct mc13xxx_regulator_init_data *regulators; 79 79 }; 80 80 81 + enum { 82 + /* MC13783 LED IDs */ 83 + MC13783_LED_MD, 84 + MC13783_LED_AD, 85 + MC13783_LED_KP, 86 + MC13783_LED_R1, 87 + MC13783_LED_G1, 88 + MC13783_LED_B1, 89 + MC13783_LED_R2, 90 + MC13783_LED_G2, 91 + MC13783_LED_B2, 92 + MC13783_LED_R3, 93 + MC13783_LED_G3, 94 + MC13783_LED_B3, 95 + /* MC13892 LED IDs */ 96 + MC13892_LED_MD, 97 + MC13892_LED_AD, 98 + MC13892_LED_KP, 99 + MC13892_LED_R, 100 + MC13892_LED_G, 101 + MC13892_LED_B, 102 + }; 103 + 81 104 struct mc13xxx_led_platform_data { 82 - #define MC13783_LED_MD 0 83 - #define MC13783_LED_AD 1 84 - #define MC13783_LED_KP 2 85 - #define MC13783_LED_R1 3 86 - #define MC13783_LED_G1 4 87 - #define MC13783_LED_B1 5 88 - #define MC13783_LED_R2 6 89 - #define MC13783_LED_G2 7 90 - #define MC13783_LED_B2 8 91 - #define MC13783_LED_R3 9 92 - #define MC13783_LED_G3 10 93 - #define MC13783_LED_B3 11 94 - #define MC13783_LED_MAX MC13783_LED_B3 95 105 int id; 96 106 const char *name; 97 107 const char *default_trigger; ··· 110 100 char max_current; 111 101 }; 112 102 103 + #define MAX_LED_CONTROL_REGS 6 104 + 113 105 struct mc13xxx_leds_platform_data { 114 - int num_leds; 115 106 struct mc13xxx_led_platform_data *led; 107 + int num_leds; 116 108 117 - #define MC13783_LED_TRIODE_MD (1 << 0) 118 - #define MC13783_LED_TRIODE_AD (1 << 1) 119 - #define MC13783_LED_TRIODE_KP (1 << 2) 120 - #define MC13783_LED_BOOST_EN (1 << 3) 121 - #define MC13783_LED_TC1HALF (1 << 4) 122 - #define MC13783_LED_SLEWLIMTC (1 << 5) 123 - #define MC13783_LED_SLEWLIMBL (1 << 6) 124 - #define MC13783_LED_TRIODE_TC1 (1 << 7) 125 - #define MC13783_LED_TRIODE_TC2 (1 << 8) 126 - #define MC13783_LED_TRIODE_TC3 (1 << 9) 127 - int flags; 128 - 129 - #define MC13783_LED_AB_DISABLED 0 130 - #define MC13783_LED_AB_MD1 1 131 - #define MC13783_LED_AB_MD12 2 132 - #define MC13783_LED_AB_MD123 3 133 - #define MC13783_LED_AB_MD1234 4 134 - #define MC13783_LED_AB_MD1234_AD1 5 135 - #define MC13783_LED_AB_MD1234_AD12 6 136 - #define MC13783_LED_AB_MD1_AD 7 137 - char abmode; 138 - 139 - #define MC13783_LED_ABREF_200MV 0 140 - #define MC13783_LED_ABREF_400MV 1 141 - #define MC13783_LED_ABREF_600MV 2 142 - #define MC13783_LED_ABREF_800MV 3 143 - char abref; 144 - 145 - #define MC13783_LED_PERIOD_10MS 0 146 - #define MC13783_LED_PERIOD_100MS 1 147 - #define MC13783_LED_PERIOD_500MS 2 148 - #define MC13783_LED_PERIOD_2S 3 149 - char bl_period; 150 - char tc1_period; 151 - char tc2_period; 152 - char tc3_period; 109 + /* LED Control 0 */ 110 + #define MC13783_LED_C0_ENABLE (1 << 0) 111 + #define MC13783_LED_C0_TRIODE_MD (1 << 7) 112 + #define MC13783_LED_C0_TRIODE_AD (1 << 8) 113 + #define MC13783_LED_C0_TRIODE_KP (1 << 9) 114 + #define MC13783_LED_C0_BOOST (1 << 10) 115 + #define MC13783_LED_C0_ABMODE(x) (((x) & 0x7) << 11) 116 + #define MC13783_LED_C0_ABREF(x) (((x) & 0x3) << 14) 117 + /* LED Control 1 */ 118 + #define MC13783_LED_C1_TC1HALF (1 << 18) 119 + #define MC13783_LED_C1_SLEWLIM (1 << 23) 120 + /* LED Control 2 */ 121 + #define MC13783_LED_C2_PERIOD(x) (((x) & 0x3) << 21) 122 + #define MC13783_LED_C2_SLEWLIM (1 << 23) 123 + /* LED Control 3 */ 124 + #define MC13783_LED_C3_PERIOD(x) (((x) & 0x3) << 21) 125 + #define MC13783_LED_C3_TRIODE_TC1 (1 << 23) 126 + /* LED Control 4 */ 127 + #define MC13783_LED_C4_PERIOD(x) (((x) & 0x3) << 21) 128 + #define MC13783_LED_C4_TRIODE_TC2 (1 << 23) 129 + /* LED Control 5 */ 130 + #define MC13783_LED_C5_PERIOD(x) (((x) & 0x3) << 21) 131 + #define MC13783_LED_C5_TRIODE_TC3 (1 << 23) 132 + u32 led_control[MAX_LED_CONTROL_REGS]; 153 133 }; 154 134 155 135 struct mc13xxx_buttons_platform_data {