From 78f5c78eac0a5ca1c65c5d051866a8bf15924e11 Mon Sep 17 00:00:00 2001
From: "makarand.karvekar" <makarand.karvekar@motorola.com>
Date: Fri, 17 Sep 2010 10:05:11 -0500
Subject: [PATCH] leds: leds-ld-cpcap: blink and timer trigger updates

Set default trigger as timer.
Seperate blink function from brightness.

Change-Id: I1dd789ae8b5df88ea26c40ed544807ec0f3bb52a
Signed-off-by: makarand.karvekar <makarand.karvekar@motorola.com>
---
 drivers/leds/leds-ld-cpcap.c  | 36 +++++++++++++++++++++--------------
 include/linux/leds-ld-cpcap.h | 28 ++++++---------------------
 2 files changed, 28 insertions(+), 36 deletions(-)

diff --git a/drivers/leds/leds-ld-cpcap.c b/drivers/leds/leds-ld-cpcap.c
index ca5ce145d435..0c114f18c608 100755
--- a/drivers/leds/leds-ld-cpcap.c
+++ b/drivers/leds/leds-ld-cpcap.c
@@ -34,7 +34,7 @@ struct cpcap_led_data {
 	struct work_struct brightness_work;
 	enum led_brightness brightness;
 	int regulator_state;
-	u8 blink;
+	short blink_val;
 };
 
 static void cpcap_set(struct led_classdev *led_cdev,
@@ -52,7 +52,7 @@ static void cpcap_set(struct led_classdev *led_cdev,
 }
 EXPORT_SYMBOL(cpcap_set);
 
-static int cpcap_msg_ind_blink(struct led_classdev *led_cdev,
+static int cpcap_led_blink(struct led_classdev *led_cdev,
 			       unsigned long *delay_on,
 			       unsigned long *delay_off)
 {
@@ -60,8 +60,17 @@ static int cpcap_msg_ind_blink(struct led_classdev *led_cdev,
 		container_of(led_cdev, struct cpcap_led_data,
 			 cpcap_class_dev);
 
-	info->blink = 1;
-	schedule_work(&info->brightness_work);
+	info->blink_val = *delay_on;
+
+	if (info->pdata->blink_able) {
+		if(info->blink_val) {
+			cpcap_uc_start(info->cpcap, CPCAP_MACRO_6);
+		} else {
+			cpcap_uc_stop(info->cpcap, CPCAP_MACRO_6);
+			schedule_work(&info->brightness_work);
+		}
+	}
+
 	return 0;
 }
 
@@ -76,8 +85,10 @@ static void cpcap_brightness_work(struct work_struct *work)
 	brightness = cpcap_led_data->brightness;
 
 	if (brightness > 0) {
-		brightness = (cpcap_led_data->pdata->cpcap_duty_cycle |
-			cpcap_led_data->pdata->cpcap_current | 0x01);
+		brightness = (cpcap_led_data->pdata->cpcap_reg_period |
+				 cpcap_led_data->pdata->cpcap_reg_duty_cycle |
+				 cpcap_led_data->pdata->cpcap_reg_current |
+				 0x01);
 
 		if ((cpcap_led_data->regulator) &&
 		    (cpcap_led_data->regulator_state == 0)) {
@@ -88,14 +99,12 @@ static void cpcap_brightness_work(struct work_struct *work)
 		cpcap_status = cpcap_regacc_write(cpcap_led_data->cpcap,
 				cpcap_led_data->pdata->cpcap_register,
 				brightness,
-				cpcap_led_data->pdata->cpcap_mask);
+				cpcap_led_data->pdata->cpcap_reg_mask);
 
 		if (cpcap_status < 0)
 			pr_err("%s: Writing to the register failed for %i\n",
 			       __func__, cpcap_status);
 
-		if (cpcap_led_data->blink)
-			cpcap_uc_start(cpcap_led_data->cpcap, CPCAP_MACRO_6);
 	} else {
 		if ((cpcap_led_data->regulator) &&
 		    (cpcap_led_data->regulator_state == 1)) {
@@ -108,22 +117,20 @@ static void cpcap_brightness_work(struct work_struct *work)
 		cpcap_status = cpcap_regacc_write(cpcap_led_data->cpcap,
 				cpcap_led_data->pdata->cpcap_register,
 				brightness,
-				cpcap_led_data->pdata->cpcap_mask);
+				cpcap_led_data->pdata->cpcap_reg_mask);
 
 
 		brightness = 0x00;
 		cpcap_status = cpcap_regacc_write(cpcap_led_data->cpcap,
 				cpcap_led_data->pdata->cpcap_register,
 				brightness,
-				cpcap_led_data->pdata->cpcap_mask);
+				cpcap_led_data->pdata->cpcap_reg_mask);
 
 
 		if (cpcap_status < 0)
 			pr_err("%s: Writing to the register failed for %i\n",
 			       __func__, cpcap_status);
 
-		if (cpcap_led_data->blink)
-			cpcap_uc_stop(cpcap_led_data->cpcap, CPCAP_MACRO_6);
 	}
 }
 
@@ -162,10 +169,11 @@ static int cpcap_probe(struct platform_device *pdev)
 
 	info->cpcap_class_dev.name = info->pdata->class_name;
 	info->cpcap_class_dev.brightness_set = cpcap_set;
+	info->cpcap_class_dev.blink_set = cpcap_led_blink;
 	info->cpcap_class_dev.brightness = LED_OFF;
 	info->cpcap_class_dev.max_brightness = 255;
 	if (info->pdata->blink_able)
-		info->cpcap_class_dev.blink_set = cpcap_msg_ind_blink;
+		info->cpcap_class_dev.default_trigger = "timer";
 
 	ret = led_classdev_register(&pdev->dev, &info->cpcap_class_dev);
 	if (ret < 0) {
diff --git a/include/linux/leds-ld-cpcap.h b/include/linux/leds-ld-cpcap.h
index a8c52f62ae8c..27a8a89e7083 100644
--- a/include/linux/leds-ld-cpcap.h
+++ b/include/linux/leds-ld-cpcap.h
@@ -23,32 +23,16 @@
 
 #define LD_CPCAP_LED_DRV "cpcap_led_driver"
 
-#define LD_DISP_BUTTON_DEV "button-backlight"
 #define LD_PRIVACY_LED_DEV "privacy-led"
-#define LD_NOTIF_LED_DEV "notification-backlight"
-
-struct cpcap_display_led {
-	unsigned int display_reg;
-	unsigned int display_mask;
-	unsigned int display_on;
-	unsigned int display_off;
-	unsigned int display_init;
-	unsigned int poll_intvl;
-	unsigned int zone0;
-	unsigned int zone1;
-	unsigned int zone2;
-	unsigned int zone3;
-	unsigned int zone4;
-};
+#define LD_NOTIF_LED_DEV "notification-led"
 
 struct cpcap_led {
 	u8 blink_able;
-	unsigned int cpcap_register;
-	unsigned int cpcap_mask;
-	unsigned int on_val;
-	unsigned int off_val;
-	unsigned int cpcap_duty_cycle;
-	unsigned int cpcap_current;
+	unsigned short cpcap_register;
+	unsigned short cpcap_reg_mask;
+	unsigned short cpcap_reg_period;
+	unsigned short cpcap_reg_duty_cycle;
+	unsigned short cpcap_reg_current;
 	char *class_name;
 	char *led_regulator;
 };
-- 
2.34.1