Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
5cb5aed5
Commit
5cb5aed5
authored
Sep 16, 2009
by
Stephen Rothwell
Browse files
Options
Browse Files
Download
Plain Diff
Merge commit 'leds/for-mm'
parents
f5da4d83
f16a5dba
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
414 additions
and
31 deletions
+414
-31
drivers/leds/Kconfig
drivers/leds/Kconfig
+10
-3
drivers/leds/Makefile
drivers/leds/Makefile
+1
-0
drivers/leds/leds-clevo-mail.c
drivers/leds/leds-clevo-mail.c
+1
-1
drivers/leds/leds-cobalt-qube.c
drivers/leds/leds-cobalt-qube.c
+1
-1
drivers/leds/leds-cobalt-raq.c
drivers/leds/leds-cobalt-raq.c
+2
-2
drivers/leds/leds-gpio.c
drivers/leds/leds-gpio.c
+1
-1
drivers/leds/leds-pca9532.c
drivers/leds/leds-pca9532.c
+6
-6
drivers/leds/leds-wm831x-status.c
drivers/leds/leds-wm831x-status.c
+341
-0
drivers/leds/ledtrig-gpio.c
drivers/leds/ledtrig-gpio.c
+16
-16
drivers/macintosh/via-pmu-led.c
drivers/macintosh/via-pmu-led.c
+1
-1
include/linux/mfd/wm831x/status.h
include/linux/mfd/wm831x/status.h
+34
-0
No files found.
drivers/leds/Kconfig
View file @
5cb5aed5
...
@@ -195,6 +195,13 @@ config LEDS_PCA955X
...
@@ -195,6 +195,13 @@ config LEDS_PCA955X
LED driver chips accessed via the I2C bus. Supported
LED driver chips accessed via the I2C bus. Supported
devices include PCA9550, PCA9551, PCA9552, and PCA9553.
devices include PCA9550, PCA9551, PCA9552, and PCA9553.
config LEDS_WM831X_STATUS
tristate "LED support for status LEDs on WM831x PMICs"
depends on LEDS_CLASS && MFD_WM831X
help
This option enables support for the status LEDs of the WM831x
series of PMICs.
config LEDS_WM8350
config LEDS_WM8350
tristate "LED Support for WM8350 AudioPlus PMIC"
tristate "LED Support for WM8350 AudioPlus PMIC"
depends on LEDS_CLASS && MFD_WM8350
depends on LEDS_CLASS && MFD_WM8350
...
...
drivers/leds/Makefile
View file @
5cb5aed5
...
@@ -26,6 +26,7 @@ obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o
...
@@ -26,6 +26,7 @@ obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o
obj-$(CONFIG_LEDS_FSG)
+=
leds-fsg.o
obj-$(CONFIG_LEDS_FSG)
+=
leds-fsg.o
obj-$(CONFIG_LEDS_PCA955X)
+=
leds-pca955x.o
obj-$(CONFIG_LEDS_PCA955X)
+=
leds-pca955x.o
obj-$(CONFIG_LEDS_DA903X)
+=
leds-da903x.o
obj-$(CONFIG_LEDS_DA903X)
+=
leds-da903x.o
obj-$(CONFIG_LEDS_WM831X_STATUS)
+=
leds-wm831x-status.o
obj-$(CONFIG_LEDS_WM8350)
+=
leds-wm8350.o
obj-$(CONFIG_LEDS_WM8350)
+=
leds-wm8350.o
obj-$(CONFIG_LEDS_PWM)
+=
leds-pwm.o
obj-$(CONFIG_LEDS_PWM)
+=
leds-pwm.o
...
...
drivers/leds/leds-clevo-mail.c
View file @
5cb5aed5
...
@@ -145,7 +145,7 @@ static struct led_classdev clevo_mail_led = {
...
@@ -145,7 +145,7 @@ static struct led_classdev clevo_mail_led = {
.
flags
=
LED_CORE_SUSPENDRESUME
,
.
flags
=
LED_CORE_SUSPENDRESUME
,
};
};
static
int
__init
clevo_mail_led_probe
(
struct
platform_device
*
pdev
)
static
int
__
dev
init
clevo_mail_led_probe
(
struct
platform_device
*
pdev
)
{
{
return
led_classdev_register
(
&
pdev
->
dev
,
&
clevo_mail_led
);
return
led_classdev_register
(
&
pdev
->
dev
,
&
clevo_mail_led
);
}
}
...
...
drivers/leds/leds-cobalt-qube.c
View file @
5cb5aed5
...
@@ -28,7 +28,7 @@ static void qube_front_led_set(struct led_classdev *led_cdev,
...
@@ -28,7 +28,7 @@ static void qube_front_led_set(struct led_classdev *led_cdev,
}
}
static
struct
led_classdev
qube_front_led
=
{
static
struct
led_classdev
qube_front_led
=
{
.
name
=
"qube
-
front"
,
.
name
=
"qube
::
front"
,
.
brightness
=
LED_FULL
,
.
brightness
=
LED_FULL
,
.
brightness_set
=
qube_front_led_set
,
.
brightness_set
=
qube_front_led_set
,
.
default_trigger
=
"ide-disk"
,
.
default_trigger
=
"ide-disk"
,
...
...
drivers/leds/leds-cobalt-raq.c
View file @
5cb5aed5
...
@@ -49,7 +49,7 @@ static void raq_web_led_set(struct led_classdev *led_cdev,
...
@@ -49,7 +49,7 @@ static void raq_web_led_set(struct led_classdev *led_cdev,
}
}
static
struct
led_classdev
raq_web_led
=
{
static
struct
led_classdev
raq_web_led
=
{
.
name
=
"raq
-
web"
,
.
name
=
"raq
::
web"
,
.
brightness_set
=
raq_web_led_set
,
.
brightness_set
=
raq_web_led_set
,
};
};
...
@@ -70,7 +70,7 @@ static void raq_power_off_led_set(struct led_classdev *led_cdev,
...
@@ -70,7 +70,7 @@ static void raq_power_off_led_set(struct led_classdev *led_cdev,
}
}
static
struct
led_classdev
raq_power_off_led
=
{
static
struct
led_classdev
raq_power_off_led
=
{
.
name
=
"raq
-
power-off"
,
.
name
=
"raq
::
power-off"
,
.
brightness_set
=
raq_power_off_led_set
,
.
brightness_set
=
raq_power_off_led_set
,
.
default_trigger
=
"power-off"
,
.
default_trigger
=
"power-off"
,
};
};
...
...
drivers/leds/leds-gpio.c
View file @
5cb5aed5
...
@@ -80,7 +80,7 @@ static int __devinit create_gpio_led(const struct gpio_led *template,
...
@@ -80,7 +80,7 @@ static int __devinit create_gpio_led(const struct gpio_led *template,
/* skip leds that aren't available */
/* skip leds that aren't available */
if
(
!
gpio_is_valid
(
template
->
gpio
))
{
if
(
!
gpio_is_valid
(
template
->
gpio
))
{
printk
(
KERN_INFO
"Skipping unav
ilable LED gpio %d (%s)
\n
"
,
printk
(
KERN_INFO
"Skipping unav
ailable LED gpio %d (%s)
\n
"
,
template
->
gpio
,
template
->
name
);
template
->
gpio
,
template
->
name
);
return
0
;
return
0
;
}
}
...
...
drivers/leds/leds-pca9532.c
View file @
5cb5aed5
drivers/leds/leds-wm831x-status.c
0 → 100644
View file @
5cb5aed5
/*
* LED driver for WM831x status LEDs
*
* Copyright(C) 2009 Wolfson Microelectronics PLC.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/leds.h>
#include <linux/err.h>
#include <linux/mfd/wm831x/core.h>
#include <linux/mfd/wm831x/pdata.h>
#include <linux/mfd/wm831x/status.h>
struct
wm831x_status
{
struct
led_classdev
cdev
;
struct
wm831x
*
wm831x
;
struct
work_struct
work
;
struct
mutex
mutex
;
spinlock_t
value_lock
;
int
reg
;
/* Control register */
int
reg_val
;
/* Control register value */
int
blink
;
int
blink_time
;
int
blink_cyc
;
int
src
;
enum
led_brightness
brightness
;
};
#define to_wm831x_status(led_cdev) \
container_of(led_cdev, struct wm831x_status, cdev)
static
void
wm831x_status_work
(
struct
work_struct
*
work
)
{
struct
wm831x_status
*
led
=
container_of
(
work
,
struct
wm831x_status
,
work
);
unsigned
long
flags
;
mutex_lock
(
&
led
->
mutex
);
led
->
reg_val
&=
~
(
WM831X_LED_SRC_MASK
|
WM831X_LED_MODE_MASK
|
WM831X_LED_DUTY_CYC_MASK
|
WM831X_LED_DUR_MASK
);
spin_lock_irqsave
(
&
led
->
value_lock
,
flags
);
led
->
reg_val
|=
led
->
src
<<
WM831X_LED_SRC_SHIFT
;
if
(
led
->
blink
)
{
led
->
reg_val
|=
2
<<
WM831X_LED_MODE_SHIFT
;
led
->
reg_val
|=
led
->
blink_time
<<
WM831X_LED_DUR_SHIFT
;
led
->
reg_val
|=
led
->
blink_cyc
;
}
else
{
if
(
led
->
brightness
!=
LED_OFF
)
led
->
reg_val
|=
1
<<
WM831X_LED_MODE_SHIFT
;
}
spin_unlock_irqrestore
(
&
led
->
value_lock
,
flags
);
wm831x_reg_write
(
led
->
wm831x
,
led
->
reg
,
led
->
reg_val
);
mutex_unlock
(
&
led
->
mutex
);
}
static
void
wm831x_status_set
(
struct
led_classdev
*
led_cdev
,
enum
led_brightness
value
)
{
struct
wm831x_status
*
led
=
to_wm831x_status
(
led_cdev
);
unsigned
long
flags
;
spin_lock_irqsave
(
&
led
->
value_lock
,
flags
);
led
->
brightness
=
value
;
if
(
value
==
LED_OFF
)
led
->
blink
=
0
;
schedule_work
(
&
led
->
work
);
spin_unlock_irqrestore
(
&
led
->
value_lock
,
flags
);
}
static
int
wm831x_status_blink_set
(
struct
led_classdev
*
led_cdev
,
unsigned
long
*
delay_on
,
unsigned
long
*
delay_off
)
{
struct
wm831x_status
*
led
=
to_wm831x_status
(
led_cdev
);
unsigned
long
flags
;
int
ret
=
0
;
/* Pick some defaults if we've not been given times */
if
(
*
delay_on
==
0
&&
*
delay_off
==
0
)
{
*
delay_on
=
250
;
*
delay_off
=
250
;
}
spin_lock_irqsave
(
&
led
->
value_lock
,
flags
);
/* We only have a limited selection of settings, see if we can
* support the configuration we're being given */
switch
(
*
delay_on
)
{
case
1000
:
led
->
blink_time
=
0
;
break
;
case
250
:
led
->
blink_time
=
1
;
break
;
case
125
:
led
->
blink_time
=
2
;
break
;
case
62
:
case
63
:
/* Actually 62.5ms */
led
->
blink_time
=
3
;
break
;
default:
ret
=
-
EINVAL
;
break
;
}
if
(
ret
==
0
)
{
switch
(
*
delay_off
/
*
delay_on
)
{
case
1
:
led
->
blink_cyc
=
0
;
break
;
case
3
:
led
->
blink_cyc
=
1
;
break
;
case
4
:
led
->
blink_cyc
=
2
;
break
;
case
8
:
led
->
blink_cyc
=
3
;
break
;
default:
ret
=
-
EINVAL
;
break
;
}
}
if
(
ret
==
0
)
led
->
blink
=
1
;
else
led
->
blink
=
0
;
/* Always update; if we fail turn off blinking since we expect
* a software fallback. */
schedule_work
(
&
led
->
work
);
spin_unlock_irqrestore
(
&
led
->
value_lock
,
flags
);
return
ret
;
}
static
const
char
*
led_src_texts
[]
=
{
"otp"
,
"power"
,
"charger"
,
"soft"
,
};
static
ssize_t
wm831x_status_src_show
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
struct
led_classdev
*
led_cdev
=
dev_get_drvdata
(
dev
);
struct
wm831x_status
*
led
=
to_wm831x_status
(
led_cdev
);
int
i
;
ssize_t
ret
=
0
;
mutex_lock
(
&
led
->
mutex
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
led_src_texts
);
i
++
)
if
(
i
==
led
->
src
)
ret
+=
sprintf
(
&
buf
[
ret
],
"[%s] "
,
led_src_texts
[
i
]);
else
ret
+=
sprintf
(
&
buf
[
ret
],
"%s "
,
led_src_texts
[
i
]);
mutex_unlock
(
&
led
->
mutex
);
ret
+=
sprintf
(
&
buf
[
ret
],
"
\n
"
);
return
ret
;
}
static
ssize_t
wm831x_status_src_store
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
size
)
{
struct
led_classdev
*
led_cdev
=
dev_get_drvdata
(
dev
);
struct
wm831x_status
*
led
=
to_wm831x_status
(
led_cdev
);
char
name
[
20
];
int
i
;
size_t
len
;
name
[
sizeof
(
name
)
-
1
]
=
'\0'
;
strncpy
(
name
,
buf
,
sizeof
(
name
)
-
1
);
len
=
strlen
(
name
);
if
(
len
&&
name
[
len
-
1
]
==
'\n'
)
name
[
len
-
1
]
=
'\0'
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
led_src_texts
);
i
++
)
{
if
(
!
strcmp
(
name
,
led_src_texts
[
i
]))
{
mutex_lock
(
&
led
->
mutex
);
led
->
src
=
i
;
schedule_work
(
&
led
->
work
);
mutex_unlock
(
&
led
->
mutex
);
}
}
return
size
;
}
static
DEVICE_ATTR
(
src
,
0644
,
wm831x_status_src_show
,
wm831x_status_src_store
);
static
int
wm831x_status_probe
(
struct
platform_device
*
pdev
)
{
struct
wm831x
*
wm831x
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
struct
wm831x_pdata
*
chip_pdata
;
struct
wm831x_status_pdata
pdata
;
struct
wm831x_status
*
drvdata
;
struct
resource
*
res
;
int
id
=
pdev
->
id
%
ARRAY_SIZE
(
chip_pdata
->
status
);
int
ret
;
res
=
platform_get_resource
(
pdev
,
IORESOURCE_IO
,
0
);
if
(
res
==
NULL
)
{
dev_err
(
&
pdev
->
dev
,
"No I/O resource
\n
"
);
ret
=
-
EINVAL
;
goto
err
;
}
drvdata
=
kzalloc
(
sizeof
(
struct
wm831x_status
),
GFP_KERNEL
);
if
(
!
drvdata
)
return
-
ENOMEM
;
dev_set_drvdata
(
&
pdev
->
dev
,
drvdata
);
drvdata
->
wm831x
=
wm831x
;
drvdata
->
reg
=
res
->
start
;
if
(
wm831x
->
dev
->
platform_data
)
chip_pdata
=
wm831x
->
dev
->
platform_data
;
else
chip_pdata
=
NULL
;
memset
(
&
pdata
,
0
,
sizeof
(
pdata
));
if
(
chip_pdata
&&
chip_pdata
->
status
[
id
])
memcpy
(
&
pdata
,
chip_pdata
->
status
[
id
],
sizeof
(
pdata
));
else
pdata
.
name
=
dev_name
(
&
pdev
->
dev
);
mutex_init
(
&
drvdata
->
mutex
);
INIT_WORK
(
&
drvdata
->
work
,
wm831x_status_work
);
spin_lock_init
(
&
drvdata
->
value_lock
);
/* We cache the configuration register and read startup values
* from it. */
drvdata
->
reg_val
=
wm831x_reg_read
(
wm831x
,
drvdata
->
reg
);
if
(
drvdata
->
reg_val
&
WM831X_LED_MODE_MASK
)
drvdata
->
brightness
=
LED_FULL
;
else
drvdata
->
brightness
=
LED_OFF
;
/* Set a default source if configured, otherwise leave the
* current hardware setting.
*/
if
(
pdata
.
default_src
==
WM831X_STATUS_PRESERVE
)
{
drvdata
->
src
=
drvdata
->
reg_val
;
drvdata
->
src
&=
WM831X_LED_SRC_MASK
;
drvdata
->
src
>>=
WM831X_LED_SRC_SHIFT
;
}
else
{
drvdata
->
src
=
pdata
.
default_src
-
1
;
}
drvdata
->
cdev
.
name
=
pdata
.
name
;
drvdata
->
cdev
.
default_trigger
=
pdata
.
default_trigger
;
drvdata
->
cdev
.
brightness_set
=
wm831x_status_set
;
drvdata
->
cdev
.
blink_set
=
wm831x_status_blink_set
;
ret
=
led_classdev_register
(
wm831x
->
dev
,
&
drvdata
->
cdev
);
if
(
ret
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"Failed to register LED: %d
\n
"
,
ret
);
goto
err_led
;
}
ret
=
device_create_file
(
drvdata
->
cdev
.
dev
,
&
dev_attr_src
);
if
(
ret
!=
0
)
dev_err
(
&
pdev
->
dev
,
"No source control for LED: %d
\n
"
,
ret
);
return
0
;
err_led:
led_classdev_unregister
(
&
drvdata
->
cdev
);
kfree
(
drvdata
);
err:
return
ret
;
}
static
int
wm831x_status_remove
(
struct
platform_device
*
pdev
)
{
struct
wm831x_status
*
drvdata
=
platform_get_drvdata
(
pdev
);
device_remove_file
(
drvdata
->
cdev
.
dev
,
&
dev_attr_src
);
led_classdev_unregister
(
&
drvdata
->
cdev
);
kfree
(
drvdata
);
return
0
;
}
static
struct
platform_driver
wm831x_status_driver
=
{
.
driver
=
{
.
name
=
"wm831x-status"
,
.
owner
=
THIS_MODULE
,
},
.
probe
=
wm831x_status_probe
,
.
remove
=
wm831x_status_remove
,
};
static
int
__devinit
wm831x_status_init
(
void
)
{
return
platform_driver_register
(
&
wm831x_status_driver
);
}
module_init
(
wm831x_status_init
);
static
void
wm831x_status_exit
(
void
)
{
platform_driver_unregister
(
&
wm831x_status_driver
);
}
module_exit
(
wm831x_status_exit
);
MODULE_AUTHOR
(
"Mark Brown <broonie@opensource.wolfsonmicro.com>"
);
MODULE_DESCRIPTION
(
"WM831x status LED driver"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_ALIAS
(
"platform:wm831x-status"
);
drivers/leds/ledtrig-gpio.c
View file @
5cb5aed5
drivers/macintosh/via-pmu-led.c
View file @
5cb5aed5
...
@@ -72,7 +72,7 @@ static void pmu_led_set(struct led_classdev *led_cdev,
...
@@ -72,7 +72,7 @@ static void pmu_led_set(struct led_classdev *led_cdev,
}
}
static
struct
led_classdev
pmu_led
=
{
static
struct
led_classdev
pmu_led
=
{
.
name
=
"pmu-
front-led
"
,
.
name
=
"pmu-
led::front
"
,
#ifdef CONFIG_ADB_PMU_LED_IDE
#ifdef CONFIG_ADB_PMU_LED_IDE
.
default_trigger
=
"ide-disk"
,
.
default_trigger
=
"ide-disk"
,
#endif
#endif
...
...
include/linux/mfd/wm831x/status.h
0 → 100644
View file @
5cb5aed5
/*
* include/linux/mfd/wm831x/status.h -- Status LEDs for WM831x
*
* Copyright 2009 Wolfson Microelectronics PLC.
*
* Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
*/
#ifndef __MFD_WM831X_STATUS_H__
#define __MFD_WM831X_STATUS_H__
#define WM831X_LED_SRC_MASK 0xC000
/* LED_SRC - [15:14] */
#define WM831X_LED_SRC_SHIFT 14
/* LED_SRC - [15:14] */
#define WM831X_LED_SRC_WIDTH 2
/* LED_SRC - [15:14] */
#define WM831X_LED_MODE_MASK 0x0300
/* LED_MODE - [9:8] */
#define WM831X_LED_MODE_SHIFT 8
/* LED_MODE - [9:8] */
#define WM831X_LED_MODE_WIDTH 2
/* LED_MODE - [9:8] */
#define WM831X_LED_SEQ_LEN_MASK 0x0030
/* LED_SEQ_LEN - [5:4] */
#define WM831X_LED_SEQ_LEN_SHIFT 4
/* LED_SEQ_LEN - [5:4] */
#define WM831X_LED_SEQ_LEN_WIDTH 2
/* LED_SEQ_LEN - [5:4] */
#define WM831X_LED_DUR_MASK 0x000C
/* LED_DUR - [3:2] */
#define WM831X_LED_DUR_SHIFT 2
/* LED_DUR - [3:2] */
#define WM831X_LED_DUR_WIDTH 2
/* LED_DUR - [3:2] */
#define WM831X_LED_DUTY_CYC_MASK 0x0003
/* LED_DUTY_CYC - [1:0] */
#define WM831X_LED_DUTY_CYC_SHIFT 0
/* LED_DUTY_CYC - [1:0] */
#define WM831X_LED_DUTY_CYC_WIDTH 2
/* LED_DUTY_CYC - [1:0] */
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment