Merge tag 'u-boot-atmel-fixes-2021.01-b' of https://gitlab.denx.de/u-boot/custodians...
[platform/kernel/u-boot.git] / board / nokia / rx51 / rx51.c
index c2e07db..3d62b5d 100644 (file)
@@ -1,9 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * (C) Copyright 2012
  * Ивайло Димитров <freemangordon@abv.bg>
  *
  * (C) Copyright 2011-2012
- * Pali Rohár <pali.rohar@gmail.com>
+ * Pali Rohár <pali@kernel.org>
  *
  * (C) Copyright 2010
  * Alistair Buxton <a.j.buxton@gmail.com>
  *
  *     Richard Woodruff <r-woodruff2@ti.com>
  *     Syed Mohammed Khasim <khasim@ti.com>
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
+#include <dm.h>
+#include <env.h>
+#include <init.h>
 #include <watchdog.h>
 #include <malloc.h>
 #include <twl4030.h>
@@ -32,6 +34,7 @@
 #include <asm/setup.h>
 #include <asm/bitops.h>
 #include <asm/mach-types.h>
+#include <asm/omap_i2c.h>
 #include <asm/arch/mux.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/arch/mmc_host_def.h>
@@ -69,18 +72,12 @@ static struct tag_omap omap[] = {
        OMAP_TAG_GPIO_SWITCH_CONFIG("sleep_ind", 0xa2, 0x2, 0x2, 0x0),
        OMAP_TAG_GPIO_SWITCH_CONFIG("slide", GPIO_SLIDE, 0x0, 0x0, 0x0),
        OMAP_TAG_WLAN_CX3110X_CONFIG(0x25, 0xff, 87, 42, -1),
-       OMAP_TAG_PARTITION_CONFIG(PART1_NAME, PART1_SIZE * PART1_MULL,
-                       PART1_OFFS, PART1_MASK),
-       OMAP_TAG_PARTITION_CONFIG(PART2_NAME, PART2_SIZE * PART2_MULL,
-                       PART2_OFFS, PART2_MASK),
-       OMAP_TAG_PARTITION_CONFIG(PART3_NAME, PART3_SIZE * PART3_MULL,
-                       PART3_OFFS, PART3_MASK),
-       OMAP_TAG_PARTITION_CONFIG(PART4_NAME, PART4_SIZE * PART4_MULL,
-                       PART4_OFFS, PART4_MASK),
-       OMAP_TAG_PARTITION_CONFIG(PART5_NAME, PART5_SIZE * PART5_MULL,
-                       PART5_OFFS, PART5_MASK),
-       OMAP_TAG_PARTITION_CONFIG(PART6_NAME, PART6_SIZE * PART6_MULL,
-                       PART6_OFFS, PART6_MASK),
+       OMAP_TAG_PARTITION_CONFIG("bootloader", 128 * 1024, 0x00000000, 0x00000003),
+       OMAP_TAG_PARTITION_CONFIG("config", 384 * 1024, 0x00020000, 0x00000000),
+       OMAP_TAG_PARTITION_CONFIG("log", 256 * 1024, 0x00080000, 0x00000000),
+       OMAP_TAG_PARTITION_CONFIG("kernel", 2 * 1024*1024, 0x000c0000, 0x00000000),
+       OMAP_TAG_PARTITION_CONFIG("initfs", 2 * 1024*1024, 0x002c0000, 0x00000000),
+       OMAP_TAG_PARTITION_CONFIG("rootfs", 257280 * 1024, 0x004c0000, 0x00000000),
        OMAP_TAG_BOOT_REASON_CONFIG("pwr_key"),
        OMAP_TAG_VERSION_STR_CONFIG("product", "RX-51"),
        OMAP_TAG_VERSION_STR_CONFIG("hw-build", "2101"),
@@ -93,6 +90,7 @@ static char *boot_reason_ptr;
 static char *hw_build_ptr;
 static char *nolo_version_ptr;
 static char *boot_mode_ptr;
+static int serial_was_console_enabled;
 
 /*
  * Routine: init_omap_tags
@@ -149,6 +147,13 @@ static void reuse_omap_atags(struct tag_omap *t)
                                strcpy(boot_mode_ptr, version);
                        }
                        break;
+               case OMAP_TAG_UART:
+                       if (t->u.uart.enabled_uarts)
+                               serial_was_console_enabled = 1;
+                       break;
+               case OMAP_TAG_SERIAL_CONSOLE:
+                       serial_was_console_enabled = 1;
+                       break;
                default:
                        break;
                }
@@ -195,8 +200,25 @@ static void reuse_atags(void)
  */
 int board_init(void)
 {
+#if defined(CONFIG_CMD_ONENAND)
+       const u32 gpmc_regs_onenandrx51[GPMC_MAX_REG] = {
+               ONENAND_GPMC_CONFIG1_RX51,
+               ONENAND_GPMC_CONFIG2_RX51,
+               ONENAND_GPMC_CONFIG3_RX51,
+               ONENAND_GPMC_CONFIG4_RX51,
+               ONENAND_GPMC_CONFIG5_RX51,
+               ONENAND_GPMC_CONFIG6_RX51,
+               0
+       };
+#endif
        /* in SRAM or SDRAM, finish GPMC */
        gpmc_init();
+#if defined(CONFIG_CMD_ONENAND)
+       enable_gpmc_cs_config(gpmc_regs_onenandrx51, &gpmc_cfg->cs[0],
+                             CONFIG_SYS_ONENAND_BASE, GPMC_SIZE_256M);
+#endif
+       /* Enable the clks & power */
+       per_clocks_enable();
        /* boot param addr */
        gd->bd->bi_boot_params = OMAP34XX_SDRC_CS0 + 0x100;
        return 0;
@@ -234,18 +256,25 @@ void setup_board_tags(struct tag **in_params)
        params->u.core.rootdev = 0x0;
 
        /* append omap atag only if env setup_omap_atag is set to 1 */
-       str = getenv("setup_omap_atag");
+       str = env_get("setup_omap_atag");
        if (!str || str[0] != '1')
                return;
 
-       str = getenv("setup_console_atag");
-       if (str && str[0] == '1')
-               setup_console_atag = 1;
-       else
-               setup_console_atag = 0;
+       str = env_get("setup_console_atag");
+       if (str && str[0]) {
+               if (str[0] == '1')
+                       setup_console_atag = 1;
+               else
+                       setup_console_atag = 0;
+       } else {
+               if (serial_was_console_enabled)
+                       setup_console_atag = 1;
+               else
+                       setup_console_atag = 0;
+       }
 
-       setup_boot_reason_atag = getenv("setup_boot_reason_atag");
-       setup_boot_mode_atag = getenv("setup_boot_mode_atag");
+       setup_boot_reason_atag = env_get("setup_boot_reason_atag");
+       setup_boot_mode_atag = env_get("setup_boot_mode_atag");
 
        params = *in_params;
        t = (struct tag_omap *)&params->u;
@@ -341,6 +370,17 @@ static void omap3_emu_romcode_call(u32 service_id, u32 *parameters)
        do_omap3_emu_romcode_call(service_id, OMAP3_PUBLIC_SRAM_SCRATCH_AREA);
 }
 
+void omap3_set_aux_cr_secure(u32 acr)
+{
+       struct emu_hal_params_rx51 emu_romcode_params = { 0, };
+
+       emu_romcode_params.num_params = 2;
+       emu_romcode_params.param1 = acr;
+
+       omap3_emu_romcode_call(OMAP3_EMU_HAL_API_WRITE_ACR,
+                              (u32 *)&emu_romcode_params);
+}
+
 /*
  * Routine: omap3_update_aux_cr_secure_rx51
  * Description: Modify the contents Auxiliary Control Register.
@@ -350,19 +390,13 @@ static void omap3_emu_romcode_call(u32 service_id, u32 *parameters)
  */
 static void omap3_update_aux_cr_secure_rx51(u32 set_bits, u32 clear_bits)
 {
-       struct emu_hal_params_rx51 emu_romcode_params = { 0, };
        u32 acr;
 
        /* Read ACR */
        asm volatile ("mrc p15, 0, %0, c1, c0, 1" : "=r" (acr));
        acr &= ~clear_bits;
        acr |= set_bits;
-
-       emu_romcode_params.num_params = 2;
-       emu_romcode_params.param1 = acr;
-
-       omap3_emu_romcode_call(OMAP3_EMU_HAL_API_WRITE_ACR,
-                               (u32 *)&emu_romcode_params);
+       omap3_set_aux_cr_secure(acr);
 }
 
 /*
@@ -371,14 +405,13 @@ static void omap3_update_aux_cr_secure_rx51(u32 set_bits, u32 clear_bits)
  */
 int misc_init_r(void)
 {
+       struct udevice *dev;
        char buf[12];
        u8 state;
 
-       /* reset lp5523 led */
-       i2c_set_bus_num(1);
-       state = 0xff;
-       i2c_write(0x32, 0x3d, 1, &state, 1);
-       i2c_set_bus_num(0);
+       /* disable lp5523 led */
+       if (i2c_get_chip_for_busnum(1, 0x32, 1, &dev) == 0)
+               dm_i2c_reg_write(dev, 0x00, 0x00);
 
        /* initialize twl4030 power managment */
        twl4030_power_init();
@@ -408,7 +441,7 @@ int misc_init_r(void)
 
        /* set env variable attkernaddr for relocated kernel */
        sprintf(buf, "%#x", KERNEL_ADDRESS);
-       setenv("attkernaddr", buf);
+       env_set("attkernaddr", buf);
 
        /* initialize omap tags */
        init_omap_tags();
@@ -416,14 +449,18 @@ int misc_init_r(void)
        /* reuse atags from previous bootloader */
        reuse_atags();
 
-       dieid_num_r();
+       omap_die_id_display();
        print_cpuinfo();
 
        /*
         * Cortex-A8(r1p0..r1p2) errata 430973 workaround
         * Set IBE bit in Auxiliary Control Register
+        *
+        * Call this routine only on real secure device
+        * Qemu does not implement secure PPA and crash
         */
-       omap3_update_aux_cr_secure_rx51(1 << 6, 0);
+       if (get_device_type() == HS_DEVICE)
+               omap3_update_aux_cr_secure_rx51(1 << 6, 0);
 
        return 0;
 }
@@ -607,8 +644,8 @@ int rx51_kp_tstc(struct stdio_dev *sdev)
                        continue;
 
                /* read the key state */
-               i2c_read(TWL4030_CHIP_KEYPAD,
-                       TWL4030_KEYPAD_FULL_CODE_7_0, 1, keys, 8);
+               twl4030_i2c_read(TWL4030_CHIP_KEYPAD,
+                                TWL4030_KEYPAD_FULL_CODE_7_0, keys, 8);
 
                /* cut out modifier keys from the keystate */
                mods = keys[4] >> 4;
@@ -653,9 +690,27 @@ int rx51_kp_getc(struct stdio_dev *sdev)
  * Routine: board_mmc_init
  * Description: Initialize mmc devices.
  */
-int board_mmc_init(bd_t *bis)
+int board_mmc_init(struct bd_info *bis)
 {
        omap_mmc_init(0, 0, 0, -1, -1);
        omap_mmc_init(1, 0, 0, -1, -1);
        return 0;
 }
+
+void board_mmc_power_init(void)
+{
+       twl4030_power_mmc_init(0);
+       twl4030_power_mmc_init(1);
+}
+
+static const struct omap_i2c_platdata rx51_i2c[] = {
+       { I2C_BASE1, 2200000, OMAP_I2C_REV_V1 },
+       { I2C_BASE2, 100000, OMAP_I2C_REV_V1 },
+       { I2C_BASE3, 400000, OMAP_I2C_REV_V1 },
+};
+
+U_BOOT_DEVICES(rx51_i2c) = {
+       { "i2c_omap", &rx51_i2c[0] },
+       { "i2c_omap", &rx51_i2c[1] },
+       { "i2c_omap", &rx51_i2c[2] },
+};