From: arnaud.patard@rtp-net.org (Arnaud Patard (Rtp))
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] mx53_loco: add DA9053 PMIC support
Date: Mon, 16 Jan 2012 22:08:46 +0100 [thread overview]
Message-ID: <87fwffmk2p.fsf@lebrac.rtp-net.org> (raw)
In-Reply-To: <1326733853-13956-2-git-send-email-paul.liu@linaro.org> (Ying-Chun Liu's message of "Tue, 17 Jan 2012 01:10:53 +0800")
"Ying-Chun Liu (PaulLiu)" <paul.liu@linaro.org> writes:
Hi,
> From: "Ying-Chun Liu (PaulLiu)" <paul.liu@linaro.org>
>
> Add DA9052 PMIC support for Freescale QuickStart Loco board.
> The model of PMIC on QuickStart Loco board is "da9053-aa".
>
> Signed-off-by: Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org>
> Cc: Amit Kucheria <amit.kucheria@canonical.com>
> Cc: Sascha Hauer <kernel@pengutronix.de>
> ---
> arch/arm/mach-mx5/board-mx53_loco.c | 128 +++++++++++++++++++++++++++++++++
> arch/arm/plat-mxc/include/mach/irqs.h | 10 +++-
> 2 files changed, 137 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/mach-mx5/board-mx53_loco.c b/arch/arm/mach-mx5/board-mx53_loco.c
> index fd8b524..61dd8c9 100644
> --- a/arch/arm/mach-mx5/board-mx53_loco.c
> +++ b/arch/arm/mach-mx5/board-mx53_loco.c
> @@ -23,10 +23,21 @@
> #include <linux/delay.h>
> #include <linux/gpio.h>
> #include <linux/i2c.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/irq.h>
> +#include <linux/interrupt.h>
> +#include <linux/err.h>
> +#include <linux/regulator/machine.h>
> +#include <linux/regulator/fixed.h>
> +#include <linux/mfd/da9052/da9052.h>
> +#include <linux/mfd/da9052/pdata.h>
>
> #include <mach/common.h>
> #include <mach/hardware.h>
> #include <mach/iomux-mx53.h>
> +#include <mach/irqs.h>
> +#include <mach/gpio.h>
>
> #include <asm/mach-types.h>
> #include <asm/mach/arch.h>
> @@ -45,6 +56,32 @@
> #define LOCO_SD1_CD IMX_GPIO_NR(3, 13)
> #define LOCO_ACCEL_EN IMX_GPIO_NR(6, 14)
>
> +#define DA9052_LDO1_VOLT_UPPER 1800
> +#define DA9052_LDO1_VOLT_LOWER 600
> +#define DA9052_LDO1_VOLT_STEP 50
> +#define DA9052_LDO2_VOLT_UPPER 1800
> +#define DA9052_LDO2_VOLT_LOWER 600
> +#define DA9052_LDO2_VOLT_STEP 25
> +#define DA9052_LDO34_VOLT_UPPER 3300
> +#define DA9052_LDO34_VOLT_LOWER 1725
> +#define DA9052_LDO34_VOLT_STEP 25
> +#define DA9052_LDO567810_VOLT_UPPER 3600
> +#define DA9052_LDO567810_VOLT_LOWER 1200
> +#define DA9052_LDO567810_VOLT_STEP 50
> +#define DA9052_LDO9_VOLT_STEP 50
> +#define DA9052_LDO9_VOLT_LOWER 1250
> +#define DA9052_LDO9_VOLT_UPPER 3650
> +/* Buck Config Validation Macros */
> +#define DA9052_BUCK_CORE_PRO_VOLT_UPPER 2075
> +#define DA9052_BUCK_CORE_PRO_VOLT_LOWER 500
> +#define DA9052_BUCK_CORE_PRO_STEP 25
> +#define DA9052_BUCK_MEM_VOLT_UPPER 2500
> +#define DA9052_BUCK_MEM_VOLT_LOWER 925
> +#define DA9052_BUCK_MEM_STEP 25
> +#define DA9052_BUCK_PERI_VOLT_UPPER 2500
> +#define DA9052_BUCK_PERI_VOLT_LOWER 925
> +#define DA9052_BUCK_PERI_STEP 25
> +
The _STEP #defines looks unused. What about removing them ?
> static iomux_v3_cfg_t mx53_loco_pads[] = {
> /* FEC */
> MX53_PAD_FEC_MDC__FEC_MDC,
> @@ -227,6 +264,93 @@ static const struct esdhc_platform_data mx53_loco_sd3_data __initconst = {
> .wp_type = ESDHC_WP_GPIO,
> };
>
> +#define DA9052_LDO(max, min, rname, suspend_mv) \
> +{\
> + .constraints = {\
> + .name = (rname), \
> + .max_uV = (max) * 1000,\
> + .min_uV = (min) * 1000,\
> + .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE\
> + |REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE,\
> + .valid_modes_mask = REGULATOR_MODE_NORMAL,\
> + .state_mem = { \
> + .uV = suspend_mv * 1000, \
> + .mode = REGULATOR_MODE_NORMAL, \
> + .enabled = (0 == suspend_mv) ? 0 : 1, \
> + .disabled = 0, \
> + }, \
> + },\
> +}
> +
> +/* currently the suspend_mv here takes no effects for DA9053
> +preset-voltage have to be done in the latest stage during
> +suspend*/
> +static struct regulator_init_data da9052_regulators_init[] = {
> + /* BUCKS */
> + DA9052_LDO(DA9052_BUCK_CORE_PRO_VOLT_UPPER,
> + DA9052_BUCK_CORE_PRO_VOLT_LOWER, "DA9052_BUCK_CORE",
> 850),
You're using some #define for min/max. Why not for suspend_mv ? Also, if
#defines are similar enough, I guess you can go further with something
like (untested) :
#define DA9052_LDO(prefix, rname) \
{\
.constraints = {\
.name = (rname), \
.max_uV = (prefix ## _VOLT_UPPER) * 1000,\
.min_uV = (prefix ## _VOLT_LOWER) * 1000,\
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE\
|REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_MODE,\
.valid_modes_mask = REGULATOR_MODE_NORMAL,\
.state_mem = { \
.uV = (prefix ## _VOLT_SUSP) * 1000, \
.mode = REGULATOR_MODE_NORMAL, \
.enabled = (0 == (prefix ## _VOLT_SUSP)) ? 0 : 1, \
.disabled = 0, \
}, \
},\
}
and then:
DA9052(DA9052_BUCK_CORE_PRO, "DA9052_BUCK_CORE"),
> + DA9052_LDO(DA9052_BUCK_CORE_PRO_VOLT_UPPER,
> + DA9052_BUCK_CORE_PRO_VOLT_LOWER, "DA9052_BUCK_PRO", 950),
> + DA9052_LDO(DA9052_BUCK_MEM_VOLT_UPPER,
> + DA9052_BUCK_MEM_VOLT_LOWER, "DA9052_BUCK_MEM", 1500),
> + DA9052_LDO(DA9052_BUCK_PERI_VOLT_UPPER,
> + DA9052_BUCK_PERI_VOLT_LOWER, "DA9052_BUCK_PERI", 2500),
> + DA9052_LDO(DA9052_LDO1_VOLT_UPPER,
> + DA9052_LDO1_VOLT_LOWER, "DA9052_LDO1", 1300),
> + DA9052_LDO(DA9052_LDO2_VOLT_UPPER,
> + DA9052_LDO2_VOLT_LOWER, "DA9052_LDO2", 1300),
> + DA9052_LDO(DA9052_LDO34_VOLT_UPPER,
> + DA9052_LDO34_VOLT_LOWER, "DA9052_LDO3", 3300),
> + DA9052_LDO(DA9052_LDO34_VOLT_UPPER,
> + DA9052_LDO34_VOLT_LOWER, "DA9052_LDO4", 2775),
> + DA9052_LDO(DA9052_LDO567810_VOLT_UPPER,
> + DA9052_LDO567810_VOLT_LOWER, "DA9052_LDO5", 1300),
> + DA9052_LDO(DA9052_LDO567810_VOLT_UPPER,
> + DA9052_LDO567810_VOLT_LOWER, "DA9052_LDO6", 1200),
> + DA9052_LDO(DA9052_LDO567810_VOLT_UPPER,
> + DA9052_LDO567810_VOLT_LOWER, "DA9052_LDO7", 2750),
> + DA9052_LDO(DA9052_LDO567810_VOLT_UPPER,
> + DA9052_LDO567810_VOLT_LOWER, "DA9052_LDO8", 1800),
> + DA9052_LDO(DA9052_LDO9_VOLT_UPPER,
> + DA9052_LDO9_VOLT_LOWER, "DA9052_LDO9", 2500),
> + DA9052_LDO(DA9052_LDO567810_VOLT_UPPER,
> + DA9052_LDO567810_VOLT_LOWER, "DA9052_LDO10", 1200),
> +};
> +
> +#define MX53_LOCO_DA9052_IRQ (6*32 + 11) /* GPIO7_11 */
you're aware that there's a IMX_GPIO_NR() macro for defining gpio,
right ? Moreover, why not putting it with other #defines for gpio in the
top of the file ?
> +
> +static int __init loco_da9052_init(struct da9052 *da9052)
> +{
> + /* Configuring for DA9052 interrupt servce */
> + /* s3c_gpio_setpull(DA9052_IRQ_PIN, S3C_GPIO_PULL_UP); */
> +
> + /* Set interrupt as LOW LEVEL interrupt source */
> + irq_set_irq_type(gpio_to_irq(MX53_LOCO_DA9052_IRQ),
> + IRQF_TRIGGER_LOW);
> + return 0;
> +}
> +
> +static struct da9052_pdata __initdata da9052_plat = {
> + .init = loco_da9052_init,
> + .irq_base = MXC_PMIC_IRQ_START,
> + .regulators = {
> + &da9052_regulators_init[0],
> + &da9052_regulators_init[1],
> + &da9052_regulators_init[2],
> + &da9052_regulators_init[3],
> + &da9052_regulators_init[4],
> + &da9052_regulators_init[5],
> + &da9052_regulators_init[6],
> + &da9052_regulators_init[7],
> + &da9052_regulators_init[8],
> + &da9052_regulators_init[9],
> + &da9052_regulators_init[10],
> + &da9052_regulators_init[11],
> + &da9052_regulators_init[12],
> + &da9052_regulators_init[13],
> + },
> +};
> +
> static inline void mx53_loco_fec_reset(void)
> {
> int ret;
> @@ -273,6 +397,10 @@ static struct i2c_board_info mx53loco_i2c_devices[] = {
> {
> I2C_BOARD_INFO("mma8450", 0x1C),
> },
> + {
> + I2C_BOARD_INFO("da9053-aa", 0x90 >> 1),
> + .platform_data = &da9052_plat,
> + },
> };
>
> static void __init mx53_loco_board_init(void)
> diff --git a/arch/arm/plat-mxc/include/mach/irqs.h b/arch/arm/plat-mxc/include/mach/irqs.h
> index fd9efb0..9fb56eb 100644
> --- a/arch/arm/plat-mxc/include/mach/irqs.h
> +++ b/arch/arm/plat-mxc/include/mach/irqs.h
> @@ -53,7 +53,15 @@
> #endif
> /* REVISIT: Add IPU irqs on IMX51 */
>
> -#define NR_IRQS (MXC_IPU_IRQ_START + MX3_IPU_IRQS)
> +#define MXC_PMIC_IRQ_START (MXC_IPU_IRQ_START + MX3_IPU_IRQS)
> +
> +#ifdef CONFIG_MACH_MX53_LOCO
> +#define MXC_PMIC_IRQS 32
> +#else
> +#define MXC_PMIC_IRQS 0
> +#endif
So, each board using a pmic needing some irqs will need to add a
#ifdef/#define combo ? Can it be made more generic ? How will it work
with a kernel compiled for several machines, say loco and an other using
a pmic using more than 32 irqs ?
> +
> +#define NR_IRQS (MXC_PMIC_IRQ_START + MXC_PMIC_IRQS)
>
> extern int imx_irq_set_priority(unsigned char irq, unsigned char prio);
Regards,
Arnaud
next prev parent reply other threads:[~2012-01-16 21:08 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-16 17:10 [PATCH] mx53_loco: add DA9053 PMIC support Ying-Chun Liu (PaulLiu)
2012-01-16 17:10 ` Ying-Chun Liu (PaulLiu)
2012-01-16 19:19 ` Mark Brown
2012-01-16 21:08 ` Arnaud Patard (Rtp) [this message]
2012-01-17 18:45 ` Ying-Chun Liu (PaulLiu)
2012-01-16 23:00 ` Russell King - ARM Linux
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=87fwffmk2p.fsf@lebrac.rtp-net.org \
--to=arnaud.patard@rtp-net.org \
--cc=linux-arm-kernel@lists.infradead.org \
/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.