Merge tag 'mfd-3.5-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-ux500 / board-mop500.c
index 6dd632d8a80983f3bde59645f202309f30da1e81..fba8adea421e399272336b9ff8d7b6bfb8b645e9 100644 (file)
@@ -1,3 +1,4 @@
+
 /*
  * Copyright (C) 2008-2009 ST-Ericsson
  *
 #include <linux/smsc911x.h>
 #include <linux/gpio_keys.h>
 #include <linux/delay.h>
-
 #include <linux/of.h>
 #include <linux/of_platform.h>
-
 #include <linux/leds.h>
+#include <linux/pinctrl/consumer.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/hardware/gic.h>
 
 #include <plat/i2c.h>
 #include <plat/ste_dma40.h>
-#include <plat/pincfg.h>
 #include <plat/gpio-nomadik.h>
 
 #include <mach/hardware.h>
 #include <mach/setup.h>
 #include <mach/devices.h>
 #include <mach/irqs.h>
+#include <mach/crypto-ux500.h>
 
-#include "pins-db8500.h"
 #include "ste-dma40-db8500.h"
 #include "devices-db8500.h"
 #include "board-mop500.h"
 #include "board-mop500-regulators.h"
+#include "board-mop500-msp.h"
 
 static struct gpio_led snowball_led_array[] = {
        {
@@ -417,6 +418,45 @@ static void mop500_prox_deactivate(struct device *dev)
        regulator_put(prox_regulator);
 }
 
+static struct cryp_platform_data u8500_cryp1_platform_data = {
+               .mem_to_engine = {
+                               .dir = STEDMA40_MEM_TO_PERIPH,
+                               .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
+                               .dst_dev_type = DB8500_DMA_DEV48_CAC1_TX,
+                               .src_info.data_width = STEDMA40_WORD_WIDTH,
+                               .dst_info.data_width = STEDMA40_WORD_WIDTH,
+                               .mode = STEDMA40_MODE_LOGICAL,
+                               .src_info.psize = STEDMA40_PSIZE_LOG_4,
+                               .dst_info.psize = STEDMA40_PSIZE_LOG_4,
+               },
+               .engine_to_mem = {
+                               .dir = STEDMA40_PERIPH_TO_MEM,
+                               .src_dev_type = DB8500_DMA_DEV48_CAC1_RX,
+                               .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
+                               .src_info.data_width = STEDMA40_WORD_WIDTH,
+                               .dst_info.data_width = STEDMA40_WORD_WIDTH,
+                               .mode = STEDMA40_MODE_LOGICAL,
+                               .src_info.psize = STEDMA40_PSIZE_LOG_4,
+                               .dst_info.psize = STEDMA40_PSIZE_LOG_4,
+               }
+};
+
+static struct stedma40_chan_cfg u8500_hash_dma_cfg_tx = {
+               .dir = STEDMA40_MEM_TO_PERIPH,
+               .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
+               .dst_dev_type = DB8500_DMA_DEV50_HAC1_TX,
+               .src_info.data_width = STEDMA40_WORD_WIDTH,
+               .dst_info.data_width = STEDMA40_WORD_WIDTH,
+               .mode = STEDMA40_MODE_LOGICAL,
+               .src_info.psize = STEDMA40_PSIZE_LOG_16,
+               .dst_info.psize = STEDMA40_PSIZE_LOG_16,
+};
+
+static struct hash_platform_data u8500_hash1_platform_data = {
+               .mem_to_engine = &u8500_hash_dma_cfg_tx,
+               .dma_filter = stedma40_filter,
+};
+
 /* add any platform devices here - TODO */
 static struct platform_device *mop500_platform_devs[] __initdata = {
        &mop500_gpio_keys_device,
@@ -520,14 +560,6 @@ static struct stedma40_chan_cfg uart2_dma_cfg_tx = {
 };
 #endif
 
-
-static pin_cfg_t mop500_pins_uart0[] = {
-       GPIO0_U0_CTSn   | PIN_INPUT_PULLUP,
-       GPIO1_U0_RTSn   | PIN_OUTPUT_HIGH,
-       GPIO2_U0_RXD    | PIN_INPUT_PULLUP,
-       GPIO3_U0_TXD    | PIN_OUTPUT_HIGH,
-};
-
 #define PRCC_K_SOFTRST_SET      0x18
 #define PRCC_K_SOFTRST_CLEAR    0x1C
 static void ux500_uart0_reset(void)
@@ -548,24 +580,33 @@ static void ux500_uart0_reset(void)
        udelay(1);
 }
 
