From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Chou Date: Sat, 7 Nov 2015 21:43:28 +0800 Subject: [U-Boot] [PATCH v4 1/3] dm: implement a MTD uclass In-Reply-To: References: <1444289667-23775-1-git-send-email-thomas@wytron.com.tw> <1446556146-9876-1-git-send-email-thomas@wytron.com.tw> <5638C985.9060308@wytron.com.tw> <563977AB.4040709@wytron.com.tw> Message-ID: <563E0000.6040105@wytron.com.tw> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de HI Jagan, On 2015?11?07? 20:35, Jagan Teki wrote: >> It seems we are working toward the same direction. :) > > Sorry, I couldn't understand this looks we're in different direction. > > Let me explain what I thought about mtd_info usage. udevice should be > part of underlying flash structure's like cfi, nand and spi_flash and > mtd_info should be used for it's core api's like _erase. _read and > _write and underlying driver will use their global structure that > include's mtd and udevice as a function pointer like this. Please see v5 of this patch and v3 of altera qspi. The uclass priv of mtd class is an auto-allocated mtd_info. The spi_flash_priv includes both mtd_info and spi_flash. So the only difference is the spi_flash. This is because cfi uses struct flash, while spi flash uses struct spi_flash. So it is better to leave the struct flash to driver allocation. The mtd->priv points to struct spi_flash for spi flash, and points to struct flash for cfi flash. It serves the same purpose. The struct flash has *mtd. The struct spi_flash has *mtd, too. I added struct udevice *dev to mtd_info. The struct spi_flash has *dev, but struct flash has not. > > struct spi_flash { > struct mtd_info *info; > struct udevice *device; > } > struct flash { ... struct mtd_info *info; } > struct spi_flash_priv { > struct spi_flash flash; > struct mtd_info mtd; > }; > Simply, struct mtd_info. > static int spi_flash_std_probe(struct udevice *dev) > { > struct spi_flash_priv *priv = dev_get_uclass_priv(dev); > struct spi_slave *spi = dev_get_parent_priv(dev); > struct spi_flash *flash; > int ret; > > flash = &priv->flash; > flash->mtd = &priv->mtd; mtd = dev_get_uclass_priv(dev); flash->mtd = mtd; > > flash->spi = spi; > flash->priv = priv; > > priv->mtd.priv = flash; > flash->dev = dev; mtd->priv = flash; mtd->dev = dev; flash->mtd->dev is the same as spi's flash->dev > } > > U_BOOT_DRIVER(spi_flash_std) = { > .name = "spi_flash_std", > .id = UCLASS_SPI_FLASH, > .of_match = spi_flash_std_ids, > .probe = spi_flash_std_probe, > .priv_auto_alloc_size = sizeof(struct spi_flash_priv), > }; > > This is the way I have implemented mtd on spi-flash[1] [2] > [1] https://patchwork.ozlabs.org/patch/529397/ > [2] https://patchwork.ozlabs.org/patch/529399/ > > Please explain how this related your approach of adding udevice to mtd. > The flash ops which u-boot commands calls are built upon mtd ops. eg, write_buff() { mtd_write(); } flash_erase() { mtd_erase(); } Please let me know what do you think. Thanks. :) Best regards, Thomas