diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-04-06 10:08:19 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-04-06 10:08:19 -0700 |
commit | ce40196200ca234d1abe8dd66a96906745501a05 (patch) | |
tree | 700e1c99e298d8636b2b97f68276681db577e719 /driver | |
parent | 788a651935432b61fd0d03707d0d679de678b9c1 (diff) | |
download | patches-ce40196200ca234d1abe8dd66a96906745501a05.tar.gz |
more patches added
Diffstat (limited to 'driver')
-rw-r--r-- | driver/driver-core-bus-device-event-delay.patch | 99 | ||||
-rw-r--r-- | driver/put_device-might_sleep.patch | 2 | ||||
-rw-r--r-- | driver/spi-update-to-pxa2xx-spi-driver.patch | 202 |
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); + |