Patchwork [U-Boot,3/3] mx6sl: Add initial support for mx6slevk board

login
register
mail settings
Submitter Fabio Estevam
Date April 6, 2013, 12:55 a.m.
Message ID <1365209739-5586-3-git-send-email-festevam@gmail.com>
Download mbox | patch
Permalink /patch/234303/
State Superseded
Delegated to: Stefano Babic
Headers show

Comments

Fabio Estevam - April 6, 2013, 12:55 a.m.
From: Fabio Estevam <fabio.estevam@freescale.com>

mx6slevk board is a development board from Freescale based on the mx6 solo-lite
processor.

For details about mx6slevk, please refer to:
http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX6SLEVK&parentCode=i.MX6SL&fpsp=1

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
---
 MAINTAINERS                           |    1 +
 board/freescale/mx6slevk/Makefile     |   28 +++++
 board/freescale/mx6slevk/imximage.cfg |  118 ++++++++++++++++++++
 board/freescale/mx6slevk/mx6slevk.c   |  102 ++++++++++++++++++
 boards.cfg                            |    1 +
 include/configs/mx6slevk.h            |  189 +++++++++++++++++++++++++++++++++
 6 files changed, 439 insertions(+)
 create mode 100644 board/freescale/mx6slevk/Makefile
 create mode 100644 board/freescale/mx6slevk/imximage.cfg
 create mode 100644 board/freescale/mx6slevk/mx6slevk.c
 create mode 100644 include/configs/mx6slevk.h
Dirk Behme - April 6, 2013, 7:27 a.m.
Am 06.04.2013 02:55, schrieb Fabio Estevam:
> From: Fabio Estevam <fabio.estevam@freescale.com>
>
> mx6slevk board is a development board from Freescale based on the mx6 solo-lite
> processor.
>
> For details about mx6slevk, please refer to:
> http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX6SLEVK&parentCode=i.MX6SL&fpsp=1
>
> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
> ---

> diff --git a/board/freescale/mx6slevk/imximage.cfg b/board/freescale/mx6slevk/imximage.cfg
> new file mode 100644
> index 0000000..df39a16
> --- /dev/null
> +++ b/board/freescale/mx6slevk/imximage.cfg
> @@ -0,0 +1,118 @@
> +/*
> + * Copyright (C) 2013 Freescale Semiconductor, Inc.
> + *
> + * 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.
> + *
> + * Refer docs/README.imxmage for more details about how-to configure
> + * and create imximage boot image
> + *
> + * The syntax is taken as close as possible with the kwbimage
> + */
> +
> +/* image version */
> +
> +IMAGE_VERSION 2
> +
> +/*
> + * Boot Device : one of
> + * spi, sd (the board has no nand neither onenand)
> + */
> +
> +BOOT_FROM	sd
> +
> +/*
> + * Device Configuration Data (DCD)
> + *
> + * Each entry must have the format:
> + * Addr-type           Address        Value
> + *
> + * where:
> + *	Addr-type register length (1,2 or 4 bytes)
> + *	Address	  absolute address of the register
> + *	value	  value to be stored in the register
> + */
> +DATA 4 0x020c4018 0x00260324
> +
> +DATA 4 0x020c4068 0xffffffff
> +DATA 4 0x020c406c 0xffffffff
> +DATA 4 0x020c4070 0xffffffff
> +DATA 4 0x020c4074 0xffffffff
> +DATA 4 0x020c4078 0xffffffff
> +DATA 4 0x020c407c 0xffffffff
> +DATA 4 0x020c4080 0xffffffff

Again this default stuff? ;)

Best regards

Dirk
Fabio Estevam - April 6, 2013, 12:47 p.m.
Hi Dirk,

On Sat, Apr 6, 2013 at 4:27 AM, Dirk Behme <dirk.behme@gmail.com> wrote:

