--- zzzz-none-000/linux-2.6.39.4/drivers/spi/spi.c 2011-08-03 19:43:28.000000000 +0000 +++ puma6-arm-6490-729/linux-2.6.39.4/drivers/spi/spi.c 2021-11-10 13:23:10.000000000 +0000 @@ -318,7 +318,7 @@ } spi->master = master; - spi->dev.parent = dev; + spi->dev.parent = &master->dev; spi->dev.bus = &spi_bus_type; spi->dev.release = spidev_release; device_initialize(&spi->dev); @@ -480,19 +480,34 @@ * The board info passed can safely be __initdata ... but be careful of * any embedded pointers (platform_data, etc), they're copied as-is. */ -int __init +#ifdef CONFIG_GEN3_SPI +int +#else +int __init +#endif spi_register_board_info(struct spi_board_info const *info, unsigned n) { - struct boardinfo *bi; + struct boardinfo *bi, *temp; int i; - bi = kzalloc(n * sizeof(*bi), GFP_KERNEL); - if (!bi) - return -ENOMEM; - for (i = 0; i < n; i++, bi++, info++) { + for (i = 0; i < n; i++, info++) { struct spi_master *master; + bi = kzalloc(sizeof(*bi), GFP_KERNEL); + if (!bi) { + for( --i, --info; i >=0; i--, info--) + mutex_lock(&board_lock); + list_for_each_entry_safe(bi, temp, &board_list, list) { + if (!memcmp(&bi->board_info, info, sizeof(*info))) { + list_del(&bi->list); + kfree(bi); + break; + } + } + mutex_unlock(&board_lock); + return -ENOMEM; + } memcpy(&bi->board_info, info, sizeof(*info)); mutex_lock(&board_lock); list_add_tail(&bi->list, &board_list); @@ -503,6 +518,30 @@ return 0; } +#ifdef CONFIG_GEN3_SPI +EXPORT_SYMBOL_GPL(spi_register_board_info); + +int spi_unregister_board_info(struct spi_board_info *info, unsigned n) +{ + struct boardinfo *bi,*temp; + int i; + + for (i = 0; i < n; i++, info++) { + mutex_lock(&board_lock); + list_for_each_entry_safe(bi, temp, &board_list, list) { + if (!memcmp(&bi->board_info, info, sizeof(*info))) { + list_del(&bi->list); + kfree(bi); + break; + } + } + mutex_unlock(&board_lock); + } + return 0; +} + +EXPORT_SYMBOL_GPL(spi_unregister_board_info); +#endif /*-------------------------------------------------------------------------*/ @@ -510,6 +549,7 @@ { struct spi_master *master; + put_device(dev->parent); master = container_of(dev, struct spi_master, dev); kfree(master); } @@ -654,21 +694,19 @@ */ void spi_unregister_master(struct spi_master *master) { - int dummy; - mutex_lock(&board_lock); list_del(&master->list); mutex_unlock(&board_lock); - dummy = device_for_each_child(&master->dev, NULL, __unregister); + device_for_each_child(&master->dev, NULL, __unregister); device_unregister(&master->dev); } EXPORT_SYMBOL_GPL(spi_unregister_master); -static int __spi_master_match(struct device *dev, void *data) +static int __spi_master_match(struct device *dev, const void *data) { struct spi_master *m; - u16 *bus_num = data; + const u16 *bus_num = data; m = container_of(dev, struct spi_master, dev); return m->bus_num == *bus_num;