[PATCH v2] scripts: imx imx-usb-loader: add support for imx23 and imx28

2017-03-06 Thread Oleksij Rempel
This code was rewrtitten from mxs-usb-loader.

Signed-off-by: Oleksij Rempel 
---
 scripts/imx/imx-usb-loader.c | 85 +++-
 1 file changed, 84 insertions(+), 1 deletion(-)

diff --git a/scripts/imx/imx-usb-loader.c b/scripts/imx/imx-usb-loader.c
index b2c9f8f5a..c61ebaf2f 100644
--- a/scripts/imx/imx-usb-loader.c
+++ b/scripts/imx/imx-usb-loader.c
@@ -69,6 +69,9 @@ struct mach_id {
 #define HDR_MX53   2
unsigned char header_type;
unsigned short max_transfer;
+#define DEV_IMX0
+#define DEV_MXS1
+   unsigned char dev_type;
 };
 
 struct usb_work {
@@ -87,7 +90,9 @@ struct mach_id imx_ids[] = {
.vid = 0x066f,
.pid = 0x3780,
.name = "i.MX23",
-   .mode = MODE_BULK,
+   .mode = MODE_HID,
+   .max_transfer = 1024,
+   .dev_type = DEV_MXS,
}, {
.vid = 0x15a2,
.pid = 0x0030,
@@ -120,6 +125,8 @@ struct mach_id imx_ids[] = {
.vid = 0x15a2,
.pid = 0x004f,
.name = "i.MX28",
+   .max_transfer = 1024,
+   .dev_type = DEV_MXS,
}, {
.vid = 0x15a2,
.pid = 0x0052,
@@ -180,6 +187,17 @@ struct sdp_command  {
uint8_t rsvd;
 } __attribute__((packed));
 
+#define MXS_CMD_FW_DOWNLOAD0x02
+struct mxs_command {
+   uint32_tsign;   /* Signature */
+   uint32_ttag;/* Tag */
+   uint32_tsize;   /* Payload size */
+   uint8_t flags;  /* Flags (host to device) */
+   uint8_t rsvd[2];/* Reserved */
+   uint8_t cmd;/* Firmware download */
+   uint32_tdw_size;/* Download size */
+} __attribute__((packed));
+
 static struct mach_id *imx_device(unsigned short vid, unsigned short pid)
 {
int i;
@@ -1343,6 +1361,66 @@ static int write_mem(const struct config_data *data, 
uint32_t addr,
return modify_memory(addr, val, width, set_bits, clear_bits);
 }
 
+/* MXS section */
+static int mxs_load_file(libusb_device_handle *dev, uint8_t *data, int size)
+{
+   static struct mxs_command dl_command;
+   int last_trans, err;
+   void *p;
+   int cnt;
+
+   dl_command.sign = htonl(0x424c5443); /* Signature: BLTC */
+   dl_command.tag = htonl(0x1);
+   dl_command.size = htonl(size);
+   dl_command.flags = 0;
+   dl_command.rsvd[0] = 0;
+   dl_command.rsvd[1] = 0;
+   dl_command.cmd = MXS_CMD_FW_DOWNLOAD;
+   dl_command.dw_size = htonl(size);
+
+   err = transfer(1, (unsigned char *) _command, 20, _trans);
+   if (err) {
+   printf("transfer error at init step: err=%i, last_trans=%i\n",
+  err, last_trans);
+   return err;
+   }
+
+   p = data;
+   cnt = size;
+
+   while (1) {
+   int now = get_min(cnt, usb_id->mach_id->max_transfer);
+
+   if (!now)
+   break;
+
+   err = transfer(2, p, now, );
+   if (err) {
+   printf("dl_command err=%i, last_trans=%i\n", err, now);
+   return err;
+   }
+
+   p += now;
+   cnt -= now;
+   }
+
+   return err;
+}
+
+static int mxs_work(struct usb_work *curr)
+{
+   unsigned fsize = 0;
+   unsigned char *buf = NULL;
+   int ret;
+
+   ret = read_file(curr->filename, , );
+   if (ret < 0)
+   return ret;
+
+   return mxs_load_file(usb_dev_handle, buf, fsize);
+}
+/* end of mxs section */
+
 static int parse_initfile(const char *filename)
 {
struct config_data data = {
@@ -1452,6 +1530,11 @@ int main(int argc, char *argv[])
 
usb_id->mach_id = mach;
 
+   if (mach->dev_type == DEV_MXS) {
+   ret = mxs_work();
+   goto out;
+   }
+
err = do_status();
if (err) {
printf("status failed\n");
-- 
2.11.0


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


Re: [PATCH 07/45] serial: atmel: Check result of clk_get()

2017-03-06 Thread Sascha Hauer
On Mon, Mar 06, 2017 at 02:53:18PM -0800, Andrey Smirnov wrote:
> Signed-off-by: Andrey Smirnov 
> ---
>  drivers/serial/atmel.c | 5 +
>  1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/serial/atmel.c b/drivers/serial/atmel.c
> index 4e4624e..d47b926 100644
> --- a/drivers/serial/atmel.c
> +++ b/drivers/serial/atmel.c
> @@ -403,6 +403,11 @@ static int atmel_serial_init_port(struct console_device 
> *cdev)
>   return -ENOENT;
>  
>   uart->clk = clk_get(dev, "usart");
> + if (IS_ERR(uart->clk)) {
> + dev_err(dev, "Faield to get 'usart' clock\n");

s/Faield/Failed/

Sascha

> + return PTR_ERR(uart->clk);
> + }
> +
>   clk_enable(uart->clk);
>   uart->uartclk = clk_get_rate(uart->clk);
>  
> -- 
> 2.9.3
> 
> 
> ___
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.   | |
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |

___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


Re: [PATCH 8/9] efi: clocksoure: add EFI event timer

2017-03-06 Thread Sascha Hauer
On Fri, Mar 03, 2017 at 01:34:04PM +0100, Jean-Christophe PLAGNIOL-VILLARD 
wrote:
> with this we can be hw generic
> 
> If the EFI implement timestamp protocol we could use instead of event
> but even EDK2 Never Ever compile it for any target.
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD 
> ---
> + freq = 1000 * 1000;
> + if (ticks_freq() < 800 * 1000) {
> + uint64_t nb_100ns;
> +
> + freq = ticks_freq_x86();
> + nb_100ns = 10 * 1000 * 1000 / freq;
> + pr_warn("EFI Event timer too slow freq = %llu Hz\n", freq);

Applied this series for now. I weakened this message somewhat:

pr_warn("EFI Event timer slow, freq = %lluHz\n", freq);

As this is not really an error, only an information one might want to
know.

Sascha

-- 
Pengutronix e.K.   | |
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |

___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


Re: [PATCH 2/2 v2] efi: add serial driver support

2017-03-06 Thread Sascha Hauer
On Mon, Mar 06, 2017 at 10:34:47AM +0100, Jean-Christophe PLAGNIOL-VILLARD 
wrote:
> So now we can stop to use the efi-stdio as this driver
> print on the Framebuffer and the serial at the same time.
> 
> This is specially usefull if we want to use the framebuffer via efi-gop for
> something else.
> 
> Do not forget to disable the efi-stdio device before enabling the console
> otherwise you will get double printing.
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD 
> ---
> Fix copyright

Replaced with this version.

Sascha

> 
>  drivers/serial/Kconfig  |   4 +
>  drivers/serial/Makefile |   1 +
>  drivers/serial/serial_efi.c | 221 
> 
>  3 files changed, 226 insertions(+)
>  create mode 100644 drivers/serial/serial_efi.c
> 
> diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
> index ced30530a..cfddc2ee9 100644
> --- a/drivers/serial/Kconfig
> +++ b/drivers/serial/Kconfig
> @@ -21,6 +21,10 @@ config DRIVER_SERIAL_AR933X
> If you have an Atheros AR933X SOC based board and want to use the
> built-in UART of the SoC, say Y to this option.
>  
> +config DRIVER_SERIAL_EFI
> + bool "EFI serial"
> + depends on EFI_BOOTUP
> +
>  config DRIVER_SERIAL_IMX
>   depends on ARCH_IMX
>   default y
> diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
> index 7d1bae195..3d9f735ed 100644
> --- a/drivers/serial/Makefile
> +++ b/drivers/serial/Makefile
> @@ -1,6 +1,7 @@
>  obj-$(CONFIG_DRIVER_SERIAL_ARM_DCC)  += arm_dcc.o
>  obj-$(CONFIG_SERIAL_AMBA_PL011)  += amba-pl011.o
>  obj-$(CONFIG_DRIVER_SERIAL_AR933X)   += serial_ar933x.o
> +obj-$(CONFIG_DRIVER_SERIAL_EFI)  += serial_efi.o
>  obj-$(CONFIG_DRIVER_SERIAL_IMX)  += serial_imx.o
>  obj-$(CONFIG_DRIVER_SERIAL_STM378X)  += stm-serial.o
>  obj-$(CONFIG_DRIVER_SERIAL_ATMEL)+= atmel.o
> diff --git a/drivers/serial/serial_efi.c b/drivers/serial/serial_efi.c
> new file mode 100644
> index 0..f0a2b22c2
> --- /dev/null
> +++ b/drivers/serial/serial_efi.c
> @@ -0,0 +1,221 @@
> +/*
> + * Copyright (C) 2017 Jean-Christophe PLAGNIOL-VILLARD 
> 
> + *
> + * Under GPLv2 Only
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +/*
> + * define for Control bits, grouped by read only, write only, and read write
> + *
> + * Read Only
> + */
> +#define EFI_SERIAL_CLEAR_TO_SEND0x0010
> +#define EFI_SERIAL_DATA_SET_READY   0x0020
> +#define EFI_SERIAL_RING_INDICATE0x0040
> +#define EFI_SERIAL_CARRIER_DETECT   0x0080
> +#define EFI_SERIAL_INPUT_BUFFER_EMPTY   0x0100
> +#define EFI_SERIAL_OUTPUT_BUFFER_EMPTY  0x0200
> +
> +/*
> + * Write Only
> + */
> +#define EFI_SERIAL_REQUEST_TO_SEND  0x0002
> +#define EFI_SERIAL_DATA_TERMINAL_READY  0x0001
> +
> +/*
> + * Read Write
> + */
> +#define EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE 0x1000
> +#define EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE 0x2000
> +#define EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE 0x4000
> +
> +typedef enum {
> + DefaultParity,
> + NoParity,
> + EvenParity,
> + OddParity,
> + MarkParity,
> + SpaceParity
> +} efi_parity_type;
> +
> +typedef enum {
> + DefaultStopBits,
> + OneStopBit,
> + OneFiveStopBits,
> + TwoStopBits
> +} efi_stop_bits_type;
> +
> +struct efi_serial_io_mode {
> + uint32_t controlmask;
> + uint32_t timeout;
> + uint64_t baudrate;
> + uint32_t receivefifodepth;
> + uint32_t databits;
> + uint32_t parity;
> + uint32_t stopbits;
> +};
> +
> +struct efi_serial_io_protocol {
> + uint32_t revision;
> +
> + efi_status_t (EFIAPI *reset) (struct efi_serial_io_protocol *This);
> + efi_status_t (EFIAPI *set_attributes) (struct efi_serial_io_protocol 
> *This,
> + uint64_t baudrate, uint32_t receivefifodepth,
> + uint32_t timeout, efi_parity_type parity,
> + uint8_t databits, efi_stop_bits_type stopbits);
> + efi_status_t (EFIAPI *setcontrol) (struct efi_serial_io_protocol *This,
> + uint32_t control);
> + efi_status_t (EFIAPI *getcontrol) (struct efi_serial_io_protocol *This,
> + uint32_t *control);
> + efi_status_t (EFIAPI *write) (struct efi_serial_io_protocol *This,
> + unsigned long *buffersize, void *buffer);
> + efi_status_t (EFIAPI *read) (struct efi_serial_io_protocol *This,
> + unsigned long *buffersize, void *buffer);
> +
> + struct efi_serial_io_mode *mode;
> +};
> +
> +/*
> + * We wrap our port structure around the generic console_device.
> + */
> +struct efi_serial_port {
> + struct efi_serial_io_protocol *serial;
> + struct console_device   uart;   /* uart */
> + struct 

[PATCH 16/45] at91sam9x5ek: Configure LEDs in DT

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/at91sam9x5ek/init.c | 27 ---
 arch/arm/configs/at91sam9x5ek_defconfig |  1 +
 2 files changed, 1 insertion(+), 27 deletions(-)

diff --git a/arch/arm/boards/at91sam9x5ek/init.c 
b/arch/arm/boards/at91sam9x5ek/init.c
index 068897a..85f20a9 100644
--- a/arch/arm/boards/at91sam9x5ek/init.c
+++ b/arch/arm/boards/at91sam9x5ek/init.c
@@ -260,32 +260,6 @@ static void ek_add_device_usb(void)
 static void ek_add_device_usb(void) {}
 #endif
 
-struct gpio_led leds[] = {
-   {
-   .gpio   = AT91_PIN_PB18,
-   .active_low = 1,
-   .led= {
-   .name = "d1",
-   },
-   }, {
-   .gpio   = AT91_PIN_PD21,
-   .led= {
-   .name = "d2",
-   },
-   },
-};
-
-static void __init ek_add_led(void)
-{
-   int i;
-
-   for (i = 0; i < ARRAY_SIZE(leds); i++) {
-   at91_set_gpio_output(leds[i].gpio, leds[i].active_low);
-   led_gpio_register([i]);
-   }
-   led_set_trigger(LED_TRIGGER_HEARTBEAT, [1].led);
-}
-
 static void ek_add_device_w1(void)
 {
at91_set_gpio_input(w1_pdata.pin, 0);
@@ -303,7 +277,6 @@ static int at91sam9x5ek_devices_init(void)
ek_add_device_spi();
ek_add_device_mci();
ek_add_device_usb();
-   ek_add_led();
ek_add_device_i2c();
ek_add_device_lcdc();
 
diff --git a/arch/arm/configs/at91sam9x5ek_defconfig 
b/arch/arm/configs/at91sam9x5ek_defconfig
index 0691145..dd42755 100644
--- a/arch/arm/configs/at91sam9x5ek_defconfig
+++ b/arch/arm/configs/at91sam9x5ek_defconfig
@@ -90,3 +90,4 @@ CONFIG_FS_TFTP=y
 CONFIG_FS_FAT=y
 CONFIG_FS_FAT_WRITE=y
 CONFIG_FS_FAT_LFN=y
+CONFIG_LED_GPIO_OF=y
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 45/45] at91sam9x5ek: Configure NAND in DT

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/at91sam9x5ek/init.c | 47 +
 1 file changed, 16 insertions(+), 31 deletions(-)

diff --git a/arch/arm/boards/at91sam9x5ek/init.c 
b/arch/arm/boards/at91sam9x5ek/init.c
index 29da97d..646cff5 100644
--- a/arch/arm/boards/at91sam9x5ek/init.c
+++ b/arch/arm/boards/at91sam9x5ek/init.c
@@ -45,22 +45,6 @@
 
 #include "hw_version.h"
 
-static struct atmel_nand_data nand_pdata = {
-   .ale= 21,
-   .cle= 22,
-   .det_pin= -EINVAL,
-   .rdy_pin= AT91_PIN_PD5,
-   .enable_pin = AT91_PIN_PD4,
-   .has_pmecc  = 1,
-   .ecc_mode   = NAND_ECC_HW,
-   .pmecc_sector_size = 512,
-   .pmecc_corr_cap = 2,
-#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
-   .bus_width_16   = 1,
-#endif
-   .on_flash_bbt   = 1,
-};
-
 static struct sam9_smc_config cm_nand_smc_config = {
.ncs_read_setup = 0,
.nrd_setup  = 1,
@@ -79,15 +63,27 @@ static struct sam9_smc_config cm_nand_smc_config = {
.tdf_cycles = 1,
 };
 
-static void ek_add_device_nand(void)
+static int ek_add_device_smc(void)
 {
+   unsigned long csa;
+   csa = at91_sys_read(AT91_MATRIX_EBICSA);
+
+   /* Enable CS3 */
+   csa |= AT91_MATRIX_EBI_CS3A_SMC_NANDFLASH;
+   /* NAND flash on D16 */
+   csa |= AT91_MATRIX_NFD0_ON_D16;
+
+   /* Configure IO drive */
+   csa &= ~AT91_MATRIX_EBI_EBI_IOSR_NORMAL;
+   at91_sys_write(AT91_MATRIX_EBICSA, csa);
+
add_generic_device("at91sam9-smc",
   DEVICE_ID_SINGLE, NULL,
   AT91SAM9X5_BASE_SMC, 0x200,
   IORESOURCE_MEM, NULL);
 
/* setup bus-width (8 or 16) */
-   if (nand_pdata.bus_width_16)
+   if (IS_ENABLED(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16))
cm_nand_smc_config.mode |= AT91_SMC_DBW_16;
else
cm_nand_smc_config.mode |= AT91_SMC_DBW_8;
@@ -96,15 +92,14 @@ static void ek_add_device_nand(void)
sam9_smc_configure(0, 3, _nand_smc_config);
 
if (at91sam9x5ek_cm_is_vendor(VENDOR_COGENT)) {
-   unsigned long csa;
-
csa = at91_sys_read(AT91_MATRIX_EBICSA);
csa |= AT91_MATRIX_EBI_VDDIOMSEL_1_8V;
at91_sys_write(AT91_MATRIX_EBICSA, csa);
}
 
-   at91_add_device_nand(_pdata);
+   return 0;
 }
+fs_initcall(ek_add_device_smc);
 
 static int ek_register_mac_address(void)
 {
@@ -163,20 +158,10 @@ static void ek_add_device_lcdc(void) {}
 
 static int at91sam9x5ek_devices_init(void)
 {
-   ek_add_device_nand();
ek_add_device_lcdc();
 
armlinux_set_architecture(CONFIG_MACH_AT91SAM9X5EK);
 
-   devfs_add_partition("nand0", 0x0, SZ_256K, DEVFS_PARTITION_FIXED, 
"at91bootstrap_raw");
-   dev_add_bb_dev("at91bootstrap_raw", "at91bootstrap");
-   devfs_add_partition("nand0", SZ_256K, SZ_256K + SZ_128K, 
DEVFS_PARTITION_FIXED, "self_raw");
-   dev_add_bb_dev("self_raw", "self0");
-   devfs_add_partition("nand0", SZ_512K + SZ_128K, SZ_128K, 
DEVFS_PARTITION_FIXED, "env_raw");
-   dev_add_bb_dev("env_raw", "env0");
-   devfs_add_partition("nand0", SZ_512K + SZ_256K, SZ_128K, 
DEVFS_PARTITION_FIXED, "env_raw1");
-   dev_add_bb_dev("env_raw1", "env1");
-
if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_GENERIC))
defaultenv_append_directory(defaultenv_at91sam9x5ek);
 
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 19/45] at91sam9x5ek: Configure I2C via DT

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/at91sam9x5ek/init.c | 21 -
 arch/arm/dts/at91sam9x5ek.dts   | 10 ++
 2 files changed, 10 insertions(+), 21 deletions(-)

diff --git a/arch/arm/boards/at91sam9x5ek/init.c 
b/arch/arm/boards/at91sam9x5ek/init.c
index 85f20a9..fca5e7d 100644
--- a/arch/arm/boards/at91sam9x5ek/init.c
+++ b/arch/arm/boards/at91sam9x5ek/init.c
@@ -187,26 +187,6 @@ static void ek_add_device_mci(void)
at91_add_device_mci(0, _data);
 }
 
-struct qt1070_platform_data qt1070_pdata = {
-   .irq_pin= AT91_PIN_PA7,
-};
-
-static struct i2c_board_info i2c_devices[] = {
-   {
-   .platform_data = _pdata,
-   I2C_BOARD_INFO("qt1070", 0x1b),
-   }, {
-   I2C_BOARD_INFO("24c512", 0x51)
-   },
-};
-
-static void ek_add_device_i2c(void)
-{
-   at91_set_gpio_input(qt1070_pdata.irq_pin, 0);
-   at91_set_deglitch(qt1070_pdata.irq_pin, 1);
-   at91_add_device_i2c(0, i2c_devices, ARRAY_SIZE(i2c_devices));
-}
-
 static const struct spi_board_info ek_cm_cogent_spi_devices[] = {
{
.name   = "mtd_dataflash",
@@ -277,7 +257,6 @@ static int at91sam9x5ek_devices_init(void)
ek_add_device_spi();
ek_add_device_mci();
ek_add_device_usb();
-   ek_add_device_i2c();
ek_add_device_lcdc();
 
armlinux_set_architecture(CONFIG_MACH_AT91SAM9X5EK);
diff --git a/arch/arm/dts/at91sam9x5ek.dts b/arch/arm/dts/at91sam9x5ek.dts
index db1bd67..f9ae091 100644
--- a/arch/arm/dts/at91sam9x5ek.dts
+++ b/arch/arm/dts/at91sam9x5ek.dts
@@ -7,3 +7,13 @@
 #include 
 #include 
 #include 
+
+/ {
+   i2c-gpio-0 {
+   status = "okay";
+   };
+};
+
+ {
+   status = "disabled";
+};
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 41/45] usb: echi-atmel: Add DT support

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/usb/host/ehci-atmel.c | 11 ++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c
index f075b50..1132879 100644
--- a/drivers/usb/host/ehci-atmel.c
+++ b/drivers/usb/host/ehci-atmel.c
@@ -65,6 +65,9 @@ static int atmel_ehci_probe(struct device_d *dev)
struct resource *iores;
struct ehci_data data;
struct atmel_ehci_priv *atehci;
+   const char *uclk_name;
+
+   uclk_name = (dev->device_node) ? "usb_clk" : "uhpck";
 
atehci = xzalloc(sizeof(*atehci));
atehci->dev = dev;
@@ -76,7 +79,7 @@ static int atmel_ehci_probe(struct device_d *dev)
return -ENOENT;
}
 
-   atehci->uclk = clk_get(dev, "uhpck");
+   atehci->uclk = clk_get(dev, uclk_name);
if (IS_ERR(atehci->iclk)) {
dev_err(dev, "Error getting function clock\n");
return -ENOENT;
@@ -107,9 +110,15 @@ static void atmel_ehci_remove(struct device_d *dev)
atmel_stop_clock(dev->priv);
 }
 
+static const struct of_device_id atmel_ehci_dt_ids[] = {
+   { .compatible = "atmel,at91sam9g45-ehci" },
+   { /* sentinel */ }
+};
+
 static struct driver_d atmel_ehci_driver = {
.name = "atmel-ehci",
.probe = atmel_ehci_probe,
.remove = atmel_ehci_remove,
+   .of_compatible = DRV_OF_COMPAT(atmel_ehci_dt_ids),
 };
 device_platform_driver(atmel_ehci_driver);
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 15/45] at91sam9x5ek: Remove at91sam9x5ek_mem_init()

2017-03-06 Thread Andrey Smirnov
RAM device is created based on OF data now, so there's no need to call
this function.

Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/at91sam9x5ek/init.c | 8 
 1 file changed, 8 deletions(-)

diff --git a/arch/arm/boards/at91sam9x5ek/init.c 
b/arch/arm/boards/at91sam9x5ek/init.c
index 796ae84..068897a 100644
--- a/arch/arm/boards/at91sam9x5ek/init.c
+++ b/arch/arm/boards/at91sam9x5ek/init.c
@@ -286,14 +286,6 @@ static void __init ek_add_led(void)
led_set_trigger(LED_TRIGGER_HEARTBEAT, [1].led);
 }
 
-static int at91sam9x5ek_mem_init(void)
-{
-   at91_add_device_sdram(0);
-
-   return 0;
-}
-mem_initcall(at91sam9x5ek_mem_init);
-
 static void ek_add_device_w1(void)
 {
at91_set_gpio_input(w1_pdata.pin, 0);
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 39/45] usb: ehci-atmel: Zero ehci_data before using it

2017-03-06 Thread Andrey Smirnov
Zero ehci_data before using it as an argument for echi_register,
otherwise bogus values (some of which are interpreted as callbacks) will
be passed through, resulting in illegal memory accesses.

Signed-off-by: Andrey Smirnov 
---
 drivers/usb/host/ehci-atmel.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c
index 7a9d942..4b9fc0a 100644
--- a/drivers/usb/host/ehci-atmel.c
+++ b/drivers/usb/host/ehci-atmel.c
@@ -89,7 +89,7 @@ static int atmel_ehci_probe(struct device_d *dev)
if (ret < 0)
return ret;
 
-   data.flags = 0;
+   memset(, 0, sizeof(data));
 
iores = dev_request_mem_resource(dev, 0);
if (IS_ERR(iores))
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 31/45] at91sam9x5ek: Configure 1-wire in DT

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/at91sam9x5ek/hw_version.c |  6 +-
 arch/arm/boards/at91sam9x5ek/hw_version.h |  1 -
 arch/arm/boards/at91sam9x5ek/init.c   | 16 
 arch/arm/dts/at91sam9x5ek.dts | 17 +
 4 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/arch/arm/boards/at91sam9x5ek/hw_version.c 
b/arch/arm/boards/at91sam9x5ek/hw_version.c
index 2f84d82..d1ca036 100644
--- a/arch/arm/boards/at91sam9x5ek/hw_version.c
+++ b/arch/arm/boards/at91sam9x5ek/hw_version.c
@@ -15,6 +15,7 @@
  */
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -250,7 +251,7 @@ static int cm_cogent_fixup(struct device_node *root, void 
*unused)
return 0;
 }
 
-void at91sam9x5ek_devices_detect_hw(void)
+static int at91sam9x5ek_devices_detect_hw(void)
 {
at91sam9x5ek_devices_detect_one("/dev/ds24310");
at91sam9x5ek_devices_detect_one("/dev/ds24311");
@@ -262,4 +263,7 @@ void at91sam9x5ek_devices_detect_hw(void)
 
if (at91sam9x5ek_cm_is_vendor(VENDOR_COGENT))
of_register_fixup(cm_cogent_fixup, NULL);
+
+   return 0;
 }
+late_initcall(at91sam9x5ek_devices_detect_hw);
diff --git a/arch/arm/boards/at91sam9x5ek/hw_version.h 
b/arch/arm/boards/at91sam9x5ek/hw_version.h
index 91fd429..3f3c800 100644
--- a/arch/arm/boards/at91sam9x5ek/hw_version.h
+++ b/arch/arm/boards/at91sam9x5ek/hw_version.h
@@ -29,6 +29,5 @@ enum vendor_id {
 bool at91sam9x5ek_cm_is_vendor(enum vendor_id vid);
 bool at91sam9x5ek_ek_is_vendor(enum vendor_id vid);
 bool at91sam9x5ek_dm_is_vendor(enum vendor_id vid);
-void at91sam9x5ek_devices_detect_hw(void);
 
 #endif /* __HW_REVISION_H__ */
diff --git a/arch/arm/boards/at91sam9x5ek/init.c 
b/arch/arm/boards/at91sam9x5ek/init.c
index 2fe724c..09b7d0f 100644
--- a/arch/arm/boards/at91sam9x5ek/init.c
+++ b/arch/arm/boards/at91sam9x5ek/init.c
@@ -45,12 +45,6 @@
 
 #include "hw_version.h"
 
-struct w1_gpio_platform_data w1_pdata = {
-   .pin = AT91_PIN_PB18,
-   .ext_pullup_enable_pin = -EINVAL,
-   .is_open_drain = 0,
-};
-
 static struct atmel_nand_data nand_pdata = {
.ale= 21,
.cle= 22,
@@ -186,18 +180,8 @@ static void ek_add_device_usb(void)
 static void ek_add_device_usb(void) {}
 #endif
 
-static void ek_add_device_w1(void)
-{
-   at91_set_gpio_input(w1_pdata.pin, 0);
-   at91_set_multi_drive(w1_pdata.pin, 1);
-   add_generic_device_res("w1-gpio", DEVICE_ID_SINGLE, NULL, 0, _pdata);
-
-   at91sam9x5ek_devices_detect_hw();
-}
-
 static int at91sam9x5ek_devices_init(void)
 {
-   ek_add_device_w1();
ek_add_device_nand();
ek_add_device_eth();
ek_add_device_usb();
diff --git a/arch/arm/dts/at91sam9x5ek.dts b/arch/arm/dts/at91sam9x5ek.dts
index efdba61..fa79347 100644
--- a/arch/arm/dts/at91sam9x5ek.dts
+++ b/arch/arm/dts/at91sam9x5ek.dts
@@ -29,6 +29,23 @@
};
};
};
+
+   leds {
+   /*
+* PB18 has a resource conflict since it is both used
+ * as a heartbeat LED and 1-wire bus in the kernel
+ * device tree. Since 1-wire EEPROMs contains
+ * importatnt revision information as a part of
+ * Barebox DT stup we move heartbeat to PD21 and
+ * remove the original pb18 node
+*/
+
+   /delete-node/ pb18;
+
+   pd21 {
+   linux,default-trigger = "heartbeat";
+   };
+   };
 };
 
  {
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 14/45] at91sam9x5ek: Convert to use DT clock tree

2017-03-06 Thread Andrey Smirnov
Convert board code to use clock tree form DT as well as converting UART,
GPIO and PIT devices to be instantiated from devicetree as well (to make
sure codebase is still bootable).

Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/at91sam9x5ek/init.c |  14 +-
 arch/arm/mach-at91/Kconfig  |   4 +
 arch/arm/mach-at91/Makefile |   9 +-
 arch/arm/mach-at91/at91sam9x5.c | 311 
 arch/arm/mach-at91/setup.c  |   4 +-
 5 files changed, 19 insertions(+), 323 deletions(-)
 delete mode 100644 arch/arm/mach-at91/at91sam9x5.c

diff --git a/arch/arm/boards/at91sam9x5ek/init.c 
b/arch/arm/boards/at91sam9x5ek/init.c
index 9fe117c..796ae84 100644
--- a/arch/arm/boards/at91sam9x5ek/init.c
+++ b/arch/arm/boards/at91sam9x5ek/init.c
@@ -87,6 +87,11 @@ static struct sam9_smc_config cm_nand_smc_config = {
 
 static void ek_add_device_nand(void)
 {
+   add_generic_device("at91sam9-smc",
+  DEVICE_ID_SINGLE, NULL,
+  AT91SAM9X5_BASE_SMC, 0x200,
+  IORESOURCE_MEM, NULL);
+
/* setup bus-width (8 or 16) */
if (nand_pdata.bus_width_16)
cm_nand_smc_config.mode |= AT91_SMC_DBW_16;
@@ -333,15 +338,6 @@ static int at91sam9x5ek_console_init(void)
barebox_set_model("Atmel at91sam9x5-ek");
barebox_set_hostname("at91sam9x5-ek");
 
-   at91_register_uart(0, 0);
-   at91_register_uart(1, 0);
return 0;
 }
 console_initcall(at91sam9x5ek_console_init);
-
-static int at91sam9x5ek_main_clock(void)
-{
-   at91_set_main_clock(1200);
-   return 0;
-}
-pure_initcall(at91sam9x5ek_main_clock);
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 2870bf3..28f66ac 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -38,6 +38,10 @@ config AT91SAM9_SMC
 config SOC_AT91SAM9
bool
select CPU_ARM926T
+   select HAVE_AT91_SMD
+   select HAVE_AT91_USB_CLK
+   select HAVE_AT91_UTMI
+   select COMMON_CLK_OF_PROVIDER
select AT91SAM9_SMC
select CLOCKSOURCE_ATMEL_PIT
 
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index 1f63b09..edfa258 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -1,4 +1,9 @@
-obj-y += setup.o clock.o irq_fixup.o
+obj-y += setup.o irq_fixup.o
+
+ifeq ($(CONFIG_COMMON_CLK_OF_PROVIDER),)
+   obj-y + =clock.o
+endif
+
 obj-$(CONFIG_CMD_AT91_BOOT_TEST) += boot_test_cmd.o
 
 obj-$(CONFIG_AT91_BOOTSTRAP) += bootstrap.o
@@ -28,7 +33,7 @@ obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o 
at91sam9263_devices.o
 obj-$(CONFIG_ARCH_AT91SAM9G10) += at91sam9261.o at91sam9261_devices.o
 obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam9260_devices.o
 obj-$(CONFIG_ARCH_AT91SAM9G45) += at91sam9g45.o at91sam9g45_devices.o
-obj-$(CONFIG_ARCH_AT91SAM9X5)  += at91sam9x5.o at91sam9x5_devices.o
+obj-$(CONFIG_ARCH_AT91SAM9X5)  += at91sam9x5_devices.o
 obj-$(CONFIG_ARCH_AT91SAM9N12) += at91sam9n12.o at91sam9n12_devices.o
 obj-$(CONFIG_ARCH_SAMA5D3) += sama5d3.o sama5d3_devices.o
 obj-$(CONFIG_ARCH_SAMA5D4) += sama5d4.o sama5d4_devices.o
diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c
deleted file mode 100644
index 000b748..000
--- a/arch/arm/mach-at91/at91sam9x5.c
+++ /dev/null
@@ -1,311 +0,0 @@
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include "soc.h"
-#include "generic.h"
-#include "clock.h"
-
-/* 
- *  Clocks
- *  */
-
-/*
- * The peripheral clocks.
- */
-static struct clk pioAB_clk = {
-   .name   = "pioAB_clk",
-   .pmc_mask   = 1 << AT91SAM9X5_ID_PIOAB,
-   .type   = CLK_TYPE_PERIPHERAL,
-};
-static struct clk pioCD_clk = {
-   .name   = "pioCD_clk",
-   .pmc_mask   = 1 << AT91SAM9X5_ID_PIOCD,
-   .type   = CLK_TYPE_PERIPHERAL,
-};
-static struct clk smd_clk = {
-   .name   = "smd_clk",
-   .pmc_mask   = 1 << AT91SAM9X5_ID_SMD,
-   .type   = CLK_TYPE_PERIPHERAL,
-};
-static struct clk usart0_clk = {
-   .name   = "usart0_clk",
-   .pmc_mask   = 1 << AT91SAM9X5_ID_USART0,
-   .type   = CLK_TYPE_PERIPHERAL,
-};
-static struct clk usart1_clk = {
-   .name   = "usart1_clk",
-   .pmc_mask   = 1 << AT91SAM9X5_ID_USART1,
-   .type   = CLK_TYPE_PERIPHERAL,
-};
-static struct clk usart2_clk = {
-   .name   = "usart2_clk",
-   .pmc_mask   = 1 << AT91SAM9X5_ID_USART2,
-   .type   = CLK_TYPE_PERIPHERAL,
-};
-/* USART3 clock - Only for sam9g25/sam9x25 */
-static struct clk usart3_clk = {
-   .name   = "usart3_clk",
-   .pmc_mask   = 1 << AT91SAM9X5_ID_USART3,
- 

[PATCH 40/45] usb: echi-atmel: Check result of ehci_register()

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/usb/host/ehci-atmel.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c
index 4b9fc0a..f075b50 100644
--- a/drivers/usb/host/ehci-atmel.c
+++ b/drivers/usb/host/ehci-atmel.c
@@ -96,9 +96,7 @@ static int atmel_ehci_probe(struct device_d *dev)
return PTR_ERR(iores);
data.hccr = IOMEM(iores->start);
 
-   ehci_register(dev, );
-
-   return 0;
+   return ehci_register(dev, );
 }
 
 static void atmel_ehci_remove(struct device_d *dev)
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 42/45] at91sam9x5ek: Configure USB in DT

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/at91sam9x5ek/init.c | 19 ---
 1 file changed, 19 deletions(-)

diff --git a/arch/arm/boards/at91sam9x5ek/init.c 
b/arch/arm/boards/at91sam9x5ek/init.c
index 09b7d0f..ff0ef22 100644
--- a/arch/arm/boards/at91sam9x5ek/init.c
+++ b/arch/arm/boards/at91sam9x5ek/init.c
@@ -162,29 +162,10 @@ static void ek_add_device_lcdc(void)
 static void ek_add_device_lcdc(void) {}
 #endif
 
-#if defined(CONFIG_USB_OHCI) || defined(CONFIG_USB_EHCI)
-/*
- * USB HS Host port (common to OHCI & EHCI)
- */
-static struct at91_usbh_data ek_usbh_hs_data = {
-   .ports  = 2,
-   .vbus_pin   = {AT91_PIN_PD19, AT91_PIN_PD20},
-};
-
-static void ek_add_device_usb(void)
-{
-   at91_add_device_usbh_ohci(_usbh_hs_data);
-   at91_add_device_usbh_ehci(_usbh_hs_data);
-}
-#else
-static void ek_add_device_usb(void) {}
-#endif
-
 static int at91sam9x5ek_devices_init(void)
 {
ek_add_device_nand();
ek_add_device_eth();
-   ek_add_device_usb();
ek_add_device_lcdc();
 
armlinux_set_architecture(CONFIG_MACH_AT91SAM9X5EK);
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 22/45] at91sam9x5ek: Configure MMC in DT

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/at91sam9x5ek/init.c | 20 
 arch/arm/dts/at91sam9x5ek.dts   |  5 +
 2 files changed, 5 insertions(+), 20 deletions(-)

diff --git a/arch/arm/boards/at91sam9x5ek/init.c 
b/arch/arm/boards/at91sam9x5ek/init.c
index fca5e7d..8acb23c 100644
--- a/arch/arm/boards/at91sam9x5ek/init.c
+++ b/arch/arm/boards/at91sam9x5ek/init.c
@@ -168,25 +168,6 @@ static void ek_add_device_lcdc(void)
 static void ek_add_device_lcdc(void) {}
 #endif
 
-/*
- * MCI (SD/MMC)
- */
-/* mci0 detect_pin is revision dependent */
-static struct atmel_mci_platform_data mci0_data = {
-   .bus_width  = 4,
-   .detect_pin = AT91_PIN_PD15,
-   .wp_pin = -EINVAL,
-};
-
-static void ek_add_device_mci(void)
-{
-   if (at91sam9x5ek_cm_is_vendor(VENDOR_COGENT))
-   mci0_data.detect_pin = -EINVAL;
-
-   /* MMC0 */
-   at91_add_device_mci(0, _data);
-}
-
 static const struct spi_board_info ek_cm_cogent_spi_devices[] = {
{
.name   = "mtd_dataflash",
@@ -255,7 +236,6 @@ static int at91sam9x5ek_devices_init(void)
ek_add_device_nand();
ek_add_device_eth();
ek_add_device_spi();
-   ek_add_device_mci();
ek_add_device_usb();
ek_add_device_lcdc();
 
diff --git a/arch/arm/dts/at91sam9x5ek.dts b/arch/arm/dts/at91sam9x5ek.dts
index f9ae091..00bb86a 100644
--- a/arch/arm/dts/at91sam9x5ek.dts
+++ b/arch/arm/dts/at91sam9x5ek.dts
@@ -9,6 +9,11 @@
 #include 
 
 / {
+   aliases {
+   mmc0 = 
+   mmc1 = 
+   };
+
i2c-gpio-0 {
status = "okay";
};
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 18/45] at91: Enable PINCTRL for SOC_AT91SAM9

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/mach-at91/Kconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 28f66ac..0b77653 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -44,6 +44,7 @@ config SOC_AT91SAM9
select COMMON_CLK_OF_PROVIDER
select AT91SAM9_SMC
select CLOCKSOURCE_ATMEL_PIT
+   select PINCTRL
 
 config SOC_SAMA5
bool
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 29/45] at91sam9x5ek: Configure SPI in DT

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/at91sam9x5ek/init.c | 36 
 arch/arm/dts/at91sam9x5ek.dts   | 24 
 2 files changed, 24 insertions(+), 36 deletions(-)

diff --git a/arch/arm/boards/at91sam9x5ek/init.c 
b/arch/arm/boards/at91sam9x5ek/init.c
index 8acb23c..2fe724c 100644
--- a/arch/arm/boards/at91sam9x5ek/init.c
+++ b/arch/arm/boards/at91sam9x5ek/init.c
@@ -168,41 +168,6 @@ static void ek_add_device_lcdc(void)
 static void ek_add_device_lcdc(void) {}
 #endif
 
-static const struct spi_board_info ek_cm_cogent_spi_devices[] = {
-   {
-   .name   = "mtd_dataflash",
-   .chip_select= 0,
-   .max_speed_hz   = 15 * 1000 * 1000,
-   .bus_num= 0,
-   }
-};
-
-static const struct spi_board_info ek_spi_devices[] = {
-   {
-   .name   = "m25p80",
-   .chip_select= 0,
-   .max_speed_hz   = 30 * 1000 * 1000,
-   .bus_num= 0,
-   }
-};
-
-static unsigned spi0_standard_cs[] = { AT91_PIN_PA14};
-static struct at91_spi_platform_data spi_pdata = {
-   .chipselect = spi0_standard_cs,
-   .num_chipselect = ARRAY_SIZE(spi0_standard_cs),
-};
-
-static void ek_add_device_spi(void)
-{
-   if (at91sam9x5ek_cm_is_vendor(VENDOR_COGENT))
-   spi_register_board_info(ek_cm_cogent_spi_devices,
-   ARRAY_SIZE(ek_cm_cogent_spi_devices));
-   else
-   spi_register_board_info(ek_spi_devices,
-   ARRAY_SIZE(ek_spi_devices));
-   at91_add_device_spi(0, _pdata);
-}
-
 #if defined(CONFIG_USB_OHCI) || defined(CONFIG_USB_EHCI)
 /*
  * USB HS Host port (common to OHCI & EHCI)
@@ -235,7 +200,6 @@ static int at91sam9x5ek_devices_init(void)
ek_add_device_w1();
ek_add_device_nand();
ek_add_device_eth();
-   ek_add_device_spi();
ek_add_device_usb();
ek_add_device_lcdc();
 
diff --git a/arch/arm/dts/at91sam9x5ek.dts b/arch/arm/dts/at91sam9x5ek.dts
index 00bb86a..efdba61 100644
--- a/arch/arm/dts/at91sam9x5ek.dts
+++ b/arch/arm/dts/at91sam9x5ek.dts
@@ -17,8 +17,32 @@
i2c-gpio-0 {
status = "okay";
};
+
+   ahb {
+   apb {
+   pinctrl@f400 {
+   spi {
+   pinctrl_board_spi: spi-board {
+   atmel,pins = ;
+   };
+   };
+   };
+   };
+   };
+};
+
+ {
+   pinctrl-names = "default";
+   pinctrl-0 = <_spi0>, <_board_spi>;
 };
 
  {
status = "disabled";
 };
+
+/*
+ * This one conflicts with SPI NOR on the SoM
+ */
+ {
+   status = "disabled";
+};
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 44/45] at91sam9x5ek: Configure Ethernet in DT

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/at91sam9x5ek/init.c | 18 --
 arch/arm/dts/at91sam9x5ek.dts   |  7 +++
 2 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/arch/arm/boards/at91sam9x5ek/init.c 
b/arch/arm/boards/at91sam9x5ek/init.c
index ff0ef22..29da97d 100644
--- a/arch/arm/boards/at91sam9x5ek/init.c
+++ b/arch/arm/boards/at91sam9x5ek/init.c
@@ -106,18 +106,17 @@ static void ek_add_device_nand(void)
at91_add_device_nand(_pdata);
 }
 
-static struct macb_platform_data macb_pdata = {
-   .phy_interface = PHY_INTERFACE_MODE_RMII,
-   .phy_addr = 0,
-};
-
-static void ek_add_device_eth(void)
+static int ek_register_mac_address(void)
 {
-   if (w1_local_mac_address_register(0, "tml", "w1-2d-0"))
-   w1_local_mac_address_register(0, "tml", "w1-23-0");
+   int ret;
+
+   ret = w1_local_mac_address_register(0, "tml", "w1-2d-0");
+   if (!ret)
+   return ret;
 
-   at91_add_device_eth(0, _pdata);
+   return w1_local_mac_address_register(0, "tml", "w1-23-0");
 }
+late_initcall(ek_register_mac_address);
 
 #if defined(CONFIG_DRIVER_VIDEO_ATMEL_HLCD)
 /*
@@ -165,7 +164,6 @@ static void ek_add_device_lcdc(void) {}
 static int at91sam9x5ek_devices_init(void)
 {
ek_add_device_nand();
-   ek_add_device_eth();
ek_add_device_lcdc();
 
armlinux_set_architecture(CONFIG_MACH_AT91SAM9X5EK);
diff --git a/arch/arm/dts/at91sam9x5ek.dts b/arch/arm/dts/at91sam9x5ek.dts
index fa79347..f9e8a94 100644
--- a/arch/arm/dts/at91sam9x5ek.dts
+++ b/arch/arm/dts/at91sam9x5ek.dts
@@ -4,6 +4,7 @@
 #include 
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -63,3 +64,9 @@
  {
status = "disabled";
 };
+
+ {
+   status = "okay";
+   phy-mode = "rmii";
+};
+
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 17/45] pinctrl-at91: Fix a bug in at91_pinctrl_set_conf()

2017-03-06 Thread Andrey Smirnov
Pin_to_controller returns struct at91_gpio_chip, whereas at91_mux_*
functions expect void __iomem * pointing to controller register
window. Fix the code to do appropriate conversion between the two.

Signed-off-by: Andrey Smirnov 
---
 drivers/pinctrl/pinctrl-at91.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c
index ebbc6f6..e24c9be 100644
--- a/drivers/pinctrl/pinctrl-at91.c
+++ b/drivers/pinctrl/pinctrl-at91.c
@@ -414,8 +414,10 @@ static int at91_pinctrl_set_conf(struct at91_pinctrl 
*info, unsigned int pin_num
 {
unsigned int mask;
void __iomem *pio;
+   struct at91_gpio_chip *at91_gpio;
 
-   pio = pin_to_controller(pin_num);
+   at91_gpio = pin_to_controller(pin_num);
+   pio  = at91_gpio->regbase;
mask = pin_to_mask(pin_num);
 
if (conf & PULL_UP && conf & PULL_DOWN)
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 03/45] at91sam9x5ek: Add CONFIG_KALLSYMS to defconfig

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/configs/at91sam9x5ek_defconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm/configs/at91sam9x5ek_defconfig 
b/arch/arm/configs/at91sam9x5ek_defconfig
index 76ee3d9..d6f18b2 100644
--- a/arch/arm/configs/at91sam9x5ek_defconfig
+++ b/arch/arm/configs/at91sam9x5ek_defconfig
@@ -8,6 +8,7 @@ CONFIG_MMU=y
 CONFIG_MALLOC_SIZE=0xa0
 CONFIG_EXPERIMENTAL=y
 CONFIG_MALLOC_TLSF=y
+CONFIG_KALLSYMS=y
 CONFIG_RELOCATABLE=y
 CONFIG_PROMPT="9G20-EK:"
 CONFIG_GLOB=y
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 06/45] clocksource: at91: Add DT compatibility table

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/clocksource/timer-atmel-pit.c | 9 +
 1 file changed, 9 insertions(+)

diff --git a/drivers/clocksource/timer-atmel-pit.c 
b/drivers/clocksource/timer-atmel-pit.c
index cc7ad2f..d59efa6 100644
--- a/drivers/clocksource/timer-atmel-pit.c
+++ b/drivers/clocksource/timer-atmel-pit.c
@@ -102,9 +102,18 @@ static int at91_pit_probe(struct device_d *dev)
return init_clock();
 }
 
+static __maybe_unused struct of_device_id at91_pit_dt_ids[] = {
+   {
+   .compatible = "atmel,at91sam9260-pit",
+   }, {
+   /* sentinel */
+   }
+};
+
 static struct driver_d at91_pit_driver = {
.name = "at91-pit",
.probe = at91_pit_probe,
+   .of_compatible = DRV_OF_COMPAT(at91_pit_dt_ids),
 };
 
 static int at91_pit_init(void)
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 35/45] usb: ohci-at91: Add DT support

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 arch/arm/mach-at91/include/mach/board.h |  6 ++-
 drivers/usb/host/ohci-at91.c| 84 -
 2 files changed, 86 insertions(+), 4 deletions(-)

