Set the led brightness using PWM all the time.
This change sets the led brightness using PWM, there will be a
forthcoming change in userland that blinks the led in software.
Change-Id: I7899d611490ba40bc6b936a785846ef3a00fb11c
diff --git a/arch/arm/mach-feroceon-kw2/board-gflt110.c b/arch/arm/mach-feroceon-kw2/board-gflt110.c
index 81ff16f..5341efb 100644
--- a/arch/arm/mach-feroceon-kw2/board-gflt110.c
+++ b/arch/arm/mach-feroceon-kw2/board-gflt110.c
@@ -12,6 +12,12 @@
#define BOARD_NAME "gflt110"
+struct gflt_led_data {
+ unsigned gpio;
+ unsigned active_low;
+ struct led_classdev cdev;
+};
+
static ssize_t board_hw_ver_show(struct device *dev,
struct device_attribute *attr,
char *buf)
@@ -20,83 +26,93 @@
}
static DEVICE_ATTR(hw_ver, S_IRUGO, board_hw_ver_show, NULL);
+static void gflt_led_brightness_set(struct led_classdev *led_cdev,
+ enum led_brightness enum_brightness);
-static struct gpio_led board_gpio_leds[] = {
+static struct gflt_led_data board_gpio_leds[] = {
{
- .name = "sys-blue",
.gpio = 12,
- .default_state = LEDS_GPIO_DEFSTATE_OFF,
+ .cdev = {
+ .name = "sys-blue",
+ .brightness_set = gflt_led_brightness_set,
+ .max_brightness = 100,
+ },
},
{
- .name = "sys-red",
.gpio = 13,
- .default_state = LEDS_GPIO_DEFSTATE_ON,
+ .cdev = {
+ .name = "sys-red",
+ .brightness_set = gflt_led_brightness_set,
+ .max_brightness = 100,
+ },
},
};
-static int board_gpio_blink_set(unsigned gpio, unsigned long *delay_on,
- unsigned long *delay_off);
-
-static struct gpio_led_platform_data board_gpio_leds_data = {
- .gpio_blink_set = board_gpio_blink_set,
-};
-
-int board_gpio_blink_set(unsigned gpio, unsigned long *delay_on,
- unsigned long *delay_off)
+static void gflt_led_brightness_set(struct led_classdev *led_cdev,
+ enum led_brightness enum_brightness)
{
- int i;
- int active_low;
- MV_U32 mask = 1 << (gpio %32);
+ struct gflt_led_data *led_data =
+ container_of(led_cdev, struct gflt_led_data, cdev);
+
+ unsigned gpio = led_data->gpio;
+ unsigned brightness = (unsigned)enum_brightness;
+
+ MV_U32 mask = 1 << (gpio % 32);
MV_U32 group = gpio / 32;
MV_U32 cycles_per_ms = mvBoardTclkGet() / 1000;
- unsigned long max_delay = ~0 / cycles_per_ms;
- for (i = 0; i < board_gpio_leds_data.num_leds; i++) {
- if (gpio == board_gpio_leds_data.leds[i].gpio) {
- active_low = board_gpio_leds_data.leds[i].active_low;
- break;
- }
- }
+ if (brightness && brightness < led_cdev->max_brightness) {
+ unsigned long delay_on;
+ unsigned long delay_off;
- if (i == board_gpio_leds_data.num_leds)
- return -EINVAL;
-
- *delay_on = min(*delay_on, max_delay);
- *delay_off = min(*delay_off, max_delay);
-
- if (*delay_on && *delay_off) {
- if (active_low)
+ delay_on = cycles_per_ms * brightness / led_cdev->max_brightness;
+ delay_off = cycles_per_ms - delay_on;
+ if (led_data->active_low)
mvGppBlinkCntrSet(MV_GPP_BLINK_CNTR_A,
- *delay_off * cycles_per_ms,
- *delay_on * cycles_per_ms);
+ delay_off,
+ delay_on);
else
mvGppBlinkCntrSet(MV_GPP_BLINK_CNTR_A,
- *delay_on * cycles_per_ms,
- *delay_off * cycles_per_ms);
+ delay_on,
+ delay_off);
mvGppBlinkEn(group, mask, mask);
- }
- else
+ } else if(brightness) {
+ mvGppValueSet(group, mask, led_data->active_low ? 0 : mask);
mvGppBlinkEn(group, mask, 0);
-
- return 0;
+ } else {
+ mvGppValueSet(group, mask, led_data->active_low ? mask : 0);
+ mvGppBlinkEn(group, mask, 0);
+ }
}
-static struct platform_device board_gpio_leds_device = {
- .name = "leds-gpio",
- .id = -1,
- .dev.platform_data = &board_gpio_leds_data,
-};
+static int register_gfltleds(struct platform_device *pdev,
+ struct gflt_led_data* gflt_leds,
+ unsigned gflt_leds_num_leds)
+{
+ int ret;
+ int i;
+
+ for (i = 0; i < gflt_leds_num_leds; i++) {
+ ret = led_classdev_register(&pdev->dev, &gflt_leds[i].cdev);
+ if (ret)
+ goto err_reg;
+ }
+ return 0;
+
+err_reg:
+ for (i-- ; i >= 0; i--)
+ {
+ led_classdev_unregister(&gflt_leds[i].cdev);
+ }
+ return ret;
+}
int __init board_init(void)
{
int rc;
struct platform_device *pdev;
- board_gpio_leds_data.num_leds
- = ARRAY_SIZE(board_gpio_leds);
- board_gpio_leds_data.leds = board_gpio_leds;
-
/* /sys/devices/platform/<board_name> */
pdev = platform_device_register_simple(BOARD_NAME, -1, NULL, 0);
if (IS_ERR(pdev)) {
@@ -117,9 +133,9 @@
pr_err(BOARD_NAME ": error %d creating attribute 'hw_ver'\n",
rc);
- rc = platform_device_register(&board_gpio_leds_device);
+ rc = register_gfltleds(pdev, board_gpio_leds, ARRAY_SIZE(board_gpio_leds));
if (rc)
- pr_err(BOARD_NAME ": error %d registering GPIO LEDs device\n",
+ pr_err(BOARD_NAME ": error %d registering GFLT LED device\n",
rc);
return 0;