Lines Matching full:flash
4 * Driver for SST25L SPI Flash chips
29 #include <linux/spi/flash.h>
71 static int sst25l_status(struct sst25l_flash *flash, int *status) in sst25l_status() argument
87 err = spi_sync(flash->spi, &m); in sst25l_status()
95 static int sst25l_write_enable(struct sst25l_flash *flash, int enable) in sst25l_write_enable() argument
101 err = spi_write(flash->spi, command, 1); in sst25l_write_enable()
106 err = spi_write(flash->spi, command, 1); in sst25l_write_enable()
112 err = spi_write(flash->spi, command, 2); in sst25l_write_enable()
117 err = sst25l_status(flash, &status); in sst25l_write_enable()
127 static int sst25l_wait_till_ready(struct sst25l_flash *flash) in sst25l_wait_till_ready() argument
134 err = sst25l_status(flash, &status); in sst25l_wait_till_ready()
146 static int sst25l_erase_sector(struct sst25l_flash *flash, uint32_t offset) in sst25l_erase_sector() argument
151 err = sst25l_write_enable(flash, 1); in sst25l_erase_sector()
159 err = spi_write(flash->spi, command, 4); in sst25l_erase_sector()
163 err = sst25l_wait_till_ready(flash); in sst25l_erase_sector()
167 return sst25l_write_enable(flash, 0); in sst25l_erase_sector()
172 struct sst25l_flash *flash = to_sst25l_flash(mtd); in sst25l_erase() local
186 mutex_lock(&flash->lock); in sst25l_erase()
188 err = sst25l_wait_till_ready(flash); in sst25l_erase()
190 mutex_unlock(&flash->lock); in sst25l_erase()
195 err = sst25l_erase_sector(flash, addr); in sst25l_erase()
197 mutex_unlock(&flash->lock); in sst25l_erase()
198 dev_err(&flash->spi->dev, "Erase failed\n"); in sst25l_erase()
205 mutex_unlock(&flash->lock); in sst25l_erase()
213 struct sst25l_flash *flash = to_sst25l_flash(mtd); in sst25l_read() local
235 mutex_lock(&flash->lock); in sst25l_read()
238 ret = sst25l_wait_till_ready(flash); in sst25l_read()
240 mutex_unlock(&flash->lock); in sst25l_read()
244 spi_sync(flash->spi, &message); in sst25l_read()
249 mutex_unlock(&flash->lock); in sst25l_read()
256 struct sst25l_flash *flash = to_sst25l_flash(mtd); in sst25l_write() local
263 mutex_lock(&flash->lock); in sst25l_write()
265 ret = sst25l_write_enable(flash, 1); in sst25l_write()
270 ret = sst25l_wait_till_ready(flash); in sst25l_write()
280 ret = spi_write(flash->spi, command, 5); in sst25l_write()
291 ret = sst25l_wait_till_ready(flash); in sst25l_write()
296 ret = spi_write(flash->spi, command, 2); in sst25l_write()
303 ret = sst25l_write_enable(flash, 0); in sst25l_write()
308 mutex_unlock(&flash->lock); in sst25l_write()
355 struct sst25l_flash *flash; in sst25l_probe() local
363 flash = devm_kzalloc(&spi->dev, sizeof(*flash), GFP_KERNEL); in sst25l_probe()
364 if (!flash) in sst25l_probe()
367 flash->spi = spi; in sst25l_probe()
368 mutex_init(&flash->lock); in sst25l_probe()
369 spi_set_drvdata(spi, flash); in sst25l_probe()
373 flash->mtd.name = data->name; in sst25l_probe()
375 flash->mtd.dev.parent = &spi->dev; in sst25l_probe()
376 flash->mtd.type = MTD_NORFLASH; in sst25l_probe()
377 flash->mtd.flags = MTD_CAP_NORFLASH; in sst25l_probe()
378 flash->mtd.erasesize = flash_info->erase_size; in sst25l_probe()
379 flash->mtd.writesize = flash_info->page_size; in sst25l_probe()
380 flash->mtd.writebufsize = flash_info->page_size; in sst25l_probe()
381 flash->mtd.size = flash_info->page_size * flash_info->nr_pages; in sst25l_probe()
382 flash->mtd._erase = sst25l_erase; in sst25l_probe()
383 flash->mtd._read = sst25l_read; in sst25l_probe()
384 flash->mtd._write = sst25l_write; in sst25l_probe()
387 (long long)flash->mtd.size >> 10); in sst25l_probe()
391 flash->mtd.name, in sst25l_probe()
392 (long long)flash->mtd.size, (long long)(flash->mtd.size >> 20), in sst25l_probe()
393 flash->mtd.erasesize, flash->mtd.erasesize / 1024, in sst25l_probe()
394 flash->mtd.numeraseregions); in sst25l_probe()
397 ret = mtd_device_register(&flash->mtd, data ? data->parts : NULL, in sst25l_probe()
407 struct sst25l_flash *flash = spi_get_drvdata(spi); in sst25l_remove() local
409 return mtd_device_unregister(&flash->mtd); in sst25l_remove()
422 MODULE_DESCRIPTION("MTD SPI driver for SST25L Flash chips");