diff --git a/arch/arm/mach-at91/include/mach/board.h 
b/arch/arm/mach-at91/include/mach/board.h
index 491b220..5d76e00 100644
--- a/arch/arm/mach-at91/include/mach/board.h
+++ b/arch/arm/mach-at91/include/mach/board.h
@@ -32,11 +32,13 @@
 
 void at91_set_main_clock(unsigned long rate);
 
+#define AT91_MAX_USBH_PORTS3
+
  /* USB Host */
 struct at91_usbh_data {
u8  ports;  /* number of ports on root hub */
-   int vbus_pin[2];/* port power-control pin */
-   u8  vbus_pin_active_low[2]; /* vbus polarity */
+   int vbus_pin[AT91_MAX_USBH_PORTS];  /* port power-control 
pin */
+   u8  vbus_pin_active_low[AT91_MAX_USBH_PORTS];   /* vbus 
polarity */
 };
 extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data);
 extern void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data);
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c
index f413616..54fe45f 100644
--- a/drivers/usb/host/ohci-at91.c
+++ b/drivers/usb/host/ohci-at91.c
@@ -23,10 +23,18 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 #include 
 
+#include 
+
 #include "ohci.h"
 
+#define at91_for_each_port(index)  \
+   for ((index) = 0; (index) < AT91_MAX_USBH_PORTS; (index)++)
+
+
 struct ohci_at91_priv {
struct device_d *dev;
struct clk *iclk;
@@ -59,6 +67,53 @@ static void at91_stop_clock(struct ohci_at91_priv *ohci_at91)
clk_disable(ohci_at91->iclk);
 }
 
