diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2010-07-03 10:26:21 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2010-07-03 10:26:21 +0200 |
commit | 6d1d9e8d8b4be5645d3613522093cdcaddad5bff (patch) | |
tree | f0147f6620fc6bce6b403f9e9c006e629ae6796f /drivers | |
parent | 0db4be97f2ebd6cedad9c113ca49667c0b1e8d75 (diff) | |
parent | 7f5644fad10f8f7a86742dd30d2812261cd0a623 (diff) | |
download | barebox-6d1d9e8d8b4be5645d3613522093cdcaddad5bff.tar.gz barebox-6d1d9e8d8b4be5645d3613522093cdcaddad5bff.tar.xz |
Merge branch 'next'
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/i2c/Kconfig | 3 | ||||
-rw-r--r-- | drivers/i2c/Makefile | 1 | ||||
-rw-r--r-- | drivers/i2c/mc34704.c | 140 | ||||
-rw-r--r-- | drivers/nand/nand.c | 7 | ||||
-rw-r--r-- | drivers/net/at91_ether.c | 2 | ||||
-rw-r--r-- | drivers/net/cs8900.c | 2 | ||||
-rw-r--r-- | drivers/net/dm9000.c | 2 | ||||
-rw-r--r-- | drivers/net/ep93xx.c | 4 | ||||
-rw-r--r-- | drivers/net/fec_imx.c | 2 | ||||
-rw-r--r-- | drivers/net/fec_mpc5200.c | 2 | ||||
-rw-r--r-- | drivers/net/macb.c | 2 | ||||
-rw-r--r-- | drivers/net/netx_eth.c | 2 | ||||
-rw-r--r-- | drivers/net/smc91111.c | 2 | ||||
-rw-r--r-- | drivers/net/smc911x.c | 2 | ||||
-rw-r--r-- | drivers/net/tap.c | 2 | ||||
-rw-r--r-- | drivers/net/usb/asix.c | 14 | ||||
-rw-r--r-- | drivers/net/usb/usbnet.c | 11 | ||||
-rw-r--r-- | drivers/nor/cfi_flash.c | 5 | ||||
-rw-r--r-- | drivers/serial/serial_imx.c | 137 | ||||
-rw-r--r-- | drivers/usb/usb.c | 5 | ||||
-rw-r--r-- | drivers/usb/usb_ehci.h | 4 | ||||
-rw-r--r-- | drivers/usb/usb_ehci_core.c | 74 | ||||
-rw-r--r-- | drivers/video/fb.c | 26 | ||||
-rw-r--r-- | drivers/video/imx-ipu-fb.c | 10 | ||||
-rw-r--r-- | drivers/video/imx.c | 26 |
25 files changed, 350 insertions, 137 deletions
diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig index f1b2949fa7..a9ee411404 100644 --- a/drivers/i2c/Kconfig +++ b/drivers/i2c/Kconfig @@ -10,6 +10,9 @@ config DRIVER_I2C_IMX config DRIVER_I2C_MC13892 bool "MC13892 a.k.a. PMIC driver" +config DRIVER_I2C_MC34704 + bool "MC34704 PMIC driver" + config DRIVER_I2C_MC9SDZ60 bool "MC9SDZ60 driver" diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile index 62d030bf0b..13e58040f7 100644 --- a/drivers/i2c/Makefile +++ b/drivers/i2c/Makefile @@ -3,5 +3,6 @@ obj-$(CONFIG_I2C) += i2c.o obj-$(CONFIG_DRIVER_I2C_IMX) += i2c-imx.o obj-$(CONFIG_DRIVER_I2C_MC13892) += mc13892.o +obj-$(CONFIG_DRIVER_I2C_MC34704) += mc34704.o obj-$(CONFIG_DRIVER_I2C_MC9SDZ60) += mc9sdz60.o obj-$(CONFIG_DRIVER_I2C_LP3972) += lp3972.o diff --git a/drivers/i2c/mc34704.c b/drivers/i2c/mc34704.c new file mode 100644 index 0000000000..51a8737209 --- /dev/null +++ b/drivers/i2c/mc34704.c @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2007 Sascha Hauer, Pengutronix + * 2009 Marc Kleine-Budde <mkl@pengutronix.de> + * Copyright (C) 2010 Baruch Siach <baruch@tkos.co.il> + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + */ + +#include <common.h> +#include <init.h> +#include <driver.h> +#include <xfuncs.h> +#include <errno.h> + +#include <i2c/i2c.h> +#include <i2c/mc34704.h> + +#define DRIVERNAME "mc34704" + +#define to_mc34704(a) container_of(a, struct mc34704, cdev) + +static struct mc34704 *mc34704_dev; + +struct mc34704 *mc34704_get(void) +{ + if (!mc34704_dev) + return NULL; + + return mc34704_dev; +} +EXPORT_SYMBOL(mc34704_get); + +int mc34704_reg_read(struct mc34704 *mc34704, u8 reg, u8 *val) +{ + int ret; + + ret = i2c_read_reg(mc34704->client, reg, val, 1); + + return ret == 1 ? 0 : ret; +} +EXPORT_SYMBOL(mc34704_reg_read) + +int mc34704_reg_write(struct mc34704 *mc34704, u8 reg, u8 val) +{ + int ret; + + ret = i2c_write_reg(mc34704->client, reg, &val, 1); + + return ret == 1 ? 0 : ret; +} +EXPORT_SYMBOL(mc34704_reg_write) + +static ssize_t mc34704_read(struct cdev *cdev, void *_buf, size_t count, + ulong offset, ulong flags) +{ + struct mc34704 *priv = to_mc34704(cdev); + u8 *buf = _buf; + size_t i = count; + int err; + + while (i) { + err = mc34704_reg_read(priv, offset, buf); + if (err) + return (ssize_t)err; + buf++; + i--; + offset++; + } + + return count; +} + +static ssize_t mc34704_write(struct cdev *cdev, const void *_buf, size_t count, + ulong offset, ulong flags) +{ + struct mc34704 *mc34704 = to_mc34704(cdev); + const u8 *buf = _buf; + size_t i = count; + int err; + + while (i) { + err = mc34704_reg_write(mc34704, offset, *buf); + if (err) + return (ssize_t)err; + buf++; + i--; + offset++; + } + + return count; +} + +static struct file_operations mc34704_fops = { + .lseek = dev_lseek_default, + .read = mc34704_read, + .write = mc34704_write, +}; + +static int mc34704_probe(struct device_d *dev) +{ + if (mc34704_dev) + return -EBUSY; + + mc34704_dev = xzalloc(sizeof(struct mc34704)); + mc34704_dev->cdev.name = DRIVERNAME; + mc34704_dev->client = to_i2c_client(dev); + mc34704_dev->cdev.size = 256; + mc34704_dev->cdev.dev = dev; + mc34704_dev->cdev.ops = &mc34704_fops; + + devfs_create(&mc34704_dev->cdev); + + return 0; +} + +static struct driver_d mc34704_driver = { + .name = DRIVERNAME, + .probe = mc34704_probe, +}; + +static int mc34704_init(void) +{ + register_driver(&mc34704_driver); + return 0; +} +device_initcall(mc34704_init); diff --git a/drivers/nand/nand.c b/drivers/nand/nand.c index bcf52bd940..4927231c17 100644 --- a/drivers/nand/nand.c +++ b/drivers/nand/nand.c @@ -210,6 +210,7 @@ static struct file_operations nand_ops_oob = { int add_mtd_device(struct mtd_info *mtd) { struct nand_chip *chip = mtd->priv; + char str[16]; strcpy(mtd->class_dev.name, "nand"); register_device(&mtd->class_dev); @@ -220,10 +221,8 @@ int add_mtd_device(struct mtd_info *mtd) mtd->cdev.priv = mtd; mtd->cdev.dev = &mtd->class_dev; - mtd->param_size.flags = PARAM_FLAG_RO; - mtd->param_size.name = "size"; - mtd->param_size.value = asprintf("%u", mtd->size); - dev_add_param(&mtd->class_dev, &mtd->param_size); + sprintf(str, "%u", mtd->size); + dev_add_param_fixed(&mtd->class_dev, "size", str); devfs_create(&mtd->cdev); diff --git a/drivers/net/at91_ether.c b/drivers/net/at91_ether.c index a2d15948f3..3c4f4b053c 100644 --- a/drivers/net/at91_ether.c +++ b/drivers/net/at91_ether.c @@ -190,7 +190,7 @@ static int at91rm9200_eth_rx (struct eth_device *edev) return 0; size = rbfp->size & RBF_SIZE; - NetReceive ((volatile uchar *) (rbfp->addr & RBF_ADDR), size); + net_receive((volatile uchar *) (rbfp->addr & RBF_ADDR), size); rbfp->addr &= ~RBF_OWNER; if (rbfp->addr & RBF_WRAP) diff --git a/drivers/net/cs8900.c b/drivers/net/cs8900.c index 64366acb15..8120877680 100644 --- a/drivers/net/cs8900.c +++ b/drivers/net/cs8900.c @@ -309,7 +309,7 @@ static int cs8900_recv(struct eth_device *dev) if (len & 1) { *addr++ = readw(priv->regs + CS8900_RTDATA0); } - NetReceive(NetRxPackets[0], len); + net_receive(NetRxPackets[0], len); return len; } diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c index 77c771bf32..2062c6669c 100644 --- a/drivers/net/dm9000.c +++ b/drivers/net/dm9000.c @@ -416,7 +416,7 @@ static int dm9000_eth_rx (struct eth_device *edev) /* Pass to upper layer */ debug("passing packet to upper layer\n"); - NetReceive(NetRxPackets[0], RxLen); + net_receive(NetRxPackets[0], RxLen); return RxLen; } return 0; diff --git a/drivers/net/ep93xx.c b/drivers/net/ep93xx.c index e91a92ef44..c6c46710d3 100644 --- a/drivers/net/ep93xx.c +++ b/drivers/net/ep93xx.c @@ -335,9 +335,9 @@ static int ep93xx_eth_rcv_packet(struct eth_device *edev) * protocol stack. We track the total number of * bytes in the frame (nbytes_frame) which will be * used when we pass the data off to the protocol - * layer via NetReceive(). + * layer via net_receive(). */ - NetReceive((uchar *)priv->rx_dq.current->word1, + net_receive((uchar *)priv->rx_dq.current->word1, RX_STATUS_FRAME_LEN(priv->rx_sq.current)); pr_debug("reporting %d bytes...\n", RX_STATUS_FRAME_LEN(priv->rx_sq.current)); diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c index 5e8e5ca197..40a7543706 100644 --- a/drivers/net/fec_imx.c +++ b/drivers/net/fec_imx.c @@ -515,7 +515,7 @@ static int fec_recv(struct eth_device *dev) */ frame = phys_to_virt(readl(&rbd->data_pointer)); frame_length = readw(&rbd->data_length) - 4; - NetReceive(frame->data, frame_length); + net_receive(frame->data, frame_length); len = frame_length; } else { if (bd_status & FEC_RBD_ERR) { diff --git a/drivers/net/fec_mpc5200.c b/drivers/net/fec_mpc5200.c index d803ddf603..ce9a21d15e 100644 --- a/drivers/net/fec_mpc5200.c +++ b/drivers/net/fec_mpc5200.c @@ -645,7 +645,7 @@ static int mpc5xxx_fec_recv(struct eth_device *dev) */ memcpy(buff, frame->head, 14); memcpy(buff + 14, frame->data, frame_length); - NetReceive(buff, frame_length); + net_receive(buff, frame_length); len = frame_length; } /* diff --git a/drivers/net/macb.c b/drivers/net/macb.c index 1bb833ae69..4feeed0ba1 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c @@ -190,7 +190,7 @@ static int macb_recv(struct eth_device *edev) buffer = (void *)NetRxPackets[0]; } - NetReceive(buffer, length); + net_receive(buffer, length); if (++rx_tail >= CFG_MACB_RX_RING_SIZE) rx_tail = 0; reclaim_rx_buffers(macb, rx_tail); diff --git a/drivers/net/netx_eth.c b/drivers/net/netx_eth.c index 673007aca1..f2d7b4ae8a 100644 --- a/drivers/net/netx_eth.c +++ b/drivers/net/netx_eth.c @@ -111,7 +111,7 @@ static int netx_eth_rx (struct eth_device *edev) /* get data */ memcpy((void*)NetRxPackets[0], (void *)(SRAM_BASE(seg) + frameno * 1560), len); /* pass to barebox */ - NetReceive(NetRxPackets[0], len); + net_receive(NetRxPackets[0], len); PFIFO_REG(PFIFO_BASE(EMPTY_PTR_FIFO(xcno))) = FIFO_PTR_SEGMENT(seg) | diff --git a/drivers/net/smc91111.c b/drivers/net/smc91111.c index 9b41c67258..58ebaa9b18 100644 --- a/drivers/net/smc91111.c +++ b/drivers/net/smc91111.c @@ -1156,7 +1156,7 @@ static int smc91c111_eth_rx(struct eth_device *edev) if (!is_error) { /* Pass the packet up to the protocol layers. */ - NetReceive(NetRxPackets[0], packet_length); + net_receive(NetRxPackets[0], packet_length); return packet_length; } diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c index 4a5e7b614c..ca320d5a90 100644 --- a/drivers/net/smc911x.c +++ b/drivers/net/smc911x.c @@ -668,7 +668,7 @@ static int smc911x_eth_rx(struct eth_device *edev) ": dropped bad packet. Status: 0x%08x\n", status); else - NetReceive(NetRxPackets[0], pktlen); + net_receive(NetRxPackets[0], pktlen); } return 0; diff --git a/drivers/net/tap.c b/drivers/net/tap.c index 8673436caf..522a9f11f0 100644 --- a/drivers/net/tap.c +++ b/drivers/net/tap.c @@ -48,7 +48,7 @@ int tap_eth_rx (struct eth_device *edev) length = linux_read_nonblock(priv->fd, NetRxPackets[0], PKTSIZE); if (length > 0) - NetReceive(NetRxPackets[0], length); + net_receive(NetRxPackets[0], length); return 0; } diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index e44ce67b6e..ca71b34e12 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c @@ -415,17 +415,17 @@ static int asix_rx_fixup(struct usbnet *dev, void *buf, int len) while (len > 0) { if ((short)(header & 0x0000ffff) != ~((short)((header & 0xffff0000) >> 16))) - dev_err(&dev->dev, "asix_rx_fixup() Bad Header Length"); - + dev_err(&dev->edev.dev, "asix_rx_fixup() Bad Header Length"); + /* get the packet length */ size = (unsigned short) (header & 0x0000ffff); if (size > 1514) { - dev_err(&dev->dev, "asix_rx_fixup() Bad RX Length %d", size); + dev_err(&dev->edev.dev, "asix_rx_fixup() Bad RX Length %d", size); return 0; } - NetReceive(buf, size); + net_receive(buf, size); buf += ((size + 1) & 0xfffe); len -= ((size + 1) & 0xfffe); @@ -440,7 +440,7 @@ static int asix_rx_fixup(struct usbnet *dev, void *buf, int len) } if (len < 0) { - dev_err(&dev->dev,"asix_rx_fixup() Bad SKB Length %d", len); + dev_err(&dev->edev.dev,"asix_rx_fixup() Bad SKB Length %d", len); return -1; } return 0; @@ -503,13 +503,13 @@ static int ax88172_bind(struct usbnet *dev) unsigned long gpio_bits = dev->driver_info->data; struct asix_data *data = (struct asix_data *)&dev->data; - dev_dbg(&dev->dev, "%s\n", __func__); + dev_dbg(&dev->edev.dev, "%s\n", __func__); data->eeprom_len = AX88172_EEPROM_LEN; ret = usbnet_get_endpoints(dev); if (ret) { - dev_err(&dev->dev, "can not get EPs\n"); + dev_err(&dev->edev.dev, "can not get EPs\n"); return ret; } diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 123cc3b30c..cc170f6611 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -74,7 +74,7 @@ int usbnet_get_endpoints(struct usbnet *dev) in->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); dev->out = usb_sndbulkpipe (dev->udev, out->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); - dev_dbg(&dev->dev, "found endpoints: IN=%d OUT=%d\n", + dev_dbg(&dev->edev.dev, "found endpoints: IN=%d OUT=%d\n", in->bEndpointAddress, out->bEndpointAddress); return 0; @@ -89,14 +89,14 @@ static int usbnet_send(struct eth_device *edev, void *eth_data, int data_length) struct driver_info *info = dev->driver_info; int len, alen, ret; - dev_dbg(&dev->dev, "%s\n",__func__); + dev_dbg(&edev->dev, "%s\n",__func__); /* some devices want funky USB-level framing, for * win32 driver (usually) and/or hardware quirks */ if(info->tx_fixup) { if(info->tx_fixup(dev, eth_data, data_length, tx_buffer, &len)) { - dev_dbg(&dev->dev, "can't tx_fixup packet"); + dev_dbg(&edev->dev, "can't tx_fixup packet"); return 0; } } else { @@ -137,7 +137,7 @@ static int usbnet_recv(struct eth_device *edev) if (info->rx_fixup) return info->rx_fixup(dev, rx_buf, alen); else - NetReceive(rx_buf, alen); + net_receive(rx_buf, alen); } return 0; @@ -191,7 +191,7 @@ int usbnet_probe(struct usb_device *usbdev, const struct usb_device_id *prod) struct driver_info *info; int status; - dev_dbg(&edev->dev, "%s\n", __func__); + dev_dbg(&usbdev->dev, "%s\n", __func__); undev = xzalloc(sizeof (*undev)); @@ -206,6 +206,7 @@ int usbnet_probe(struct usb_device *usbdev, const struct usb_device_id *prod) edev->recv = usbnet_recv, edev->halt = usbnet_halt, edev->priv = undev; + edev->dev = usbdev->dev; /* will be overwritten by eth_register */ info = (struct driver_info *)prod->driver_info; undev->driver_info = info; diff --git a/drivers/nor/cfi_flash.c b/drivers/nor/cfi_flash.c index dbfb004d05..b21739bd28 100644 --- a/drivers/nor/cfi_flash.c +++ b/drivers/nor/cfi_flash.c @@ -42,6 +42,7 @@ #include <malloc.h> #include <asm/io.h> #include <errno.h> +#include <progress.h> #include "cfi_flash.h" /* @@ -499,11 +500,13 @@ static int cfi_erase(struct cdev *cdev, size_t count, unsigned long offset) start = find_sector(finfo, cdev->dev->map_base + offset); end = find_sector(finfo, cdev->dev->map_base + offset + count - 1); + init_progression_bar(end - start); + for (i = start; i <= end; i++) { ret = finfo->cfi_cmd_set->flash_erase_one(finfo, i); if (ret) goto out; - printf("."); + show_progress(i - start); } out: putchar('\n'); diff --git a/drivers/serial/serial_imx.c b/drivers/serial/serial_imx.c index 91d3b188cc..801004e186 100644 --- a/drivers/serial/serial_imx.c +++ b/drivers/serial/serial_imx.c @@ -24,34 +24,35 @@ #include <init.h> #include <malloc.h> #include <notifier.h> - -#define URXD0(base) __REG( 0x0 +(base)) /* Receiver Register */ -#define URTX0(base) __REG( 0x40 +(base)) /* Transmitter Register */ -#define UCR1(base) __REG( 0x80 +(base)) /* Control Register 1 */ -#define UCR2(base) __REG( 0x84 +(base)) /* Control Register 2 */ -#define UCR3(base) __REG( 0x88 +(base)) /* Control Register 3 */ -#define UCR4(base) __REG( 0x8c +(base)) /* Control Register 4 */ -#define UFCR(base) __REG( 0x90 +(base)) /* FIFO Control Register */ -#define USR1(base) __REG( 0x94 +(base)) /* Status Register 1 */ -#define USR2(base) __REG( 0x98 +(base)) /* Status Register 2 */ -#define UESC(base) __REG( 0x9c +(base)) /* Escape Character Register */ -#define UTIM(base) __REG( 0xa0 +(base)) /* Escape Timer Register */ -#define UBIR(base) __REG( 0xa4 +(base)) /* BRM Incremental Register */ -#define UBMR(base) __REG( 0xa8 +(base)) /* BRM Modulator Register */ -#define UBRC(base) __REG( 0xac +(base)) /* Baud Rate Count Register */ +#include <asm/io.h> + +#define URXD0 0x0 /* Receiver Register */ +#define URTX0 0x40 /* Transmitter Register */ +#define UCR1 0x80 /* Control Register 1 */ +#define UCR2 0x84 /* Control Register 2 */ +#define UCR3 0x88 /* Control Register 3 */ +#define UCR4 0x8c /* Control Register 4 */ +#define UFCR 0x90 /* FIFO Control Register */ +#define USR1 0x94 /* Status Register 1 */ +#define USR2 0x98 /* Status Register 2 */ +#define UESC 0x9c /* Escape Character Register */ +#define UTIM 0xa0 /* Escape Timer Register */ +#define UBIR 0xa4 /* BRM Incremental Register */ +#define UBMR 0xa8 /* BRM Modulator Register */ +#define UBRC 0xac /* Baud Rate Count Register */ #ifdef CONFIG_ARCH_IMX1 -#define BIPR1(base) __REG( 0xb0 +(base)) /* Incremental Preset Register 1 */ -#define BIPR2(base) __REG( 0xb4 +(base)) /* Incremental Preset Register 2 */ -#define BIPR3(base) __REG( 0xb8 +(base)) /* Incremental Preset Register 3 */ -#define BIPR4(base) __REG( 0xbc +(base)) /* Incremental Preset Register 4 */ -#define BMPR1(base) __REG( 0xc0 +(base)) /* BRM Modulator Register 1 */ -#define BMPR2(base) __REG( 0xc4 +(base)) /* BRM Modulator Register 2 */ -#define BMPR3(base) __REG( 0xc8 +(base)) /* BRM Modulator Register 3 */ -#define BMPR4(base) __REG( 0xcc +(base)) /* BRM Modulator Register 4 */ -#define UTS(base) __REG( 0xd0 +(base)) /* UART Test Register */ +#define BIPR1 0xb0 /* Incremental Preset Register 1 */ +#define BIPR2 0xb4 /* Incremental Preset Register 2 */ +#define BIPR3 0xb8 /* Incremental Preset Register 3 */ +#define BIPR4 0xbc /* Incremental Preset Register 4 */ +#define BMPR1 0xc0 /* BRM Modulator Register 1 */ +#define BMPR2 0xc4 /* BRM Modulator Register 2 */ +#define BMPR3 0xc8 /* BRM Modulator Register 3 */ +#define BMPR4 0xcc /* BRM Modulator Register 4 */ +#define UTS 0xd0 /* UART Test Register */ #else -#define ONEMS(base) __REG( 0xb0 +(base)) /* One Millisecond register */ -#define UTS(base) __REG( 0xb4 +(base)) /* UART Test Register */ +#define ONEMS 0xb0 /* One Millisecond register */ +#define UTS 0xb4 /* UART Test Register */ #endif /* UART Control Register Bit Fields.*/ @@ -175,7 +176,7 @@ static int imx_serial_reffreq(ulong base) { ulong rfdiv; - rfdiv = (UFCR(base) >> 7) & 7; + rfdiv = (readl(base + UFCR) >> 7) & 7; rfdiv = rfdiv < 6 ? 6 - rfdiv : 7; return imx_get_uartclk() / rfdiv; @@ -190,45 +191,42 @@ static int imx_serial_init_port(struct console_device *cdev) { struct device_d *dev = cdev->dev; ulong base = dev->map_base; + uint32_t val; + + writel(UCR1_VAL, base + UCR1); + writel(UCR2_WS | UCR2_IRTS, base + UCR2); + writel(UCR3_VAL, base + UCR3); + writel(UCR4_VAL, base + UCR4); + writel(0x0000002B, base + UESC); + writel(0, base + UTIM); + writel(0, base + UBIR); + writel(0, base + UBMR); + writel(0, base + UTS); - UCR1(base) = UCR1_VAL; - UCR2(base) = UCR2_WS | UCR2_IRTS; - UCR3(base) = UCR3_VAL; - UCR4(base) = UCR4_VAL; - UESC(base) = 0x0000002B; - UTIM(base) = 0; - UBIR(base) = 0; - UBMR(base) = 0; - UTS(base) = 0; /* Configure FIFOs */ - UFCR(base) = 0xa81; + writel(0xa81, base + UFCR); #ifdef ONEMS - ONEMS(base) = imx_serial_reffreq(base) / 1000; + writel(imx_serial_reffreq(base) / 1000, base + ONEMS); #endif /* Enable FIFOs */ - UCR2(base) |= UCR2_SRST | UCR2_RXEN | UCR2_TXEN; + val = readl(base + UCR2); + val |= UCR2_SRST | UCR2_RXEN | UCR2_TXEN; + writel(val, base + UCR2); /* Clear status flags */ - USR2(base) |= USR2_ADET | - USR2_DTRF | - USR2_IDLE | - USR2_IRINT | - USR2_WAKE | - USR2_RTSF | - USR2_BRCD | - USR2_ORE | - USR2_RDR; + val = readl(base + USR2); + val |= USR2_ADET | USR2_DTRF | USR2_IDLE | USR2_IRINT | USR2_WAKE | + USR2_RTSF | USR2_BRCD | USR2_ORE | USR2_RDR; + writel(val, base + USR2); /* Clear status flags */ - USR1(base) |= USR1_PARITYERR | - USR1_RTSD | - USR1_ESCF | - USR1_FRAMERR | - USR1_AIRINT | - USR1_AWAKE; + val = readl(base + USR2); + val |= USR1_PARITYERR | USR1_RTSD | USR1_ESCF | USR1_FRAMERR | USR1_AIRINT | + USR1_AWAKE; + writel(val, base + USR2); return 0; } @@ -238,9 +236,9 @@ static void imx_serial_putc(struct console_device *cdev, char c) struct device_d *dev = cdev->dev; /* Wait for Tx FIFO not full */ - while (UTS(dev->map_base) & UTS_TXFULL); + while (readl(dev->map_base + UTS) & UTS_TXFULL); - URTX0(dev->map_base) = c; + writel(c, dev->map_base + URTX0); } static int imx_serial_tstc(struct console_device *cdev) @@ -248,7 +246,7 @@ static int imx_serial_tstc(struct console_device *cdev) struct device_d *dev = cdev->dev; /* If receive fifo is empty, return false */ - if (UTS(dev->map_base) & UTS_RXEMPTY) + if (readl(dev->map_base + UTS) & UTS_RXEMPTY) return 0; return 1; } @@ -258,9 +256,9 @@ static int imx_serial_getc(struct console_device *cdev) struct device_d *dev = cdev->dev; unsigned char ch; - while (UTS(dev->map_base) & UTS_RXEMPTY); + while (readl(dev->map_base + UTS) & UTS_RXEMPTY); - ch = URXD0(dev->map_base); + ch = readl(dev->map_base + URXD0); return ch; } @@ -269,7 +267,7 @@ static void imx_serial_flush(struct console_device *cdev) { struct device_d *dev = cdev->dev; - while (!(USR2(dev->map_base) & USR2_TXDC)); + while (!(readl(dev->map_base + USR2) & USR2_TXDC)); } static int imx_serial_setbaudrate(struct console_device *cdev, int baudrate) @@ -277,18 +275,22 @@ static int imx_serial_setbaudrate(struct console_device *cdev, int baudrate) struct device_d *dev = cdev->dev; struct imx_serial_priv *priv = container_of(cdev, struct imx_serial_priv, cdev); + uint32_t val; + ulong base = dev->map_base; - ulong ucr1 = UCR1(base); + ulong ucr1 = readl(base + UCR1); /* disable UART */ - UCR1(base) &= ~UCR1_UARTEN; + val = readl(base + UCR1); + val &= ~UCR1_UARTEN; + writel(val, base + UCR1); /* Set the numerator value minus one of the BRM ratio */ - UBIR(base) = (baudrate / 100) - 1; + writel((baudrate / 100) - 1, base + UBIR); /* Set the denominator value minus one of the BRM ratio */ - UBMR(base) = ((imx_serial_reffreq(base) / 1600) - 1); + writel((imx_serial_reffreq(base) / 1600) - 1, base + UBMR); - UCR1(base) = ucr1; + writel(ucr1, base + UCR1); priv->baudrate = baudrate; @@ -310,6 +312,7 @@ static int imx_serial_probe(struct device_d *dev) { struct console_device *cdev; struct imx_serial_priv *priv; + uint32_t val; priv = malloc(sizeof(*priv)); cdev = &priv->cdev; @@ -327,7 +330,9 @@ static int imx_serial_probe(struct device_d *dev) imx_serial_setbaudrate(cdev, 115200); /* Enable UART */ - UCR1(cdev->dev->map_base) |= UCR1_UARTEN; + val = readl(cdev->dev->map_base + UCR1); + val |= UCR1_UARTEN; + writel(val, cdev->dev->map_base + UCR1); console_register(cdev); priv->notify.notifier_call = imx_clocksource_clock_change; diff --git a/drivers/usb/usb.c b/drivers/usb/usb.c index 1ad4babb88..76e033eb7b 100644 --- a/drivers/usb/usb.c +++ b/drivers/usb/usb.c @@ -453,6 +453,7 @@ static int __usb_init(void) { struct usb_device *dev, *tmp; struct usb_host *host; + int ret; list_for_each_entry_safe(dev, tmp, &usb_device_list, list) { list_del(&dev->list); @@ -466,7 +467,9 @@ static int __usb_init(void) dev_index = 0; list_for_each_entry(host, &host_list, list) { - host->init(host); + ret = host->init(host); + if (ret) + continue; dev = usb_alloc_new_device(); dev->host = host; diff --git a/drivers/usb/usb_ehci.h b/drivers/usb/usb_ehci.h index b3c1d5d728..af4924955f 100644 --- a/drivers/usb/usb_ehci.h +++ b/drivers/usb/usb_ehci.h @@ -187,8 +187,4 @@ struct QH { uint8_t fill[16]; }; -/* Low level init functions */ -int ehci_hcd_init(void); -int ehci_hcd_stop(void); - #endif /* USB_EHCI_H */ diff --git a/drivers/usb/usb_ehci_core.c b/drivers/usb/usb_ehci_core.c index d7efaadb8c..af066de4ba 100644 --- a/drivers/usb/usb_ehci_core.c +++ b/drivers/usb/usb_ehci_core.c @@ -31,6 +31,7 @@ #include <xfuncs.h> #include <clock.h> #include <errno.h> +#include <usb/ehci.h> #include <asm/mmu.h> #include "usb_ehci.h" @@ -43,6 +44,7 @@ struct ehci_priv { struct QH *qh_list; void *qhp; int portreset; + unsigned long flags; }; #define to_ehci(ptr) container_of(ptr, struct ehci_priv, host) @@ -112,13 +114,8 @@ static struct descriptor { 255 /* bInterval */ }, }; -#define CONFIG_EHCI_IS_TDI // FIXME -#if defined(CONFIG_EHCI_IS_TDI) -#define ehci_is_TDI() (1) -#else -#define ehci_is_TDI() (0) -#endif +#define ehci_is_TDI() (ehci->flags & EHCI_HAS_TT) #ifdef CONFIG_MMU /* @@ -216,18 +213,20 @@ static inline void ehci_invalidate_dcache(struct QH *qh) static int handshake(uint32_t *ptr, uint32_t mask, uint32_t done, int usec) { uint32_t result; + uint64_t start; - do { + start = get_time_ns(); + + while (1) { result = ehci_readl(ptr); if (result == ~(uint32_t)0) return -1; result &= mask; if (result == done) return 0; - udelay(1); - usec--; - } while (usec > 0); - return -1; + if (is_timeout(start, usec * USECOND)) + return -ETIMEDOUT; + } } static int ehci_reset(struct ehci_priv *ehci) @@ -679,6 +678,8 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, ehci_writel(status_reg, reg); break; } else { + int ret; + reg |= EHCI_PS_PR; reg &= ~EHCI_PS_PE; ehci_writel(status_reg, reg); @@ -689,6 +690,22 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer, */ wait_ms(50); ehci->portreset |= 1 << le16_to_cpu(req->index); + /* terminate the reset */ + ehci_writel(status_reg, reg & ~EHCI_PS_PR); + /* + * A host controller must terminate the reset + * and stabilize the state of the port within + * 2 milliseconds + */ + ret = handshake(status_reg, EHCI_PS_PR, 0, + 2 * 1000); + if (!ret) + ehci->portreset |= + 1 << le16_to_cpu(req->index); + else + printf("port(%d) reset error\n", + le16_to_cpu(req->index) - 1); + } break; default: @@ -753,21 +770,37 @@ unknown: return -1; } +/* force HC to halt state from unknown (EHCI spec section 2.3) */ +static int ehci_halt(struct ehci_priv *ehci) +{ + u32 temp = ehci_readl(&ehci->hcor->or_usbsts); + + /* disable any irqs left enabled by previous code */ + ehci_writel(&ehci->hcor->or_usbintr, 0); + + if (temp & STS_HALT) + return 0; + + temp = ehci_readl(&ehci->hcor->or_usbcmd); + temp &= ~CMD_RUN; + ehci_writel(&ehci->hcor->or_usbcmd, temp); + + return handshake(&ehci->hcor->or_usbsts, + STS_HALT, STS_HALT, 16 * 125); +} + static int ehci_init(struct usb_host *host) { struct ehci_priv *ehci = to_ehci(host); uint32_t reg; uint32_t cmd; + ehci_halt(ehci); + /* EHCI spec section 4.1 */ if (ehci_reset(ehci) != 0) return -1; -#if defined(CONFIG_EHCI_HCD_INIT_AFTER_RESET) - if (ehci_hcd_init() != 0) - return -1; -#endif - /* Set head of reclaim list */ ehci->qhp = xzalloc(sizeof(struct QH) + 32); ehci->qh_list = (struct QH *)(((unsigned long)ehci->qhp + 32) & ~31); @@ -861,10 +894,19 @@ static int ehci_probe(struct device_d *dev) struct usb_host *host; struct ehci_priv *ehci; uint32_t reg; + struct ehci_platform_data *pdata = dev->platform_data; ehci = xmalloc(sizeof(struct ehci_priv)); host = &ehci->host; + if (pdata) + ehci->flags = pdata->flags; + else + /* default to EHCI_HAS_TT to not change behaviour of boards + * with platform_data + */ + ehci->flags = EHCI_HAS_TT; + host->init = ehci_init; host->submit_int_msg = submit_int_msg; host->submit_control_msg = submit_control_msg; diff --git a/drivers/video/fb.c b/drivers/video/fb.c index 00a0f6a177..f9a425efac 100644 --- a/drivers/video/fb.c +++ b/drivers/video/fb.c @@ -32,15 +32,27 @@ static int fb_enable_set(struct device_d *dev, struct param_d *param, { struct fb_info *info = dev->priv; int enable; + char *new; + + if (!val) + return dev_param_set_generic(dev, param, NULL); enable = simple_strtoul(val, NULL, 0); - if (enable) + if (info->enabled == !!enable) + return 0; + + if (enable) { info->fbops->fb_enable(info); - else + new = "1"; + } else { info->fbops->fb_disable(info); + new = "0"; + } - sprintf(info->enable_string, "%d", !!enable); + dev_param_set_generic(dev, param, new); + + info->enabled = !!enable; return 0; } @@ -71,13 +83,9 @@ int register_framebuffer(struct fb_info *info) sprintf(dev->name, "fb"); - info->param_enable.set = fb_enable_set; - info->param_enable.name = "enable"; - sprintf(info->enable_string, "%d", 0); - info->param_enable.value = info->enable_string; - dev_add_param(dev, &info->param_enable); - register_device(&info->dev); + dev_add_param(dev, "enable", fb_enable_set, NULL, 0); + dev_set_param(dev, "enable", "0"); devfs_create(&info->cdev); diff --git a/drivers/video/imx-ipu-fb.c b/drivers/video/imx-ipu-fb.c index 0bd86b286d..7e2c74bccc 100644 --- a/drivers/video/imx-ipu-fb.c +++ b/drivers/video/imx-ipu-fb.c @@ -36,6 +36,8 @@ struct ipu_fb_info { void __iomem *regs; + void (*enable)(int enable); + struct fb_info info; struct device_d *dev; }; @@ -828,6 +830,8 @@ static void ipu_fb_enable(struct fb_info *info) * Linux driver calls sdc_set_brightness() here again, * once is enough for us */ + if (fbi->enable) + fbi->enable(1); } static void ipu_fb_disable(struct fb_info *info) @@ -837,6 +841,9 @@ static void ipu_fb_disable(struct fb_info *info) printf("%s\n", __func__); + if (fbi->enable) + fbi->enable(0); + reg = reg_read(fbi, SDC_COM_CONF); reg &= ~SDC_COM_BG_EN; reg_write(fbi, reg, SDC_COM_CONF); @@ -868,6 +875,7 @@ static int imxfb_probe(struct device_d *dev) info->yres = pdata->mode->yres; info->bits_per_pixel = pdata->bpp; info->fbops = &imxfb_ops; + fbi->enable = pdata->enable; dev_info(dev, "i.MX Framebuffer driver\n"); @@ -891,8 +899,6 @@ static int imxfb_probe(struct device_d *dev) return ret; } - ipu_fb_enable(info); - return 0; } diff --git a/drivers/video/imx.c b/drivers/video/imx.c index 67cae349e5..ac518588ca 100644 --- a/drivers/video/imx.c +++ b/drivers/video/imx.c @@ -152,10 +152,9 @@ struct imxfb_info { struct fb_info info; struct device_d *dev; + void (*enable)(int enable); struct fb_info overlay; - struct param_d param_alpha; - char alpha_string[4]; }; #define IMX_NAME "IMX" @@ -264,12 +263,17 @@ static void imxfb_enable_controller(struct fb_info *info) writel(readl(IMX_CCM_BASE + CCM_CGCR1) | (1 << 29), IMX_CCM_BASE + CCM_CGCR1); #endif + if (fbi->enable) + fbi->enable(1); } static void imxfb_disable_controller(struct fb_info *info) { struct imxfb_info *fbi = info->priv; + if (fbi->enable) + fbi->enable(0); + writel(0, fbi->regs + LCDC_RMCR); #ifdef CONFIG_ARCH_IMX21 PCCR0 &= ~(PCCR0_PERCLK3_EN | PCCR0_HCLK_LCDC_EN); @@ -427,8 +431,12 @@ static int imxfb_alpha_set(struct device_d *dev, struct param_d *param, struct fb_info *overlay = dev->priv; struct imxfb_info *fbi = overlay->priv; int alpha; + char alphastr[16]; unsigned int tmp; + if (!val) + return dev_param_set_generic(dev, param, NULL); + alpha = simple_strtoul(val, NULL, 0); alpha &= 0xff; @@ -437,7 +445,9 @@ static int imxfb_alpha_set(struct device_d *dev, struct param_d *param, tmp |= LGWCR_GWAV(alpha); writel(tmp , fbi->regs + LCDC_LGWCR); - sprintf(fbi->alpha_string, "%d", alpha); + sprintf(alphastr, "%d", alpha); + + dev_param_set_generic(dev, param, alphastr); return 0; } @@ -502,11 +512,8 @@ static int imxfb_register_overlay(struct imxfb_info *fbi, void *fb) return ret; } - fbi->param_alpha.set = imxfb_alpha_set; - fbi->param_alpha.name = "alpha"; - sprintf(fbi->alpha_string, "%d", 0); - fbi->param_alpha.value = fbi->alpha_string; - dev_add_param(&overlay->dev, &fbi->param_alpha); + dev_add_param(&overlay->dev, "alpha", imxfb_alpha_set, NULL, 0); + dev_set_param(&overlay->dev, "alpha", "0"); return 0; } @@ -545,6 +552,7 @@ static int imxfb_probe(struct device_d *dev) fbi->pwmr = pdata->pwmr; fbi->lscr1 = pdata->lscr1; fbi->dmacr = pdata->dmacr; + fbi->enable = pdata->enable; fbi->dev = dev; info->priv = fbi; info->mode = &pdata->mode->mode; @@ -571,8 +579,6 @@ static int imxfb_probe(struct device_d *dev) #ifdef CONFIG_IMXFB_DRIVER_VIDEO_IMX_OVERLAY imxfb_register_overlay(fbi, pdata->framebuffer_ovl); #endif - imxfb_enable_controller(info); - return 0; } |