>> +DATA 4 0x020c4068 0xffffffff
>> +DATA 4 0x020c406c 0xffffffff
>> +DATA 4 0x020c4070 0xffffffff
>> +DATA 4 0x020c4074 0xffffffff
>> +DATA 4 0x020c4078 0xffffffff
>> +DATA 4 0x020c407c 0xffffffff
>> +DATA 4 0x020c4080 0xffffffff
>
>
> Again this default stuff? ;)

I should have replied to your previous comment.

I tried removing this block as you suggest and the board does not boot.

Then I read the following from the FSL U-boot:
"/* Enable all clocks (they are disabled by ROM code)*/

That's why I am keeping them.

Regards,

Fabio Estevam
Dirk Behme - April 6, 2013, 1:52 p.m.
Am 06.04.2013 14:47, schrieb Fabio Estevam:
> Hi Dirk,
>
> On Sat, Apr 6, 2013 at 4:27 AM, Dirk Behme <dirk.behme@gmail.com> wrote:
>
>>> +DATA 4 0x020c4068 0xffffffff
>>> +DATA 4 0x020c406c 0xffffffff
>>> +DATA 4 0x020c4070 0xffffffff
>>> +DATA 4 0x020c4074 0xffffffff
>>> +DATA 4 0x020c4078 0xffffffff
>>> +DATA 4 0x020c407c 0xffffffff
>>> +DATA 4 0x020c4080 0xffffffff
>>
>>
>> Again this default stuff? ;)
>
> I should have replied to your previous comment.
>
> I tried removing this block as you suggest and the board does not boot.
>
> Then I read the following from the FSL U-boot:
> "/* Enable all clocks (they are disabled by ROM code)*/
>
> That's why I am keeping them.

Most probably it would be sufficient to enable only the clocks needed 
for booting ;) And not all clocks. On the other boards we do

/* set the default clock gate to save power */
DATA 4 0x020c4068 0x00C03F3F
DATA 4 0x020c406c 0x0030FC03
DATA 4 0x020c4070 0x0FFFC000
DATA 4 0x020c4074 0x3FF00000
DATA 4 0x020c4078 0x00FFF300
DATA 4 0x020c407c 0x0F0000C3
DATA 4 0x020c4080 0x000003FF

http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=blob;f=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg;h=f4cae5eeb9899ab4ba937ae286e004d6861f1d43;hb=refs/heads/master#l161

Do you like to try anything similar here, too?

Best regards

Dirk
Fabio Estevam - April 6, 2013, 2:15 p.m.
On Sat, Apr 6, 2013 at 10:52 AM, Dirk Behme <dirk.behme@gmail.com> wrote:

> Most probably it would be sufficient to enable only the clocks needed for
> booting ;) And not all clocks. On the other boards we do
>
> /* set the default clock gate to save power */
> DATA 4 0x020c4068 0x00C03F3F
> DATA 4 0x020c406c 0x0030FC03
> DATA 4 0x020c4070 0x0FFFC000
> DATA 4 0x020c4074 0x3FF00000
> DATA 4 0x020c4078 0x00FFF300
> DATA 4 0x020c407c 0x0F0000C3
> DATA 4 0x020c4080 0x000003FF
>
> http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=blob;f=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg;h=f4cae5eeb9899ab4ba937ae286e004d6861f1d43;hb=refs/heads/master#l161
>
> Do you like to try anything similar here, too?

No, sorry. It is possible to turn some clocks off, for sure,  but I do
not see real benefit by doing this on this solo-lite board.

U-boot runs only for few seconds (or ms), so not much of power savings
we can do in the bootloader.

I am just setting the clocks to the default states, so it is up to the
kernel to manage the clocks as needed.