+/* This needs to be referenced by callbacks */
+struct pinctrl *u0_p;
+struct pinctrl_state *u0_def;
+struct pinctrl_state *u0_sleep;
+
 static void ux500_uart0_init(void)
 {
        int ret;
 
-       ret = nmk_config_pins(mop500_pins_uart0,
-                       ARRAY_SIZE(mop500_pins_uart0));
-       if (ret < 0)
-               pr_err("pl011: uart pins_enable failed\n");
+       if (IS_ERR(u0_p) || IS_ERR(u0_def))
+               return;
+
+       ret = pinctrl_select_state(u0_p, u0_def);
+       if (ret)
+               pr_err("could not set UART0 defstate\n");
 }
 
 static void ux500_uart0_exit(void)
 {
        int ret;
 
-       ret = nmk_config_pins_sleep(mop500_pins_uart0,
-                       ARRAY_SIZE(mop500_pins_uart0));
-       if (ret < 0)
-               pr_err("pl011: uart pins_disable failed\n");
+       if (IS_ERR(u0_p) || IS_ERR(u0_sleep))
+               return;
+
+       ret = pinctrl_select_state(u0_p, u0_sleep);
+       if (ret)
+               pr_err("could not set UART0 idlestate\n");
 }
 
 static struct amba_pl011_data uart0_plat = {
@@ -597,15 +638,41 @@ static struct amba_pl011_data uart2_plat = {
 
 static void __init mop500_uart_init(struct device *parent)
 {
-       db8500_add_uart0(parent, &uart0_plat);
+       struct amba_device *uart0_device;
+
+       uart0_device = db8500_add_uart0(parent, &uart0_plat);
+       if (uart0_device) {
+               u0_p = pinctrl_get(&uart0_device->dev);
+               if (IS_ERR(u0_p))
+                       dev_err(&uart0_device->dev,
+                               "could not get UART0 pinctrl\n");
+               else {
+                       u0_def = pinctrl_lookup_state(u0_p,
+                                                     PINCTRL_STATE_DEFAULT);
+                       if (IS_ERR(u0_def)) {
+                               dev_err(&uart0_device->dev,
+                                       "could not get UART0 defstate\n");
+                       }
+                       u0_sleep = pinctrl_lookup_state(u0_p,
+                                                       PINCTRL_STATE_SLEEP);
+                       if (IS_ERR(u0_sleep))
+                               dev_err(&uart0_device->dev,
+                                       "could not get UART0 idlestate\n");
+               }
+       }
        db8500_add_uart1(parent, &uart1_plat);
        db8500_add_uart2(parent, &uart2_plat);
 }
 
+static void __init u8500_cryp1_hash1_init(struct device *parent)
+{
+       db8500_add_cryp1(parent, &u8500_cryp1_platform_data);
+       db8500_add_hash1(parent, &u8500_hash1_platform_data);
+}
+
 static struct platform_device *snowball_platform_devs[] __initdata = {
        &snowball_led_dev,
        &snowball_key_dev,
-       &snowball_sbnet_dev,
        &ab8500_device,
 };
 
@@ -617,10 +684,9 @@ static void __init mop500_init_machine(void)
 
        mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
 
+       mop500_pinmaps_init();
        parent = u8500_init_devices();
 
-       mop500_pins_init();
-
        /* FIXME: parent of ab8500 should be prcmu */
        for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
                mop500_platform_devs[i]->dev.parent = parent;
@@ -631,8 +697,11 @@ static void __init mop500_init_machine(void)
        mop500_i2c_init(parent);
        mop500_sdi_init(parent);
        mop500_spi_init(parent);
+       mop500_msp_init(parent);
        mop500_uart_init(parent);
 
+       u8500_cryp1_hash1_init(parent);
+
        i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
 
        i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
@@ -646,13 +715,11 @@ static void __init mop500_init_machine(void)
 static void __init snowball_init_machine(void)
 {
        struct device *parent = NULL;
-       int i2c0_devs;
        int i;
 
+       snowball_pinmaps_init();
        parent = u8500_init_devices();
 
-       snowball_pins_init();
-
        for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++)
                snowball_platform_devs[i]->dev.parent = parent;
 
@@ -662,13 +729,9 @@ static void __init snowball_init_machine(void)
        mop500_i2c_init(parent);
        snowball_sdi_init(parent);
        mop500_spi_init(parent);
+       mop500_msp_init(parent);
        mop500_uart_init(parent);
 
-       i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
-       i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
-       i2c_register_board_info(2, mop500_i2c2_devices,
-                               ARRAY_SIZE(mop500_i2c2_devices));
-
        /* This board has full regulator constraints */
        regulator_has_full_constraints();
 }
@@ -686,10 +749,9 @@ static void __init hrefv60_init_machine(void)
         */
        mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
 
+       hrefv60_pinmaps_init();
        parent = u8500_init_devices();
 
-       hrefv60_pins_init();
-
        for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
                mop500_platform_devs[i]->dev.parent = parent;
 
@@ -699,6 +761,7 @@ static void __init hrefv60_init_machine(void)
        mop500_i2c_init(parent);
        hrefv60_sdi_init(parent);
        mop500_spi_init(parent);
+       mop500_msp_init(parent);
        mop500_uart_init(parent);
 
        i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
@@ -722,6 +785,7 @@ MACHINE_START(U8500, "ST-Ericsson MOP500 platform")
        .timer          = &ux500_timer,
        .handle_irq     = gic_handle_irq,
        .init_machine   = mop500_init_machine,
+       .init_late      = ux500_init_late,
 MACHINE_END
 
 MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")
@@ -731,6 +795,7 @@ MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")
        .timer          = &ux500_timer,
        .handle_irq     = gic_handle_irq,
        .init_machine   = hrefv60_init_machine,
+       .init_late      = ux500_init_late,
 MACHINE_END
 
 MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
@@ -741,21 +806,35 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
        .timer          = &ux500_timer,
        .handle_irq     = gic_handle_irq,
        .init_machine   = snowball_init_machine,
+       .init_late      = ux500_init_late,
 MACHINE_END
 
 #ifdef CONFIG_MACH_UX500_DT
 
 struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
+       /* Requires DMA and call-back bindings. */
        OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat),
        OF_DEV_AUXDATA("arm,pl011", 0x80121000, "uart1", &uart1_plat),
        OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", &uart2_plat),
