Lines Matching full:flash

4  * Driver for SST25L SPI Flash chips
30 #include <linux/spi/flash.h>
72 static int sst25l_status(struct sst25l_flash *flash, int *status) in sst25l_status() argument
88 err = spi_sync(flash->spi, &m); in sst25l_status()
96 static int sst25l_write_enable(struct sst25l_flash *flash, int enable) in sst25l_write_enable() argument
102 err = spi_write(flash->spi, command, 1); in sst25l_write_enable()
107 err = spi_write(flash->spi, command, 1); in sst25l_write_enable()
113 err = spi_write(flash->spi, command, 2); in sst25l_write_enable()
118 err = sst25l_status(flash, &status); in sst25l_write_enable()
128 static int sst25l_wait_till_ready(struct sst25l_flash *flash) in sst25l_wait_till_ready() argument
135 err = sst25l_status(flash, &status); in sst25l_wait_till_ready()
147 static int sst25l_erase_sector(struct sst25l_flash *flash, uint32_t offset) in sst25l_erase_sector() argument
152 err = sst25l_write_enable(flash, 1); in sst25l_erase_sector()
160 err = spi_write(flash->spi, command, 4); in sst25l_erase_sector()
164 err = sst25l_wait_till_ready(flash); in sst25l_erase_sector()
168 return sst25l_write_enable(flash, 0); in sst25l_erase_sector()
173 struct sst25l_flash *flash = to_sst25l_flash(mtd); in sst25l_erase() local
178 if (instr->addr + instr->len > flash->mtd.size) in sst25l_erase()
190 mutex_lock(&flash->lock); in sst25l_erase()
192 err = sst25l_wait_till_ready(flash); in sst25l_erase()
194 mutex_unlock(&flash->lock); in sst25l_erase()
199 err = sst25l_erase_sector(flash, addr); in sst25l_erase()
201 mutex_unlock(&flash->lock); in sst25l_erase()
203 dev_err(&flash->spi->dev, "Erase failed\n"); in sst25l_erase()
210 mutex_unlock(&flash->lock); in sst25l_erase()
220 struct sst25l_flash *flash = to_sst25l_flash(mtd); in sst25l_read() local
230 if (from + len > flash->mtd.size) in sst25l_read()
252 mutex_lock(&flash->lock); in sst25l_read()
255 ret = sst25l_wait_till_ready(flash); in sst25l_read()
257 mutex_unlock(&flash->lock); in sst25l_read()
261 spi_sync(flash->spi, &message); in sst25l_read()
266 mutex_unlock(&flash->lock); in sst25l_read()
273 struct sst25l_flash *flash = to_sst25l_flash(mtd); in sst25l_write() local
281 if (to + len > flash->mtd.size) in sst25l_write()
287 mutex_lock(&flash->lock); in sst25l_write()
289 ret = sst25l_write_enable(flash, 1); in sst25l_write()
294 ret = sst25l_wait_till_ready(flash); in sst25l_write()
304 ret = spi_write(flash->spi, command, 5); in sst25l_write()
315 ret = sst25l_wait_till_ready(flash); in sst25l_write()
320 ret = spi_write(flash->spi, command, 2); in sst25l_write()
327 ret = sst25l_write_enable(flash, 0); in sst25l_write()
332 mutex_unlock(&flash->lock); in sst25l_write()
379 struct sst25l_flash *flash; in sst25l_probe() local
387 flash = kzalloc(sizeof(struct sst25l_flash), GFP_KERNEL); in sst25l_probe()
388 if (!flash) in sst25l_probe()
391 flash->spi = spi; in sst25l_probe()
392 mutex_init(&flash->lock); in sst25l_probe()
393 dev_set_drvdata(&spi->dev, flash); in sst25l_probe()
397 flash->mtd.name = data->name; in sst25l_probe()
399 flash->mtd.name = dev_name(&spi->dev); in sst25l_probe()
401 flash->mtd.type = MTD_NORFLASH; in sst25l_probe()
402 flash->mtd.flags = MTD_CAP_NORFLASH; in sst25l_probe()
403 flash->mtd.erasesize = flash_info->erase_size; in sst25l_probe()
404 flash->mtd.writesize = flash_info->page_size; in sst25l_probe()
405 flash->mtd.size = flash_info->page_size * flash_info->nr_pages; in sst25l_probe()
406 flash->mtd.erase = sst25l_erase; in sst25l_probe()
407 flash->mtd.read = sst25l_read; in sst25l_probe()
408 flash->mtd.write = sst25l_write; in sst25l_probe()
411 (long long)flash->mtd.size >> 10); in sst25l_probe()
415 flash->mtd.name, in sst25l_probe()
416 (long long)flash->mtd.size, (long long)(flash->mtd.size >> 20), in sst25l_probe()
417 flash->mtd.erasesize, flash->mtd.erasesize / 1024, in sst25l_probe()
418 flash->mtd.numeraseregions); in sst25l_probe()
421 ret = mtd_device_parse_register(&flash->mtd, NULL, 0, in sst25l_probe()
425 kfree(flash); in sst25l_probe()
435 struct sst25l_flash *flash = dev_get_drvdata(&spi->dev); in sst25l_remove() local
438 ret = mtd_device_unregister(&flash->mtd); in sst25l_remove()
440 kfree(flash); in sst25l_remove()
466 MODULE_DESCRIPTION("MTD SPI driver for SST25L Flash chips");