]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00142304: IMX51: Add pmic support for IMX51 babbage in 2.6.38
authorZeng Zhaoming <b32542@freescale.com>
Wed, 20 Apr 2011 19:18:48 +0000 (03:18 +0800)
committerOliver Wendt <ow@karo-electronics.de>
Mon, 30 Sep 2013 12:09:01 +0000 (14:09 +0200)
Add pmic support for imx51 babbage in upgrading to 2.6.38
Signed-off-by: Zeng Zhaoming <b32542@freescale.com>
arch/arm/mach-mx5/Makefile
arch/arm/mach-mx5/board-mx51_babbage.c
arch/arm/mach-mx5/mx51_babbage_pmic_mc13892.c [new file with mode: 0644]

index 44a312c3faf61155b25d061792cb921f44b52272..557a514a90a80901fd0e3a26cc894d573090fc9e 100755 (executable)
@@ -11,7 +11,7 @@ obj-$(CONFIG_SOC_IMX51) += clock.o
 obj-$(CONFIG_SOC_IMX53) += clock.o
 
 obj-$(CONFIG_CPU_FREQ_IMX)    += cpu_op-mx51.o cpu_op-mx53.o cpu_op-mx50.o
-obj-$(CONFIG_MACH_MX51_BABBAGE) += board-mx51_babbage.o
+obj-$(CONFIG_MACH_MX51_BABBAGE) += board-mx51_babbage.o mx51_babbage_pmic_mc13892.o
 obj-$(CONFIG_MACH_MX51_3DS) += board-mx51_3ds.o
 obj-$(CONFIG_MACH_MX53_EVK) += board-mx53_evk.o
 obj-$(CONFIG_MACH_MX53_SMD) += board-mx53_smd.o mx53_smd_pmic_da9053.o
