static bool_t spi_flash_unregister(struct resource_t * res) { struct block_t * blk; char name[64]; snprintf(name, sizeof(name), "%s.%d", res->name, res->id); blk = search_block(name); if(!blk) return FALSE; if(!unregister_block(blk)) return FALSE; spi_device_free(((struct spi_flash_private_data_t *)blk->priv)->dev); free(blk->priv); free(blk->name); free(blk); return TRUE; }
static int m_spi_gc(lua_State * L) { struct lspi_t * spi = luaL_checkudata(L, 1, MT_HARDWARE_SPI); spi_device_free(spi->dev); return 0; }
static bool_t spi_flash_register(struct resource_t * res) { struct spi_flash_data_t * rdat = (struct spi_flash_data_t *)res->data; struct spi_flash_private_data_t * dat; struct spi_device_t * dev; struct spi_flash_id_t * id; struct block_t * blk; char name[64]; dev = spi_device_alloc(rdat->spibus, rdat->mode, 8, rdat->speed); if(!dev) return FALSE; id = spi_flash_read_id(dev); if(!id) { spi_device_free(dev); return FALSE; } dat = malloc(sizeof(struct spi_flash_private_data_t)); if(!dat) { spi_device_free(dev); return FALSE; } blk = malloc(sizeof(struct block_t)); if(!blk) { spi_device_free(dev); free(dat); return FALSE; } snprintf(name, sizeof(name), "%s.%d", res->name, res->id); dat->dev = dev; dat->id = id; blk->name = strdup(name); if(id->flags & SECTOR_4K) { blk->blksz = 4096; blk->blkcnt = id->sector_size * id->sector_count / 4096; } else { blk->blksz = id->sector_size; blk->blkcnt = id->sector_count; } blk->read = spi_flash_read; blk->write = spi_flash_write; blk->sync = spi_flash_sync; blk->suspend = spi_flash_suspend; blk->resume = spi_flash_resume; blk->priv = dat; spi_flash_write_enable(dev); spi_flash_write_status_register(dev, 0); if(register_block(blk)) return TRUE; spi_device_free(dev); free(blk->priv); free(blk->name); free(blk); return FALSE; }