+       /* Requires DMA bindings. */
        OF_DEV_AUXDATA("arm,pl022", 0x80002000, "ssp0",  &ssp0_plat),
+       /* Requires clock name bindings. */
+       OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e000, "gpio.0", NULL),
+       OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e080, "gpio.1", NULL),
+       OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e000, "gpio.2", NULL),
+       OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e080, "gpio.3", NULL),
+       OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e100, "gpio.4", NULL),
+       OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e180, "gpio.5", NULL),
+       OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e000, "gpio.6", NULL),
+       OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e080, "gpio.7", NULL),
+       OF_DEV_AUXDATA("st,nomadik-gpio", 0xa03fe000, "gpio.8", NULL),
        {},
 };
 
-static const struct of_device_id u8500_soc_node[] = {
+static const struct of_device_id u8500_local_bus_nodes[] = {
        /* only create devices below soc node */
        { .compatible = "stericsson,db8500", },
+       { .compatible = "simple-bus"},
        { },
 };
 
@@ -765,8 +844,15 @@ static void __init u8500_init_machine(void)
        int i2c0_devs;
        int i;
 
+       /* Pinmaps must be in place before devices register */
+       if (of_machine_is_compatible("st-ericsson,mop500"))
+               mop500_pinmaps_init();
+       else if (of_machine_is_compatible("calaosystems,snowball-a9500"))
+               snowball_pinmaps_init();
+       else if (of_machine_is_compatible("st-ericsson,hrefv60+"))
+               hrefv60_pinmaps_init();
+
        parent = u8500_init_devices();
-       i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
 
        for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
                mop500_platform_devs[i]->dev.parent = parent;
@@ -774,18 +860,22 @@ static void __init u8500_init_machine(void)
                snowball_platform_devs[i]->dev.parent = parent;
 
        /* automatically probe child nodes of db8500 device */
-       of_platform_populate(NULL, u8500_soc_node, u8500_auxdata_lookup, parent);
+       of_platform_populate(NULL, u8500_local_bus_nodes, u8500_auxdata_lookup, parent);
 
        if (of_machine_is_compatible("st-ericsson,mop500")) {
                mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
-               mop500_pins_init();
 
                platform_add_devices(mop500_platform_devs,
                                ARRAY_SIZE(mop500_platform_devs));
 
                mop500_sdi_init(parent);
+
+               i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
+               i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
+               i2c_register_board_info(2, mop500_i2c2_devices,
+                                       ARRAY_SIZE(mop500_i2c2_devices));
+
        } else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
-               snowball_pins_init();
                platform_add_devices(snowball_platform_devs,
                                ARRAY_SIZE(snowball_platform_devs));
 
@@ -797,19 +887,20 @@ static void __init u8500_init_machine(void)
                 * instead.
                 */
                mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
-               i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
-               hrefv60_pins_init();
                platform_add_devices(mop500_platform_devs,
                                ARRAY_SIZE(mop500_platform_devs));
 
                hrefv60_sdi_init(parent);
+
+               i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
+               i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
+
+               i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
+               i2c_register_board_info(2, mop500_i2c2_devices,
+                                       ARRAY_SIZE(mop500_i2c2_devices));
        }
        mop500_i2c_init(parent);
 
-       i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
-       i2c_register_board_info(2, mop500_i2c2_devices,
-                               ARRAY_SIZE(mop500_i2c2_devices));
-
        /* This board has full regulator constraints */
        regulator_has_full_constraints();
 }
@@ -830,6 +921,7 @@ DT_MACHINE_START(U8500_DT, "ST-Ericsson U8500 platform (Device Tree Support)")
        .timer          = &ux500_timer,
        .handle_irq     = gic_handle_irq,
        .init_machine   = u8500_init_machine,
+       .init_late      = ux500_init_late,
        .dt_compat      = u8500_dt_board_compat,
 MACHINE_END
 #endif