index f1539b5c0c3148ce694a6b77c117542a50748f6e..25a2fdaf8a826b0f1f273f59582b1d61484496ce 100755 (executable)
@@ -184,8 +184,11 @@ static iomux_v3_cfg_t mx51babbage_pads[] = {
        MX51_PAD_CSPI1_MISO__ECSPI1_MISO,
        MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI,
        MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK,
+       MX51_PAD_CSPI1_SS0__ECSPI1_SS0,
        MX51_PAD_CSPI1_SS0__GPIO4_24,
        MX51_PAD_CSPI1_SS1__GPIO4_25,
+       MX51_PAD_CSPI1_RDY__GPIO4_26,
+       MX51_PAD_CSPI1_SS1__ECSPI1_SS1,
 
        /* Display */
        MX51_PAD_EIM_A19__GPIO2_13,
@@ -599,6 +602,7 @@ static struct imx_ssi_platform_data bbg_ssi_pdata = {
        .flags = IMX_SSI_DMA,
 };
 
+extern int mx51_babbage_init_mc13892(void);
 static int bbg_sgtl5000_init(void)
 {
        gpio_request(BABBAGE_AUDAMP_STBY, "audio_amp");
@@ -743,6 +747,7 @@ static void __init mx51_babbage_init(void)
        /* WVGA Reset */
        gpio_set_value(BABBAGE_DISP_BRIGHTNESS_CTL, 1);
 
+       mx51_babbage_init_mc13892();
        mxc_register_device(&bbg_audio_device, &bbg_audio_data);
        imx51_add_imx_ssi(1, &bbg_ssi_pdata);
 
diff --git a/arch/arm/mach-mx5/mx51_babbage_pmic_mc13892.c b/arch/arm/mach-mx5/mx51_babbage_pmic_mc13892.c
new file mode 100644 (file)
index 0000000..fcdc03b
--- /dev/null
@@ -0,0 +1,339 @@
+/*
+ * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/*
+ * mx51-babbage-pmic-mc13892.c  --  i.MX51 Babbage Driver for Atlas MC13892 PMIC
+ */
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/spi/spi.h>
+#include <linux/err.h>
+#include <linux/pmic_external.h>
+#include <linux/regulator/machine.h>
+#include <linux/mfd/mc13892.h>
+#include <mach/irqs.h>
+#include <mach/hardware.h>
+#include <linux/gpio.h>
+#include <mach/iomux-mx51.h>
+
+/*
+ * Convenience conversion.
+ * Here atm, maybe there is somewhere better for this.
+ */
+#define mV_to_uV(mV) (mV * 1000)
+#define uV_to_mV(uV) (uV / 1000)
+#define V_to_uV(V) (mV_to_uV(V * 1000))
+#define uV_to_V(uV) (uV_to_mV(uV) / 1000)
+
+/* CPU */
+static struct regulator_consumer_supply sw1_consumers[] = {
+       {
+               .supply = "cpu_vcc",
+       }
+};
+
+static struct regulator_consumer_supply vdig_consumers[] = {
+       {
+               /* sgtl5000 */
+               .supply = "VDDA",
+               .dev_name = "1-000a",
+       },
+};
+
+static struct regulator_consumer_supply vvideo_consumers[] = {
+       {
+               /* sgtl5000 */
+               .supply = "VDDIO",
+               .dev_name = "1-000a",
+       },
+};
+
+struct mc13892;
+
+static struct regulator_init_data sw1_init = {
+       .constraints = {
+               .name = "SW1",
+               .min_uV = mV_to_uV(600),
+               .max_uV = mV_to_uV(1375),
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
+               .valid_modes_mask = 0,
+               .always_on = 1,
+               .boot_on = 1,
+               .state_mem = {
+                       .uV = 850000,
+                       .mode = REGULATOR_MODE_NORMAL,
+                       .enabled = 1,
+               },
+       },
+       .num_consumer_supplies = ARRAY_SIZE(sw1_consumers),
+       .consumer_supplies = sw1_consumers,
+};
+
+static struct regulator_init_data sw2_init = {
+       .constraints = {
+               .name = "SW2",
+               .min_uV = mV_to_uV(900),
+               .max_uV = mV_to_uV(1850),
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
+               .always_on = 1,
+               .boot_on = 1,
+               .state_mem = {
+                       .uV = 950000,
+                       .mode = REGULATOR_MODE_NORMAL,
+                       .enabled = 1,
+               },
+       }
+};
+
+static struct regulator_init_data sw3_init = {
+       .constraints = {
+               .name = "SW3",
+               .min_uV = mV_to_uV(1100),
+               .max_uV = mV_to_uV(1850),
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
+               .always_on = 1,
+               .boot_on = 1,
+       }
+};
+
+static struct regulator_init_data sw4_init = {
+       .constraints = {
+               .name = "SW4",
+               .min_uV = mV_to_uV(1100),
+               .max_uV = mV_to_uV(1850),
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
+               .always_on = 1,
+               .boot_on = 1,
+       }
+};
+
+static struct regulator_init_data viohi_init = {
+       .constraints = {
+               .name = "VIOHI",
+               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+               .always_on = 1,
+               .boot_on = 1,
+       }
+};
+
+static struct regulator_init_data vusb_init = {
+       .constraints = {
+               .name = "VUSB",
+               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+               .boot_on = 1,
+               .always_on = 1,
+       }
+};
+
+static struct regulator_init_data swbst_init = {
+       .constraints = {
+               .name = "SWBST",
+       }
+};
+
+static struct regulator_init_data vdig_init = {
+       .constraints = {
+               .name = "VDIG",
+               .min_uV = mV_to_uV(1650),
+               .max_uV = mV_to_uV(1650),
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
+                       REGULATOR_CHANGE_STATUS,
+               .boot_on = 1,
+       },
+       .num_consumer_supplies = ARRAY_SIZE(vdig_consumers),
+       .consumer_supplies = vdig_consumers,
+};
+
+static struct regulator_init_data vpll_init = {
+       .constraints = {
+               .name = "VPLL",
+               .min_uV = mV_to_uV(1050),
+               .max_uV = mV_to_uV(1800),
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
+                       REGULATOR_CHANGE_STATUS,
+               .boot_on = 1,
+               .always_on = 1,
+       }
+};
+
+static struct regulator_init_data vusb2_init = {
+       .constraints = {
+               .name = "VUSB2",
+               .min_uV = mV_to_uV(2400),
+               .max_uV = mV_to_uV(2775),
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
+                       REGULATOR_CHANGE_STATUS,
+               .boot_on = 1,
+               .always_on = 1,
+       }
+};
+
+static struct regulator_init_data vvideo_init = {
+       .constraints = {
+               .name = "VVIDEO",
+               .min_uV = mV_to_uV(2775),
+               .max_uV = mV_to_uV(2775),
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
+                       REGULATOR_CHANGE_STATUS,
+               .apply_uV = 1,
+       },
+       .num_consumer_supplies = ARRAY_SIZE(vvideo_consumers),
+       .consumer_supplies = vvideo_consumers,
+};
+
+static struct regulator_init_data vaudio_init = {
+       .constraints = {
+               .name = "VAUDIO",
+               .min_uV = mV_to_uV(2300),
+               .max_uV = mV_to_uV(3000),
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
+                       REGULATOR_CHANGE_STATUS,
+       }
+};
+
+static struct regulator_init_data vsd_init = {
+       .constraints = {
+               .name = "VSD",
+               .min_uV = mV_to_uV(1800),
+               .max_uV = mV_to_uV(3150),
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
+                       REGULATOR_CHANGE_STATUS,
+       }
+};
+
+static struct regulator_init_data vcam_init = {
+       .constraints = {
+               .name = "VCAM",
+               .min_uV = mV_to_uV(2500),
+               .max_uV = mV_to_uV(3000),
+               .valid_ops_mask =
+                       REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_MODE |
+                       REGULATOR_CHANGE_STATUS,
+               .valid_modes_mask = REGULATOR_MODE_FAST | REGULATOR_MODE_NORMAL,
+       }
+};
+
+static struct regulator_init_data vgen1_init = {
+       .constraints = {
+               .name = "VGEN1",
+               .min_uV = mV_to_uV(1200),
+               .max_uV = mV_to_uV(1200),
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
+                       REGULATOR_CHANGE_STATUS,
+       }
+};
+
+static struct regulator_init_data vgen2_init = {
+       .constraints = {
+               .name = "VGEN2",
+               .min_uV = mV_to_uV(1200),
+               .max_uV = mV_to_uV(3150),
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
+                       REGULATOR_CHANGE_STATUS,
+               .always_on = 1,
+       }
+};
+
+static struct regulator_init_data vgen3_init = {
+       .constraints = {
+               .name = "VGEN3",
+               .min_uV = mV_to_uV(1800),
+               .max_uV = mV_to_uV(2900),
+               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
+                       REGULATOR_CHANGE_STATUS,
+               .always_on = 1,
+       }
+};
+
+static struct regulator_init_data gpo1_init = {
+       .constraints = {
+               .name = "GPO1",
+               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+       }
+};
+
+static struct regulator_init_data gpo2_init = {
+       .constraints = {
+               .name = "GPO2",
+               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+       }
+};
+
+static struct regulator_init_data gpo3_init = {
+       .constraints = {
+               .name = "GPO3",
+               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+       }
+};
+
+static struct regulator_init_data gpo4_init = {
+       .constraints = {
+               .name = "GPO4",
+               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+       }
+};
+
+static struct mc13xxx_regulator_init_data mx51_bbg_regulators[] = {
+       { .id = MC13892_SW1,            .init_data =  &sw1_init },
+       { .id = MC13892_SW2,            .init_data =  &sw2_init },
+       { .id = MC13892_SW3,            .init_data =  &sw3_init },
+       { .id = MC13892_SW4,            .init_data =  &sw4_init },
+       { .id = MC13892_SWBST,          .init_data =  &swbst_init },
+       { .id = MC13892_VIOHI,          .init_data =  &viohi_init },
+       { .id = MC13892_VPLL,           .init_data =  &vpll_init },
+       { .id = MC13892_VDIG,           .init_data =  &vdig_init },
+       { .id = MC13892_VSD,            .init_data =  &vsd_init },
+       { .id = MC13892_VUSB2,          .init_data =  &vusb2_init },
+       { .id = MC13892_VVIDEO,         .init_data =  &vvideo_init },
+       { .id = MC13892_VAUDIO,         .init_data =  &vaudio_init },
+       { .id = MC13892_VCAM,           .init_data =  &vcam_init },
+       { .id = MC13892_VGEN1,          .init_data =  &vgen1_init },
+       { .id = MC13892_VGEN2,          .init_data =  &vgen2_init },
+       { .id = MC13892_VGEN3,          .init_data =  &vgen3_init },
+       { .id = MC13892_VUSB,           .init_data =  &vusb_init },
+       { .id = MC13892_GPO1,           .init_data =  &gpo1_init },
+       { .id = MC13892_GPO2,           .init_data =  &gpo2_init },
+       { .id = MC13892_GPO3,           .init_data =  &gpo3_init },
+       { .id = MC13892_GPO4,           .init_data =  &gpo4_init },
+};
+
+static struct mc13xxx_platform_data mc13892_plat = {
+       .flags = MC13XXX_USE_REGULATOR,
+       .num_regulators = ARRAY_SIZE(mx51_bbg_regulators),
+       .regulators = mx51_bbg_regulators,
+};
+
+#define MC13892_SPI_IRQ                gpio_to_irq(8)
+static struct spi_board_info __initdata mc13892_spi_device = {
+       .modalias = "mc13892",
+       .irq = MC13892_SPI_IRQ,
+       .max_speed_hz = 6000000,        /* max spi SCK clock speed in HZ */
+       .bus_num = 0,
+       .chip_select = 0,
+       .platform_data = &mc13892_plat,
+};
+
+
+int __init mx51_babbage_init_mc13892(void)
+{
+       return spi_register_board_info(&mc13892_spi_device, 1);
+}
+