summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2012-06-06 14:11:57 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2012-06-06 14:11:57 +0200
commit497d1c49f4b75a6827bb400513d53a39dc8bb57c (patch)
tree3227133463cb942c4d5be45108aab82e79daa98c /drivers
parent94418c2d0d3d7dbaa6995fb53f00a5d5fc9f4028 (diff)
parent4024d9ca11295b63dd2b9b795a8f1019b9bba64a (diff)
downloadbarebox-497d1c49f4b75a6827bb400513d53a39dc8bb57c.tar.gz
barebox-497d1c49f4b75a6827bb400513d53a39dc8bb57c.tar.xz
Merge branch 'next'
Diffstat (limited to 'drivers')
-rw-r--r--drivers/base/resource.c2
-rw-r--r--drivers/mtd/nand/nand_imx.c2
-rw-r--r--drivers/mtd/nand/nand_s3c24xx.c10
-rw-r--r--drivers/nor/cfi_flash.h10
-rw-r--r--drivers/serial/Kconfig2
-rw-r--r--drivers/serial/serial_s3c.c55
-rw-r--r--drivers/spi/imx_spi.c4
-rw-r--r--drivers/spi/spi.c2
-rw-r--r--drivers/usb/host/ehci-hcd.c2
-rw-r--r--drivers/usb/host/ohci-hcd.c4
-rw-r--r--drivers/usb/storage/usb.c2
11 files changed, 69 insertions, 26 deletions
diff --git a/drivers/base/resource.c b/drivers/base/resource.c
index b31c7d7e1a..347b2f01f0 100644
--- a/drivers/base/resource.c
+++ b/drivers/base/resource.c
@@ -113,8 +113,10 @@ struct device_d *add_usb_ehci_device(int id, resource_size_t hccr,
res = xzalloc(sizeof(struct resource) * 2);
res[0].start = hccr;
+ res[0].size = 0x40;
res[0].flags = IORESOURCE_MEM;
res[1].start = hcor;
+ res[1].size = 0xc0;
res[1].flags = IORESOURCE_MEM;
return add_generic_device_res("ehci", id, res, 2, pdata);
diff --git a/drivers/mtd/nand/nand_imx.c b/drivers/mtd/nand/nand_imx.c
index 85cfbeda95..e75ffbc819 100644
--- a/drivers/mtd/nand/nand_imx.c
+++ b/drivers/mtd/nand/nand_imx.c
@@ -1135,7 +1135,7 @@ static int __init imxnd_probe(struct device_d *dev)
this->ecc.layout = oob_smallpage;
- /* NAND bus width determines access funtions used by upper layer */
+ /* NAND bus width determines access functions used by upper layer */
if (pdata->width == 2) {
this->options |= NAND_BUSWIDTH_16;
this->ecc.layout = &nandv1_hw_eccoob_smallpage;
diff --git a/drivers/mtd/nand/nand_s3c24xx.c b/drivers/mtd/nand/nand_s3c24xx.c
index dbf2e1420e..c6297011a3 100644
--- a/drivers/mtd/nand/nand_s3c24xx.c
+++ b/drivers/mtd/nand/nand_s3c24xx.c
@@ -36,7 +36,7 @@
#include <io.h>
#include <asm-generic/errno.h>
-#ifdef CONFIG_S3C24XX_NAND_BOOT
+#ifdef CONFIG_S3C_NAND_BOOT
# define __nand_boot_init __bare_init
# ifndef BOARD_DEFAULT_NAND_TIMING
# define BOARD_DEFAULT_NAND_TIMING 0x0737
@@ -49,7 +49,7 @@
* Define this symbol for testing purpose. It will add a command to read an
* image from the NAND like it the boot strap code will do.
*/
-#define CONFIG_NAND_S3C24XX_BOOT_DEBUG
+#define CONFIG_NAND_S3C_BOOT_DEBUG
/* NAND controller's register */
@@ -497,7 +497,7 @@ static struct driver_d s3c24x0_nand_driver = {
.probe = s3c24x0_nand_probe,
};
-#ifdef CONFIG_S3C24XX_NAND_BOOT
+#ifdef CONFIG_S3C_NAND_BOOT
static void __nand_boot_init wait_for_completion(void __iomem *host)
{
@@ -603,7 +603,7 @@ void __nand_boot_init s3c24x0_nand_load_image(void *dest, int size, int page)
disable_nand_controller(host);
}
-#ifdef CONFIG_NAND_S3C24XX_BOOT_DEBUG
+#ifdef CONFIG_NAND_S3C_BOOT_DEBUG
#include <command.h>
static int do_nand_boot_test(int argc, char *argv[])
@@ -636,7 +636,7 @@ BAREBOX_CMD_START(nand_boot_test)
BAREBOX_CMD_END
#endif
-#endif /* CONFIG_S3C24XX_NAND_BOOT */
+#endif /* CONFIG_S3C_NAND_BOOT */
/*
* Main initialization routine
diff --git a/drivers/nor/cfi_flash.h b/drivers/nor/cfi_flash.h
index df482b6c56..fec08940ab 100644
--- a/drivers/nor/cfi_flash.h
+++ b/drivers/nor/cfi_flash.h
@@ -30,7 +30,17 @@
#include <linux/mtd/mtd.h>
typedef unsigned long flash_sect_t;
+
+#if defined(CONFIG_DRIVER_CFI_BANK_WIDTH_8)
typedef u64 cfiword_t;
+#elif defined(CONFIG_DRIVER_CFI_BANK_WIDTH_4)
+typedef u32 cfiword_t;
+#elif defined(CONFIG_DRIVER_CFI_BANK_WIDTH_2)
+typedef u16 cfiword_t;
+#else
+typedef u8 cfiword_t;
+#endif
+
struct cfi_cmd_set;
/*-----------------------------------------------------------------------
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 186b59638f..a9383da9d7 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -80,7 +80,7 @@ config DRIVER_SERIAL_PL010
config DRIVER_SERIAL_S3C
bool "Samsung S3C serial driver"
- depends on ARCH_S3C24xx
+ depends on ARCH_SAMSUNG
default y
help
Say Y here if you want to use the CONS on a Samsung S3C CPU
diff --git a/drivers/serial/serial_s3c.c b/drivers/serial/serial_s3c.c
index 2bdc1df696..7a9b355704 100644
--- a/drivers/serial/serial_s3c.c
+++ b/drivers/serial/serial_s3c.c
@@ -40,6 +40,17 @@
#define UTXH 0x20 /* transmitt */
#define URXH 0x24 /* receive */
#define UBRDIV 0x28 /* baudrate generator */
+#ifdef S3C_UART_HAS_UBRDIVSLOT
+# define UBRDIVSLOT 0x2c /* baudrate slot generator */
+#endif
+#ifdef S3C_UART_HAS_UINTM
+# define UINTM 0x38 /* interrupt mask register */
+#endif
+
+#ifndef S3C_UART_CLKSEL
+/* Use pclk */
+# define S3C_UART_CLKSEL 0
+#endif
struct s3c_uart {
void __iomem *regs;
@@ -51,26 +62,32 @@ struct s3c_uart {
static unsigned s3c_get_arch_uart_input_clock(void __iomem *base)
{
unsigned reg = readw(base + UCON);
-
- switch (reg & 0xc00) {
- case 0x000:
- case 0x800:
- return s3c_get_pclk();
- case 0x400:
- break; /* TODO UEXTCLK */
- case 0xc00:
- break; /* TODO FCLK/n */
- }
-
- return 0; /* not nice, but we can't emit an error message! */
+ reg = (reg >> 10) & 0x3;
+ return s3c_get_uart_clk(reg);
}
+#ifdef S3C_UART_HAS_UBRDIVSLOT
+/*
+ * This table takes the fractional value of the baud divisor and gives
+ * the recommended setting for the UDIVSLOT register. Refer the datasheet
+ * for further details
+ */
+static const uint16_t udivslot_table[] __maybe_unused = {
+ 0x0000, 0x0080, 0x0808, 0x0888, 0x2222, 0x4924, 0x4A52, 0x54AA,
+ 0x5555, 0xD555, 0xD5D5, 0xDDD5, 0xDDDD, 0xDFDD, 0xDFDF, 0xFFDF,
+};
+#endif
+
static int s3c_serial_setbaudrate(struct console_device *cdev, int baudrate)
{
struct s3c_uart *priv = to_s3c_uart(cdev);
void __iomem *base = priv->regs;
unsigned val;
+#ifdef S3C_UART_HAS_UBRDIVSLOT
+ val = s3c_get_arch_uart_input_clock(base) / baudrate;
+ writew(udivslot_table[val & 15], base + UBRDIVSLOT);
+#endif
val = s3c_get_arch_uart_input_clock(base) / (16 * baudrate) - 1;
writew(val, base + UBRDIV);
@@ -88,11 +105,15 @@ static int s3c_serial_init_port(struct console_device *cdev)
/* Normal,No parity,1 stop,8 bit */
writeb(0x03, base + ULCON);
- /*
- * tx=level,rx=edge,disable timeout int.,enable rx error int.,
- * normal,interrupt or polling
- */
- writew(0x0245, base + UCON);
+
+ /* tx=level,rx=edge,disable timeout int.,enable rx error int.,
+ * normal, interrupt or polling, no pre-divider */
+ writew(0x0245 | ((S3C_UART_CLKSEL) << 10), base + UCON);
+
+#ifdef S3C_UART_HAS_UINTM
+ /* 'interrupt or polling mode' for both directions */
+ writeb(0xf, base + UINTM);
+#endif
#ifdef CONFIG_DRIVER_SERIAL_S3C_AUTOSYNC
writeb(0x10, base + UMCON); /* enable auto flow control */
diff --git a/drivers/spi/imx_spi.c b/drivers/spi/imx_spi.c
index 3b33b669fb..42358f2e6a 100644
--- a/drivers/spi/imx_spi.c
+++ b/drivers/spi/imx_spi.c
@@ -145,6 +145,10 @@ struct spi_imx_devtype_data {
static int imx_spi_setup(struct spi_device *spi)
{
+ struct imx_spi *imx = container_of(spi->master, struct imx_spi, master);
+
+ imx->chipselect(spi, 0);
+
debug("%s mode 0x%08x bits_per_word: %d speed: %d\n",
__FUNCTION__, spi->mode, spi->bits_per_word,
spi->max_speed_hz);
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 7a8aed42e2..a7fe10cba0 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -78,6 +78,8 @@ struct spi_device *spi_new_device(struct spi_master *master,
proxy->bits_per_word = chip->bits_per_word ? chip->bits_per_word : 8;
proxy->dev.platform_data = chip->platform_data;
strcpy(proxy->dev.name, chip->name);
+ /* allocate a free id for this chip */
+ proxy->dev.id = DEVICE_ID_DYNAMIC;
proxy->dev.type_data = proxy;
dev_add_child(master->dev, &proxy->dev);
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index ae2b41ed53..a2473a9141 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -858,7 +858,7 @@ static int ehci_probe(struct device_d *dev)
uint32_t reg;
struct ehci_platform_data *pdata = dev->platform_data;
- ehci = xmalloc(sizeof(struct ehci_priv));
+ ehci = xzalloc(sizeof(struct ehci_priv));
host = &ehci->host;
dev->priv = ehci;
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
index f103101464..05e4094386 100644
--- a/drivers/usb/host/ohci-hcd.c
+++ b/drivers/usb/host/ohci-hcd.c
@@ -859,6 +859,8 @@ static void td_fill(struct ohci *ohci, unsigned int info,
td->hwNextTD = virt_to_phys((void *)m32_swap((unsigned long)td_pt));
+ dma_flush_range((unsigned long)data, (unsigned long)(data + len));
+
/* append to queue */
td->ed->hwTailP = td->hwNextTD;
}
@@ -1555,6 +1557,8 @@ int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
dev->status = stat;
dev->act_len = urb->actual_length;
+ dma_inv_range((unsigned long)buffer, (unsigned long)(buffer + transfer_len));
+
pkt_print(urb, dev, pipe, buffer, transfer_len,
setup, "RET(ctlr)", usb_pipein(pipe));
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
index fa3691af15..2adc2ef508 100644
--- a/drivers/usb/storage/usb.c
+++ b/drivers/usb/storage/usb.c
@@ -613,7 +613,7 @@ static struct usb_device_id usb_storage_usb_ids[] = {
***********************************************************************/
static struct usb_driver usb_storage_driver = {
- .driver.name = "usb-storage",
+ .name = "usb-storage",
.id_table = usb_storage_usb_ids,
.probe = usb_stor_probe,
.disconnect = usb_stor_disconnect,