And I don't want to face the risk to turn some clocks off and then
realize later that the kernel was expecting a clock to be on and start
seeing weird run-time issues.
Dirk Behme - April 6, 2013, 4:30 p.m.
Am 06.04.2013 16:15, schrieb Fabio Estevam:
> On Sat, Apr 6, 2013 at 10:52 AM, Dirk Behme <dirk.behme@gmail.com> wrote:
>
>> Most probably it would be sufficient to enable only the clocks needed for
>> booting ;) And not all clocks. On the other boards we do
>>
>> /* set the default clock gate to save power */
>> DATA 4 0x020c4068 0x00C03F3F
>> DATA 4 0x020c406c 0x0030FC03
>> DATA 4 0x020c4070 0x0FFFC000
>> DATA 4 0x020c4074 0x3FF00000
>> DATA 4 0x020c4078 0x00FFF300
>> DATA 4 0x020c407c 0x0F0000C3
>> DATA 4 0x020c4080 0x000003FF
>>
>> http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=blob;f=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg;h=f4cae5eeb9899ab4ba937ae286e004d6861f1d43;hb=refs/heads/master#l161
>>
>> Do you like to try anything similar here, too?
>
> No, sorry. It is possible to turn some clocks off, for sure,  but I do
> not see real benefit by doing this on this solo-lite board.
>
> U-boot runs only for few seconds (or ms), so not much of power savings
> we can do in the bootloader.

To my understanding what we do above is not about saving power in the 
bootloader ...

> I am just setting the clocks to the default states, so it is up to the
> kernel to manage the clocks as needed.

... but saving power over the whole (kernel) runtime. I might be 
wrong, but to my understanding the kernel doesn't *disable* unneeded 
clocks?

So it's up to the bootloader to enable only the peripherals (clocks) 
really needed for booting. And then it's up to the kernel's driver 
init functions to enable the needed clocks for the subsystem once it's 
needed.

But as I won't use this board I won't care about the power consumption 
here. If you think it's fine for the use cases of this board to enable 
all clocks by default, then this shouldn't stop applying this patch.

Best regards

Dirk
Fabio Estevam - April 6, 2013, 4:40 p.m.
Hi Dirk,

On Sat, Apr 6, 2013 at 1:30 PM, Dirk Behme <dirk.behme@gmail.com> wrote:

> ... but saving power over the whole (kernel) runtime. I might be wrong, but
> to my understanding the kernel doesn't *disable* unneeded clocks?
>
> So it's up to the bootloader to enable only the peripherals (clocks) really
> needed for booting. And then it's up to the kernel's driver init functions
> to enable the needed clocks for the subsystem once it's needed.
>
> But as I won't use this board I won't care about the power consumption here.
> If you think it's fine for the use cases of this board to enable all clocks
> by default, then this shouldn't stop applying this patch.

Ok, understood. I will go through each one of the CCM registers and
check what clocks can be turned off.

This may take some time though as it needs proper testing.

I suggest that we keep the current clock settings as is, so that the
board support can reach U-boot, then later I can submit a patch for
turning off the unneeded clocks.

Thanks,

Fabio Estevam
Dirk Behme - April 6, 2013, 4:48 p.m.
Am 06.04.2013 18:40, schrieb Fabio Estevam:
> Hi Dirk,
>
> On Sat, Apr 6, 2013 at 1:30 PM, Dirk Behme <dirk.behme@gmail.com> wrote:
>
>> ... but saving power over the whole (kernel) runtime. I might be wrong, but
>> to my understanding the kernel doesn't *disable* unneeded clocks?
>>
>> So it's up to the bootloader to enable only the peripherals (clocks) really
>> needed for booting. And then it's up to the kernel's driver init functions
>> to enable the needed clocks for the subsystem once it's needed.
>>
>> But as I won't use this board I won't care about the power consumption here.
>> If you think it's fine for the use cases of this board to enable all clocks
>> by default, then this shouldn't stop applying this patch.
>
> Ok, understood. I will go through each one of the CCM registers and
> check what clocks can be turned off.
>
> This may take some time though as it needs proper testing.
>
> I suggest that we keep the current clock settings as is, so that the
> board support can reach U-boot, then later I can submit a patch for
> turning off the unneeded clocks.

Sounds like a good plan :)

Thanks

Dirk

P.S.: I would think that the clock settings of the other boards should 
be a good starting point to minimize the work. At least if the 
SoloLite clocks are not completely different ;)
Stefano Babic - April 10, 2013, 6:01 a.m.
On 06/04/2013 18:40, Fabio Estevam wrote:
> Hi Dirk,
> 
> On Sat, Apr 6, 2013 at 1:30 PM, Dirk Behme <dirk.behme@gmail.com> wrote:
> 
>> ... but saving power over the whole (kernel) runtime. I might be wrong, but
>> to my understanding the kernel doesn't *disable* unneeded clocks?
>>
>> So it's up to the bootloader to enable only the peripherals (clocks) really
>> needed for booting. And then it's up to the kernel's driver init functions
>> to enable the needed clocks for the subsystem once it's needed.
>>
>> But as I won't use this board I won't care about the power consumption here.
>> If you think it's fine for the use cases of this board to enable all clocks
>> by default, then this shouldn't stop applying this patch.
> 
> Ok, understood. I will go through each one of the CCM registers and
> check what clocks can be turned off.
> 
> This may take some time though as it needs proper testing.
> 
> I suggest that we keep the current clock settings as is, so that the
> board support can reach U-boot, then later I can submit a patch for
> turning off the unneeded clocks.

+1

Best regards,
Stefano
Stefano Babic - April 17, 2013, 8:48 a.m.
On 06/04/2013 18:40, Fabio Estevam wrote:
> Hi Dirk,
> 
> On Sat, Apr 6, 2013 at 1:30 PM, Dirk Behme <dirk.behme@gmail.com> wrote:
> 
>> ... but saving power over the whole (kernel) runtime. I might be wrong, but
>> to my understanding the kernel doesn't *disable* unneeded clocks?
>>
>> So it's up to the bootloader to enable only the peripherals (clocks) really
>> needed for booting. And then it's up to the kernel's driver init functions
>> to enable the needed clocks for the subsystem once it's needed.
>>
>> But as I won't use this board I won't care about the power consumption here.
>> If you think it's fine for the use cases of this board to enable all clocks
>> by default, then this shouldn't stop applying this patch.
> 

Hi Fabio,

> Ok, understood. I will go through each one of the CCM registers and
> check what clocks can be turned off.
> 
> This may take some time though as it needs proper testing.
> 
> I suggest that we keep the current clock settings as is, so that the
> board support can reach U-boot, then later I can submit a patch for
> turning off the unneeded clocks.

Ok, let's do in this way - I agree that U-boot should only turn on the
clocks that it requires and do not touch the rest. But let's start
pushing this into u-boot-imx and then we can trim this setup.

Best regards,
Stefano
Fabio Estevam - April 21, 2013, 5 p.m.
Hi Stefano,

On Wed, Apr 17, 2013 at 5:48 AM, Stefano Babic <sbabic@denx.de> wrote:

> Ok, let's do in this way - I agree that U-boot should only turn on the
> clocks that it requires and do not touch the rest. But let's start
> pushing this into u-boot-imx and then we can trim this setup.

Please let me know when this series reach u-boot-imx, so that I can
work on disabling the unneeded clocks.

Regards,

Fabio Estevam
Stefano Babic - April 22, 2013, 7:51 a.m.
On 21/04/2013 19:00, Fabio Estevam wrote:
> Hi Stefano,
> 
> On Wed, Apr 17, 2013 at 5:48 AM, Stefano Babic <sbabic@denx.de> wrote:
> 
>> Ok, let's do in this way - I agree that U-boot should only turn on the
>> clocks that it requires and do not touch the rest. But let's start
>> pushing this into u-boot-imx and then we can trim this setup.
> 
> Please let me know when this series reach u-boot-imx, so that I can
> work on disabling the unneeded clocks.
> 

They are ready to be merged - I will put it into u-boot-imx.

Regards,
Stefano

Patch

diff --git a/MAINTAINERS b/MAINTAINERS
index 0f19078..723a316 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -665,6 +665,7 @@  Fabio Estevam <fabio.estevam@freescale.com>
 	mx6qsabresd	i.MX6Q
 	mx6qsabreauto	i.MX6Q
 	wandboard	i.MX6DL/S
+	mx6slevk	i.MX6SL
 
 Daniel Gorsulowski <daniel.gorsulowski@esd.eu>
 
diff --git a/board/freescale/mx6slevk/Makefile b/board/freescale/mx6slevk/Makefile
new file mode 100644
index 0000000..43af351
--- /dev/null
+++ b/board/freescale/mx6slevk/Makefile
@@ -0,0 +1,28 @@ 
+# (C) Copyright 2013 Freescale Semiconductor, Inc.
+#
+# 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.
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).o
+
+COBJS  := mx6slevk.o
+
+SRCS   := $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+
+$(LIB):        $(obj).depend $(OBJS)
+	$(call cmd_link_o_target, $(OBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/freescale/mx6slevk/imximage.cfg b/board/freescale/mx6slevk/imximage.cfg
new file mode 100644
index 0000000..df39a16
--- /dev/null
+++ b/board/freescale/mx6slevk/imximage.cfg
@@ -0,0 +1,118 @@ 
+/*
+ * Copyright (C) 2013 Freescale Semiconductor, Inc.
+ *
+ * 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.
+ *
+ * Refer docs/README.imxmage for more details about how-to configure
+ * and create imximage boot image
+ *
+ * The syntax is taken as close as possible with the kwbimage
+ */
+
+/* image version */
+
+IMAGE_VERSION 2
+
+/*
+ * Boot Device : one of
+ * spi, sd (the board has no nand neither onenand)
+ */
+
+BOOT_FROM	sd
+
+/*
+ * Device Configuration Data (DCD)
+ *
+ * Each entry must have the format:
+ * Addr-type           Address        Value
+ *
+ * where:
+ *	Addr-type register length (1,2 or 4 bytes)
+ *	Address	  absolute address of the register
+ *	value	  value to be stored in the register
+ */
+DATA 4 0x020c4018 0x00260324
+
+DATA 4 0x020c4068 0xffffffff
+DATA 4 0x020c406c 0xffffffff
+DATA 4 0x020c4070 0xffffffff
+DATA 4 0x020c4074 0xffffffff
+DATA 4 0x020c4078 0xffffffff
+DATA 4 0x020c407c 0xffffffff
+DATA 4 0x020c4080 0xffffffff
+
+DATA 4 0x020e0344 0x00003030
+DATA 4 0x020e0348 0x00003030
+DATA 4 0x020e034c 0x00003030
+DATA 4 0x020e0350 0x00003030
+DATA 4 0x020e030c 0x00000030
+DATA 4 0x020e0310 0x00000030
+DATA 4 0x020e0314 0x00000030
+DATA 4 0x020e0318 0x00000030
+DATA 4 0x020e0300 0x00000030
+DATA 4 0x020e031c 0x00000030
+DATA 4 0x020e0338 0x00000028
+DATA 4 0x020e0320 0x00000030
+DATA 4 0x020e032c 0x00000000
+DATA 4 0x020e033c 0x00000008
+DATA 4 0x020e0340 0x00000008
+DATA 4 0x020e05c4 0x00000030
+DATA 4 0x020e05cc 0x00000030
+DATA 4 0x020e05d4 0x00000030
+DATA 4 0x020e05d8 0x00000030
+DATA 4 0x020e05ac 0x00000030
+DATA 4 0x020e05c8 0x00000030
+DATA 4 0x020e05b0 0x00020000
+DATA 4 0x020e05b4 0x00000000
+DATA 4 0x020e05c0 0x00020000
+DATA 4 0x020e05d0 0x00080000
+
+DATA 4 0x021b001c 0x00008000
+DATA 4 0x021b085c 0x1b4700c7
+DATA 4 0x021b0800 0xa1390003
+DATA 4 0x021b0890 0x00300000
+DATA 4 0x021b08b8 0x00000800
+DATA 4 0x021b081c 0x33333333
+DATA 4 0x021b0820 0x33333333
+DATA 4 0x021b0824 0x33333333
+DATA 4 0x021b0828 0x33333333
+DATA 4 0x021b082c 0xf3333333
+DATA 4 0x021b0830 0xf3333333
+DATA 4 0x021b0834 0xf3333333
+DATA 4 0x021b0838 0xf3333333
+DATA 4 0x021b0848 0x4241444a
+DATA 4 0x021b0850 0x3030312b
+DATA 4 0x021b083c 0x20000000
+DATA 4 0x021b0840 0x00000000
+DATA 4 0x021b08c0 0x24911492
+DATA 4 0x021b08b8 0x00000800
+DATA 4 0x021b000c 0x33374133
+DATA 4 0x021b0004 0x00020024
+DATA 4 0x021b0010 0x00100A82
+DATA 4 0x021b0014 0x00000093
+DATA 4 0x021b0018 0x00001688
+DATA 4 0x021b002c 0x0f9f26d2
+DATA 4 0x021b0030 0x0000020e
+DATA 4 0x021b0038 0x00190778
+DATA 4 0x021b0008 0x00000000
+DATA 4 0x021b0040 0x0000004f
+DATA 4 0x021b0000 0xc3110000
+DATA 4 0x021b001c 0x003f8030
+DATA 4 0x021b001c 0xff0a8030
+DATA 4 0x021b001c 0x82018030
+DATA 4 0x021b001c 0x04028030
+DATA 4 0x021b001c 0x02038030
+DATA 4 0x021b001c 0xff0a8038
+DATA 4 0x021b001c 0x82018038
+DATA 4 0x021b001c 0x04028038
+DATA 4 0x021b001c 0x02038038
+DATA 4 0x021b0800 0xa1310003
+DATA 4 0x021b0020 0x00001800
+DATA 4 0x021b0818 0x00000000
+DATA 4 0x021b08b8 0x00000800
+DATA 4 0x021b0004 0x00025564
+DATA 4 0x021b0404 0x00011006
+DATA 4 0x021b001c 0x00000000
diff --git a/board/freescale/mx6slevk/mx6slevk.c b/board/freescale/mx6slevk/mx6slevk.c
new file mode 100644
index 0000000..fc6353e
--- /dev/null
+++ b/board/freescale/mx6slevk/mx6slevk.c
@@ -0,0 +1,102 @@ 
+/*
+ * Copyright (C) 2013 Freescale Semiconductor, Inc.
+ *
+ * Author: Fabio Estevam <fabio.estevam@freescale.com>
+ *
+ * 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.
+ */
+
+#include <asm/arch/clock.h>
+#include <asm/arch/iomux.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/mx6-pins.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/gpio.h>
+#include <asm/imx-common/iomux-v3.h>
+#include <asm/io.h>
+#include <asm/sizes.h>
+#include <common.h>
+#include <fsl_esdhc.h>
+#include <mmc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |		\
+	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |		\
+	PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |		\
+	PAD_CTL_PUS_22K_UP  | PAD_CTL_SPEED_LOW |		\
+	PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+int dram_init(void)
+{
+	gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
+
+	return 0;
+}
+
+static iomux_v3_cfg_t const uart1_pads[] = {
+	MX6_PAD_UART1_TXD__UART1_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+	MX6_PAD_UART1_RXD__UART1_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+static iomux_v3_cfg_t const usdhc2_pads[] = {
+	MX6_PAD_SD2_CLK__USDHC2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD2_CMD__USDHC2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD2_DAT0__USDHC2_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD2_DAT1__USDHC2_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD2_DAT2__USDHC2_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD2_DAT3__USDHC2_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+};
+
+static void setup_iomux_uart(void)
+{
+	imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
+}
+
+static struct fsl_esdhc_cfg usdhc_cfg[1] = {
+	{USDHC2_BASE_ADDR},
+};
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+	return 1;	/* Assume boot SD always present */
+}
+
+int board_mmc_init(bd_t *bis)
+{
+	imx_iomux_v3_setup_multiple_pads(usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
+
+	usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
+	return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
+}
+
+int board_early_init_f(void)
+{
+	setup_iomux_uart();
+	return 0;
+}
+
+int board_init(void)
+{
+	/* address of boot parameters */
+	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
+
+	return 0;
+}
+
+u32 get_board_rev(void)
+{
+	return get_cpu_rev();
+}
+
+int checkboard(void)
+{
+	puts("Board: MX6SLEVK\n");
+
+	return 0;
+}
diff --git a/boards.cfg b/boards.cfg
index 7725a15..9e213ad 100644
--- a/boards.cfg
+++ b/boards.cfg
@@ -257,6 +257,7 @@  mx6qarm2                     arm         armv7       mx6qarm2            freesca
 mx6qsabreauto                arm         armv7       mx6qsabreauto       freescale      mx6		mx6qsabreauto:IMX_CONFIG=board/freescale/mx6qsabreauto/imximage.cfg
 mx6qsabrelite                arm         armv7       mx6qsabrelite       freescale      mx6		mx6qsabrelite:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
 mx6qsabresd                  arm         armv7       mx6qsabresd         freescale      mx6		mx6qsabresd:IMX_CONFIG=board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg
+mx6slevk                     arm         armv7       mx6slevk            freescale      mx6		mx6slevk:IMX_CONFIG=board/freescale/mx6slevk/imximage.cfg,MX6SL
 eco5pk                       arm         armv7       eco5pk              8dtech         omap3
 nitrogen6dl                  arm         armv7       nitrogen6x          boundary       mx6		nitrogen6x:IMX_CONFIG=board/boundary/nitrogen6x/nitrogen6dl.cfg,MX6DL,DDR_MB=1024
 nitrogen6dl2g                arm         armv7       nitrogen6x          boundary       mx6		nitrogen6x:IMX_CONFIG=board/boundary/nitrogen6x/nitrogen6dl2g.cfg,MX6DL,DDR_MB=2048
diff --git a/include/configs/mx6slevk.h b/include/configs/mx6slevk.h
new file mode 100644
index 0000000..67b63f4
--- /dev/null
+++ b/include/configs/mx6slevk.h
@@ -0,0 +1,189 @@ 
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * Configuration settings for the Freescale i.MX6SL EVK board.
+ *
+ * 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.
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#include <asm/arch/imx-regs.h>
+#include <asm/sizes.h>
+
+#define CONFIG_MX6
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+
+#define MACH_TYPE_MX6SLEVK		4307
+#define CONFIG_MACH_TYPE		MACH_TYPE_MX6SLEVK
+
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_INITRD_TAG
+#define CONFIG_REVISION_TAG
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN		(3 * SZ_1M)
+
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_MXC_GPIO
+
+#define CONFIG_MXC_UART
+#define CONFIG_MXC_UART_BASE		UART1_IPS_BASE_ADDR
+
+/* MMC Configs */
+#define CONFIG_FSL_ESDHC
+#define CONFIG_FSL_USDHC
+#define CONFIG_SYS_FSL_ESDHC_ADDR	0
+
+#define CONFIG_MMC
+#define CONFIG_CMD_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_CONS_INDEX		1
+#define CONFIG_BAUDRATE			115200
+
+/* Command definition */
+#include <config_cmd_default.h>
+
+#undef CONFIG_CMD_IMLS
+
+#define CONFIG_BOOTDELAY		3
+
+#define CONFIG_LOADADDR			0x80800000
+#define CONFIG_SYS_TEXT_BASE		0x87800000
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+	"script=boot.scr\0" \
+	"uimage=uImage\0" \
+	"console=ttymxc0\0" \
+	"fdt_high=0xffffffff\0" \
+	"initrd_high=0xffffffff\0" \
+	"fdt_file=imx6sl-evk.dtb\0" \
+	"fdt_addr=0x81000000\0" \
+	"boot_fdt=try\0" \
+	"ip_dyn=yes\0" \
+	"mmcdev=0\0" \
+	"mmcpart=2\0" \
+	"mmcroot=/dev/mmcblk0p3 rootwait rw\0" \
+	"mmcargs=setenv bootargs console=${console},${baudrate} " \
+		"root=${mmcroot}\0" \
+	"loadbootscript=" \
+		"fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
+	"bootscript=echo Running bootscript from mmc ...; " \
+		"source\0" \
+	"loaduimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${uimage}\0" \
+	"loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \
+	"mmcboot=echo Booting from mmc ...; " \
+		"run mmcargs; " \
+		"if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+			"if run loadfdt; then " \
+				"bootm ${loadaddr} - ${fdt_addr}; " \
+			"else " \
+				"if test ${boot_fdt} = try; then " \
+					"bootm; " \
+				"else " \
+					"echo WARN: Cannot load the DT; " \
+				"fi; " \
+			"fi; " \
+		"else " \
+			"bootm; " \
+		"fi;\0" \
+	"netargs=setenv bootargs console=${console},${baudrate} " \
+		"root=/dev/nfs " \
+	"ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \
+		"netboot=echo Booting from net ...; " \
+		"run netargs; " \
+		"if test ${ip_dyn} = yes; then " \
+			"setenv get_cmd dhcp; " \
+		"else " \
+			"setenv get_cmd tftp; " \
+		"fi; " \
+		"${get_cmd} ${uimage}; " \
+		"if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+			"if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
+				"bootm ${loadaddr} - ${fdt_addr}; " \
+			"else " \
+				"if test ${boot_fdt} = try; then " \
+					"bootm; " \
+				"else " \
+					"echo WARN: Cannot load the DT; " \
+				"fi; " \
+			"fi; " \
+		"else " \
+			"bootm; " \
+		"fi;\0"
+
+#define CONFIG_BOOTCOMMAND \
+	   "mmc dev ${mmcdev};" \
+	   "mmc dev ${mmcdev}; if mmc rescan; then " \
+		   "if run loadbootscript; then " \
+			   "run bootscript; " \
+		   "else " \
+			   "if run loaduimage; then " \
+				   "run mmcboot; " \
+			   "else run netboot; " \
+			   "fi; " \
+		   "fi; " \
+	   "else run netboot; fi"
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_SYS_HUSH_PARSER
+#define CONFIG_SYS_PROMPT		"=> "
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_SYS_CBSIZE		256
+
+/* Print Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_MAXARGS		16
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE
+
+#define CONFIG_SYS_MEMTEST_START	0x80000000
+#define CONFIG_SYS_MEMTEST_END		(CONFIG_SYS_MEMTEST_START + 256 * SZ_1M)
+
+#define CONFIG_SYS_LOAD_ADDR		CONFIG_LOADADDR
+#define CONFIG_SYS_HZ			1000
+
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_STACKSIZE		SZ_128K
+
+/* Physical Memory Map */
+#define CONFIG_NR_DRAM_BANKS		1
+#define PHYS_SDRAM			MMDC0_ARB_BASE_ADDR
+#define PHYS_SDRAM_SIZE			SZ_512M
+
+#define CONFIG_SYS_SDRAM_BASE		PHYS_SDRAM
+#define CONFIG_SYS_INIT_RAM_ADDR	IRAM_BASE_ADDR
+#define CONFIG_SYS_INIT_RAM_SIZE	IRAM_SIZE
+
+#define CONFIG_SYS_INIT_SP_OFFSET \
+	(CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
+#define CONFIG_SYS_INIT_SP_ADDR \
+	(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
+
+/* FLASH and environment organization */
+#define CONFIG_SYS_NO_FLASH
+
+#define CONFIG_ENV_OFFSET		(6 * SZ_64K)
+#define CONFIG_ENV_SIZE			SZ_8K
+#define CONFIG_ENV_IS_IN_MMC
+#define CONFIG_SYS_MMC_ENV_DEV		0
+
+#define CONFIG_OF_LIBFDT
+#define CONFIG_CMD_BOOTZ
+
+#ifndef CONFIG_SYS_DCACHE_OFF
+#define CONFIG_CMD_CACHE
+#endif
+
+#endif				/* __CONFIG_H */