|
@@ -23,6 +23,10 @@
|
|
|
#include <linux/mtd/plat-ram.h>
|
|
|
#include <linux/mtd/physmap.h>
|
|
|
#include <linux/platform_device.h>
|
|
|
+#include <linux/regulator/machine.h>
|
|
|
+#include <linux/mfd/mc13783.h>
|
|
|
+#include <linux/spi/spi.h>
|
|
|
+#include <linux/irq.h>
|
|
|
|
|
|
#include <asm/mach-types.h>
|
|
|
#include <asm/mach/arch.h>
|
|
@@ -35,6 +39,7 @@
|
|
|
#include <mach/iomux.h>
|
|
|
#include <mach/imx-uart.h>
|
|
|
#include <mach/mxc_nand.h>
|
|
|
+#include <mach/spi.h>
|
|
|
|
|
|
#include "devices.h"
|
|
|
|
|
@@ -78,8 +83,6 @@ static int pcm038_pins[] = {
|
|
|
PC6_PF_I2C2_SCL,
|
|
|
/* SPI1 */
|
|
|
PD25_PF_CSPI1_RDY,
|
|
|
- PD27_PF_CSPI1_SS1,
|
|
|
- PD28_PF_CSPI1_SS0,
|
|
|
PD29_PF_CSPI1_SCLK,
|
|
|
PD30_PF_CSPI1_MISO,
|
|
|
PD31_PF_CSPI1_MOSI,
|
|
@@ -196,6 +199,86 @@ static struct i2c_board_info pcm038_i2c_devices[] = {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+static int pcm038_spi_cs[] = {GPIO_PORTD + 28};
|
|
|
+
|
|
|
+static struct spi_imx_master pcm038_spi_0_data = {
|
|
|
+ .chipselect = pcm038_spi_cs,
|
|
|
+ .num_chipselect = ARRAY_SIZE(pcm038_spi_cs),
|
|
|
+};
|
|
|
+
|
|
|
+static struct regulator_consumer_supply sdhc1_consumers[] = {
|
|
|
+ {
|
|
|
+ .dev = &mxc_sdhc_device1.dev,
|
|
|
+ .supply = "sdhc_vcc",
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct regulator_init_data sdhc1_data = {
|
|
|
+ .constraints = {
|
|
|
+ .min_uV = 3000000,
|
|
|
+ .max_uV = 3400000,
|
|
|
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
|
|
|
+ REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
|
|
|
+ .valid_modes_mask = REGULATOR_MODE_NORMAL |
|
|
|
+ REGULATOR_MODE_FAST,
|
|
|
+ .always_on = 0,
|
|
|
+ .boot_on = 0,
|
|
|
+ },
|
|
|
+ .num_consumer_supplies = ARRAY_SIZE(sdhc1_consumers),
|
|
|
+ .consumer_supplies = sdhc1_consumers,
|
|
|
+};
|
|
|
+
|
|
|
+static struct regulator_consumer_supply cam_consumers[] = {
|
|
|
+ {
|
|
|
+ .dev = NULL,
|
|
|
+ .supply = "imx_cam_vcc",
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct regulator_init_data cam_data = {
|
|
|
+ .constraints = {
|
|
|
+ .min_uV = 3000000,
|
|
|
+ .max_uV = 3400000,
|
|
|
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
|
|
|
+ REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
|
|
|
+ .valid_modes_mask = REGULATOR_MODE_NORMAL |
|
|
|
+ REGULATOR_MODE_FAST,
|
|
|
+ .always_on = 0,
|
|
|
+ .boot_on = 0,
|
|
|
+ },
|
|
|
+ .num_consumer_supplies = ARRAY_SIZE(cam_consumers),
|
|
|
+ .consumer_supplies = cam_consumers,
|
|
|
+};
|
|
|
+
|
|
|
+struct mc13783_regulator_init_data pcm038_regulators[] = {
|
|
|
+ {
|
|
|
+ .id = MC13783_REGU_VCAM,
|
|
|
+ .init_data = &cam_data,
|
|
|
+ }, {
|
|
|
+ .id = MC13783_REGU_VMMC1,
|
|
|
+ .init_data = &sdhc1_data,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct mc13783_platform_data pcm038_pmic = {
|
|
|
+ .regulators = pcm038_regulators,
|
|
|
+ .num_regulators = ARRAY_SIZE(pcm038_regulators),
|
|
|
+ .flags = MC13783_USE_ADC | MC13783_USE_REGULATOR |
|
|
|
+ MC13783_USE_TOUCHSCREEN,
|
|
|
+};
|
|
|
+
|
|
|
+static struct spi_board_info pcm038_spi_board_info[] __initdata = {
|
|
|
+ {
|
|
|
+ .modalias = "mc13783",
|
|
|
+ .irq = IRQ_GPIOB(23),
|
|
|
+ .max_speed_hz = 300000,
|
|
|
+ .bus_num = 0,
|
|
|
+ .chip_select = 0,
|
|
|
+ .platform_data = &pcm038_pmic,
|
|
|
+ .mode = SPI_CS_HIGH,
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
static void __init pcm038_init(void)
|
|
|
{
|
|
|
mxc_gpio_setup_multiple_pins(pcm038_pins, ARRAY_SIZE(pcm038_pins),
|
|
@@ -219,6 +302,15 @@ static void __init pcm038_init(void)
|
|
|
/* PE18 for user-LED D40 */
|
|
|
mxc_gpio_mode(GPIO_PORTE | 18 | GPIO_GPIO | GPIO_OUT);
|
|
|
|
|
|
+ mxc_gpio_mode(GPIO_PORTD | 28 | GPIO_GPIO | GPIO_OUT);
|
|
|
+
|
|
|
+ /* MC13783 IRQ */
|
|
|
+ mxc_gpio_mode(GPIO_PORTB | 23 | GPIO_GPIO | GPIO_IN);
|
|
|
+
|
|
|
+ mxc_register_device(&mxc_spi_device0, &pcm038_spi_0_data);
|
|
|
+ spi_register_board_info(pcm038_spi_board_info,
|
|
|
+ ARRAY_SIZE(pcm038_spi_board_info));
|
|
|
+
|
|
|
platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
|
|
|
|
|
|
#ifdef CONFIG_MACH_PCM970_BASEBOARD
|