Register the on-die spi device with the mtd subsystem. Add mtd access stub functions.
Cc: Rodrigo Vivi <rodrigo.v...@intel.com> Cc: Lucas De Marchi <lucas.demar...@intel.com> Signed-off-by: Tomas Winkler <tomas.wink...@intel.com> --- drivers/gpu/drm/i915/spi/intel_spi_drv.c | 86 +++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/spi/intel_spi_drv.c b/drivers/gpu/drm/i915/spi/intel_spi_drv.c index df6a461d520d..bdf58e14fd6b 100644 --- a/drivers/gpu/drm/i915/spi/intel_spi_drv.c +++ b/drivers/gpu/drm/i915/spi/intel_spi_drv.c @@ -15,7 +15,11 @@ #include <linux/delay.h> #include <spi/intel_spi.h> +#include <linux/mtd/mtd.h> +#include <linux/mtd/partitions.h> + struct i915_spi { + struct mtd_info mtd; void __iomem *base; size_t size; unsigned int nregions; @@ -344,6 +348,73 @@ static int i915_spi_init(struct i915_spi *spi, struct device *device) return n; } +static int i915_spi_erase(struct mtd_info *mtd, struct erase_info *info) +{ + dev_err(&mtd->dev, "erasing %lld %lld\n", info->addr, info->len); + + return 0; +} + +static int i915_spi_read(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) +{ + dev_err(&mtd->dev, "read %lld %zd\n", from, len); + + return 0; +} + +static int i915_spi_write(struct mtd_info *mtd, loff_t to, size_t len, + size_t *retlen, const u_char *buf) +{ + dev_err(&mtd->dev, "writing %lld %zd\n", to, len); + + return 0; +} + +static int i915_spi_init_mtd(struct i915_spi *spi, struct device *device, + unsigned int nparts) +{ + unsigned int i; + unsigned int n; + struct mtd_partition *parts = NULL; + int ret; + + dev_dbg(device, "registering with mtd\n"); + + spi->mtd.owner = THIS_MODULE; + spi->mtd.dev.parent = device; + spi->mtd.flags = MTD_CAP_NORFLASH | MTD_WRITEABLE; + spi->mtd.type = MTD_DATAFLASH; + spi->mtd.priv = spi; + spi->mtd._write = i915_spi_write; + spi->mtd._read = i915_spi_read; + spi->mtd._erase = i915_spi_erase; + spi->mtd.writesize = SZ_4; /* 4 bytes granularity */ + spi->mtd.erasesize = SZ_4K; /* 4K bytes granularity */ + spi->mtd.size = spi->size; + + parts = kcalloc(spi->nregions, sizeof(*parts), GFP_KERNEL); + if (!parts) + return -ENOMEM; + + for (i = 0, n = 0; i < spi->nregions && n < nparts; i++) { + if (!spi->regions[i].is_readable) + continue; + parts[n].name = spi->regions[i].name; + parts[n].offset = spi->regions[i].offset; + parts[n].size = spi->regions[i].size; + if (!spi->regions[i].is_writable) + parts[n].mask_flags = MTD_WRITEABLE; + n++; + } + + ret = mtd_device_register(&spi->mtd, parts, n); + + kfree(parts); + + return ret; +} + static int i915_spi_probe(struct platform_device *platdev) { struct resource *bar; @@ -413,15 +484,28 @@ static int i915_spi_probe(struct platform_device *platdev) return -ENODEV; } + ret = i915_spi_init_mtd(spi, device, ret); + if (ret) { + dev_err(device, "i915-spi failed init mtd %d\n", ret); + return ret; + } + platform_set_drvdata(platdev, spi); dev_dbg(device, "i915-spi is bound\n"); - return 0; + return ret; } static int i915_spi_remove(struct platform_device *platdev) { + struct i915_spi *spi = platform_get_drvdata(platdev); + + if (!spi) + return 0; + + mtd_device_unregister(&spi->mtd); + platform_set_drvdata(platdev, NULL); return 0; -- 2.26.2 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx