linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Milo Kim <woogyom.kim@gmail.com>
To: Bryan Wu <cooloney@gmail.com>
Cc: "Pali Rohár" <pali.rohar@gmail.com>,
	linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org,
	"Milo Kim" <milo.kim@ti.com>
Subject: [PATCH 06/10] leds: lp5523: LED MUX configuration on initializing
Date: Thu,  8 Aug 2013 16:59:50 +0900	[thread overview]
Message-ID: <1375948794-6286-7-git-send-email-milo.kim@ti.com> (raw)
In-Reply-To: <1375948794-6286-1-git-send-email-milo.kim@ti.com>

LED MUX start and stop address should be updated in the program memory
on LP5523 initialization.
LED pattern doesn't work without additional MUX address configuration.
This handling is done by new function, lp5523_init_program_engine().
Eventually, it's called during device initialization, lp5523_post_init_device().

This is a conflict after git commit 632418bf65503405df3f9a6a1616f5a95f91db85
(leds-lp5523: clean up lp5523_configure()).
So it should be fixed.

Cc: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Milo Kim <milo.kim@ti.com>
---
 drivers/leds/leds-lp5523.c |   70 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 69 insertions(+), 1 deletion(-)

diff --git a/drivers/leds/leds-lp5523.c b/drivers/leds/leds-lp5523.c
index b509480..29c8b19 100644
--- a/drivers/leds/leds-lp5523.c
+++ b/drivers/leds/leds-lp5523.c
@@ -49,6 +49,9 @@
 #define LP5523_REG_RESET		0x3D
 #define LP5523_REG_LED_TEST_CTRL	0x41
 #define LP5523_REG_LED_TEST_ADC		0x42
+#define LP5523_REG_CH1_PROG_START	0x4C
+#define LP5523_REG_CH2_PROG_START	0x4D
+#define LP5523_REG_CH3_PROG_START	0x4E
 #define LP5523_REG_PROG_PAGE_SEL	0x4F
 #define LP5523_REG_PROG_MEM		0x50
 
@@ -65,6 +68,7 @@
 #define LP5523_RESET			0xFF
 #define LP5523_ADC_SHORTCIRC_LIM	80
 #define LP5523_EXT_CLK_USED		0x08
+#define LP5523_ENG_STATUS_MASK		0x07
 
 /* Memory Page Selection */
 #define LP5523_PAGE_ENG1		0
@@ -99,6 +103,8 @@ enum lp5523_chip_id {
 	LP55231,
 };
 
+static int lp5523_init_program_engine(struct lp55xx_chip *chip);
+
 static inline void lp5523_wait_opmode_done(void)
 {
 	usleep_range(1000, 2000);
@@ -134,7 +140,11 @@ static int lp5523_post_init_device(struct lp55xx_chip *chip)
 	if (ret)
 		return ret;
 
-	return lp55xx_write(chip, LP5523_REG_ENABLE_LEDS_LSB, 0xff);
+	ret = lp55xx_write(chip, LP5523_REG_ENABLE_LEDS_LSB, 0xff);
+	if (ret)
+		return ret;
+
+	return lp5523_init_program_engine(chip);
 }
 
 static void lp5523_load_engine(struct lp55xx_chip *chip)
@@ -233,6 +243,64 @@ static void lp5523_run_engine(struct lp55xx_chip *chip, bool start)
 	lp55xx_update_bits(chip, LP5523_REG_ENABLE, LP5523_EXEC_M, exec);
 }
 
+static int lp5523_init_program_engine(struct lp55xx_chip *chip)
+{
+	int i;
+	int j;
+	int ret;
+	u8 status;
+	/* one pattern per engine setting LED MUX start and stop addresses */
+	static const u8 pattern[][LP5523_PROGRAM_LENGTH] =  {
+		{ 0x9c, 0x30, 0x9c, 0xb0, 0x9d, 0x80, 0xd8, 0x00, 0},
+		{ 0x9c, 0x40, 0x9c, 0xc0, 0x9d, 0x80, 0xd8, 0x00, 0},
+		{ 0x9c, 0x50, 0x9c, 0xd0, 0x9d, 0x80, 0xd8, 0x00, 0},
+	};
+
+	/* hardcode 32 bytes of memory for each engine from program memory */
+	ret = lp55xx_write(chip, LP5523_REG_CH1_PROG_START, 0x00);
+	if (ret)
+		return ret;
+
+	ret = lp55xx_write(chip, LP5523_REG_CH2_PROG_START, 0x10);
+	if (ret)
+		return ret;
+
+	ret = lp55xx_write(chip, LP5523_REG_CH3_PROG_START, 0x20);
+	if (ret)
+		return ret;
+
+	/* write LED MUX address space for each engine */
+	for (i = LP55XX_ENGINE_1; i <= LP55XX_ENGINE_3; i++) {
+		chip->engine_idx = i;
+		lp5523_load_engine_and_select_page(chip);
+
+		for (j = 0; j < LP5523_PROGRAM_LENGTH; j++) {
+			ret = lp55xx_write(chip, LP5523_REG_PROG_MEM + j,
+					pattern[i - 1][j]);
+			if (ret)
+				goto out;
+		}
+	}
+
+	lp5523_run_engine(chip, true);
+
+	/* Let the programs run for couple of ms and check the engine status */
+	usleep_range(3000, 6000);
+	lp55xx_read(chip, LP5523_REG_STATUS, &status);
+	status &= LP5523_ENG_STATUS_MASK;
+
+	if (status != LP5523_ENG_STATUS_MASK) {
+		dev_err(&chip->cl->dev,
+			"cound not configure LED engine, status = 0x%.2x\n",
+			status);
+		ret = -1;
+	}
+
+out:
+	lp5523_stop_engine(chip);
+	return ret;
+}
+
 static int lp5523_update_program_memory(struct lp55xx_chip *chip,
 					const u8 *data, size_t size)
 {
-- 
1.7.9.5


  parent reply	other threads:[~2013-08-08  8:00 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-08  7:59 [PATCH 00/10] leds: lp5521,5523: restore device attributes for running LED patterns Milo Kim
2013-08-08  7:59 ` [PATCH 01/10] leds: lp55xx: add common data structure for program Milo Kim
2013-08-13 18:56   ` Bryan Wu
2013-08-18 22:57     ` Kim, Milo
2013-08-08  7:59 ` [PATCH 02/10] leds: lp55xx: add common macros for device attributes Milo Kim
2013-08-13 19:12   ` Bryan Wu
2013-08-08  7:59 ` [PATCH 03/10] leds: lp5521: restore legacy " Milo Kim
2013-08-13 20:40   ` Bryan Wu
2013-08-08  7:59 ` [PATCH 04/10] leds: lp5521: remove unnecessary writing commands Milo Kim
2013-08-13 20:42   ` Bryan Wu
2013-08-08  7:59 ` [PATCH 05/10] leds: lp5523: make separate API for loading engine Milo Kim
2013-08-13 20:54   ` Bryan Wu
2013-08-08  7:59 ` Milo Kim [this message]
2013-08-13 20:56   ` [PATCH 06/10] leds: lp5523: LED MUX configuration on initializing Bryan Wu
2013-08-08  7:59 ` [PATCH 07/10] leds: lp5523: restore legacy device attributes Milo Kim
2013-08-13 20:58   ` Bryan Wu
2013-08-08  7:59 ` [PATCH 08/10] leds: lp5523: remove unnecessary writing commands Milo Kim
2013-08-13 20:59   ` Bryan Wu
2013-08-08  7:59 ` [PATCH 09/10] Documentation: leds-lp5521,lp5523: update device attribute information Milo Kim
2013-08-13 21:00   ` Bryan Wu
2013-08-08  7:59 ` [PATCH 10/10] leds: lp5562: use LP55xx common macros for device attributes Milo Kim
2013-08-13 21:00   ` Bryan Wu
2013-08-13 21:04 ` [PATCH 00/10] leds: lp5521,5523: restore device attributes for running LED patterns Bryan Wu
2013-10-25 16:38   ` Pali Rohár
2013-10-25 17:10     ` Bryan Wu
2013-10-25 18:21       ` Pali Rohár
2013-10-29 23:17         ` Bryan Wu
2013-11-08  5:15         ` Milo Kim
     [not found]           ` <CAK5ve-KQPxc-xWs1rh6KTgGK8VdLOgHqMLT8D90+mYt8P+xaew@mail.gmail.com>
2013-11-19 10:35             ` Pali Rohár
2013-11-19 19:20               ` Bryan Wu
2013-11-19 22:33                 ` Milo Kim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1375948794-6286-7-git-send-email-milo.kim@ti.com \
    --to=woogyom.kim@gmail.com \
    --cc=cooloney@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-leds@vger.kernel.org \
    --cc=milo.kim@ti.com \
    --cc=pali.rohar@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).