"Ying-Chun Liu (PaulLiu)" <paul....@linaro.org> writes:

Hi,

> From: "Ying-Chun Liu (PaulLiu)" <paul....@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....@linaro.org>
> Cc: Amit Kucheria <amit.kuche...@canonical.com>
> Cc: Sascha Hauer <ker...@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

_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to