From: David Brownell <david-b@pacbell.net>
To: "Peter 'p2' De Schrijver" <peter.de-schrijver@nokia.com>
Cc: lkml <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] TWL4030: add function to send PB messages
Date: Thu, 23 Apr 2009 15:03:47 -0700 [thread overview]
Message-ID: <200904231503.47287.david-b@pacbell.net> (raw)
In-Reply-To: <1240407833-28060-1-git-send-email-peter.de-schrijver@nokia.com>
On Wednesday 22 April 2009, Peter 'p2' De Schrijver wrote:
> This patch moves sending of powerbus messages to a separate function.
Can you add #defines for those register offsets, and use
those as names instead of 0x14/0x15/0x16? And at least
use BIT(x) instead of (1 << x).
If this moves into twl4030_core.c (as I ask about elsewhere),
those registers can just be defines local to that file.
Otherwise this seems ok.
> It also
> makes sure I2C access to the powerbus is enabled.
>
> Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
> ---
> drivers/regulator/twl4030-regulator.c | 72 +++++++++++++++++++++++++++++---
> 1 files changed, 65 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/regulator/twl4030-regulator.c b/drivers/regulator/twl4030-regulator.c
> index 472c35a..df9a94b 100644
> --- a/drivers/regulator/twl4030-regulator.c
> +++ b/drivers/regulator/twl4030-regulator.c
> @@ -16,6 +16,7 @@
> #include <linux/regulator/driver.h>
> #include <linux/regulator/machine.h>
> #include <linux/i2c/twl4030.h>
> +#include <linux/delay.h>
>
>
> /*
> @@ -81,6 +82,69 @@ twl4030reg_write(struct twlreg_info *info, unsigned offset, u8 value)
> value, info->base + offset);
> }
>
> +static int twl4030_wait_pb_ready(void)
> +{
> +
> + u8 pb_status;
> + int status, timeout = 10;
> +
> + do {
> + status = twl4030_i2c_read_u8(TWL4030_MODULE_PM_MASTER,
> + &pb_status, 0x14);
> + if (status < 0)
> + return status;
> +
Worth a comment that PB_CFG.BIT(0) == PB_I2C_BUSY ... true if there's
a word queued for the power bus, but not yet sent. And that we assume
no other I2C master is sending such events...
> + if (!(pb_status & 1))
> + return 0;
> +
> + mdelay(1);
> + timeout--;
> +
> + } while (timeout);
> +
> + return -ETIMEDOUT;
> +}
> +
> +static int twl4030_send_pb_msg(unsigned msg)
> +{
> +
> + u8 pb_state;
> + int status;
> +
> + /* save powerbus configuration */
> + status = twl4030_i2c_read_u8(TWL4030_MODULE_PM_MASTER,
> + &pb_state, 0x14);
> + if (status < 0)
> + return status;
> +
> + /* Enable I2C access to powerbus */
> + status = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER,
> + pb_state | (1<<1), 0x14);
> + if (status < 0)
> + return status;
> +
> + status = twl4030_wait_pb_ready();
I'd probably combine wait_pb_ready() with this; not that
this is wrong, but you should only need to set BIT(1) once,
and there's no need to re-read that byte to test BIT(0).
Minor point ... I hate needless I/O. This isn't a critical
path though.
> + if (status < 0)
> + return status;
> +
> + status = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, msg >> 8,
> + 0x15 /* PB_WORD_MSB */);
> + if (status < 0)
> + return status;
> +
> + status = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, msg & 0xff,
> + 0x16 /* PB_WORD_LSB */);
> + if (status < 0)
> + return status;
> +
> + status = twl4030_wait_pb_ready();
> + if (status < 0)
> + return status;
> +
> + /* Restore powerbus configuration */
> + return twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, pb_state, 0x14);
> +}
> +
> /*----------------------------------------------------------------------*/
>
> /* generic power resource operations, which work on all regulators */
> @@ -177,13 +241,7 @@ static int twl4030reg_set_mode(struct regulator_dev *rdev, unsigned mode)
> if (!(status & (P3_GRP | P2_GRP | P1_GRP)))
> return -EACCES;
>
> - status = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER,
> - message >> 8, 0x15 /* PB_WORD_MSB */ );
> - if (status >= 0)
> - return status;
> -
> - return twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER,
> - message, 0x16 /* PB_WORD_LSB */ );
> + return twl4030_send_pb_msg(message);
> }
>
> /*----------------------------------------------------------------------*/
> --
> 1.5.6.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
next prev parent reply other threads:[~2009-04-23 22:04 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-22 13:43 [PATCH] TWL4030: add function to send PB messages Peter 'p2' De Schrijver
2009-04-22 13:43 ` [PATCH] TWL4030: Make sure the regulator is active after calling twl4030reg_enable Peter 'p2' De Schrijver
2009-04-22 14:03 ` [PATCH] TWL4030: add function to send PB messages Peter 'p2' De Schrijver
2009-04-22 14:03 ` [PATCH] TWL4030: Make sure the regulator is active after calling twl4030reg_enable Peter 'p2' De Schrijver
2009-04-23 22:03 ` David Brownell [this message]
2009-04-24 9:25 ` [PATCH] TWL4030: add function to send PB messages Peter 'p2' De Schrijver
-- strict thread matches above, loose matches on Subject: below --
2009-04-23 13:08 Peter 'p2' De Schrijver
2009-04-23 14:52 ` Mark Brown
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=200904231503.47287.david-b@pacbell.net \
--to=david-b@pacbell.net \
--cc=linux-kernel@vger.kernel.org \
--cc=peter.de-schrijver@nokia.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.