forked from Minki/linux
LED tree changes for 5.7-rc1.
-----BEGIN PGP SIGNATURE----- iF0EABECAB0WIQRPfPO7r0eAhk010v0w5/Bqldv68gUCXoww9AAKCRAw5/Bqldv6 8jR+AKCVa9QsVEeMTOXHDgUaub/zC2C+VQCfQoVhFysdTH3HQ0wsqX0ck7UIGhk= =+xca -----END PGP SIGNATURE----- Merge tag 'leds-5.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/pavel/linux-leds Pull LED updates from Pavel Machek: "One new driver, some driver changes, and some late minute cleanups -- but those are just whitespace so should be okay. There are some major changes being prepared (multicolor, triggers) so the next release likely will be more interesting" * tag 'leds-5.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/pavel/linux-leds: leds: core: Fix warning message when init_data leds: make functions easier to understand leds: sort Makefile entries leds: old enums are not really applicable to new code leds: ip30: label power LED as such leds: lm3532: make bitfield 'enabled' unsigned leds: leds-pwm: Replace zero-length array with flexible-array member leds: leds-is31fl32xx: Replace zero-length array with flexible-array member leds: pwm: remove useless pwm_period_ns leds: pwm: remove header leds: pwm: convert to atomic PWM API leds: pwm: simplify if condition leds: add SGI IP30 led support leds: lm3697: fix spelling mistake "To" -> "Too" leds: leds-bd2802: remove set but not used variable 'pdata' leds: ns2: Convert to GPIO descriptors leds: ns2: Absorb platform data
This commit is contained in:
commit
38e2c63ec3
@ -846,6 +846,17 @@ config LEDS_TPS6105X
|
||||
It is a single boost converter primarily for white LEDs and
|
||||
audio amplifiers.
|
||||
|
||||
config LEDS_IP30
|
||||
tristate "LED support for SGI Octane machines"
|
||||
depends on LEDS_CLASS
|
||||
depends on SGI_MFD_IOC3
|
||||
help
|
||||
This option enables support for the Red and White LEDs of
|
||||
SGI Octane machines.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called leds-ip30.
|
||||
|
||||
comment "LED Triggers"
|
||||
source "drivers/leds/trigger/Kconfig"
|
||||
|
||||
|
@ -6,91 +6,92 @@ obj-$(CONFIG_LEDS_CLASS) += led-class.o
|
||||
obj-$(CONFIG_LEDS_CLASS_FLASH) += led-class-flash.o
|
||||
obj-$(CONFIG_LEDS_TRIGGERS) += led-triggers.o
|
||||
|
||||
# LED Platform Drivers
|
||||
# LED Platform Drivers (keep this sorted, M-| sort)
|
||||
obj-$(CONFIG_LEDS_88PM860X) += leds-88pm860x.o
|
||||
obj-$(CONFIG_LEDS_AAT1290) += leds-aat1290.o
|
||||
obj-$(CONFIG_LEDS_ADP5520) += leds-adp5520.o
|
||||
obj-$(CONFIG_LEDS_AN30259A) += leds-an30259a.o
|
||||
obj-$(CONFIG_LEDS_APU) += leds-apu.o
|
||||
obj-$(CONFIG_LEDS_AS3645A) += leds-as3645a.o
|
||||
obj-$(CONFIG_LEDS_AN30259A) += leds-an30259a.o
|
||||
obj-$(CONFIG_LEDS_ASIC3) += leds-asic3.o
|
||||
obj-$(CONFIG_LEDS_BCM6328) += leds-bcm6328.o
|
||||
obj-$(CONFIG_LEDS_BCM6358) += leds-bcm6358.o
|
||||
obj-$(CONFIG_LEDS_BD2802) += leds-bd2802.o
|
||||
obj-$(CONFIG_LEDS_BLINKM) += leds-blinkm.o
|
||||
obj-$(CONFIG_LEDS_CLEVO_MAIL) += leds-clevo-mail.o
|
||||
obj-$(CONFIG_LEDS_COBALT_QUBE) += leds-cobalt-qube.o
|
||||
obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o
|
||||
obj-$(CONFIG_LEDS_CPCAP) += leds-cpcap.o
|
||||
obj-$(CONFIG_LEDS_LOCOMO) += leds-locomo.o
|
||||
obj-$(CONFIG_LEDS_DA903X) += leds-da903x.o
|
||||
obj-$(CONFIG_LEDS_DA9052) += leds-da9052.o
|
||||
obj-$(CONFIG_LEDS_FSG) += leds-fsg.o
|
||||
obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o
|
||||
obj-$(CONFIG_LEDS_GPIO_REGISTER) += leds-gpio-register.o
|
||||
obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o
|
||||
obj-$(CONFIG_LEDS_INTEL_SS4200) += leds-ss4200.o
|
||||
obj-$(CONFIG_LEDS_IP30) += leds-ip30.o
|
||||
obj-$(CONFIG_LEDS_IPAQ_MICRO) += leds-ipaq-micro.o
|
||||
obj-$(CONFIG_LEDS_IS31FL319X) += leds-is31fl319x.o
|
||||
obj-$(CONFIG_LEDS_IS31FL32XX) += leds-is31fl32xx.o
|
||||
obj-$(CONFIG_LEDS_KTD2692) += leds-ktd2692.o
|
||||
obj-$(CONFIG_LEDS_LM3530) += leds-lm3530.o
|
||||
obj-$(CONFIG_LEDS_LM3532) += leds-lm3532.o
|
||||
obj-$(CONFIG_LEDS_LM3533) += leds-lm3533.o
|
||||
obj-$(CONFIG_LEDS_LM355x) += leds-lm355x.o
|
||||
obj-$(CONFIG_LEDS_LM3601X) += leds-lm3601x.o
|
||||
obj-$(CONFIG_LEDS_LM36274) += leds-lm36274.o
|
||||
obj-$(CONFIG_LEDS_LM3642) += leds-lm3642.o
|
||||
obj-$(CONFIG_LEDS_MIKROTIK_RB532) += leds-rb532.o
|
||||
obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o
|
||||
obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o
|
||||
obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o
|
||||
obj-$(CONFIG_LEDS_COBALT_QUBE) += leds-cobalt-qube.o
|
||||
obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o
|
||||
obj-$(CONFIG_LEDS_SUNFIRE) += leds-sunfire.o
|
||||
obj-$(CONFIG_LEDS_PCA9532) += leds-pca9532.o
|
||||
obj-$(CONFIG_LEDS_GPIO_REGISTER) += leds-gpio-register.o
|
||||
obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o
|
||||
obj-$(CONFIG_LEDS_LM3692X) += leds-lm3692x.o
|
||||
obj-$(CONFIG_LEDS_LM3697) += leds-lm3697.o
|
||||
obj-$(CONFIG_LEDS_LOCOMO) += leds-locomo.o
|
||||
obj-$(CONFIG_LEDS_LP3944) += leds-lp3944.o
|
||||
obj-$(CONFIG_LEDS_LP3952) += leds-lp3952.o
|
||||
obj-$(CONFIG_LEDS_LP55XX_COMMON) += leds-lp55xx-common.o
|
||||
obj-$(CONFIG_LEDS_LP5521) += leds-lp5521.o
|
||||
obj-$(CONFIG_LEDS_LP5523) += leds-lp5523.o
|
||||
obj-$(CONFIG_LEDS_LP5562) += leds-lp5562.o
|
||||
obj-$(CONFIG_LEDS_LP55XX_COMMON) += leds-lp55xx-common.o
|
||||
obj-$(CONFIG_LEDS_LP8501) += leds-lp8501.o
|
||||
obj-$(CONFIG_LEDS_LP8788) += leds-lp8788.o
|
||||
obj-$(CONFIG_LEDS_LP8860) += leds-lp8860.o
|
||||
obj-$(CONFIG_LEDS_TCA6507) += leds-tca6507.o
|
||||
obj-$(CONFIG_LEDS_TLC591XX) += leds-tlc591xx.o
|
||||
obj-$(CONFIG_LEDS_CLEVO_MAIL) += leds-clevo-mail.o
|
||||
obj-$(CONFIG_LEDS_IPAQ_MICRO) += leds-ipaq-micro.o
|
||||
obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o
|
||||
obj-$(CONFIG_LEDS_OT200) += leds-ot200.o
|
||||
obj-$(CONFIG_LEDS_FSG) += leds-fsg.o
|
||||
obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o
|
||||
obj-$(CONFIG_LEDS_PCA963X) += leds-pca963x.o
|
||||
obj-$(CONFIG_LEDS_DA903X) += leds-da903x.o
|
||||
obj-$(CONFIG_LEDS_DA9052) += leds-da9052.o
|
||||
obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o
|
||||
obj-$(CONFIG_LEDS_WM8350) += leds-wm8350.o
|
||||
obj-$(CONFIG_LEDS_PWM) += leds-pwm.o
|
||||
obj-$(CONFIG_LEDS_REGULATOR) += leds-regulator.o
|
||||
obj-$(CONFIG_LEDS_INTEL_SS4200) += leds-ss4200.o
|
||||
obj-$(CONFIG_LEDS_LT3593) += leds-lt3593.o
|
||||
obj-$(CONFIG_LEDS_ADP5520) += leds-adp5520.o
|
||||
obj-$(CONFIG_LEDS_MC13783) += leds-mc13783.o
|
||||
obj-$(CONFIG_LEDS_NS2) += leds-ns2.o
|
||||
obj-$(CONFIG_LEDS_NETXBIG) += leds-netxbig.o
|
||||
obj-$(CONFIG_LEDS_ASIC3) += leds-asic3.o
|
||||
obj-$(CONFIG_LEDS_MAX77650) += leds-max77650.o
|
||||
obj-$(CONFIG_LEDS_MAX77693) += leds-max77693.o
|
||||
obj-$(CONFIG_LEDS_MAX8997) += leds-max8997.o
|
||||
obj-$(CONFIG_LEDS_LM355x) += leds-lm355x.o
|
||||
obj-$(CONFIG_LEDS_BLINKM) += leds-blinkm.o
|
||||
obj-$(CONFIG_LEDS_SYSCON) += leds-syscon.o
|
||||
obj-$(CONFIG_LEDS_MC13783) += leds-mc13783.o
|
||||
obj-$(CONFIG_LEDS_MENF21BMC) += leds-menf21bmc.o
|
||||
obj-$(CONFIG_LEDS_KTD2692) += leds-ktd2692.o
|
||||
obj-$(CONFIG_LEDS_POWERNV) += leds-powernv.o
|
||||
obj-$(CONFIG_LEDS_IS31FL319X) += leds-is31fl319x.o
|
||||
obj-$(CONFIG_LEDS_IS31FL32XX) += leds-is31fl32xx.o
|
||||
obj-$(CONFIG_LEDS_PM8058) += leds-pm8058.o
|
||||
obj-$(CONFIG_LEDS_MIKROTIK_RB532) += leds-rb532.o
|
||||
obj-$(CONFIG_LEDS_MLXCPLD) += leds-mlxcpld.o
|
||||
obj-$(CONFIG_LEDS_MLXREG) += leds-mlxreg.o
|
||||
obj-$(CONFIG_LEDS_NIC78BX) += leds-nic78bx.o
|
||||
obj-$(CONFIG_LEDS_SPI_BYTE) += leds-spi-byte.o
|
||||
obj-$(CONFIG_LEDS_MT6323) += leds-mt6323.o
|
||||
obj-$(CONFIG_LEDS_LM3692X) += leds-lm3692x.o
|
||||
obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o
|
||||
obj-$(CONFIG_LEDS_NETXBIG) += leds-netxbig.o
|
||||
obj-$(CONFIG_LEDS_NIC78BX) += leds-nic78bx.o
|
||||
obj-$(CONFIG_LEDS_NS2) += leds-ns2.o
|
||||
obj-$(CONFIG_LEDS_OT200) += leds-ot200.o
|
||||
obj-$(CONFIG_LEDS_PCA9532) += leds-pca9532.o
|
||||
obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o
|
||||
obj-$(CONFIG_LEDS_PCA963X) += leds-pca963x.o
|
||||
obj-$(CONFIG_LEDS_PM8058) += leds-pm8058.o
|
||||
obj-$(CONFIG_LEDS_POWERNV) += leds-powernv.o
|
||||
obj-$(CONFIG_LEDS_PWM) += leds-pwm.o
|
||||
obj-$(CONFIG_LEDS_REGULATOR) += leds-regulator.o
|
||||
obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o
|
||||
obj-$(CONFIG_LEDS_SC27XX_BLTC) += leds-sc27xx-bltc.o
|
||||
obj-$(CONFIG_LEDS_LM3601X) += leds-lm3601x.o
|
||||
obj-$(CONFIG_LEDS_SUNFIRE) += leds-sunfire.o
|
||||
obj-$(CONFIG_LEDS_SYSCON) += leds-syscon.o
|
||||
obj-$(CONFIG_LEDS_TCA6507) += leds-tca6507.o
|
||||
obj-$(CONFIG_LEDS_TI_LMU_COMMON) += leds-ti-lmu-common.o
|
||||
obj-$(CONFIG_LEDS_LM3697) += leds-lm3697.o
|
||||
obj-$(CONFIG_LEDS_LM36274) += leds-lm36274.o
|
||||
obj-$(CONFIG_LEDS_TLC591XX) += leds-tlc591xx.o
|
||||
obj-$(CONFIG_LEDS_TPS6105X) += leds-tps6105x.o
|
||||
obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o
|
||||
obj-$(CONFIG_LEDS_WM8350) += leds-wm8350.o
|
||||
obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o
|
||||
|
||||
# LED SPI Drivers
|
||||
obj-$(CONFIG_LEDS_CR0014114) += leds-cr0014114.o
|
||||
obj-$(CONFIG_LEDS_DAC124S085) += leds-dac124s085.o
|
||||
obj-$(CONFIG_LEDS_EL15203000) += leds-el15203000.o
|
||||
obj-$(CONFIG_LEDS_SPI_BYTE) += leds-spi-byte.o
|
||||
|
||||
# LED Userspace Drivers
|
||||
obj-$(CONFIG_LEDS_USER) += uleds.o
|
||||
|
@ -376,7 +376,7 @@ int led_classdev_register_ext(struct device *parent,
|
||||
|
||||
if (ret)
|
||||
dev_warn(parent, "Led %s renamed to %s due to name collision",
|
||||
led_cdev->name, dev_name(led_cdev->dev));
|
||||
proposed_name, dev_name(led_cdev->dev));
|
||||
|
||||
if (led_cdev->flags & LED_BRIGHT_HW_CHANGED) {
|
||||
ret = led_add_brightness_hw_changed(led_cdev);
|
||||
|
@ -660,7 +660,6 @@ static int bd2802_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct bd2802_led *led;
|
||||
struct bd2802_led_platform_data *pdata;
|
||||
int ret, i;
|
||||
|
||||
led = devm_kzalloc(&client->dev, sizeof(struct bd2802_led), GFP_KERNEL);
|
||||
@ -668,7 +667,6 @@ static int bd2802_probe(struct i2c_client *client,
|
||||
return -ENOMEM;
|
||||
|
||||
led->client = client;
|
||||
pdata = led->pdata = dev_get_platdata(&client->dev);
|
||||
i2c_set_clientdata(client, led);
|
||||
|
||||
/*
|
||||
|
86
drivers/leds/leds-ip30.c
Normal file
86
drivers/leds/leds-ip30.c
Normal file
@ -0,0 +1,86 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* LED Driver for SGI Octane machines
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#define IP30_LED_SYSTEM 0
|
||||
#define IP30_LED_FAULT 1
|
||||
|
||||
struct ip30_led {
|
||||
struct led_classdev cdev;
|
||||
u32 __iomem *reg;
|
||||
};
|
||||
|
||||
static void ip30led_set(struct led_classdev *led_cdev,
|
||||
enum led_brightness value)
|
||||
{
|
||||
struct ip30_led *led = container_of(led_cdev, struct ip30_led, cdev);
|
||||
|
||||
writel(value, led->reg);
|
||||
}
|
||||
|
||||
static int ip30led_create(struct platform_device *pdev, int num)
|
||||
{
|
||||
struct resource *res;
|
||||
struct ip30_led *data;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, num);
|
||||
if (!res)
|
||||
return -EBUSY;
|
||||
|
||||
data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
data->reg = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(data->reg))
|
||||
return PTR_ERR(data->reg);
|
||||
|
||||
|
||||
switch (num) {
|
||||
case IP30_LED_SYSTEM:
|
||||
data->cdev.name = "white:power";
|
||||
break;
|
||||
case IP30_LED_FAULT:
|
||||
data->cdev.name = "red:fault";
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
data->cdev.brightness = readl(data->reg);
|
||||
data->cdev.max_brightness = 1;
|
||||
data->cdev.brightness_set = ip30led_set;
|
||||
|
||||
return devm_led_classdev_register(&pdev->dev, &data->cdev);
|
||||
}
|
||||
|
||||
static int ip30led_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = ip30led_create(pdev, IP30_LED_SYSTEM);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return ip30led_create(pdev, IP30_LED_FAULT);
|
||||
}
|
||||
|
||||
static struct platform_driver ip30led_driver = {
|
||||
.probe = ip30led_probe,
|
||||
.driver = {
|
||||
.name = "ip30-leds",
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(ip30led_driver);
|
||||
|
||||
MODULE_AUTHOR("Thomas Bogendoerfer <tbogendoerfer@suse.de>");
|
||||
MODULE_DESCRIPTION("SGI Octane LED driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:ip30-leds");
|
@ -44,7 +44,7 @@ struct is31fl32xx_priv {
|
||||
const struct is31fl32xx_chipdef *cdef;
|
||||
struct i2c_client *client;
|
||||
unsigned int num_leds;
|
||||
struct is31fl32xx_led_data leds[0];
|
||||
struct is31fl32xx_led_data leds[];
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -140,7 +140,7 @@ struct lm3532_led {
|
||||
int ctrl_brt_pointer;
|
||||
int num_leds;
|
||||
int full_scale_current;
|
||||
int enabled:1;
|
||||
unsigned int enabled:1;
|
||||
u32 led_strings[LM3532_MAX_CONTROL_BANKS];
|
||||
char label[LED_MAX_NAME_SIZE];
|
||||
};
|
||||
|
@ -246,7 +246,7 @@ static int lm3697_probe_dt(struct lm3697 *priv)
|
||||
|
||||
led->num_leds = fwnode_property_count_u32(child, "led-sources");
|
||||
if (led->num_leds > LM3697_MAX_LED_STRINGS) {
|
||||
dev_err(&priv->client->dev, "To many LED strings defined\n");
|
||||
dev_err(&priv->client->dev, "Too many LED strings defined\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -12,14 +12,38 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_data/leds-kirkwood-ns2.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include "leds.h"
|
||||
|
||||
enum ns2_led_modes {
|
||||
NS_V2_LED_OFF,
|
||||
NS_V2_LED_ON,
|
||||
NS_V2_LED_SATA,
|
||||
};
|
||||
|
||||
struct ns2_led_modval {
|
||||
enum ns2_led_modes mode;
|
||||
int cmd_level;
|
||||
int slow_level;
|
||||
};
|
||||
|
||||
struct ns2_led {
|
||||
const char *name;
|
||||
const char *default_trigger;
|
||||
struct gpio_desc *cmd;
|
||||
struct gpio_desc *slow;
|
||||
int num_modes;
|
||||
struct ns2_led_modval *modval;
|
||||
};
|
||||
|
||||
struct ns2_led_platform_data {
|
||||
int num_leds;
|
||||
struct ns2_led *leds;
|
||||
};
|
||||
|
||||
/*
|
||||
* The Network Space v2 dual-GPIO LED is wired to a CPLD. Three different LED
|
||||
* modes are available: off, on and SATA activity blinking. The LED modes are
|
||||
@ -29,8 +53,8 @@
|
||||
|
||||
struct ns2_led_data {
|
||||
struct led_classdev cdev;
|
||||
unsigned int cmd;
|
||||
unsigned int slow;
|
||||
struct gpio_desc *cmd;
|
||||
struct gpio_desc *slow;
|
||||
bool can_sleep;
|
||||
unsigned char sata; /* True when SATA mode active. */
|
||||
rwlock_t rw_lock; /* Lock GPIOs. */
|
||||
@ -46,8 +70,8 @@ static int ns2_led_get_mode(struct ns2_led_data *led_dat,
|
||||
int cmd_level;
|
||||
int slow_level;
|
||||
|
||||
cmd_level = gpio_get_value_cansleep(led_dat->cmd);
|
||||
slow_level = gpio_get_value_cansleep(led_dat->slow);
|
||||
cmd_level = gpiod_get_value_cansleep(led_dat->cmd);
|
||||
slow_level = gpiod_get_value_cansleep(led_dat->slow);
|
||||
|
||||
for (i = 0; i < led_dat->num_modes; i++) {
|
||||
if (cmd_level == led_dat->modval[i].cmd_level &&
|
||||
@ -80,15 +104,15 @@ static void ns2_led_set_mode(struct ns2_led_data *led_dat,
|
||||
write_lock_irqsave(&led_dat->rw_lock, flags);
|
||||
|
||||
if (!led_dat->can_sleep) {
|
||||
gpio_set_value(led_dat->cmd,
|
||||
led_dat->modval[i].cmd_level);
|
||||
gpio_set_value(led_dat->slow,
|
||||
led_dat->modval[i].slow_level);
|
||||
gpiod_set_value(led_dat->cmd,
|
||||
led_dat->modval[i].cmd_level);
|
||||
gpiod_set_value(led_dat->slow,
|
||||
led_dat->modval[i].slow_level);
|
||||
goto exit_unlock;
|
||||
}
|
||||
|
||||
gpio_set_value_cansleep(led_dat->cmd, led_dat->modval[i].cmd_level);
|
||||
gpio_set_value_cansleep(led_dat->slow, led_dat->modval[i].slow_level);
|
||||
gpiod_set_value_cansleep(led_dat->cmd, led_dat->modval[i].cmd_level);
|
||||
gpiod_set_value_cansleep(led_dat->slow, led_dat->modval[i].slow_level);
|
||||
|
||||
exit_unlock:
|
||||
write_unlock_irqrestore(&led_dat->rw_lock, flags);
|
||||
@ -176,26 +200,6 @@ create_ns2_led(struct platform_device *pdev, struct ns2_led_data *led_dat,
|
||||
int ret;
|
||||
enum ns2_led_modes mode;
|
||||
|
||||
ret = devm_gpio_request_one(&pdev->dev, template->cmd,
|
||||
gpio_get_value_cansleep(template->cmd) ?
|
||||
GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW,
|
||||
template->name);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "%s: failed to setup command GPIO\n",
|
||||
template->name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_gpio_request_one(&pdev->dev, template->slow,
|
||||
gpio_get_value_cansleep(template->slow) ?
|
||||
GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW,
|
||||
template->name);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "%s: failed to setup slow GPIO\n",
|
||||
template->name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
rwlock_init(&led_dat->rw_lock);
|
||||
|
||||
led_dat->cdev.name = template->name;
|
||||
@ -205,8 +209,8 @@ create_ns2_led(struct platform_device *pdev, struct ns2_led_data *led_dat,
|
||||
led_dat->cdev.groups = ns2_led_groups;
|
||||
led_dat->cmd = template->cmd;
|
||||
led_dat->slow = template->slow;
|
||||
led_dat->can_sleep = gpio_cansleep(led_dat->cmd) |
|
||||
gpio_cansleep(led_dat->slow);
|
||||
led_dat->can_sleep = gpiod_cansleep(led_dat->cmd) |
|
||||
gpiod_cansleep(led_dat->slow);
|
||||
if (led_dat->can_sleep)
|
||||
led_dat->cdev.brightness_set_blocking = ns2_led_set_blocking;
|
||||
else
|
||||
@ -261,17 +265,26 @@ ns2_leds_get_of_pdata(struct device *dev, struct ns2_led_platform_data *pdata)
|
||||
const char *string;
|
||||
int i, num_modes;
|
||||
struct ns2_led_modval *modval;
|
||||
struct gpio_desc *gd;
|
||||
|
||||
ret = of_get_named_gpio(child, "cmd-gpio", 0);
|
||||
if (ret < 0)
|
||||
goto err_node_put;
|
||||
led->cmd = ret;
|
||||
ret = of_get_named_gpio(child, "slow-gpio", 0);
|
||||
if (ret < 0)
|
||||
goto err_node_put;
|
||||
led->slow = ret;
|
||||
ret = of_property_read_string(child, "label", &string);
|
||||
led->name = (ret == 0) ? string : child->name;
|
||||
|
||||
gd = gpiod_get_from_of_node(child, "cmd-gpio", 0,
|
||||
GPIOD_ASIS, led->name);
|
||||
if (IS_ERR(gd)) {
|
||||
ret = PTR_ERR(gd);
|
||||
goto err_node_put;
|
||||
}
|
||||
led->cmd = gd;
|
||||
gd = gpiod_get_from_of_node(child, "slow-gpio", 0,
|
||||
GPIOD_ASIS, led->name);
|
||||
if (IS_ERR(gd)) {
|
||||
ret = PTR_ERR(gd);
|
||||
goto err_node_put;
|
||||
}
|
||||
led->slow = gd;
|
||||
|
||||
ret = of_property_read_string(child, "linux,default-trigger",
|
||||
&string);
|
||||
if (ret == 0)
|
||||
|
@ -16,60 +16,55 @@
|
||||
#include <linux/leds.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/leds_pwm.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
struct led_pwm {
|
||||
const char *name;
|
||||
const char *default_trigger;
|
||||
u8 active_low;
|
||||
unsigned int max_brightness;
|
||||
};
|
||||
|
||||
struct led_pwm_platform_data {
|
||||
int num_leds;
|
||||
struct led_pwm *leds;
|
||||
};
|
||||
|
||||
struct led_pwm_data {
|
||||
struct led_classdev cdev;
|
||||
struct pwm_device *pwm;
|
||||
struct pwm_state pwmstate;
|
||||
unsigned int active_low;
|
||||
unsigned int period;
|
||||
int duty;
|
||||
};
|
||||
|
||||
struct led_pwm_priv {
|
||||
int num_leds;
|
||||
struct led_pwm_data leds[0];
|
||||
struct led_pwm_data leds[];
|
||||
};
|
||||
|
||||
static void __led_pwm_set(struct led_pwm_data *led_dat)
|
||||
{
|
||||
int new_duty = led_dat->duty;
|
||||
|
||||
pwm_config(led_dat->pwm, new_duty, led_dat->period);
|
||||
|
||||
if (new_duty == 0)
|
||||
pwm_disable(led_dat->pwm);
|
||||
else
|
||||
pwm_enable(led_dat->pwm);
|
||||
}
|
||||
|
||||
static int led_pwm_set(struct led_classdev *led_cdev,
|
||||
enum led_brightness brightness)
|
||||
{
|
||||
struct led_pwm_data *led_dat =
|
||||
container_of(led_cdev, struct led_pwm_data, cdev);
|
||||
unsigned int max = led_dat->cdev.max_brightness;
|
||||
unsigned long long duty = led_dat->period;
|
||||
unsigned long long duty = led_dat->pwmstate.period;
|
||||
|
||||
duty *= brightness;
|
||||
do_div(duty, max);
|
||||
|
||||
if (led_dat->active_low)
|
||||
duty = led_dat->period - duty;
|
||||
duty = led_dat->pwmstate.period - duty;
|
||||
|
||||
led_dat->duty = duty;
|
||||
|
||||
__led_pwm_set(led_dat);
|
||||
|
||||
return 0;
|
||||
led_dat->pwmstate.duty_cycle = duty;
|
||||
led_dat->pwmstate.enabled = duty > 0;
|
||||
return pwm_apply_state(led_dat->pwm, &led_dat->pwmstate);
|
||||
}
|
||||
|
||||
static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
|
||||
struct led_pwm *led, struct fwnode_handle *fwnode)
|
||||
{
|
||||
struct led_pwm_data *led_data = &priv->leds[priv->num_leds];
|
||||
struct pwm_args pargs;
|
||||
int ret;
|
||||
|
||||
led_data->active_low = led->active_low;
|
||||
@ -93,17 +88,7 @@ static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
|
||||
|
||||
led_data->cdev.brightness_set_blocking = led_pwm_set;
|
||||
|
||||
/*
|
||||
* FIXME: pwm_apply_args() should be removed when switching to the
|
||||
* atomic PWM API.
|
||||
*/
|
||||
pwm_apply_args(led_data->pwm);
|
||||
|
||||
pwm_get_args(led_data->pwm, &pargs);
|
||||
|
||||
led_data->period = pargs.period;
|
||||
if (!led_data->period && (led->pwm_period_ns > 0))
|
||||
led_data->period = led->pwm_period_ns;
|
||||
pwm_init_state(led_data->pwm, &led_data->pwmstate);
|
||||
|
||||
ret = devm_led_classdev_register(dev, &led_data->cdev);
|
||||
if (ret == 0) {
|
||||
|
@ -6,6 +6,7 @@
|
||||
* Author: Jacek Anaszewski <j.anaszewski@samsung.com>
|
||||
*
|
||||
* Copyright (C) 2019 Jacek Anaszewski <jacek.anaszewski@gmail.com>
|
||||
* Copyright (C) 2020 Pavel Machek <pavel@ucw.cz>
|
||||
*/
|
||||
|
||||
#ifndef __DT_BINDINGS_LEDS_H
|
||||
@ -32,16 +33,38 @@
|
||||
#define LED_COLOR_ID_MAX 8
|
||||
|
||||
/* Standard LED functions */
|
||||
/* Keyboard LEDs, usually it would be input4::capslock etc. */
|
||||
/* Obsolete equivalent: "shift-key-light" */
|
||||
#define LED_FUNCTION_CAPSLOCK "capslock"
|
||||
#define LED_FUNCTION_SCROLLLOCK "scrolllock"
|
||||
#define LED_FUNCTION_NUMLOCK "numlock"
|
||||
/* Obsolete equivalents: "tpacpi::thinklight" (IBM/Lenovo Thinkpads),
|
||||
"lp5523:kb{1,2,3,4,5,6}" (Nokia N900) */
|
||||
#define LED_FUNCTION_KBD_BACKLIGHT "kbd_backlight"
|
||||
|
||||
/* System LEDs, usually found on system body.
|
||||
platform::mute (etc) is sometimes seen, :mute would be better */
|
||||
#define LED_FUNCTION_POWER "power"
|
||||
#define LED_FUNCTION_DISK "disk"
|
||||
|
||||
/* Obsolete: "platform:*:charging" (allwinner sun50i) */
|
||||
#define LED_FUNCTION_CHARGING "charging"
|
||||
/* Used RGB notification LEDs common on phones.
|
||||
Obsolete equivalents: "status-led:{red,green,blue}" (Motorola Droid 4),
|
||||
"lp5523:{r,g,b}" (Nokia N900) */
|
||||
#define LED_FUNCTION_STATUS "status"
|
||||
|
||||
#define LED_FUNCTION_MICMUTE "micmute"
|
||||
#define LED_FUNCTION_MUTE "mute"
|
||||
|
||||
/* Miscelleaus functions. Use functions above if you can. */
|
||||
#define LED_FUNCTION_ACTIVITY "activity"
|
||||
#define LED_FUNCTION_ALARM "alarm"
|
||||
#define LED_FUNCTION_BACKLIGHT "backlight"
|
||||
#define LED_FUNCTION_BLUETOOTH "bluetooth"
|
||||
#define LED_FUNCTION_BOOT "boot"
|
||||
#define LED_FUNCTION_CPU "cpu"
|
||||
#define LED_FUNCTION_CAPSLOCK "capslock"
|
||||
#define LED_FUNCTION_CHARGING "charging"
|
||||
#define LED_FUNCTION_DEBUG "debug"
|
||||
#define LED_FUNCTION_DISK "disk"
|
||||
#define LED_FUNCTION_DISK_ACTIVITY "disk-activity"
|
||||
#define LED_FUNCTION_DISK_ERR "disk-err"
|
||||
#define LED_FUNCTION_DISK_READ "disk-read"
|
||||
@ -50,21 +73,14 @@
|
||||
#define LED_FUNCTION_FLASH "flash"
|
||||
#define LED_FUNCTION_HEARTBEAT "heartbeat"
|
||||
#define LED_FUNCTION_INDICATOR "indicator"
|
||||
#define LED_FUNCTION_KBD_BACKLIGHT "kbd_backlight"
|
||||
#define LED_FUNCTION_LAN "lan"
|
||||
#define LED_FUNCTION_MAIL "mail"
|
||||
#define LED_FUNCTION_MTD "mtd"
|
||||
#define LED_FUNCTION_MICMUTE "micmute"
|
||||
#define LED_FUNCTION_MUTE "mute"
|
||||
#define LED_FUNCTION_NUMLOCK "numlock"
|
||||
#define LED_FUNCTION_PANIC "panic"
|
||||
#define LED_FUNCTION_PROGRAMMING "programming"
|
||||
#define LED_FUNCTION_POWER "power"
|
||||
#define LED_FUNCTION_RX "rx"
|
||||
#define LED_FUNCTION_SD "sd"
|
||||
#define LED_FUNCTION_SCROLLLOCK "scrolllock"
|
||||
#define LED_FUNCTION_STANDBY "standby"
|
||||
#define LED_FUNCTION_STATUS "status"
|
||||
#define LED_FUNCTION_TORCH "torch"
|
||||
#define LED_FUNCTION_TX "tx"
|
||||
#define LED_FUNCTION_USB "usb"
|
||||
|
@ -25,6 +25,7 @@ struct device_node;
|
||||
* LED Core
|
||||
*/
|
||||
|
||||
/* This is obsolete/useless. We now support variable maximum brightness. */
|
||||
enum led_brightness {
|
||||
LED_OFF = 0,
|
||||
LED_ON = 1,
|
||||
|
@ -1,22 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* PWM LED driver data - see drivers/leds/leds-pwm.c
|
||||
*/
|
||||
#ifndef __LINUX_LEDS_PWM_H
|
||||
#define __LINUX_LEDS_PWM_H
|
||||
|
||||
struct led_pwm {
|
||||
const char *name;
|
||||
const char *default_trigger;
|
||||
unsigned pwm_id __deprecated;
|
||||
u8 active_low;
|
||||
unsigned max_brightness;
|
||||
unsigned pwm_period_ns;
|
||||
};
|
||||
|
||||
struct led_pwm_platform_data {
|
||||
int num_leds;
|
||||
struct led_pwm *leds;
|
||||
};
|
||||
|
||||
#endif
|
@ -1,38 +0,0 @@
|
||||
/*
|
||||
* Platform data structure for Network Space v2 LED driver
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#ifndef __LEDS_KIRKWOOD_NS2_H
|
||||
#define __LEDS_KIRKWOOD_NS2_H
|
||||
|
||||
enum ns2_led_modes {
|
||||
NS_V2_LED_OFF,
|
||||
NS_V2_LED_ON,
|
||||
NS_V2_LED_SATA,
|
||||
};
|
||||
|
||||
struct ns2_led_modval {
|
||||
enum ns2_led_modes mode;
|
||||
int cmd_level;
|
||||
int slow_level;
|
||||
};
|
||||
|
||||
struct ns2_led {
|
||||
const char *name;
|
||||
const char *default_trigger;
|
||||
unsigned cmd;
|
||||
unsigned slow;
|
||||
int num_modes;
|
||||
struct ns2_led_modval *modval;
|
||||
};
|
||||
|
||||
struct ns2_led_platform_data {
|
||||
int num_leds;
|
||||
struct ns2_led *leds;
|
||||
};
|
||||
|
||||
#endif /* __LEDS_KIRKWOOD_NS2_H */
|
Loading…
Reference in New Issue
Block a user