The current bus implementation is simple but leaves some things to drivers which are better handled in the uclass.
At present uclasses cannot provide a common way of dealing with children (i.e. devices on the bus), so we have duplication in the drivers. The same code is repeated in each driver when it would be better to put it in the uclass. Secondly, we don't have the concept of per-child platform data for devices on the bus. Instead the per-child data can only exist when the child is actually probed. This is not really suitable. Examples of things we want to know before a child is probed are: - chip address (for I2C) - chip select (for SPI) - device address (for PCI) These things are static and do not change when the device is probed and removed. In some cases (such as SPI mode and maximum speed), the data may be copied to run-time data when the device is probed. It may then be changed while the driver is active, but the original platform data is never changed by drivers once it is set up. To address these issues, additional functions are added: - per-child platform data, which can be defined by the uclass and (if necessary) overriden by the bus driver. This allows the bus's uclass to provide some consistency here - per-child post-bind and pre-probe methods in the uclass. These allow the bus uclass to set up the per-child platform data, and also to do any last-minute adjustments before the child is probed. With these changes, some code can be removed from the existing I2C and SPI drivers and this has been done as part of this series. With this series I2C and SPI are tested on: - jetson-tk1 (Tegra 124) - beaver (Tegra 30) - seaboard (Tegra 20, I2C only) - trimslice (Tegra 20, SPI only) - snow (Exynos 5250) - pit (Exynos 5420, note I2C probe is previously broken) - link (x86) - sandbox Note: Some of these changes were previously included in the DM PCI RFC. This series is available at u-boot-dm/i2c-working. Changes in v2: - Add a TODO to remove struct dm_spi_bus - Add additional comments to spi.h - Add new patch to provide an offset length parameter where needed - Add patches to tidy up cros_ec using new I2C/SPI features - Copy max_hz and mode from platdata to spi_slave when probing - Drop RFC prefix since this series has been properly tested now - Tidy up soft_spi driver also - Update commit message to describe immuatable platform data - Update the spi-howto docs Simon Glass (26): dm: i2c: Provide an offset length parameter where needed dm: Don't run tests if U-Boot cannot be built dm: core: Improve comments for uclass_first/next_device() dm: core: Set device tree node for root device dm: core: Tidy up error handling in device_bind() dm: core: Allocate platform data when binding a device dm: core: Allow parents to have platform data for their children dm: core: Allow uclasses to specific the platdata for a device's children dm: core: Add a post_bind method for parents dm: core: Add a function to get a device's uclass ID dm: core: Add a flag to control sequence numbering dm: core: Allow uclasses to specific the private data for a device's children dm: spi: Move the per-child data size to the uclass dm: core: Allow the uclass to set up a device's child after binding dm: sandbox: sf: Tidy up the error handling in sandbox_sf_probe() dm: core: Allow uclass to set up a device's child before it is probed dm: spi: Set up the spi_slave device pointer in child_pre_probe() dm: spi: Move slave details to child platdata dm: i2c: Move slave details to child platdata dm: tegra: Drop unused COMPAT features for I2C, SPI dm: exynos: Drop unused COMPAT features for SPI dm: core: Ignore disabled devices when binding dm: cros_ec: Don't require protocol 3 support dm: cros_ec: Move cros_ec_i2c over to driver model dm: cros_ec_spi: Remove old pre-driver-model code dm: Update documentation for new bus features arch/arm/cpu/tegra20-common/pmu.c | 2 +- board/avionic-design/common/tamonten-ng.c | 2 +- board/nvidia/cardhu/cardhu.c | 4 +- board/nvidia/dalmore/dalmore.c | 4 +- board/nvidia/whistler/whistler.c | 4 +- board/toradex/apalis_t30/apalis_t30.c | 2 +- common/cmd_i2c.c | 2 +- doc/driver-model/README.txt | 91 +++++------ doc/driver-model/spi-howto.txt | 40 ++++- drivers/core/device-remove.c | 16 +- drivers/core/device.c | 119 ++++++++++---- drivers/core/root.c | 8 + drivers/core/uclass.c | 34 +++- drivers/i2c/i2c-uclass-compat.c | 2 +- drivers/i2c/i2c-uclass.c | 68 ++++---- drivers/i2c/i2c-uniphier-f.c | 12 -- drivers/i2c/i2c-uniphier.c | 12 -- drivers/i2c/s3c24x0_i2c.c | 12 -- drivers/i2c/sandbox_i2c.c | 30 +--- drivers/i2c/tegra_i2c.c | 18 --- drivers/misc/cros_ec.c | 10 +- drivers/misc/cros_ec_i2c.c | 107 +++++-------- drivers/misc/cros_ec_spi.c | 70 +-------- drivers/mtd/spi/sandbox.c | 12 +- drivers/mtd/spi/sf_probe.c | 3 +- drivers/power/as3722.c | 2 +- drivers/serial/serial-uclass.c | 1 + drivers/spi/cadence_qspi.c | 1 - drivers/spi/designware_spi.c | 1 - drivers/spi/exynos_spi.c | 1 - drivers/spi/sandbox_spi.c | 1 - drivers/spi/soft_spi.c | 10 -- drivers/spi/spi-uclass.c | 95 ++++++++---- drivers/spi/tegra114_spi.c | 1 - drivers/spi/tegra20_sflash.c | 1 - drivers/spi/tegra20_slink.c | 1 - include/configs/snow.h | 5 + include/dm/device.h | 29 ++++ include/dm/test.h | 3 + include/dm/uclass-internal.h | 11 ++ include/dm/uclass.h | 21 +++ include/fdtdec.h | 7 - include/i2c.h | 12 +- include/spi.h | 42 +++-- lib/fdtdec.c | 7 - test/dm/bus.c | 250 +++++++++++++++++++++++++++++- test/dm/core.c | 11 ++ test/dm/i2c.c | 10 +- test/dm/spi.c | 6 +- test/dm/test-dm.sh | 9 +- test/dm/test-fdt.c | 20 ++- test/dm/test.dts | 16 ++ 52 files changed, 812 insertions(+), 446 deletions(-) -- 2.2.0.rc0.207.ga3a616c _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot