aboutsummaryrefslogtreecommitdiffstats
path: root/driver
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2006-04-06 10:08:19 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2006-04-06 10:08:19 -0700
commitce40196200ca234d1abe8dd66a96906745501a05 (patch)
tree700e1c99e298d8636b2b97f68276681db577e719 /driver
parent788a651935432b61fd0d03707d0d679de678b9c1 (diff)
downloadpatches-ce40196200ca234d1abe8dd66a96906745501a05.tar.gz
more patches added
Diffstat (limited to 'driver')
-rw-r--r--driver/driver-core-bus-device-event-delay.patch99
-rw-r--r--driver/put_device-might_sleep.patch2
-rw-r--r--driver/spi-update-to-pxa2xx-spi-driver.patch202
3 files changed, 302 insertions, 1 deletions
diff --git a/driver/driver-core-bus-device-event-delay.patch b/driver/driver-core-bus-device-event-delay.patch
new file mode 100644
index 0000000000000..0d2e22a2038b9
--- /dev/null
+++ b/driver/driver-core-bus-device-event-delay.patch
@@ -0,0 +1,99 @@
+From kay.sievers@vrfy.org Thu Apr 6 09:46:15 2006
+Date: Tue, 4 Apr 2006 20:42:26 +0200
+From: Kay Sievers <kay.sievers@vrfy.org>
+To: Greg KH <greg@kroah.com>
+Subject: Driver core: bus device event delay
+Message-ID: <20060404184226.GA7578@vrfy.org>
+Content-Disposition: inline
+
+From: Kay Sievers <kay.sievers@suse.de>
+
+split bus_add_device() and send device uevents after sysfs population
+
+Signed-off-by: Kay Sievers <kay.sievers@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/base/base.h | 1 +
+ drivers/base/bus.c | 22 ++++++++++++++++++----
+ drivers/base/core.c | 3 ++-
+ 3 files changed, 21 insertions(+), 5 deletions(-)
+
+--- gregkh-2.6.orig/drivers/base/base.h
++++ gregkh-2.6/drivers/base/base.h
+@@ -11,6 +11,7 @@ extern int cpu_dev_init(void);
+ extern int attribute_container_init(void);
+
+ extern int bus_add_device(struct device * dev);
++extern void bus_attach_device(struct device * dev);
+ extern void bus_remove_device(struct device * dev);
+
+ extern int bus_add_driver(struct device_driver *);
+--- gregkh-2.6.orig/drivers/base/bus.c
++++ gregkh-2.6/drivers/base/bus.c
+@@ -362,8 +362,7 @@ static void device_remove_attrs(struct b
+ * @dev: device being added
+ *
+ * - Add the device to its bus's list of devices.
+- * - Try to attach to driver.
+- * - Create link to device's physical location.
++ * - Create link to device's bus.
+ */
+ int bus_add_device(struct device * dev)
+ {
+@@ -372,8 +371,6 @@ int bus_add_device(struct device * dev)
+
+ if (bus) {
+ pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id);
+- device_attach(dev);
+- klist_add_tail(&dev->knode_bus, &bus->klist_devices);
+ error = device_add_attrs(bus, dev);
+ if (!error) {
+ sysfs_create_link(&bus->devices.kobj, &dev->kobj, dev->bus_id);
+@@ -384,6 +381,22 @@ int bus_add_device(struct device * dev)
+ }
+
+ /**
++ * bus_attach_device - add device to bus
++ * @dev: device tried to attach to a driver
++ *
++ * - Try to attach to driver.
++ */
++void bus_attach_device(struct device * dev)
++{
++ struct bus_type * bus = dev->bus;
++
++ if (bus) {
++ device_attach(dev);
++ klist_add_tail(&dev->knode_bus, &bus->klist_devices);
++ }
++}
++
++/**
+ * bus_remove_device - remove device from bus
+ * @dev: device to be removed
+ *
+@@ -733,6 +746,7 @@ EXPORT_SYMBOL_GPL(bus_find_device);
+ EXPORT_SYMBOL_GPL(bus_for_each_drv);
+
+ EXPORT_SYMBOL_GPL(bus_add_device);
++EXPORT_SYMBOL_GPL(bus_attach_device);
+ EXPORT_SYMBOL_GPL(bus_remove_device);
+ EXPORT_SYMBOL_GPL(bus_register);
+ EXPORT_SYMBOL_GPL(bus_unregister);
+--- gregkh-2.6.orig/drivers/base/core.c
++++ gregkh-2.6/drivers/base/core.c
+@@ -274,11 +274,12 @@ int device_add(struct device *dev)
+ dev->uevent_attr.store = store_uevent;
+ device_create_file(dev, &dev->uevent_attr);
+
+- kobject_uevent(&dev->kobj, KOBJ_ADD);
+ if ((error = device_pm_add(dev)))
+ goto PMError;
+ if ((error = bus_add_device(dev)))
+ goto BusError;
++ kobject_uevent(&dev->kobj, KOBJ_ADD);
++ bus_attach_device(dev);
+ if (parent)
+ klist_add_tail(&dev->knode_parent, &parent->klist_children);
+
diff --git a/driver/put_device-might_sleep.patch b/driver/put_device-might_sleep.patch
index 024b423001a07..fcc3b60d99d1f 100644
--- a/driver/put_device-might_sleep.patch
+++ b/driver/put_device-might_sleep.patch
@@ -12,7 +12,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
--- gregkh-2.6.orig/drivers/base/core.c
+++ gregkh-2.6/drivers/base/core.c
-@@ -340,6 +340,7 @@ struct device * get_device(struct device
+@@ -341,6 +341,7 @@ struct device * get_device(struct device
*/
void put_device(struct device * dev)
{
diff --git a/driver/spi-update-to-pxa2xx-spi-driver.patch b/driver/spi-update-to-pxa2xx-spi-driver.patch
new file mode 100644
index 0000000000000..5603325cd8b2b
--- /dev/null
+++ b/driver/spi-update-to-pxa2xx-spi-driver.patch
@@ -0,0 +1,202 @@
+From akpm@osdl.org Tue Mar 28 14:05:35 2006
+Message-Id: <200603282205.k2SM5UpW027797@shell0.pdx.osdl.net>
+Subject: spi: Update to PXA2xx SPI Driver
+To: greg@kroah.com
+Cc: akpm@osdl.org, stephen@streetfiresound.com
+From: Stephen Street <stephen@streetfiresound.com>
+Date: Tue, 28 Mar 2006 14:05:23 -0800
+
+From: Stephen Street <stephen@streetfiresound.com>
+
+Fix two outstanding issues with the pxa2xx_spi driver:
+
+1) Bad cast in the function u32_writer. Thanks to Henrik Bechmann
+2) Adds support for per transfer changes to speed and bits per word
+
+Signed-off-by: Stephen Street <stephen@streetfiresound.com>
+Cc: David Brownell <dbrownell@users.sourceforge.net>
+Signed-off-by: Andrew Morton <akpm@osdl.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/spi/pxa2xx_spi.c | 82 ++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 75 insertions(+), 7 deletions(-)
+
+--- gregkh-2.6.orig/drivers/spi/pxa2xx_spi.c
++++ gregkh-2.6/drivers/spi/pxa2xx_spi.c
+@@ -120,6 +120,8 @@ struct driver_data {
+ dma_addr_t tx_dma;
+ size_t rx_map_len;
+ size_t tx_map_len;
++ u8 n_bytes;
++ u32 dma_width;
+ int cs_change;
+ void (*write)(struct driver_data *drv_data);
+ void (*read)(struct driver_data *drv_data);
+@@ -139,6 +141,8 @@ struct chip_data {
+ u32 threshold;
+ u32 dma_threshold;
+ u8 enable_dma;
++ u8 bits_per_word;
++ u32 speed_hz;
+ void (*write)(struct driver_data *drv_data);
+ void (*read)(struct driver_data *drv_data);
+ void (*cs_control)(u32 command);
+@@ -186,7 +190,7 @@ static void null_cs_control(u32 command)
+ static void null_writer(struct driver_data *drv_data)
+ {
+ void *reg = drv_data->ioaddr;
+- u8 n_bytes = drv_data->cur_chip->n_bytes;
++ u8 n_bytes = drv_data->n_bytes;
+
+ while ((read_SSSR(reg) & SSSR_TNF)
+ && (drv_data->tx < drv_data->tx_end)) {
+@@ -198,7 +202,7 @@ static void null_writer(struct driver_da
+ static void null_reader(struct driver_data *drv_data)
+ {
+ void *reg = drv_data->ioaddr;
+- u8 n_bytes = drv_data->cur_chip->n_bytes;
++ u8 n_bytes = drv_data->n_bytes;
+
+ while ((read_SSSR(reg) & SSSR_RNE)
+ && (drv_data->rx < drv_data->rx_end)) {
+@@ -256,7 +260,7 @@ static void u32_writer(struct driver_dat
+
+ while ((read_SSSR(reg) & SSSR_TNF)
+ && (drv_data->tx < drv_data->tx_end)) {
+- write_SSDR(*(u16 *)(drv_data->tx), reg);
++ write_SSDR(*(u32 *)(drv_data->tx), reg);
+ drv_data->tx += 4;
+ }
+ }
+@@ -677,6 +681,10 @@ static void pump_transfers(unsigned long
+ struct spi_transfer *previous = NULL;
+ struct chip_data *chip = NULL;
+ void *reg = drv_data->ioaddr;
++ u32 clk_div = 0;
++ u8 bits = 0;
++ u32 speed = 0;
++ u32 cr0;
+
+ /* Get current state information */
+ message = drv_data->cur_msg;
+@@ -713,6 +721,8 @@ static void pump_transfers(unsigned long
+ giveback(message, drv_data);
+ return;
+ }
++ drv_data->n_bytes = chip->n_bytes;
++ drv_data->dma_width = chip->dma_width;
+ drv_data->cs_control = chip->cs_control;
+ drv_data->tx = (void *)transfer->tx_buf;
+ drv_data->tx_end = drv_data->tx + transfer->len;
+@@ -724,6 +734,62 @@ static void pump_transfers(unsigned long
+ drv_data->write = drv_data->tx ? chip->write : null_writer;
+ drv_data->read = drv_data->rx ? chip->read : null_reader;
+ drv_data->cs_change = transfer->cs_change;
++
++ /* Change speed and bit per word on a per transfer */
++ if (transfer->speed_hz || transfer->bits_per_word) {
++
++ /* Disable clock */
++ write_SSCR0(chip->cr0 & ~SSCR0_SSE, reg);
++ cr0 = chip->cr0;
++ bits = chip->bits_per_word;
++ speed = chip->speed_hz;
++
++ if (transfer->speed_hz)
++ speed = transfer->speed_hz;
++
++ if (transfer->bits_per_word)
++ bits = transfer->bits_per_word;
++
++ if (reg == SSP1_VIRT)
++ clk_div = SSP1_SerClkDiv(speed);
++ else if (reg == SSP2_VIRT)
++ clk_div = SSP2_SerClkDiv(speed);
++ else if (reg == SSP3_VIRT)
++ clk_div = SSP3_SerClkDiv(speed);
++
++ if (bits <= 8) {
++ drv_data->n_bytes = 1;
++ drv_data->dma_width = DCMD_WIDTH1;
++ drv_data->read = drv_data->read != null_reader ?
++ u8_reader : null_reader;
++ drv_data->write = drv_data->write != null_writer ?
++ u8_writer : null_writer;
++ } else if (bits <= 16) {
++ drv_data->n_bytes = 2;
++ drv_data->dma_width = DCMD_WIDTH2;
++ drv_data->read = drv_data->read != null_reader ?
++ u16_reader : null_reader;
++ drv_data->write = drv_data->write != null_writer ?
++ u16_writer : null_writer;
++ } else if (bits <= 32) {
++ drv_data->n_bytes = 4;
++ drv_data->dma_width = DCMD_WIDTH4;
++ drv_data->read = drv_data->read != null_reader ?
++ u32_reader : null_reader;
++ drv_data->write = drv_data->write != null_writer ?
++ u32_writer : null_writer;
++ }
++
++ cr0 = clk_div
++ | SSCR0_Motorola
++ | SSCR0_DataSize(bits & 0x0f)
++ | SSCR0_SSE
++ | (bits > 16 ? SSCR0_EDSS : 0);
++
++ /* Start it back up */
++ write_SSCR0(cr0, reg);
++ }
++
+ message->state = RUNNING_STATE;
+
+ /* Try to map dma buffer and do a dma transfer if successful */
+@@ -739,13 +805,13 @@ static void pump_transfers(unsigned long
+ if (drv_data->rx == drv_data->null_dma_buf)
+ /* No target address increment */
+ DCMD(drv_data->rx_channel) = DCMD_FLOWSRC
+- | chip->dma_width
++ | drv_data->dma_width
+ | chip->dma_burst_size
+ | drv_data->len;
+ else
+ DCMD(drv_data->rx_channel) = DCMD_INCTRGADDR
+ | DCMD_FLOWSRC
+- | chip->dma_width
++ | drv_data->dma_width
+ | chip->dma_burst_size
+ | drv_data->len;
+
+@@ -756,13 +822,13 @@ static void pump_transfers(unsigned long
+ if (drv_data->tx == drv_data->null_dma_buf)
+ /* No source address increment */
+ DCMD(drv_data->tx_channel) = DCMD_FLOWTRG
+- | chip->dma_width
++ | drv_data->dma_width
+ | chip->dma_burst_size
+ | drv_data->len;
+ else
+ DCMD(drv_data->tx_channel) = DCMD_INCSRCADDR
+ | DCMD_FLOWTRG
+- | chip->dma_width
++ | drv_data->dma_width
+ | chip->dma_burst_size
+ | drv_data->len;
+
+@@ -943,6 +1009,7 @@ static int setup(struct spi_device *spi)
+ clk_div = SSP3_SerClkDiv(spi->max_speed_hz);
+ else
+ return -ENODEV;
++ chip->speed_hz = spi->max_speed_hz;
+
+ chip->cr0 = clk_div
+ | SSCR0_Motorola
+@@ -987,6 +1054,7 @@ static int setup(struct spi_device *spi)
+ kfree(chip);
+ return -ENODEV;
+ }
++ chip->bits_per_word = spi->bits_per_word;
+
+ spi_set_ctldata(spi, chip);
+