+static void at91_ohci_probe_dt(struct device_d *dev)
+{
+   u32 ports;
+   int i, ret, gpio;
+   enum of_gpio_flags flags;
+   struct at91_usbh_data *pdata;
+   struct device_node *np = dev->device_node;
+
+   pdata = xzalloc(sizeof(*pdata));
+   dev->platform_data = pdata;
+
+   if (!of_property_read_u32(np, "num-ports", ))
+   pdata->ports = ports;
+
+   at91_for_each_port(i) {
+   /*
+* do not configure PIO if not in relation with
+* real USB port on board
+*/
+   if (i >= pdata->ports) {
+   pdata->vbus_pin[i] = -EINVAL;
+   continue;
+   }
+
+   gpio = of_get_named_gpio_flags(np, "atmel,vbus-gpio", i,
+  );
+   pdata->vbus_pin[i] = gpio;
+   if (!gpio_is_valid(gpio))
+   continue;
+   pdata->vbus_pin_active_low[i] = flags & OF_GPIO_ACTIVE_LOW;
+
+   ret = gpio_request(gpio, "ohci_vbus");
+   if (ret) {
+   dev_err(dev, "can't request vbus gpio %d\n", gpio);
+   continue;
+   }
+   ret = gpio_direction_output(gpio,
+   !pdata->vbus_pin_active_low[i]);
+   if (ret) {
+   dev_err(dev, "can't put vbus gpio %d as output %d\n",
+   gpio, !pdata->vbus_pin_active_low[i]);
+   gpio_free(gpio);
+   continue;
+   }
+   }
+}
+
 static int at91_ohci_probe(struct device_d *dev)
 {
int ret;
@@ -68,6 +123,9 @@ static int at91_ohci_probe(struct device_d *dev)
dev->priv = ohci_at91;
ohci_at91->dev = dev;
 
+   if (dev->device_node)
+   at91_ohci_probe_dt(dev);
+
io = dev_get_resource(dev, IORESOURCE_MEM, 0);
if (IS_ERR(io)) {
dev_err(dev, "Failed to get IORESOURCE_MEM\n");
@@ -75,13 +133,13 @@ static int at91_ohci_probe(struct device_d *dev)
}
ohci_at91->regs = IOMEM(io->start);
 
-   ohci_at91->iclk = clk_get(NULL, "ohci_clk");
+   ohci_at91->iclk = clk_get(dev, "ohci_clk");
if (IS_ERR(ohci_at91->iclk)) {
dev_err(dev, "Failed to get 'iclk'\n");
return PTR_ERR(ohci_at91->iclk);
}
 
-   ohci_at91->fclk = clk_get(NULL, "uhpck");
+   ohci_at91->fclk = clk_get(dev, "uhpck");
if (IS_ERR(ohci_at91->fclk)) {
dev_err(dev, "Failed to get 'fclk'\n");
return PTR_ERR(ohci_at91->fclk);
@@ -107,6 +165,7 @@ static int at91_ohci_probe(struct device_d *dev)
 
 static void at91_ohci_remove(struct device_d *dev)
 {
+   struct at91_usbh_data *pdata = dev->platform_data;
struct ohci_at91_priv *ohci_at91 = dev->priv;
 
/*
@@ -118,11 +177,32 @@ static void at91_ohci_remove(struct device_d *dev)
 * Stop the USB clocks.
 */
at91_stop_clock(ohci_at91);
+
+   if (pdata) {
+   bool active_low;
+   int  i, gpio;
+
+   

[PATCH 33/45] usb: ohci-at91: Convert global variables to private data

2017-03-06 Thread Andrey Smirnov
Store driver data in per-device private variable as opposed to storing
it in global vairables.

Signed-off-by: Andrey Smirnov 
---
 drivers/usb/host/ohci-at91.c | 59 +++-
 1 file changed, 37 insertions(+), 22 deletions(-)

diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c
index c70d898..57ca86a 100644
--- a/drivers/usb/host/ohci-at91.c
+++ b/drivers/usb/host/ohci-at91.c
@@ -27,66 +27,81 @@
 
 #include "ohci.h"
 
-/* interface and function clocks; sometimes also an AHB clock */
-static struct clk *iclk, *fclk;
+struct ohci_at91_priv {
+   struct device_d *dev;
+   struct clk *iclk;
+   struct clk *fclk;
+   struct ohci_regs __iomem *regs;
+};
 
-static void at91_start_clock(void)
+static void at91_start_clock(struct ohci_at91_priv *ohci_at91)
 {
-   clk_enable(iclk);
-   clk_enable(fclk);
+   clk_enable(ohci_at91->iclk);
+   clk_enable(ohci_at91->fclk);
 }
 
-static void at91_stop_clock(void)
+static void at91_stop_clock(struct ohci_at91_priv *ohci_at91)
 {
-   clk_disable(fclk);
-   clk_disable(iclk);
+   clk_disable(ohci_at91->fclk);
+   clk_disable(ohci_at91->iclk);
 }
 
 static int at91_ohci_probe(struct device_d *dev)
 {
-   struct ohci_regs __iomem *regs = (struct ohci_regs __iomem 
*)dev->resource[0].start;
+   struct resource *io;
+   struct ohci_at91_priv *ohci_at91 = xzalloc(sizeof(*ohci_at91));
+
+   dev->priv = ohci_at91;
+   ohci_at91->dev = dev;
+
+   io = dev_get_resource(dev, IORESOURCE_MEM, 0);
+   if (IS_ERR(io)) {
+   dev_err(dev, "Failed to get IORESOURCE_MEM\n");
+   return PTR_ERR(io);
+   }
+   ohci_at91->regs = IOMEM(io->start);
 
-   iclk = clk_get(NULL, "ohci_clk");
-   if (IS_ERR(iclk)) {
+   ohci_at91->iclk = clk_get(NULL, "ohci_clk");
+   if (IS_ERR(ohci_at91->iclk)) {
dev_err(dev, "Failed to get 'iclk'\n");
-   return PTR_ERR(iclk);
+   return PTR_ERR(ohci_at91->iclk);
}
 
-   fclk = clk_get(NULL, "uhpck");
-   if (IS_ERR(fclk)) {
+   ohci_at91->fclk = clk_get(NULL, "uhpck");
+   if (IS_ERR(ohci_at91->fclk)) {
dev_err(dev, "Failed to get 'fclk'\n");
-   return PTR_ERR(fclk);
+   return PTR_ERR(ohci_at91->fclk);
}
 
/*
 * Start the USB clocks.
 */
-   at91_start_clock();
+   at91_start_clock(ohci_at91);
 
/*
 * The USB host controller must remain in reset.
 */
-   writel(0, >control);
+   writel(0, _at91->regs->control);
 
-   add_generic_device("ohci", DEVICE_ID_DYNAMIC, NULL, 
dev->resource[0].start,
-  resource_size(>resource[0]), IORESOURCE_MEM, 
NULL);
+   add_generic_device("ohci", DEVICE_ID_DYNAMIC, NULL, io->start,
+  resource_size(io), IORESOURCE_MEM, NULL);
 
return 0;
 }
 
 static void at91_ohci_remove(struct device_d *dev)
 {
-   struct ohci_regs __iomem *regs = (struct ohci_regs __iomem 
*)dev->resource[0].start;
+   struct ohci_at91_priv *ohci_at91 = dev->priv;
 
/*
 * Put the USB host controller into reset.
 */
-   writel(0, >control);
+   writel(0, _at91->regs->control);
 
/*
 * Stop the USB clocks.
 */
-   at91_stop_clock();
+   at91_stop_clock(ohci_at91);
 }
 
 static struct driver_d at91_ohci_driver = {
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 13/45] clk: at91: Port at91 DT clock code

2017-03-06 Thread Andrey Smirnov
Port at91 DT clock code from Linux 4.9-rc3.

Signed-off-by: Andrey Smirnov 
---
 arch/arm/Kconfig|   1 +
 arch/arm/mach-at91/Kconfig  |  20 ++
 drivers/clk/Makefile|   1 +
 drivers/clk/at91/Makefile   |  15 +
 drivers/clk/at91/clk-generated.c| 323 
 drivers/clk/at91/clk-h32mx.c| 125 
 drivers/clk/at91/clk-main.c | 576 
 drivers/clk/at91/clk-master.c   | 245 +++
 drivers/clk/at91/clk-peripheral.c   | 430 +++
 drivers/clk/at91/clk-pll.c  | 516 
 drivers/clk/at91/clk-plldiv.c   | 135 +
 drivers/clk/at91/clk-programmable.c | 254 
 drivers/clk/at91/clk-slow.c | 108 +++
 drivers/clk/at91/clk-smd.c  | 172 +++
 drivers/clk/at91/clk-system.c   | 160 ++
 drivers/clk/at91/clk-usb.c  | 397 +
 drivers/clk/at91/clk-utmi.c | 138 +
 drivers/clk/at91/pmc.c  |  41 +++
 drivers/clk/at91/pmc.h  |  27 ++
 drivers/clk/at91/sckc.c | 485 ++
 include/linux/clk/at91_pmc.h| 188 
 21 files changed, 4357 insertions(+)
 create mode 100644 drivers/clk/at91/Makefile
 create mode 100644 drivers/clk/at91/clk-generated.c
 create mode 100644 drivers/clk/at91/clk-h32mx.c
 create mode 100644 drivers/clk/at91/clk-main.c
 create mode 100644 drivers/clk/at91/clk-master.c
 create mode 100644 drivers/clk/at91/clk-peripheral.c
 create mode 100644 drivers/clk/at91/clk-pll.c
 create mode 100644 drivers/clk/at91/clk-plldiv.c
 create mode 100644 drivers/clk/at91/clk-programmable.c
 create mode 100644 drivers/clk/at91/clk-slow.c
 create mode 100644 drivers/clk/at91/clk-smd.c
 create mode 100644 drivers/clk/at91/clk-system.c
 create mode 100644 drivers/clk/at91/clk-usb.c
 create mode 100644 drivers/clk/at91/clk-utmi.c
 create mode 100644 drivers/clk/at91/pmc.c
 create mode 100644 drivers/clk/at91/pmc.h
 create mode 100644 drivers/clk/at91/sckc.c
 create mode 100644 include/linux/clk/at91_pmc.h

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index cfa9214..13eed8f 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -54,6 +54,7 @@ config ARCH_AT91
select HAS_DEBUG_LL
select HAVE_CLK
select PINCTRL_AT91
+   select COMMON_CLK_AT91
 
 config ARCH_BCM2835
bool "Broadcom BCM2835 boards"
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index fe0269d..2870bf3 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -9,6 +9,26 @@ config HAVE_AT91_DBGU1
 config HAVE_AT91_DBGU2
bool
 
+config HAVE_AT91_UTMI
+   bool
+
+config HAVE_AT91_USB_CLK
+   bool
+
+config COMMON_CLK_AT91
+   bool
+   select COMMON_CLK
+   select MFD_SYSCON
+
+config HAVE_AT91_SMD
+   bool
+
+config HAVE_AT91_H32MX
+   bool
+
+config HAVE_AT91_GENERATED_CLK
+   bool
+
 config HAVE_AT91_LOWLEVEL_INIT
bool
 
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
index 5811d28..d75b954 100644
--- a/drivers/clk/Makefile
+++ b/drivers/clk/Makefile
@@ -11,3 +11,4 @@ obj-$(CONFIG_ARCH_TEGRA)  += tegra/
 obj-$(CONFIG_CLK_SOCFPGA)  += socfpga.o
 obj-$(CONFIG_MACH_MIPS_ATH79)  += clk-ar933x.o
 obj-$(CONFIG_ARCH_IMX) += imx/
+obj-$(CONFIG_COMMON_CLK_AT91)  += at91/
diff --git a/drivers/clk/at91/Makefile b/drivers/clk/at91/Makefile
new file mode 100644
index 000..bfd06a4
--- /dev/null
+++ b/drivers/clk/at91/Makefile
@@ -0,0 +1,15 @@
+#
+# Makefile for at91 specific clk
+#
+
+obj-y += pmc.o sckc.o
+obj-y += clk-slow.o clk-main.o clk-pll.o clk-plldiv.o clk-master.o
+obj-y += clk-system.o clk-peripheral.o clk-programmable.o
+
+obj-$(CONFIG_HAVE_AT91_UTMI)   += clk-utmi.o
+obj-$(CONFIG_HAVE_AT91_USB_CLK)+= clk-usb.o
+obj-$(CONFIG_HAVE_AT91_SMD)+= clk-smd.o
+obj-$(CONFIG_HAVE_AT91_H32MX)  += clk-h32mx.o
+obj-$(CONFIG_HAVE_AT91_GENERATED_CLK)  += clk-generated.o
+
+
diff --git a/drivers/clk/at91/clk-generated.c b/drivers/clk/at91/clk-generated.c
new file mode 100644
index 000..4e1cd5a
--- /dev/null
+++ b/drivers/clk/at91/clk-generated.c
@@ -0,0 +1,323 @@
+/*
+ *  Copyright (C) 2015 Atmel Corporation,
+ * Nicolas Ferre 
+ *
+ * Based on clk-programmable & clk-peripheral drivers by Boris BREZILLON.
+ *
+ * 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 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "pmc.h"
+
+#define PERIPHERAL_MAX 64
+#define PERIPHERAL_ID_MIN  2
+
+#define 

[PATCH 38/45] usb: echi-atmel: Convert global variables to private data

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/usb/host/ehci-atmel.c | 42 ++
 1 file changed, 26 insertions(+), 16 deletions(-)

diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c
index fa9ca7d..7a9d942 100644
--- a/drivers/usb/host/ehci-atmel.c
+++ b/drivers/usb/host/ehci-atmel.c
@@ -29,29 +29,34 @@
 
 #include "ehci.h"
 
-/* interface and function clocks; sometimes also an AHB clock */
-static struct clk *iclk, *fclk;
+struct atmel_ehci_priv {
+   struct device_d *dev;
+   struct clk *iclk;
+   struct clk *uclk;
+};
 
-static int atmel_start_clock(void)
+static int atmel_start_clock(struct atmel_ehci_priv *atehci)
 {
int ret;
-   ret = clk_enable(iclk);
+   ret = clk_enable(atehci->iclk);
if (ret < 0) {
-   pr_err("Error enabling interface clock\n");
+   dev_err(atehci->dev,
+   "Error enabling interface clock\n");
return ret;
}
 
-   ret = clk_enable(fclk);
+   ret = clk_enable(atehci->uclk);
if (ret < 0)
-   pr_err("Error enabling function clock\n");
+   dev_err(atehci->dev,
+   "Error enabling function clock\n");
 
return ret;
 }
 
-static void atmel_stop_clock(void)
+static void atmel_stop_clock(struct atmel_ehci_priv *atehci)
 {
-   clk_disable(fclk);
-   clk_disable(iclk);
+   clk_disable(atehci->iclk);
+   clk_disable(atehci->uclk);
 }
 
 static int atmel_ehci_probe(struct device_d *dev)
@@ -59,15 +64,20 @@ static int atmel_ehci_probe(struct device_d *dev)
int ret;
struct resource *iores;
struct ehci_data data;
+   struct atmel_ehci_priv *atehci;
+
+   atehci = xzalloc(sizeof(*atehci));
+   atehci->dev = dev;
+   dev->priv = atehci;
 
-   iclk = clk_get(dev, "ehci_clk");
-   if (IS_ERR(iclk)) {
+   atehci->iclk = clk_get(dev, "ehci_clk");
+   if (IS_ERR(atehci->iclk)) {
dev_err(dev, "Error getting interface clock\n");
return -ENOENT;
}
 
-   fclk = clk_get(dev, "uhpck");
-   if (IS_ERR(fclk)) {
+   atehci->uclk = clk_get(dev, "uhpck");
+   if (IS_ERR(atehci->iclk)) {
dev_err(dev, "Error getting function clock\n");
return -ENOENT;
}
@@ -75,7 +85,7 @@ static int atmel_ehci_probe(struct device_d *dev)
/*
 * Start the USB clocks.
 */
-   ret = atmel_start_clock();
+   ret = atmel_start_clock(atehci);
if (ret < 0)
return ret;
 
@@ -96,7 +106,7 @@ static void atmel_ehci_remove(struct device_d *dev)
/*
 * Stop the USB clocks.
 */
-   atmel_stop_clock();
+   atmel_stop_clock(dev->priv);
 }
 
 static struct driver_d atmel_ehci_driver = {
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 37/45] usb: ehci-atmel: Check result of clk_enable()

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/usb/host/ehci-atmel.c | 21 +
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c
index cc9636c..fa9ca7d 100644
--- a/drivers/usb/host/ehci-atmel.c
+++ b/drivers/usb/host/ehci-atmel.c
@@ -32,10 +32,20 @@
 /* interface and function clocks; sometimes also an AHB clock */
 static struct clk *iclk, *fclk;
 
-static void atmel_start_clock(void)
+static int atmel_start_clock(void)
 {
-   clk_enable(iclk);
-   clk_enable(fclk);
+   int ret;
+   ret = clk_enable(iclk);
+   if (ret < 0) {
+   pr_err("Error enabling interface clock\n");
+   return ret;
+   }
+
+   ret = clk_enable(fclk);
+   if (ret < 0)
+   pr_err("Error enabling function clock\n");
+
+   return ret;
 }
 
 static void atmel_stop_clock(void)
@@ -46,6 +56,7 @@ static void atmel_stop_clock(void)
 
 static int atmel_ehci_probe(struct device_d *dev)
 {
+   int ret;
struct resource *iores;
struct ehci_data data;
 
@@ -64,7 +75,9 @@ static int atmel_ehci_probe(struct device_d *dev)
/*
 * Start the USB clocks.
 */
-   atmel_start_clock();
+   ret = atmel_start_clock();
+   if (ret < 0)
+   return ret;
 
data.flags = 0;
 
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 26/45] spi: atmel_spi: Add DT support

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/spi/atmel_spi.c | 29 ++---
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c
index 3f2c527..68466ef 100644
--- a/drivers/spi/atmel_spi.c
+++ b/drivers/spi/atmel_spi.c
@@ -29,6 +29,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -375,10 +376,11 @@ static int atmel_spi_probe(struct device_d *dev)
int ret = 0;
int i;
struct spi_master *master;
+   struct device_node *node = dev->device_node;
struct atmel_spi *as;
struct at91_spi_platform_data *pdata = dev->platform_data;
 
-   if (!pdata) {
+   if (!IS_ENABLED(CONFIG_OFDEVICE) && !pdata) {
dev_err(dev, "missing platform data\n");
return -EINVAL;
}
@@ -389,6 +391,23 @@ static int atmel_spi_probe(struct device_d *dev)
master->dev = dev;
master->bus_num = dev->id;
 
+   if (pdata) {
+   master->num_chipselect = pdata->num_chipselect;
+   as->cs_pins = pdata->chipselect;
+   } else {
+   master->num_chipselect = of_gpio_named_count(node, "cs-gpios");
+   as->cs_pins = xzalloc(sizeof(u32) * master->num_chipselect);
+
+   for (i = 0; i < master->num_chipselect; i++) {
+   as->cs_pins[i] = of_get_named_gpio(node, "cs-gpios", i);
+
+   if (!gpio_is_valid(as->cs_pins[i]))
+   break;
+   }
+
+   master->num_chipselect = i;
+   }
+
as->clk = clk_get(dev, "spi_clk");
if (IS_ERR(as->clk)) {
dev_err(dev, "no spi_clk\n");
@@ -398,8 +417,6 @@ static int atmel_spi_probe(struct device_d *dev)
 
master->setup = atmel_spi_setup;
master->transfer = atmel_spi_transfer;
-   master->num_chipselect = pdata->num_chipselect;
-   as->cs_pins = pdata->chipselect;
iores = dev_request_mem_resource(dev, 0);
if (IS_ERR(iores))
return PTR_ERR(iores);
@@ -438,8 +455,14 @@ out_free:
return ret;
 }
 
+static __maybe_unused const struct of_device_id atmel_spi_dt_ids[] = {
+   { .compatible = "atmel,at91rm9200-spi" },
+   { /* sentinel */ }
+};
+
 static struct driver_d atmel_spi_driver = {
.name  = "atmel_spi",
.probe = atmel_spi_probe,
+   .of_compatible = DRV_OF_COMPAT(atmel_spi_dt_ids),
 };
 device_platform_driver(atmel_spi_driver);
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 28/45] spi: atmel_spi: Use VERSION register instead of CPU type

2017-03-06 Thread Andrey Smirnov
Use VERSION register instead of CPU type to determine IP block's version
and capabilities. This what corresponding Linux kernel driver does.

Signed-off-by: Andrey Smirnov 
---
 drivers/spi/atmel_spi.c | 35 +--
 drivers/spi/atmel_spi.h |  1 +
 2 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c
index b183344..55032be 100644
--- a/drivers/spi/atmel_spi.c
+++ b/drivers/spi/atmel_spi.c
@@ -41,11 +41,16 @@
 
 #include "atmel_spi.h"
 
+struct atmel_spi_caps {
+   boolis_spi2;
+};
+
 struct atmel_spi {
struct spi_master   master;
void __iomem*regs;
struct clk  *clk;
int *cs_pins;
+   struct atmel_spi_caps   caps;
 };
 
 #define to_atmel_spi(p)container_of(p, struct atmel_spi, 
master)
@@ -63,9 +68,9 @@ struct atmel_spi {
  * register, but I haven't checked that it exists on all chips, and
  * this is cheaper anyway.
  */
-static inline bool atmel_spi_is_v2(void)
+static inline bool atmel_spi_is_v2(struct atmel_spi *as)
 {
-   return !cpu_is_at91rm9200();
+   return as->caps.is_spi2;
 }
 
 /*
@@ -105,7 +110,7 @@ static void cs_activate(struct atmel_spi *as, struct 
spi_device *spi)
 
csr = (u32)spi->controller_data;
 
-   if (atmel_spi_is_v2()) {
+   if (atmel_spi_is_v2(as)) {
/*
 * Always use CSR0. This ensures that the clock
 * switches to the correct idle polarity before we
@@ -164,8 +169,9 @@ static void cs_deactivate(struct atmel_spi *as, struct 
spi_device *spi)
npcs_pin, active ? " (low)" : "",
mr);
 
-   if (atmel_spi_is_v2() || npcs_pin != AT91_PIN_PA3)
+   if (atmel_spi_is_v2(as) || npcs_pin != AT91_PIN_PA3) {
gpio_set_value(npcs_pin, !active);
+   }
 }
 
 static int atmel_spi_setup(struct spi_device *spi)
@@ -200,7 +206,7 @@ static int atmel_spi_setup(struct spi_device *spi)
spi->max_speed_hz);
 
bus_hz = clk_get_rate(as->clk);
-   if (!atmel_spi_is_v2())
+   if (!atmel_spi_is_v2(as))
bus_hz /= 2;
 
if (spi->max_speed_hz) {
@@ -249,7 +255,7 @@ static int atmel_spi_setup(struct spi_device *spi)
 
cs_deactivate(as, spi);
 
-   if (!atmel_spi_is_v2())
+   if (!atmel_spi_is_v2(as))
spi_writel(as, CSR0 + 4 * spi->chip_select, csr);
 
return 0;
@@ -374,6 +380,21 @@ err:
return ret;
 }
 
+static inline unsigned int atmel_get_version(struct atmel_spi *as)
+{
+   return spi_readl(as, VERSION) & 0x0fff;
+}
+
+static void atmel_get_caps(struct atmel_spi *as)
+{
+   unsigned int version;
+
+   version = atmel_get_version(as);
+   dev_info(as->master.dev, "version: 0x%x\n", version);
+
+   as->caps.is_spi2 = version > 0x121;
+}
+
 static int atmel_spi_probe(struct device_d *dev)
 {
struct resource *iores;
@@ -426,6 +447,8 @@ static int atmel_spi_probe(struct device_d *dev)
return PTR_ERR(iores);
as->regs = IOMEM(iores->start);
 
+   atmel_get_caps(as);
+
for (i = 0; i < master->num_chipselect; i++) {
ret = gpio_request(as->cs_pins[i], dev_name(dev));
if (ret)
diff --git a/drivers/spi/atmel_spi.h b/drivers/spi/atmel_spi.h
index 38ce119..3f4d7ba 100644
--- a/drivers/spi/atmel_spi.h
+++ b/drivers/spi/atmel_spi.h
@@ -23,6 +23,7 @@
 #define SPI_CSR1   0x0034
 #define SPI_CSR2   0x0038
 #define SPI_CSR3   0x003c
+#define SPI_VERSION0x00fc
 #define SPI_RPR0x0100
 #define SPI_RCR0x0104
 #define SPI_TPR0x0108
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 34/45] usb: ohci-at91: Check result of clk_enable()

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/usb/host/ohci-at91.c | 24 
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c
index 57ca86a..f413616 100644
--- a/drivers/usb/host/ohci-at91.c
+++ b/drivers/usb/host/ohci-at91.c
@@ -34,10 +34,23 @@ struct ohci_at91_priv {
struct ohci_regs __iomem *regs;
 };
 
-static void at91_start_clock(struct ohci_at91_priv *ohci_at91)
+static int at91_start_clock(struct ohci_at91_priv *ohci_at91)
 {
-   clk_enable(ohci_at91->iclk);
-   clk_enable(ohci_at91->fclk);
+   int ret;
+
+   ret = clk_enable(ohci_at91->iclk);
+   if (ret < 0) {
+   dev_err(ohci_at91->dev, "Failed to enable 'iclk'\n");
+   return ret;
+   }
+
+   ret = clk_enable(ohci_at91->fclk);
+   if (ret < 0) {
+   dev_err(ohci_at91->dev, "Failed to enable 'fclk'\n");
+   return ret;
+   }
+
+   return 0;
 }
 
 static void at91_stop_clock(struct ohci_at91_priv *ohci_at91)
@@ -48,6 +61,7 @@ static void at91_stop_clock(struct ohci_at91_priv *ohci_at91)
 
 static int at91_ohci_probe(struct device_d *dev)
 {
+   int ret;
struct resource *io;
struct ohci_at91_priv *ohci_at91 = xzalloc(sizeof(*ohci_at91));
 
@@ -76,7 +90,9 @@ static int at91_ohci_probe(struct device_d *dev)
/*
 * Start the USB clocks.
 */
-   at91_start_clock(ohci_at91);
+   ret = at91_start_clock(ohci_at91);
+   if (ret < 0)
+   return ret;
 
/*
 * The USB host controller must remain in reset.
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 32/45] usb: ohci-at91: Check result of clk_get()

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/usb/host/ohci-at91.c | 9 +
 1 file changed, 9 insertions(+)

diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c
index 0f5c8f1..c70d898 100644
--- a/drivers/usb/host/ohci-at91.c
+++ b/drivers/usb/host/ohci-at91.c
@@ -47,7 +47,16 @@ static int at91_ohci_probe(struct device_d *dev)
struct ohci_regs __iomem *regs = (struct ohci_regs __iomem 
*)dev->resource[0].start;
 
iclk = clk_get(NULL, "ohci_clk");
+   if (IS_ERR(iclk)) {
+   dev_err(dev, "Failed to get 'iclk'\n");
+   return PTR_ERR(iclk);
+   }
+
fclk = clk_get(NULL, "uhpck");
+   if (IS_ERR(fclk)) {
+   dev_err(dev, "Failed to get 'fclk'\n");
+   return PTR_ERR(fclk);
+   }
 
/*
 * Start the USB clocks.
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 27/45] spi: atmel_spi: Configure CS GPIO as output

2017-03-06 Thread Andrey Smirnov
On AT91 GPIOs default to being inputs, so we need to explicitly
configure CS gpio to being an output.

Signed-off-by: Andrey Smirnov 
---
 drivers/spi/atmel_spi.c | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c
index 68466ef..b183344 100644
--- a/drivers/spi/atmel_spi.c
+++ b/drivers/spi/atmel_spi.c
@@ -173,6 +173,8 @@ static int atmel_spi_setup(struct spi_device *spi)
struct spi_master   *master = spi->master;
struct atmel_spi*as = to_atmel_spi(master);
 
+   int npcs_pin;
+   unsignedactive = spi->mode & SPI_CS_HIGH;
u32 scbr, csr;
unsigned intbits = spi->bits_per_word;
unsigned long   bus_hz;
@@ -184,6 +186,8 @@ static int atmel_spi_setup(struct spi_device *spi)
return -EINVAL;
}
 
+   npcs_pin = as->cs_pins[spi->chip_select];
+
if (bits < 8 || bits > 16) {
dev_dbg(>dev,
"setup: invalid bits_per_word %u (8 to 16)\n",
@@ -236,7 +240,7 @@ static int atmel_spi_setup(struct spi_device *spi)
csr |= SPI_BF(DLYBS, 0);
csr |= SPI_BF(DLYBCT, 0);
 
-   /* gpio_direction_output(npcs_pin, !(spi->mode & SPI_CS_HIGH)); */
+   gpio_direction_output(npcs_pin, !active);
dev_dbg(master->dev,
"setup: %lu Hz bpw %u mode 0x%x -> csr%d %08x\n",
bus_hz / scbr, bits, spi->mode, spi->chip_select, csr);
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 30/45] w1-gpio: Add DT support

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/w1/masters/w1-gpio.c | 53 
 1 file changed, 53 insertions(+)

diff --git a/drivers/w1/masters/w1-gpio.c b/drivers/w1/masters/w1-gpio.c
index 946e9d3..916027e 100644
--- a/drivers/w1/masters/w1-gpio.c
+++ b/drivers/w1/masters/w1-gpio.c
@@ -16,6 +16,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "../w1.h"
 
@@ -43,12 +44,58 @@ static u8 w1_gpio_read_bit(struct w1_bus *bus)
return gpio_get_value(pdata->pin) ? 1 : 0;
 }
 
+static int w1_gpio_probe_dt(struct device_d *dev)
+{
+   struct w1_gpio_platform_data *pdata;
+   struct device_node *np = dev->device_node;
+   int gpio;
+
+   if (dev->platform_data)
+   return 0;
+
+   pdata = xzalloc(sizeof(*pdata));
+
+   if (of_get_property(np, "linux,open-drain", NULL))
+   pdata->is_open_drain = 1;
+
+   gpio = of_get_gpio(np, 0);
+   if (!gpio_is_valid(gpio)) {
+   if (gpio != -EPROBE_DEFER)
+   dev_err(dev,
+   "Failed to parse gpio property for data pin 
(%d)\n",
+   gpio);
+
+   goto free_pdata;
+   }
+   pdata->pin = gpio;
+
+   gpio = of_get_gpio(np, 1);
+   if (gpio == -EPROBE_DEFER)
+   goto free_pdata;
+
+   /* ignore other errors as the pullup gpio is optional */
+   pdata->ext_pullup_enable_pin = gpio;
+
+   dev->platform_data = pdata;
+   return 0;
+
+free_pdata:
+   free(pdata);
+   return gpio;
+}
+
 static int __init w1_gpio_probe(struct device_d *dev)
 {
struct w1_bus *master;
struct w1_gpio_platform_data *pdata;
int err;
 
+   if (IS_ENABLED(CONFIG_OFDEVICE)) {
+   err = w1_gpio_probe_dt(dev);
+   if (err < 0)
+   return err;
+   }
+
pdata = dev->platform_data;
 
if (!pdata)
@@ -104,8 +151,14 @@ static int __init w1_gpio_probe(struct device_d *dev)
return err;
 }
 
+static __maybe_unused const struct of_device_id w1_gpio_dt_ids[] = {
+   { .compatible = "w1-gpio" },
+   {}
+};
+
 static struct driver_d w1_gpio_driver = {
.name   = "w1-gpio",
.probe  = w1_gpio_probe,
+   .of_compatible = DRV_OF_COMPAT(w1_gpio_dt_ids),
 };
 device_platform_driver(w1_gpio_driver);
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 23/45] of: base: Use scoring in DT device matching

2017-03-06 Thread Andrey Smirnov
Port Linux kernel algorithm for both of_device_is_compatible() and
of_match_node(). With this change former now returns a score on the
scale of 0 to INT_MAX/2, and the latter goes through all compatiblity
entries and selects the entry that has the best matching score.

This is needed for SoCs where IP blocks are backwards compatible and
corresponding OF nodes can proclaim compatibility with several entries
found in driver's compatiblity table. One such example would be PIO
pinctrl block on AT91SAM9x5 SoCs which declare compatibility with with
both "atmel,at91sam9x5-pinctrl" and "atmel,at91rm9200-pinctrl".

Signed-off-by: Andrey Smirnov 
---
 drivers/of/base.c | 37 +
 1 file changed, 21 insertions(+), 16 deletions(-)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index 0c20fcd..bef8f1d 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -472,21 +472,20 @@ EXPORT_SYMBOL(of_get_cpu_node);
 int of_device_is_compatible(const struct device_node *device,
const char *compat)
 {
+   struct property *prop;
const char *cp;
-   int cplen, l;
+   int index = 0, score = 0;
 
-   cp = of_get_property(device, "compatible", );
-   if (cp == NULL)
-   return 0;
-   while (cplen > 0) {
-   if (of_compat_cmp(cp, compat, strlen(compat)) == 0)
-   return 1;
-   l = strlen(cp) + 1;
-   cp += l;
-   cplen -= l;
+   prop = of_find_property(device, "compatible", NULL);
+   for (cp = of_prop_next_string(prop, NULL); cp;
+cp = of_prop_next_string(prop, cp), index++) {
+   if (of_compat_cmp(cp, compat, strlen(compat)) == 0) {
+   score = INT_MAX/2 - (index << 2);
+   break;
+   }
}
 
-   return 0;
+   return score;
 }
 EXPORT_SYMBOL(of_device_is_compatible);
 
@@ -602,16 +601,22 @@ EXPORT_SYMBOL(of_find_node_with_property);
 const struct of_device_id *of_match_node(const struct of_device_id *matches,
 const struct device_node *node)
 {
+   const struct of_device_id *best_match = NULL;
+   int score, best_score = 0;
+
if (!matches || !node)
return NULL;
 
-   while (matches->compatible) {
-   if (of_device_is_compatible(node, matches->compatible) == 1)
-   return matches;
-   matches++;
+   for (; matches->compatible; matches++) {
+   score = of_device_is_compatible(node, matches->compatible);
+
+   if (score > best_score) {
+   best_match = matches;
+   best_score = score;
+   }
}
 
-   return NULL;
+   return best_match;
 }
 
 /**
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 25/45] pinctrl: at91: Implement .get_direction hook

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/pinctrl/pinctrl-at91.c | 16 
 1 file changed, 16 insertions(+)

diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c
index 34fb0ae..021c1e5 100644
--- a/drivers/pinctrl/pinctrl-at91.c
+++ b/drivers/pinctrl/pinctrl-at91.c
@@ -568,6 +568,21 @@ static int at91_gpio_direction_output(struct gpio_chip 
*chip, unsigned offset,
return 0;
 }
 
+static int at91_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
+{
+   struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip);
+   void __iomem *pio = at91_gpio->regbase;
+   unsigned mask = 1 << offset;
+   u32 osr;
+
+   if (mask & __raw_readl(pio + PIO_PSR)) {
+   osr = __raw_readl(pio + PIO_OSR);
+   return !(osr & mask);
+   } else {
+   return -EBUSY;
+   }
+}
+
 static int at91_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 {
struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip);
@@ -603,6 +618,7 @@ static struct gpio_ops at91_gpio_ops = {
.free = at91_gpio_free,
.direction_input = at91_gpio_direction_input,
.direction_output = at91_gpio_direction_output,
+   .get_direction = at91_gpio_get_direction,
.get = at91_gpio_get,
.set = at91_gpio_set,
 };
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 21/45] mci: atmel_mci: Add DT support

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/mci/atmel_mci.c | 101 +---
 1 file changed, 70 insertions(+), 31 deletions(-)

diff --git a/drivers/mci/atmel_mci.c b/drivers/mci/atmel_mci.c
index 2a0ddb0..317cf46 100644
--- a/drivers/mci/atmel_mci.c
+++ b/drivers/mci/atmel_mci.c
@@ -24,6 +24,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "atmel-mci-regs.h"
 
@@ -53,6 +54,7 @@ struct atmel_mci {
u32 cfg_reg;
u32 sdc_reg;
boolneed_reset;
+   int detect_pin;
 };
 
 #define to_mci_host(mci)   container_of(mci, struct atmel_mci, mci)
@@ -360,14 +362,13 @@ static int atmci_start_cmd(struct atmel_mci *host, struct 
mci_cmd *cmd,
 static int atmci_card_present(struct mci_host *mci)
 {
struct atmel_mci *host = to_mci_host(mci);
-   struct atmel_mci_platform_data *pd = host->hw_dev->platform_data;
int ret;
 
/* No gpio, assume card is present */
-   if (!gpio_is_valid(pd->detect_pin))
+   if (!gpio_is_valid(host->detect_pin))
return 1;
 
-   ret = gpio_get_value(pd->detect_pin);
+   ret = gpio_get_value(host->detect_pin);
 
return ret == 0 ? 1 : 0;
 }
@@ -535,44 +536,71 @@ static int atmci_probe(struct device_d *hw_dev)
 {
struct resource *iores;
struct atmel_mci *host;
+   struct device_node *np = hw_dev->device_node;
struct atmel_mci_platform_data *pd = hw_dev->platform_data;
int ret;
 
-   if (!pd) {
-   dev_err(hw_dev, "missing platform data\n");
-   return -EINVAL;
+   host = xzalloc(sizeof(*host));
+   host->mci.send_cmd = atmci_request;
+   host->mci.set_ios = atmci_set_ios;
+   host->mci.init = atmci_reset;
+   host->mci.card_present = atmci_card_present;
+   host->mci.hw_dev = hw_dev;
+   host->detect_pin = -EINVAL;
+
+   if (pd) {
+   host->detect_pin  = pd->detect_pin;
+   host->mci.devname = pd->devname;
+
+   if (pd->bus_width >= 4)
+   host->mci.host_caps |= MMC_CAP_4_BIT_DATA;
+   if (pd->bus_width == 8)
+   host->mci.host_caps |= MMC_CAP_8_BIT_DATA;
+
+   host->slot_b = pd->slot_b;
+   } else if (np) {
+   u32 slot_id;
+   struct device_node *cnp;
+   const char *alias = of_alias_get(np);
+
+   if (alias)
+   host->mci.devname = xstrdup(alias);
+
+   host->detect_pin = of_get_named_gpio(np, "cd-gpios", 0);
+
+   for_each_child_of_node(np, cnp) {
+   if (of_property_read_u32(cnp, "reg", _id)) {
+   dev_warn(hw_dev, "reg property is missing for 
%s\n",
+cnp->full_name);
+   continue;
+   }
+
+   host->slot_b = slot_id;
+   mci_of_parse_node(>mci, cnp);
+   break;
+   }
+   } else {
+   dev_err(hw_dev, "Missing device information\n");
+   ret = -EINVAL;
+   goto error_out;
}
 
-   if (gpio_is_valid(pd->detect_pin)) {
-   ret = gpio_request(pd->detect_pin, "mci_cd");
+   if (gpio_is_valid(host->detect_pin)) {
+   ret = gpio_request(host->detect_pin, "mci_cd");
if (ret) {
dev_err(hw_dev, "Impossible to request CD gpio %d 
(%d)\n",
-   ret, pd->detect_pin);
-   return ret;
+   ret, host->detect_pin);
+   goto error_out;
}
 
-   ret = gpio_direction_input(pd->detect_pin);
+   ret = gpio_direction_input(host->detect_pin);
if (ret) {
dev_err(hw_dev, "Impossible to configure CD gpio %d as 
input (%d)\n",
-   ret, pd->detect_pin);
-   goto err_gpio_cd_request;
+   ret, host->detect_pin);
+   goto error_out;
}
}
 
-   host = xzalloc(sizeof(*host));
-   host->mci.send_cmd = atmci_request;
-   host->mci.set_ios = atmci_set_ios;
-   host->mci.init = atmci_reset;
-   host->mci.card_present = atmci_card_present;
-   host->mci.hw_dev = hw_dev;
-   host->mci.devname = pd->devname;
-
-   if (pd->bus_width >= 4)
-   host->mci.host_caps |= MMC_CAP_4_BIT_DATA;
-   if (pd->bus_width == 8)
-   host->mci.host_caps |= MMC_CAP_8_BIT_DATA;
-   host->slot_b = pd->slot_b;
-
iores = dev_request_mem_resource(hw_dev, 0);
if (IS_ERR(iores))
return PTR_ERR(iores);
@@ -583,7 +611,7 @@ 

[PATCH 20/45] mci: Allow parsing for explicit DT node

2017-03-06 Thread Andrey Smirnov
Convert mci_of_parse into mci_of_parse_node, a function that takes
explicit deivce tree node pointer to be used for SD/MMC related
properties extraction. Implement original mci_of_parse as a wrapper
around the call to new function.

This is useful for controllers who specify parameter like bus witdth and
GPIOs as a part of main controller's child nodes (e.g. AT91 SoCs).

Signed-off-by: Andrey Smirnov 
---
 drivers/mci/mci-core.c | 13 -
 include/mci.h  |  1 +
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/mci/mci-core.c b/drivers/mci/mci-core.c
index 055a5e2..928277a 100644
--- a/drivers/mci/mci-core.c
+++ b/drivers/mci/mci-core.c
@@ -1843,20 +1843,18 @@ err_free:
return ret;
 }
 
-void mci_of_parse(struct mci_host *host)
+void mci_of_parse_node(struct mci_host *host,
+  struct device_node *np)
 {
-   struct device_node *np;
u32 bus_width;
u32 dsr_val;
 
if (!IS_ENABLED(CONFIG_OFDEVICE))
return;
 
-   if (!host->hw_dev || !host->hw_dev->device_node)
+   if (!host->hw_dev || !np)
return;
 
-   np = host->hw_dev->device_node;
-
/* "bus-width" is translated to MMC_CAP_*_BIT_DATA flags */
if (of_property_read_u32(np, "bus-width", _width) < 0) {
/* If bus-width is missing we get the driver's default, which
@@ -1897,6 +1895,11 @@ void mci_of_parse(struct mci_host *host)
host->non_removable = of_property_read_bool(np, "non-removable");
 }
 
+void mci_of_parse(struct mci_host *host)
+{
+   return mci_of_parse_node(host, host->hw_dev->device_node);
+}
+
 struct mci *mci_get_device_by_name(const char *name)
 {
struct mci *mci;
diff --git a/include/mci.h b/include/mci.h
index cc4712c..781e6e0 100644
--- a/include/mci.h
+++ b/include/mci.h
@@ -480,6 +480,7 @@ struct mci {
 
 int mci_register(struct mci_host*);
 void mci_of_parse(struct mci_host *host);
+void mci_of_parse_node(struct mci_host *host, struct device_node *np);
 int mci_detect_card(struct mci_host *);
 int mci_send_ext_csd(struct mci *mci, char *ext_csd);
 int mci_switch(struct mci *mci, unsigned set, unsigned index,
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 24/45] pinctrl: at91: Fix a bug in at91_pinctrl_set_state

2017-03-06 Thread Andrey Smirnov
Pin number, as specified in OF pinumx entries, is relative to each bank
start, whereas both at91_mux_pin() and at91_pinctrl_set_conf() asssume
absolute pin numbering, so we need to take into account each bank's pin
base and convert pin number appropriately. Failing to do so results in
any pinmux configuration being applied to pins in bank A.

Signed-off-by: Andrey Smirnov 
---
 drivers/pinctrl/pinctrl-at91.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c
index e24c9be..34fb0ae 100644
--- a/drivers/pinctrl/pinctrl-at91.c
+++ b/drivers/pinctrl/pinctrl-at91.c
@@ -462,6 +462,8 @@ static int at91_pinctrl_set_state(struct pinctrl_device 
*pdev, struct device_nod
mux = be32_to_cpu(*list++);
conf = be32_to_cpu(*list++);
 
+   pin_num += bank_num * MAX_NB_GPIO_PER_BANK;
+
ret = at91_mux_pin(pin_num, mux, conf & PULL_UP);
if (ret) {
dev_err(pdev->dev, "failed to mux pin %d\n", pin_num);
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 10/45] clk: Port two helper functions from Linux

2017-03-06 Thread Andrey Smirnov
Port of_clk_get_parent_count() and of_clk_parent_fill() from Linux.

Signed-off-by: Andrey Smirnov 
---
 drivers/clk/clk.c   | 39 +++
 include/linux/clk.h |  3 +++
 2 files changed, 42 insertions(+)

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 93e000c..9189521 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -452,6 +452,24 @@ struct clk *of_clk_get_from_provider(struct 
of_phandle_args *clkspec)
return clk;
 }
 
+/**
+ * of_clk_get_parent_count() - Count the number of clocks a device node has
+ * @np: device node to count
+ *
+ * Returns: The number of clocks that are possible parents of this node
+ */
+unsigned int of_clk_get_parent_count(struct device_node *np)
+{
+   int count;
+
+   count = of_count_phandle_with_args(np, "clocks", "#clock-cells");
+   if (count < 0)
+   return 0;
+
+   return count;
+}
+EXPORT_SYMBOL_GPL(of_clk_get_parent_count);
+
 char *of_clk_get_parent_name(struct device_node *np, unsigned int index)
 {
struct of_phandle_args clkspec;
@@ -472,6 +490,27 @@ char *of_clk_get_parent_name(struct device_node *np, 
unsigned int index)
 }
 EXPORT_SYMBOL_GPL(of_clk_get_parent_name);
 
+/**
+ * of_clk_parent_fill() - Fill @parents with names of @np's parents and return
+ * number of parents
+ * @np: Device node pointer associated with clock provider
+ * @parents: pointer to char array that hold the parents' names
+ * @size: size of the @parents array
+ *
+ * Return: number of parents for the clock node.
+ */
+int of_clk_parent_fill(struct device_node *np, const char **parents,
+  unsigned int size)
+{
+   unsigned int i = 0;
+
+   while (i < size && (parents[i] = of_clk_get_parent_name(np, i)) != NULL)
+   i++;
+
+   return i;
+}
+EXPORT_SYMBOL_GPL(of_clk_parent_fill);
+
 struct clock_provider {
of_clk_init_cb_t clk_init_cb;
struct device_node *np;
diff --git a/include/linux/clk.h b/include/linux/clk.h
index 7dd5238..f73b029 100644
--- a/include/linux/clk.h
+++ b/include/linux/clk.h
@@ -348,7 +348,10 @@ struct clk *of_clk_src_simple_get(struct of_phandle_args 
*clkspec, void *data);
 struct clk *of_clk_get(struct device_node *np, int index);
 struct clk *of_clk_get_by_name(struct device_node *np, const char *name);
 struct clk *of_clk_get_from_provider(struct of_phandle_args *clkspec);
+unsigned int of_clk_get_parent_count(struct device_node *np);
 char *of_clk_get_parent_name(struct device_node *np, unsigned int index);
+int of_clk_parent_fill(struct device_node *np, const char **parents,
+  unsigned int size);
 int of_clk_init(struct device_node *root, const struct of_device_id *matches);
 #else
 static inline struct clk *of_clk_get(struct device_node *np, int index)
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 12/45] clk: No-op CLK_OF_DECLARE if not enabled

2017-03-06 Thread Andrey Smirnov
Instead of wrapping each defenition of CLK_OF_DECLARE hook with
preprocessor guards, change the definition of CLK_OF_DECLARE to expand
into no-op if COMMON_CLK_OF_PROVIDER is not enabled.

Signed-off-by: Andrey Smirnov 
---
 drivers/clk/clk-fixed-factor.c | 2 --
 drivers/clk/clk-fixed.c| 3 +--
 include/linux/clk.h| 6 +-
 3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/clk/clk-fixed-factor.c b/drivers/clk/clk-fixed-factor.c
index a3dbf33..0be4855 100644
--- a/drivers/clk/clk-fixed-factor.c
+++ b/drivers/clk/clk-fixed-factor.c
@@ -93,7 +93,6 @@ struct clk *clk_fixed_factor(const char *name,
return >clk;
 }
 
-#if defined(CONFIG_COMMON_CLK_OF_PROVIDER)
 /**
  * of_fixed_factor_clk_setup() - Setup function for simple fixed factor clock
  */
@@ -127,4 +126,3 @@ static int of_fixed_factor_clk_setup(struct device_node 
*node)
 }
 CLK_OF_DECLARE(fixed_factor_clk, "fixed-factor-clock",
of_fixed_factor_clk_setup);
-#endif
diff --git a/drivers/clk/clk-fixed.c b/drivers/clk/clk-fixed.c
index f0f7fba..9fa9a93 100644
--- a/drivers/clk/clk-fixed.c
+++ b/drivers/clk/clk-fixed.c
@@ -55,7 +55,6 @@ struct clk *clk_fixed(const char *name, int rate)
return >clk;
 }
 
-#if defined(CONFIG_COMMON_CLK_OF_PROVIDER)
 /**
  * of_fixed_clk_setup() - Setup function for simple fixed rate clock
  */
@@ -76,4 +75,4 @@ static int of_fixed_clk_setup(struct device_node *node)
return of_clk_add_provider(node, of_clk_src_simple_get, clk);
 }
 CLK_OF_DECLARE(fixed_clk, "fixed-clock", of_fixed_clk_setup);
-#endif
+
diff --git a/include/linux/clk.h b/include/linux/clk.h
index a061398..f705532 100644
--- a/include/linux/clk.h
+++ b/include/linux/clk.h
@@ -324,12 +324,13 @@ struct clk *clk_register_composite(const char *name,
 struct device_node;
 struct of_phandle_args;
 
+#if defined(CONFIG_COMMON_CLK_OF_PROVIDER)
+
 #define CLK_OF_DECLARE(name, compat, fn)   \
 const struct of_device_id __clk_of_table_##name
\
 __attribute__ ((unused,section (".__clk_of_table"))) \
= { .compatible = compat, .data = fn }
 
-#if defined(CONFIG_COMMON_CLK_OF_PROVIDER)
 int of_clk_add_provider(struct device_node *np,
struct clk *(*clk_src_get)(struct of_phandle_args *args,
   void *data),
@@ -354,6 +355,9 @@ int of_clk_parent_fill(struct device_node *np, const char 
**parents,
   unsigned int size);
 int of_clk_init(struct device_node *root, const struct of_device_id *matches);
 #else
+
+#define CLK_OF_DECLARE(name, compat, fn)
+
 static inline struct clk *of_clk_get(struct device_node *np, int index)
 {
return ERR_PTR(-ENOENT);
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 09/45] regmap: Implement syscon_node_to_regmap()

2017-03-06 Thread Andrey Smirnov
Implement syscon_node_to_regmap() to simplify porting kernel code.

Signed-off-by: Andrey Smirnov 
---
 drivers/mfd/syscon.c | 54 +++-
 include/mfd/syscon.h |  8 
 2 files changed, 61 insertions(+), 1 deletion(-)

diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c
index 6ef30ce..957d9a7 100644
--- a/drivers/mfd/syscon.c
+++ b/drivers/mfd/syscon.c
@@ -28,6 +28,34 @@ struct syscon {
struct device_node *np;
void __iomem *base;
struct list_head list;
+   struct regmap *regmap;
+};
+
+static int syscon_reg_write(void *context, unsigned int reg,
+   unsigned int val)
+{
+   struct syscon *syscon = context;
+   writel(val, syscon->base + reg);
+   return 0;
+}
+
+static int syscon_reg_read(void *context, unsigned int reg,
+  unsigned int *val)
+{
+   struct syscon *syscon = context;
+   *val = readl(syscon->base + reg);
+   return 0;
+}
+
+static const struct regmap_bus syscon_regmap_bus = {
+   .reg_write = syscon_reg_write,
+   .reg_read  = syscon_reg_read,
+};
+
+static const struct regmap_config syscon_regmap_config = {
+   .reg_bits = 32,
+   .val_bits = 32,
+   .reg_stride = 4,
 };
 
 static struct syscon *of_syscon_register(struct device_node *np)
@@ -51,6 +79,10 @@ static struct syscon *of_syscon_register(struct device_node 
*np)
 
list_add_tail(>list, _list);
 
+   syscon->regmap = regmap_init(NULL,
+_regmap_bus,
+syscon,
+_regmap_config);
return syscon;
 
 err_map:
@@ -58,7 +90,7 @@ err_map:
return ERR_PTR(ret);
 }
 
-static void __iomem *syscon_node_to_base(struct device_node *np)
+static struct syscon *node_to_syscon(struct device_node *np)
 {
struct syscon *entry, *syscon = NULL;
 
@@ -74,6 +106,16 @@ static void __iomem *syscon_node_to_base(struct device_node 
*np)
if (IS_ERR(syscon))
return ERR_CAST(syscon);
 
+   return syscon;
+}
+
+static void __iomem *syscon_node_to_base(struct device_node *np)
+{
+   struct syscon *syscon = node_to_syscon(np);
+
+   if (IS_ERR(syscon))
+   return ERR_CAST(syscon);
+
return syscon->base;
 }
 
@@ -108,6 +150,16 @@ void __iomem *syscon_base_lookup_by_phandle(struct 
device_node *np,
return syscon_node_to_base(syscon_np);
 }
 
+struct regmap *syscon_node_to_regmap(struct device_node *np)
+{
+   struct syscon *syscon = node_to_syscon(np);
+
+   if (IS_ERR(syscon))
+   return ERR_CAST(syscon);
+
+   return syscon->regmap;
+}
+
 static int syscon_probe(struct device_d *dev)
 {
struct syscon *syscon;
diff --git a/include/mfd/syscon.h b/include/mfd/syscon.h
index 651d4c2..63b893e 100644
--- a/include/mfd/syscon.h
+++ b/include/mfd/syscon.h
@@ -14,10 +14,13 @@
 #ifndef __MFD_SYSCON_H__
 #define __MFD_SYSCON_H__
 
+#include 
+
 #ifdef CONFIG_MFD_SYSCON
 void __iomem *syscon_base_lookup_by_pdevname(const char *s);
 void __iomem *syscon_base_lookup_by_phandle
(struct device_node *np, const char *property);
+struct regmap *syscon_node_to_regmap(struct device_node *np);
 #else
 static inline void __iomem *syscon_base_lookup_by_pdevname(const char *s)
 {
@@ -29,6 +32,11 @@ static inline void __iomem *syscon_base_lookup_by_phandle
 {
return ERR_PTR(-ENOSYS);
 }
+
+static inline struct regmap *syscon_node_to_regmap(struct device_node *np)
+{
+   return ERR_PTR(-ENOSYS);
+}
 #endif
 
 #endif
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 04/45] at91sam9x5ek: Add preliminary device tree support

2017-03-06 Thread Andrey Smirnov
Add basic code to build and pass board device tree blob to Barebox
initialization code.

Signed-off-by: Andrey Smirnov 
---
 arch/arm/boards/at91sam9x5ek/lowlevel.c | 7 ++-
 arch/arm/configs/at91sam9x5ek_defconfig | 2 ++
 arch/arm/dts/Makefile   | 2 ++
 arch/arm/dts/at91sam9x5ek.dts   | 9 +
 arch/arm/mach-at91/Kconfig  | 1 +
 5 files changed, 20 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/dts/at91sam9x5ek.dts

diff --git a/arch/arm/boards/at91sam9x5ek/lowlevel.c 
b/arch/arm/boards/at91sam9x5ek/lowlevel.c
index 9b5c926..acf80d7 100644
--- a/arch/arm/boards/at91sam9x5ek/lowlevel.c
+++ b/arch/arm/boards/at91sam9x5ek/lowlevel.c
@@ -6,11 +6,16 @@
 #include 
 #include 
 
+extern char __dtb_at91sam9x5ek_start[];
 
 ENTRY_FUNCTION(start_at91sam9x5ek, r0, r1, r2)
 {
+   void *fdt;
+
arm_cpu_lowlevel_init();
arm_setup_stack(AT91SAM9X5_SRAM_BASE + AT91SAM9X5_SRAM_SIZE - 16);
 
-   barebox_arm_entry(AT91_CHIPSELECT_1, at91sam9x5_get_ddram_size(), NULL);
+   fdt = __dtb_at91sam9x5ek_start - get_runtime_offset();
+
+   barebox_arm_entry(AT91_CHIPSELECT_1, at91sam9x5_get_ddram_size(), fdt);
 }
diff --git a/arch/arm/configs/at91sam9x5ek_defconfig 
b/arch/arm/configs/at91sam9x5ek_defconfig
index d6f18b2..0691145 100644
--- a/arch/arm/configs/at91sam9x5ek_defconfig
+++ b/arch/arm/configs/at91sam9x5ek_defconfig
@@ -51,6 +51,7 @@ CONFIG_CMD_OFTREE=y
 CONFIG_NET=y
 CONFIG_NET_NFS=y
 CONFIG_NET_NETCONSOLE=y
+CONFIG_OF_BAREBOX_DRIVERS=y
 CONFIG_DRIVER_NET_MACB=y
 CONFIG_NET_USB=y
 CONFIG_NET_USB_ASIX=y
@@ -74,6 +75,7 @@ CONFIG_USB_STORAGE=y
 CONFIG_MCI=y
 CONFIG_MCI_STARTUP=y
 CONFIG_MCI_ATMEL=y
+CONFIG_MFD_SYSCON=y
 CONFIG_LED=y
 CONFIG_LED_GPIO=y
 CONFIG_LED_TRIGGERS=y
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 70359d8..c9a0946 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -89,5 +89,7 @@ pbl-dtb-$(CONFIG_MACH_ZII_VF610_DEV) += \
vf610-zii-spu3-rev-a.dtb.o  \
vf610-zii-scu4-aib-rev-c.dtb.o
 
+pbl-dtb-$(CONFIG_MACH_AT91SAM9X5EK) += at91sam9x5ek.dtb.o
+
 
 clean-files := *.dtb *.dtb.S .*.dtc .*.pre .*.dts *.dtb.lzo
diff --git a/arch/arm/dts/at91sam9x5ek.dts b/arch/arm/dts/at91sam9x5ek.dts
new file mode 100644
index 000..db1bd67
--- /dev/null
+++ b/arch/arm/dts/at91sam9x5ek.dts
@@ -0,0 +1,9 @@
+/dts-v1/;
+
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 969182c..be88bfa 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -163,6 +163,7 @@ config ARCH_AT91SAM9G45
 config ARCH_AT91SAM9X5
bool "AT91SAM9X5"
select SOC_AT91SAM9X5
+   select OFDEVICE
 
 config ARCH_AT91SAM9N12
bool "AT91SAM9N12"
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 08/45] serial: atmel: Add DT compatibility table

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/serial/atmel.c | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/drivers/serial/atmel.c b/drivers/serial/atmel.c
index d47b926..0c174cd 100644
--- a/drivers/serial/atmel.c
+++ b/drivers/serial/atmel.c
@@ -446,8 +446,15 @@ static int atmel_serial_probe(struct device_d *dev)
return 0;
 }
 
+static const struct of_device_id __maybe_unused atmel_serial_dt_ids[] = {
+   { .compatible = "atmel,at91rm9200-usart" },
+   { .compatible = "atmel,at91sam9260-usart" },
+   { /* sentinel */ }
+};
+
 static struct driver_d atmel_serial_driver = {
 .name  = "atmel_usart",
 .probe = atmel_serial_probe,
+   .of_compatible = DRV_OF_COMPAT(atmel_serial_dt_ids),
 };
 console_platform_driver(atmel_serial_driver);
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 11/45] clk: Make COMMON_CLK_OF_PROVIDER depend on OFTREE

2017-03-06 Thread Andrey Smirnov
Make COMMON_CLK_OF_PROVIDER depend on OFTREE, this way checking for:

defined(CONFIG_OFTREE) && defined(CONFIG_COMMON_CLK_OF_PROVIDER)

can be simplified to just:

defined(CONFIG_COMMON_CLK_OF_PROVIDER)

Signed-off-by: Andrey Smirnov 
---
 drivers/clk/Kconfig| 1 +
 drivers/clk/clk-fixed-factor.c | 2 +-
 drivers/clk/clk-fixed.c| 2 +-
 drivers/clk/clk.c  | 2 +-
 drivers/clk/clkdev.c   | 2 +-
 include/linux/clk.h| 2 +-
 6 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 1cf0ccb..dedbf6c 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -10,6 +10,7 @@ config COMMON_CLK
 
 config COMMON_CLK_OF_PROVIDER
bool
+   depends on OFTREE
help
  Clock driver provides OF-Tree based clock lookup.
 
diff --git a/drivers/clk/clk-fixed-factor.c b/drivers/clk/clk-fixed-factor.c
index 40b63d6..a3dbf33 100644
--- a/drivers/clk/clk-fixed-factor.c
+++ b/drivers/clk/clk-fixed-factor.c
@@ -93,7 +93,7 @@ struct clk *clk_fixed_factor(const char *name,
return >clk;
 }
 
-#if defined(CONFIG_OFTREE) && defined(CONFIG_COMMON_CLK_OF_PROVIDER)
+#if defined(CONFIG_COMMON_CLK_OF_PROVIDER)
 /**
  * of_fixed_factor_clk_setup() - Setup function for simple fixed factor clock
  */
diff --git a/drivers/clk/clk-fixed.c b/drivers/clk/clk-fixed.c
index 8164005..f0f7fba 100644
--- a/drivers/clk/clk-fixed.c
+++ b/drivers/clk/clk-fixed.c
@@ -55,7 +55,7 @@ struct clk *clk_fixed(const char *name, int rate)
return >clk;
 }
 
-#if defined(CONFIG_OFTREE) && defined(CONFIG_COMMON_CLK_OF_PROVIDER)
+#if defined(CONFIG_COMMON_CLK_OF_PROVIDER)
 /**
  * of_fixed_clk_setup() - Setup function for simple fixed rate clock
  */
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 9189521..5bb147e 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -346,7 +346,7 @@ int clk_parent_set_rate(struct clk *clk, unsigned long rate,
return clk_set_rate(clk_get_parent(clk), rate);
 }
 
-#if defined(CONFIG_OFTREE) && defined(CONFIG_COMMON_CLK_OF_PROVIDER)
+#if defined(CONFIG_COMMON_CLK_OF_PROVIDER)
 /**
  * struct of_clk_provider - Clock provider registration structure
  * @link: Entry in global list of clock providers
diff --git a/drivers/clk/clkdev.c b/drivers/clk/clkdev.c
index 1bc5c6d..7f9f8f2 100644
--- a/drivers/clk/clkdev.c
+++ b/drivers/clk/clkdev.c
@@ -24,7 +24,7 @@
 
 static LIST_HEAD(clocks);
 
-#if defined(CONFIG_OFTREE) && defined(CONFIG_COMMON_CLK_OF_PROVIDER)
+#if defined(CONFIG_COMMON_CLK_OF_PROVIDER)
 struct clk *of_clk_get(struct device_node *np, int index)
 {
struct of_phandle_args clkspec;
diff --git a/include/linux/clk.h b/include/linux/clk.h
index f73b029..a061398 100644
--- a/include/linux/clk.h
+++ b/include/linux/clk.h
@@ -329,7 +329,7 @@ const struct of_device_id __clk_of_table_##name 
\
 __attribute__ ((unused,section (".__clk_of_table"))) \
= { .compatible = compat, .data = fn }
 
-#if defined(CONFIG_OFTREE) && defined(CONFIG_COMMON_CLK_OF_PROVIDER)
+#if defined(CONFIG_COMMON_CLK_OF_PROVIDER)
 int of_clk_add_provider(struct device_node *np,
struct clk *(*clk_src_get)(struct of_phandle_args *args,
   void *data),
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 01/45] at91: Fix bug/typo in debug_ll.h

2017-03-06 Thread Andrey Smirnov
Correct "COFNIG" to "CONFIG".

Signed-off-by: Andrey Smirnov 
---
 arch/arm/mach-at91/include/mach/debug_ll.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/mach-at91/include/mach/debug_ll.h 
b/arch/arm/mach-at91/include/mach/debug_ll.h
index 1a85ae4..42728a4 100644
--- a/arch/arm/mach-at91/include/mach/debug_ll.h
+++ b/arch/arm/mach-at91/include/mach/debug_ll.h
@@ -11,7 +11,7 @@
 #include 
 #include 
 
-#ifdef COFNIG_HAVE_AT91_DBGU0
+#ifdef CONFIG_HAVE_AT91_DBGU0
 #define UART_BASE  AT91_BASE_DBGU0
 #else
 #define UART_BASE  AT91_BASE_DBGU1
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 05/45] clocksource: at91: Move to 'drivers/clocksource'

2017-03-06 Thread Andrey Smirnov
Move PIT driver code to 'drivers/clocsource' and accomodate it by
adjusting Kconfig variables. Rename the file to 'timer-atmel-pit.c' to
re-align the driver with code in Linux kernel.

Signed-off-by: Andrey Smirnov 
---
 arch/arm/mach-at91/Kconfig | 7 ++-
 arch/arm/mach-at91/Makefile| 1 -
 drivers/clocksource/Kconfig| 4 
 drivers/clocksource/Makefile   | 1 +
 .../at91sam926x_time.c => drivers/clocksource/timer-atmel-pit.c| 0
 5 files changed, 7 insertions(+), 6 deletions(-)
 rename arch/arm/mach-at91/at91sam926x_time.c => 
drivers/clocksource/timer-atmel-pit.c (100%)

diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index be88bfa..fe0269d 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -15,20 +15,17 @@ config HAVE_AT91_LOWLEVEL_INIT
 config AT91SAM9_SMC
bool
 
-config AT91SAM9_TIMER
-   bool
-
 config SOC_AT91SAM9
bool
select CPU_ARM926T
select AT91SAM9_SMC
-   select AT91SAM9_TIMER
+   select CLOCKSOURCE_ATMEL_PIT
 
 config SOC_SAMA5
bool
select CPU_V7
select AT91SAM9_SMC
-   select AT91SAM9_TIMER
+   select CLOCKSOURCE_ATMEL_PIT
 
 config ARCH_TEXT_BASE
hex
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index c2991b0..1f63b09 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -19,7 +19,6 @@ obj-$(CONFIG_AT91SAM9_RESET) += at91sam9_reset.o
 obj-$(CONFIG_AT91SAM9G45_RESET) += at91sam9g45_reset.o
 
 obj-$(CONFIG_AT91SAM9_SMC) += sam9_smc.o
-obj-$(CONFIG_AT91SAM9_TIMER) += at91sam926x_time.o
 
 # CPU-specific support
 obj-$(CONFIG_ARCH_AT91RM9200)  += at91rm9200.o at91rm9200_time.o 
at91rm9200_devices.o
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index f1ab554..f3c3255 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -53,3 +53,7 @@ config CLOCKSOURCE_UEMD
 config CLOCKSOURCE_ROCKCHIP
bool
depends on ARCH_ROCKCHIP
+
+config CLOCKSOURCE_ATMEL_PIT
+   bool
+   depends on SOC_AT91SAM9 || SOC_SAMA5
diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index 39982ff..0564d8f 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -8,3 +8,4 @@ obj-$(CONFIG_CLOCKSOURCE_NOMADIK) += nomadik.o
 obj-$(CONFIG_CLOCKSOURCE_ORION)   += orion.o
 obj-$(CONFIG_CLOCKSOURCE_UEMD)+= uemd.o
 obj-$(CONFIG_CLOCKSOURCE_ROCKCHIP)+= rk_timer.o
+obj-$(CONFIG_CLOCKSOURCE_ATMEL_PIT) += timer-atmel-pit.o
diff --git a/arch/arm/mach-at91/at91sam926x_time.c 
b/drivers/clocksource/timer-atmel-pit.c
similarity index 100%
rename from arch/arm/mach-at91/at91sam926x_time.c
rename to drivers/clocksource/timer-atmel-pit.c
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 07/45] serial: atmel: Check result of clk_get()

2017-03-06 Thread Andrey Smirnov
Signed-off-by: Andrey Smirnov 
---
 drivers/serial/atmel.c | 5 +
 1 file changed, 5 insertions(+)

diff --git a/drivers/serial/atmel.c b/drivers/serial/atmel.c
index 4e4624e..d47b926 100644
--- a/drivers/serial/atmel.c
+++ b/drivers/serial/atmel.c
@@ -403,6 +403,11 @@ static int atmel_serial_init_port(struct console_device 
*cdev)
return -ENOENT;
 
uart->clk = clk_get(dev, "usart");
+   if (IS_ERR(uart->clk)) {
+   dev_err(dev, "Faield to get 'usart' clock\n");
+   return PTR_ERR(uart->clk);
+   }
+
clk_enable(uart->clk);
uart->uartclk = clk_get_rate(uart->clk);
 
-- 
2.9.3


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH 02/45] at91sam9x5ek: Convert to mult-image build

2017-03-06 Thread Andrey Smirnov
Convert AT91SAM9X5-EK board code to multi-image build process, similar
to how majority of i.MX board code is built.

Signed-off-by: Andrey Smirnov 
---
 arch/arm/Kconfig|  1 -
 arch/arm/boards/at91sam9x5ek/Makefile   |  1 +
 arch/arm/boards/at91sam9x5ek/lowlevel.c | 16 +
 arch/arm/configs/at91sam9x5ek_defconfig |  4 +++-
 arch/arm/mach-at91/Kconfig  | 40 +++--
 images/Makefile |  1 +
 images/Makefile.at91|  7 ++
 7 files changed, 51 insertions(+), 19 deletions(-)
 create mode 100644 arch/arm/boards/at91sam9x5ek/lowlevel.c
 create mode 100644 images/Makefile.at91

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index e4663ea..cfa9214 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -52,7 +52,6 @@ config ARCH_AT91
select GPIOLIB
select CLKDEV_LOOKUP
select HAS_DEBUG_LL
-   select HAVE_MACH_ARM_HEAD
select HAVE_CLK
select PINCTRL_AT91
 
diff --git a/arch/arm/boards/at91sam9x5ek/Makefile 
b/arch/arm/boards/at91sam9x5ek/Makefile
index 559df8f..4939b7e 100644
--- a/arch/arm/boards/at91sam9x5ek/Makefile
+++ b/arch/arm/boards/at91sam9x5ek/Makefile
@@ -1,3 +1,4 @@
 obj-y += init.o
 obj-y += hw_version.o
 bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC) += defaultenv-at91sam9x5ek
+lwl-y += lowlevel.o
diff --git a/arch/arm/boards/at91sam9x5ek/lowlevel.c 
b/arch/arm/boards/at91sam9x5ek/lowlevel.c
new file mode 100644
index 000..9b5c926
--- /dev/null
+++ b/arch/arm/boards/at91sam9x5ek/lowlevel.c
@@ -0,0 +1,16 @@
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+
+ENTRY_FUNCTION(start_at91sam9x5ek, r0, r1, r2)
+{
+   arm_cpu_lowlevel_init();
+   arm_setup_stack(AT91SAM9X5_SRAM_BASE + AT91SAM9X5_SRAM_SIZE - 16);
+
+   barebox_arm_entry(AT91_CHIPSELECT_1, at91sam9x5_get_ddram_size(), NULL);
+}
diff --git a/arch/arm/configs/at91sam9x5ek_defconfig 
b/arch/arm/configs/at91sam9x5ek_defconfig
index 6ee0052..76ee3d9 100644
--- a/arch/arm/configs/at91sam9x5ek_defconfig
+++ b/arch/arm/configs/at91sam9x5ek_defconfig
@@ -1,12 +1,14 @@
 CONFIG_ARCH_AT91SAM9X5=y
+CONFIG_AT91_MULTI_BOARDS=y
+CONFIG_MACH_AT91SAM9X5EK=y
 CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x4
 CONFIG_AEABI=y
 CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
-CONFIG_PBL_IMAGE=y
 CONFIG_MMU=y
 CONFIG_MALLOC_SIZE=0xa0
 CONFIG_EXPERIMENTAL=y
 CONFIG_MALLOC_TLSF=y
+CONFIG_RELOCATABLE=y
 CONFIG_PROMPT="9G20-EK:"
 CONFIG_GLOB=y
 CONFIG_PROMPT_HUSH_PS2="y"
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index c45fc4d..969182c 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -143,18 +143,22 @@ config ARCH_AT91SAM9261
 config ARCH_AT91SAM9263
bool "AT91SAM9263"
select SOC_AT91SAM9263
+   select HAVE_MACH_ARM_HEAD
 
 config ARCH_AT91SAM9G10
bool "AT91SAM9G10"
select SOC_AT91SAM9261
+   select HAVE_MACH_ARM_HEAD
 
 config ARCH_AT91SAM9G20
bool "AT91SAM9G20"
select SOC_AT91SAM9260
+   select HAVE_MACH_ARM_HEAD
 
 config ARCH_AT91SAM9G45
bool "AT91SAM9G45 or AT91SAM9M10"
select SOC_AT91SAM9G45
+   select HAVE_MACH_ARM_HEAD
 
 config ARCH_AT91SAM9X5
bool "AT91SAM9X5"
@@ -163,6 +167,7 @@ config ARCH_AT91SAM9X5
 config ARCH_AT91SAM9N12
bool "AT91SAM9N12"
select SOC_AT91SAM9N12
+   select HAVE_MACH_ARM_HEAD
 
 config ARCH_SAMA5D3
bool "SAMA5D3x"
@@ -170,6 +175,7 @@ config ARCH_SAMA5D3
select HAVE_AT91_DBGU1
select HAS_MACB
select AT91SAM9G45_RESET
+   select HAVE_MACH_ARM_HEAD
 
 config ARCH_SAMA5D4
bool "SAMA5D4"
@@ -177,6 +183,7 @@ config ARCH_SAMA5D4
select HAVE_AT91_DBGU2
select HAS_MACB
select AT91SAM9G45_RESET
+   select HAVE_MACH_ARM_HEAD
 
 endchoice
 
@@ -432,23 +439,6 @@ endif
 
 # --
 
-if ARCH_AT91SAM9X5
-
-choice
-   prompt "AT91SAM9x5 Series Board Type"
-
-config MACH_AT91SAM9X5EK
-   bool "Atmel AT91SAM9x5 Series Evaluation Kit"
-   help
- Select this if you re using Atmel's AT91SAM9x5-EK Evaluation Kit.
- Supported chips are sam9g15, sam9g25, sam9x25, sam9g35 and sam9x35.
-
-endchoice
-
-endif
-
-# --
-
 if ARCH_AT91SAM9N12
 
 choice
@@ -507,6 +497,22 @@ endif
 
 # --
 
+
+config AT91_MULTI_BOARDS
+   bool "Allow multiple boards to be selected"
+   select HAVE_PBL_MULTI_IMAGES
+
+if AT91_MULTI_BOARDS
+
+config MACH_AT91SAM9X5EK
+   bool "Atmel AT91SAM9x5 Series Evaluation Kit"
+   depends on ARCH_AT91SAM9X5
+   help
+ Select this if you re using Atmel's AT91SAM9x5-EK Evaluation Kit.
+ Supported chips are sam9g15, sam9g25, sam9x25, sam9g35 and sam9x35.
+
+endif
+
 comment "AT91 Board 

[PATCH 00/45] AT91, at91sam9x5ek updates

2017-03-06 Thread Andrey Smirnov
Hi everyone,

I recently had a chance to work with at91sam9x5ek board and as a part
of that effort I converted the code to support features found in
Barebox for i.MX based SoCs. Most notably this patchset converts
at91sam9x5ek to use multi-image PBL build process as well as adds
support for board initialization from attached devicetree blob.

Sascha, at least for now, all of the patches, in chronological order,
are included in this submission. However if this proves to be too
burdensome to review, I'd be more than happy to split it into several
individual submissions. One such division could be:

   - Generic bug fixes/infrastructure enhancements
   - Peripheral drivers updates
   - at91sam9x5ek specific changes

Please let me know if that is preferrable.

Thank you,
Andrey Smirnov


Andrey Smirnov (45):
  at91: Fix bug/typo in debug_ll.h
  at91sam9x5ek: Convert to mult-image build
  at91sam9x5ek: Add CONFIG_KALLSYMS to defconfig
  at91sam9x5ek: Add preliminary device tree support
  clocksource: at91: Move to 'drivers/clocksource'
  clocksource: at91: Add DT compatibility table
  serial: atmel: Check result of clk_get()
  serial: atmel: Add DT compatibility table
  regmap: Implement syscon_node_to_regmap()
  clk: Port two helper functions from Linux
  clk: Make COMMON_CLK_OF_PROVIDER depend on OFTREE
  clk: No-op CLK_OF_DECLARE if not enabled
  clk: at91: Port at91 DT clock code
  at91sam9x5ek: Convert to use DT clock tree
  at91sam9x5ek: Remove at91sam9x5ek_mem_init()
  at91sam9x5ek: Configure LEDs in DT
  pinctrl-at91: Fix a bug in at91_pinctrl_set_conf()
  at91: Enable PINCTRL for SOC_AT91SAM9
  at91sam9x5ek: Configure I2C via DT
  mci: Allow parsing for explicit DT node
  mci: atmel_mci: Add DT support
  at91sam9x5ek: Configure MMC in DT
  of: base: Use scoring in DT device matching
  pinctrl: at91: Fix a bug in at91_pinctrl_set_state
  pinctrl: at91: Implement .get_direction hook
  spi: atmel_spi: Add DT support
  spi: atmel_spi: Configure CS GPIO as output
  spi: atmel_spi: Use VERSION register instead of CPU type
  at91sam9x5ek: Configure SPI in DT
  w1-gpio: Add DT support
  at91sam9x5ek: Configure 1-wire in DT
  usb: ohci-at91: Check result of clk_get()
  usb: ohci-at91: Convert global variables to private data
  usb: ohci-at91: Check result of clk_enable()
  usb: ohci-at91: Add DT support
  usb/host: Allow USB_OHCI_AT91 even if USB_OHCI is disabled
  usb: ehci-atmel: Check result of clk_enable()
  usb: echi-atmel: Convert global variables to private data
  usb: ehci-atmel: Zero ehci_data before using it
  usb: echi-atmel: Check result of ehci_register()
  usb: echi-atmel: Add DT support
  at91sam9x5ek: Configure USB in DT
  net: macb: Add DT support
  at91sam9x5ek: Configure Ethernet in DT
  at91sam9x5ek: Configure NAND in DT

 arch/arm/Kconfig   |   2 +-
 arch/arm/boards/at91sam9x5ek/Makefile  |   1 +
 arch/arm/boards/at91sam9x5ek/hw_version.c  |   6 +-
 arch/arm/boards/at91sam9x5ek/hw_version.h  |   1 -
 arch/arm/boards/at91sam9x5ek/init.c| 226 ++--
 arch/arm/boards/at91sam9x5ek/lowlevel.c|  21 +
 arch/arm/configs/at91sam9x5ek_defconfig|   8 +-
 arch/arm/dts/Makefile  |   2 +
 arch/arm/dts/at91sam9x5ek.dts  |  72 +++
 arch/arm/mach-at91/Kconfig |  73 ++-
 arch/arm/mach-at91/Makefile|  10 +-
 arch/arm/mach-at91/at91sam9x5.c| 311 ---
 arch/arm/mach-at91/include/mach/board.h|   6 +-
 arch/arm/mach-at91/include/mach/debug_ll.h |   2 +-
 arch/arm/mach-at91/setup.c |   4 +-
 drivers/clk/Kconfig|   1 +
 drivers/clk/Makefile   |   1 +
 drivers/clk/at91/Makefile  |  15 +
 drivers/clk/at91/clk-generated.c   | 323 
 drivers/clk/at91/clk-h32mx.c   | 125 +
 drivers/clk/at91/clk-main.c| 576 +
 drivers/clk/at91/clk-master.c  | 245 +
 drivers/clk/at91/clk-peripheral.c  | 430 +++
 drivers/clk/at91/clk-pll.c | 516 ++
 drivers/clk/at91/clk-plldiv.c  | 135 +
 drivers/clk/at91/clk-programmable.c| 254 +
 drivers/clk/at91/clk-slow.c| 108 
 drivers/clk/at91/clk-smd.c | 172 ++
 drivers/clk/at91/clk-system.c  | 160 ++
 drivers/clk/at91/clk-usb.c | 397 ++
 drivers/clk/at91/clk-utmi.c| 138 +
 drivers/clk/at91/pmc.c |  41 ++
 drivers/clk/at91/pmc.h |  27 +
 drivers/clk/at91/sckc.c| 485 

[PATCH] scripts: imx imx-usb-loader: add support for imx23

2017-03-06 Thread Oleksij Rempel
imx23 is supported by mxs-usb-loader, but it makes no sense
to maintain separate tool for this. Espesially if we need some identical
functionality like usb path filtering.

This code was rewrtitten from mxs-usb-loader.

Signed-off-by: Oleksij Rempel 
---
 scripts/imx/imx-usb-loader.c | 116 +--
 1 file changed, 101 insertions(+), 15 deletions(-)

diff --git a/scripts/imx/imx-usb-loader.c b/scripts/imx/imx-usb-loader.c
index b2c9f8f5a..dfce3c0d9 100644
--- a/scripts/imx/imx-usb-loader.c
+++ b/scripts/imx/imx-usb-loader.c
@@ -69,6 +69,9 @@ struct mach_id {
 #define HDR_MX53   2
unsigned char header_type;
unsigned short max_transfer;
+#define DEV_IMX0
+#define DEV_MXS1
+   unsigned char dev_type;
 };
 
 struct usb_work {
@@ -87,7 +90,9 @@ struct mach_id imx_ids[] = {
.vid = 0x066f,
.pid = 0x3780,
.name = "i.MX23",
-   .mode = MODE_BULK,
+   .mode = MODE_HID,
+   .max_transfer = 1024,
+   .dev_type = DEV_MXS,
}, {
.vid = 0x15a2,
.pid = 0x0030,
@@ -180,6 +185,17 @@ struct sdp_command  {
uint8_t rsvd;
 } __attribute__((packed));
 
+#define MXS_CMD_FW_DOWNLOAD0x02
+struct mxs_command {
+   uint32_tsign;   /* Signature */
+   uint32_ttag;/* Tag */
+   uint32_tsize;   /* Payload size */
+   uint8_t flags;  /* Flags (host to device) */
+   uint8_t rsvd[2];/* Reserved */
+   uint8_t cmd;/* Firmware download */
+   uint32_tdw_size;/* Download size */
+} __attribute__((packed));
+
 static struct mach_id *imx_device(unsigned short vid, unsigned short pid)
 {
int i;
@@ -1343,6 +1359,72 @@ static int write_mem(const struct config_data *data, 
uint32_t addr,
return modify_memory(addr, val, width, set_bits, clear_bits);
 }
 
+/* MXS section */
+static int mxs_load_file(libusb_device_handle *dev, uint8_t *data, int size)
+{
+   static struct mxs_command dl_command;
+   int last_trans, err;
+   unsigned char tmp[64];
+   void *p;
+   int cnt;
+
+   dl_command.sign = htonl(0x424c5443); /* Signature: BLTC */
+   dl_command.tag = htonl(0x1);
+   dl_command.size = htonl(size);
+   dl_command.flags = 0;
+   dl_command.rsvd[0] = 0;
+   dl_command.rsvd[1] = 0;
+   dl_command.cmd = MXS_CMD_FW_DOWNLOAD;
+   dl_command.dw_size = htonl(size);
+
+   err = transfer(1, (unsigned char *) _command, 20, _trans);
+   if (err) {
+   printf("transfer error at init step: err=%i, last_trans=%i\n",
+  err, last_trans);
+   return err;
+   }
+
+   p = data;
+   cnt = size;
+
+   while (1) {
+   int now = get_min(cnt, usb_id->mach_id->max_transfer);
+
+   if (!now)
+   break;
+
+   err = transfer(2, p, now, );
+   if (err) {
+   printf("dl_command err=%i, last_trans=%i\n", err, now);
+   return err;
+   }
+
+   p += now;
+   cnt -= now;
+   }
+
+   err = transfer(3, tmp, sizeof(tmp), _trans);
+   if (err < 0)
+   printf("transfer error at final stage: err=%i, last_trans=%i\n",
+  err, last_trans);
+
+   return err;
+}
+
+static int mxs_work(struct usb_work *curr)
+{
+   unsigned fsize = 0;
+   unsigned char *buf = NULL;
+   int ret;
+
+   ret = read_file(curr->filename, , );
+   if (ret < 0)
+   return ret;
+
+   return mxs_load_file(usb_dev_handle, buf, fsize);
+}
+/* end of mxs section */
+
 static int parse_initfile(const char *filename)
 {
struct config_data data = {
@@ -1452,22 +1534,26 @@ int main(int argc, char *argv[])
 
usb_id->mach_id = mach;
 
-   err = do_status();
-   if (err) {
-   printf("status failed\n");
-   goto out;
-   }
-
-   if (initfile) {
-   err = parse_initfile(initfile);
-   if (err)
+   if (mach->dev_type == DEV_MXS) {
+   ret = mxs_work();
+   } else {
+   err = do_status();
+   if (err) {
+   printf("status failed\n");
goto out;
-   }
+   }
 
-   err = do_irom_download(, verify);
-   if (err) {
-   err = do_status();
-   goto out;
+   if (initfile) {
+   err = parse_initfile(initfile);
+   if (err)
+   goto out;
+   }
+
+   err = do_irom_download(, verify);
+   if (err) {
+   err = do_status();
+  

[PATCH 2/2 v2] efi: add serial driver support

2017-03-06 Thread Jean-Christophe PLAGNIOL-VILLARD
So now we can stop to use the efi-stdio as this driver
print on the Framebuffer and the serial at the same time.

This is specially usefull if we want to use the framebuffer via efi-gop for
something else.

Do not forget to disable the efi-stdio device before enabling the console
otherwise you will get double printing.

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD 
---
Fix copyright

 drivers/serial/Kconfig  |   4 +
 drivers/serial/Makefile |   1 +
 drivers/serial/serial_efi.c | 221 
 3 files changed, 226 insertions(+)
 create mode 100644 drivers/serial/serial_efi.c

diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index ced30530a..cfddc2ee9 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -21,6 +21,10 @@ config DRIVER_SERIAL_AR933X
  If you have an Atheros AR933X SOC based board and want to use the
  built-in UART of the SoC, say Y to this option.
 
+config DRIVER_SERIAL_EFI
+   bool "EFI serial"
+   depends on EFI_BOOTUP
+
 config DRIVER_SERIAL_IMX
depends on ARCH_IMX
default y
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
index 7d1bae195..3d9f735ed 100644
--- a/drivers/serial/Makefile
+++ b/drivers/serial/Makefile
@@ -1,6 +1,7 @@
 obj-$(CONFIG_DRIVER_SERIAL_ARM_DCC)+= arm_dcc.o
 obj-$(CONFIG_SERIAL_AMBA_PL011)+= amba-pl011.o
 obj-$(CONFIG_DRIVER_SERIAL_AR933X) += serial_ar933x.o
+obj-$(CONFIG_DRIVER_SERIAL_EFI)+= serial_efi.o
 obj-$(CONFIG_DRIVER_SERIAL_IMX)+= serial_imx.o
 obj-$(CONFIG_DRIVER_SERIAL_STM378X)+= stm-serial.o
 obj-$(CONFIG_DRIVER_SERIAL_ATMEL)  += atmel.o
diff --git a/drivers/serial/serial_efi.c b/drivers/serial/serial_efi.c
new file mode 100644
index 0..f0a2b22c2
--- /dev/null
+++ b/drivers/serial/serial_efi.c
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 2017 Jean-Christophe PLAGNIOL-VILLARD 
+ *
+ * Under GPLv2 Only
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/*
+ * define for Control bits, grouped by read only, write only, and read write
+ *
+ * Read Only
+ */
+#define EFI_SERIAL_CLEAR_TO_SEND0x0010
+#define EFI_SERIAL_DATA_SET_READY   0x0020
+#define EFI_SERIAL_RING_INDICATE0x0040
+#define EFI_SERIAL_CARRIER_DETECT   0x0080
+#define EFI_SERIAL_INPUT_BUFFER_EMPTY   0x0100
+#define EFI_SERIAL_OUTPUT_BUFFER_EMPTY  0x0200
+
+/*
+ * Write Only
+ */
+#define EFI_SERIAL_REQUEST_TO_SEND  0x0002
+#define EFI_SERIAL_DATA_TERMINAL_READY  0x0001
+
+/*
+ * Read Write
+ */
+#define EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE 0x1000
+#define EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE 0x2000
+#define EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE 0x4000
+
+typedef enum {
+   DefaultParity,
+   NoParity,
+   EvenParity,
+   OddParity,
+   MarkParity,
+   SpaceParity
+} efi_parity_type;
+
+typedef enum {
+   DefaultStopBits,
+   OneStopBit,
+   OneFiveStopBits,
+   TwoStopBits
+} efi_stop_bits_type;
+
+struct efi_serial_io_mode {
+   uint32_t controlmask;
+   uint32_t timeout;
+   uint64_t baudrate;
+   uint32_t receivefifodepth;
+   uint32_t databits;
+   uint32_t parity;
+   uint32_t stopbits;
+};
+
+struct efi_serial_io_protocol {
+   uint32_t revision;
+
+   efi_status_t (EFIAPI *reset) (struct efi_serial_io_protocol *This);
+   efi_status_t (EFIAPI *set_attributes) (struct efi_serial_io_protocol 
*This,
+   uint64_t baudrate, uint32_t receivefifodepth,
+   uint32_t timeout, efi_parity_type parity,
+   uint8_t databits, efi_stop_bits_type stopbits);
+   efi_status_t (EFIAPI *setcontrol) (struct efi_serial_io_protocol *This,
+   uint32_t control);
+   efi_status_t (EFIAPI *getcontrol) (struct efi_serial_io_protocol *This,
+   uint32_t *control);
+   efi_status_t (EFIAPI *write) (struct efi_serial_io_protocol *This,
+   unsigned long *buffersize, void *buffer);
+   efi_status_t (EFIAPI *read) (struct efi_serial_io_protocol *This,
+   unsigned long *buffersize, void *buffer);
+
+   struct efi_serial_io_mode *mode;
+};
+
+/*
+ * We wrap our port structure around the generic console_device.
+ */
+struct efi_serial_port {
+   struct efi_serial_io_protocol *serial;
+   struct console_device   uart;   /* uart */
+   struct efi_device *efidev;
+};
+
+static inline struct efi_serial_port *
+to_efi_serial_port(struct console_device *uart)
+{
+   return container_of(uart, struct efi_serial_port, uart);
+}
+
+static int efi_serial_setbaudrate(struct console_device *cdev, int baudrate)
+{
+   struct efi_serial_port *uart = 

Re: [PATCH 0/2] add support of efi Serial IO and Graphics Output Protocol

2017-03-06 Thread Sascha Hauer
On Mon, Mar 06, 2017 at 06:02:11AM +0100, Jean-Christophe PLAGNIOL-VILLARD 
wrote:
> Hi,
> 
> The following changes since commit d92ed454107b4d6f0d30fa0271da191ae5911d18:
> 
>   Merge branch 'for-next/video' into next (2017-02-27 08:51:08 +0100)
> 
> are available in the git repository at:
> 
>   git://git.jcrosoft.org/barebox.git delivery/serial-gop
> 
> for you to fetch changes up to 6ecbe33539f20076bbc781b9e20a5a54d504fdf3:
> 
>   efi: add serial driver support (2017-03-01 22:11:37 +0800)

Applied, thanks


Sascha

> 
> 
> Jean-Christophe PLAGNIOL-VILLARD (2):
>   video: add EFI Graphics Output Protocol support
>   efi: add serial driver support
> 
>  drivers/serial/Kconfig  |   4 +++
>  drivers/serial/Makefile |   1 +
>  drivers/serial/serial_efi.c | 241 
> 
>  drivers/video/Kconfig   |   4 +++
>  drivers/video/Makefile  |   2 ++
>  drivers/video/efi_gop.c | 267 
> +++
>  6 files changed, 519 insertions(+)
>  create mode 100644 drivers/serial/serial_efi.c
>  create mode 100644 drivers/video/efi_gop.c
> 
> Best Regards,
> J.
> 
> ___
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.   | |
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |

___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


Re: [PATCH 1/1] video: sdl fix typo

2017-03-06 Thread Sascha Hauer
On Mon, Mar 06, 2017 at 06:42:13AM +0100, Jean-Christophe PLAGNIOL-VILLARD 
wrote:
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD 
> ---
>  drivers/video/sdl.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Applied, thanks

Sascha

> 
> diff --git a/drivers/video/sdl.c b/drivers/video/sdl.c
> index 5e1dc8e57..8f5b409ef 100644
> --- a/drivers/video/sdl.c
> +++ b/drivers/video/sdl.c
> @@ -53,7 +53,7 @@ static int sdlfb_probe(struct device_d *dev)
>   fb->yres = fb->mode->yres;
>  
>   fb->priv = fb;
> - fb->fbops = _ops,
> + fb->fbops = _ops;
>  
>   fb->dev.parent = dev;
>   fb->screen_base = xzalloc(fb->xres * fb->yres *
> -- 
> 2.11.0
> 
> 
> ___
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.   | |
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |

___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


Re: [RFC PATCH 0/2] use gnuhash to speed up device/driver match

2017-03-06 Thread Sascha Hauer
On Sat, Mar 04, 2017 at 08:12:41AM +0100, Jean-Christophe PLAGNIOL-VILLARD 
wrote:
> Hi,
> 
>   The following patch series use the gnu hash to speedup device/driver
>   matching.
> 
>   String compare is slow so we will calculate at runtime a hash that we
>   can compare quickly to speed up the match
> 
>   in a second step we could speed up this more by calculating the hash
>   at compile time

On a i.MX53 quickstart board this patch reduces startup time from 115.9ms
to 115.4ms. On a i.MX35 board the startup time is reduced by 72us. I
don't think this is a valuable gain. Do you have any situation where you
really spend significant time in strcmp?

Sascha

-- 
Pengutronix e.K.   | |
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |

___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox