mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-11-08 04:35:48 +00:00
* mtdchar: Prevent unbounded allocation in MEMWRITE ioctl
* gen_probe: Use bitmap_zalloc() when applicable
* Introduce an expert mode for forensics and debugging purposes
* Clear out unregistered devices a bit more
* Provide unique name for nvmem device
* Remove unused header file <linux/mtd/latch-addr-flash.h>
* Fixed breaking list in __mtd_del_partition.
MTD device changes:
* sst25l, mchp48l640, mchp23k256, dataflash:
- Warn about failure to unregister mtd device
Raw NAND core changes:
* Export nand_read_page_hwecc_oob_first()
GPMC memory controller for OMAP2 NAND controller changes:
* GPMC:
- Add support for AM64 SoC and allow build on K3 platforms
- Use a compatible match table when checking for NAND controller
- Use platform_get_irq() to get the interrupt
Raw NAND controller changes:
* OMAP2 NAND controller:
- Document the missing 'rb-gpios' DT property
- Drop unused variable
- Fix force_8bit flag behaviour for DMA mode
- Move to exec_op interface
- Use platform_get_irq() to get the interrupt
* Renesas:
- Add new NAND controller driver with its bindings and MAINTAINERS entry
* Onenand:
- Remove redundant variable ooblen
* MPC5121:
- Remove unused variable in ads5121_select_chip()
* GPMI:
- Add ERR007117 protection for nfc_apply_timings
- Remove explicit default gpmi clock setting for i.MX6
- Use platform_get_irq_byname() to get the interrupt
- Remove unneeded variable
* Ingenic:
- JZ4740 needs 'oob_first' read page function
* Davinci:
- Rewrite function description
- Avoid duplicated page read
- Don't calculate ECC when reading page
SPI NOR core changes:
* Add Pratyush as SPI NOR co-maintainer.
* Flash parameters initialization was done in a spaghetti way. Clean
flash parameters initialization.
* Rework the flash_info flags and clarify where one should be used.
* Initialize all flash parameters based on JESD216 SFDP where possible.
Flash parameters and settings that are SFDP discoverable should not be
duplicated via flash_info flags at flash declaration.
* Remove debugfs entries that duplicate sysfs entries.
SPI NOR manufacturer driver changes:
* Use late_init() hook in various drivers to make it clear that those
flash parameters are either not declared in the JESD216 SFDP standard,
or the SFDP tables which define those flash parameters are not defined
by the flash.
* Fix mtd size for s3an flashes.
* Write 2 bytes when disabling Octal DTR mode: 1 byte long transactions are
not allowed in 8D-8D-8D mode.
Hyperbus changes:
* Couple of fixes in Renesas hyperbus rpc-if driver to avoid crash on
module remove and for missing check for error value in probe.
-----BEGIN PGP SIGNATURE-----
iQEzBAABCgAdFiEE9HuaYnbmDhq/XIDIJWrqGEe9VoQFAmHO+g8ACgkQJWrqGEe9
VoRW1AgAjFC58ARNBw7asYerGyiUWv7b8RjPIRWZqmcSQ6D5m20cGNBTa15c2NrC
v0dNMf2+3FrCECso6wKPbkEbLt9lHjlMmt+AdlraV0QvHBXrJq/Tc2p2ATI5kTqq
WaP4oCx1mccgO+IrEIiGikOcFx/TLBBJEk+U0Anbm16eia9Cjw+uD/q7X2HbF5xQ
MOFZyQ+rAVqkM8tCh6VHhCpX85pn9pj2ZdouOhPWsqjULaGqDbUopC70YPZLVJyx
9u4xHFaVLVae6AS5Gitser2ie8klypTN/H+1weSao43GGmwIrT0wK0mCOVIm90Zd
4frlpnt4QE/IIAKgAm+HxkWg+KV9qg==
=E8lV
-----END PGP SIGNATURE-----
Merge tag 'mtd/for-5.17' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux
Pull MTD updates from Miquel Raynal:
"MTD core changes:
- mtdchar: Prevent unbounded allocation in MEMWRITE ioctl
- gen_probe: Use bitmap_zalloc() when applicable
- Introduce an expert mode for forensics and debugging purposes
- Clear out unregistered devices a bit more
- Provide unique name for nvmem device
- Remove unused header file <linux/mtd/latch-addr-flash.h>
- Fixed breaking list in __mtd_del_partition.
MTD device changes:
- Warn about failure to unregister mtd device in sst25l, mchp48l640,
mchp23k256, and dataflash drivers.
Raw NAND core changes:
- Export nand_read_page_hwecc_oob_first()
GPMC memory controller for OMAP2 NAND controller changes:
- Add support for AM64 SoC and allow build on K3 platforms
- Use a compatible match table when checking for NAND controller
- Use platform_get_irq() to get the interrupt
Raw NAND controller changes:
- OMAP2 NAND controller:
- Document the missing 'rb-gpios' DT property
- Drop unused variable
- Fix force_8bit flag behaviour for DMA mode
- Move to exec_op interface
- Use platform_get_irq() to get the interrupt
- Renesas:
- Add new NAND controller driver with its bindings and MAINTAINERS entry
- Onenand:
- Remove redundant variable ooblen
- MPC5121:
- Remove unused variable in ads5121_select_chip()
- GPMI:
- Add ERR007117 protection for nfc_apply_timings
- Remove explicit default gpmi clock setting for i.MX6
- Use platform_get_irq_byname() to get the interrupt
- Remove unneeded variable
- Ingenic:
- JZ4740 needs 'oob_first' read page function
- Davinci:
- Rewrite function description
- Avoid duplicated page read
- Don't calculate ECC when reading page
SPI NOR core changes:
- Add Pratyush as SPI NOR co-maintainer.
- Flash parameters initialization was done in a spaghetti way. Clean
flash parameters initialization.
- Rework the flash_info flags and clarify where one should be used.
- Initialize all flash parameters based on JESD216 SFDP where
possible. Flash parameters and settings that are SFDP discoverable
should not be duplicated via flash_info flags at flash declaration.
- Remove debugfs entries that duplicate sysfs entries.
SPI NOR manufacturer driver changes:
- Use late_init() hook in various drivers to make it clear that those
flash parameters are either not declared in the JESD216 SFDP
standard, or the SFDP tables which define those flash parameters
are not defined by the flash.
- Fix mtd size for s3an flashes.
- Write 2 bytes when disabling Octal DTR mode: 1 byte long
transactions are not allowed in 8D-8D-8D mode.
Hyperbus changes:
- Couple of fixes in Renesas hyperbus rpc-if driver to avoid crash on
module remove and for missing check for error value in probe"
* tag 'mtd/for-5.17' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux: (71 commits)
mtd: spi-nor: Remove debugfs entries that duplicate sysfs entries
mtd: spi-nor: micron-st: write 2 bytes when disabling Octal DTR mode
mtd: spi-nor: spansion: write 2 bytes when disabling Octal DTR mode
mtd: spi-nor: core: use 2 data bytes for template ops
mtd: spi-nor: Constify part specific fixup hooks
mtd: spi-nor: core: Remove reference to spi-nor.c
mtd: rawnand: gpmi: Use platform_get_irq_byname() to get the interrupt
mtd: rawnand: omap_elm: Use platform_get_irq() to get the interrupt
mtd: rawnand: omap2: Select GPMC device driver for ARCH_K3
memory: omap-gpmc: Use a compatible match table when checking for NAND controller
memory: omap-gpmc: Add support for GPMC on AM64 SoC
dt-bindings: memory-controllers: ti,gpmc: Add compatible for AM64
memory: omap-gpmc: Use platform_get_irq() to get the interrupt
MAINTAINERS: Add an entry for Renesas NAND controller
mtd: rawnand: renesas: Add new NAND controller driver
dt-bindings: mtd: renesas: Describe Renesas R-Car Gen3 & RZ/N1 NAND controller
mtd: rawnand: gpmi: remove unneeded variable
mtd: rawnand: omap2: drop unused variable
mtd: rawnand: omap2: fix force_8bit flag behaviour for DMA mode
mtd: rawnand: omap2: Add compatible for AM64 SoC
...
175 lines
3.9 KiB
C
175 lines
3.9 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Linux driver for RPC-IF HyperFlash
|
|
*
|
|
* Copyright (C) 2019-2020 Cogent Embedded, Inc.
|
|
*/
|
|
|
|
#include <linux/err.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
#include <linux/mtd/hyperbus.h>
|
|
#include <linux/mtd/mtd.h>
|
|
#include <linux/mux/consumer.h>
|
|
#include <linux/of.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/types.h>
|
|
|
|
#include <memory/renesas-rpc-if.h>
|
|
|
|
struct rpcif_hyperbus {
|
|
struct rpcif rpc;
|
|
struct hyperbus_ctlr ctlr;
|
|
struct hyperbus_device hbdev;
|
|
};
|
|
|
|
static const struct rpcif_op rpcif_op_tmpl = {
|
|
.cmd = {
|
|
.buswidth = 8,
|
|
.ddr = true,
|
|
},
|
|
.ocmd = {
|
|
.buswidth = 8,
|
|
.ddr = true,
|
|
},
|
|
.addr = {
|
|
.nbytes = 1,
|
|
.buswidth = 8,
|
|
.ddr = true,
|
|
},
|
|
.data = {
|
|
.buswidth = 8,
|
|
.ddr = true,
|
|
},
|
|
};
|
|
|
|
static void rpcif_hb_prepare_read(struct rpcif *rpc, void *to,
|
|
unsigned long from, ssize_t len)
|
|
{
|
|
struct rpcif_op op = rpcif_op_tmpl;
|
|
|
|
op.cmd.opcode = HYPERBUS_RW_READ | HYPERBUS_AS_MEM;
|
|
op.addr.val = from >> 1;
|
|
op.dummy.buswidth = 1;
|
|
op.dummy.ncycles = 15;
|
|
op.data.dir = RPCIF_DATA_IN;
|
|
op.data.nbytes = len;
|
|
op.data.buf.in = to;
|
|
|
|
rpcif_prepare(rpc, &op, NULL, NULL);
|
|
}
|
|
|
|
static void rpcif_hb_prepare_write(struct rpcif *rpc, unsigned long to,
|
|
void *from, ssize_t len)
|
|
{
|
|
struct rpcif_op op = rpcif_op_tmpl;
|
|
|
|
op.cmd.opcode = HYPERBUS_RW_WRITE | HYPERBUS_AS_MEM;
|
|
op.addr.val = to >> 1;
|
|
op.data.dir = RPCIF_DATA_OUT;
|
|
op.data.nbytes = len;
|
|
op.data.buf.out = from;
|
|
|
|
rpcif_prepare(rpc, &op, NULL, NULL);
|
|
}
|
|
|
|
static u16 rpcif_hb_read16(struct hyperbus_device *hbdev, unsigned long addr)
|
|
{
|
|
struct rpcif_hyperbus *hyperbus =
|
|
container_of(hbdev, struct rpcif_hyperbus, hbdev);
|
|
map_word data;
|
|
|
|
rpcif_hb_prepare_read(&hyperbus->rpc, &data, addr, 2);
|
|
|
|
rpcif_manual_xfer(&hyperbus->rpc);
|
|
|
|
return data.x[0];
|
|
}
|
|
|
|
static void rpcif_hb_write16(struct hyperbus_device *hbdev, unsigned long addr,
|
|
u16 data)
|
|
{
|
|
struct rpcif_hyperbus *hyperbus =
|
|
container_of(hbdev, struct rpcif_hyperbus, hbdev);
|
|
|
|
rpcif_hb_prepare_write(&hyperbus->rpc, addr, &data, 2);
|
|
|
|
rpcif_manual_xfer(&hyperbus->rpc);
|
|
}
|
|
|
|
static void rpcif_hb_copy_from(struct hyperbus_device *hbdev, void *to,
|
|
unsigned long from, ssize_t len)
|
|
{
|
|
struct rpcif_hyperbus *hyperbus =
|
|
container_of(hbdev, struct rpcif_hyperbus, hbdev);
|
|
|
|
rpcif_hb_prepare_read(&hyperbus->rpc, to, from, len);
|
|
|
|
rpcif_dirmap_read(&hyperbus->rpc, from, len, to);
|
|
}
|
|
|
|
static const struct hyperbus_ops rpcif_hb_ops = {
|
|
.read16 = rpcif_hb_read16,
|
|
.write16 = rpcif_hb_write16,
|
|
.copy_from = rpcif_hb_copy_from,
|
|
};
|
|
|
|
static int rpcif_hb_probe(struct platform_device *pdev)
|
|
{
|
|
struct device *dev = &pdev->dev;
|
|
struct rpcif_hyperbus *hyperbus;
|
|
int error;
|
|
|
|
hyperbus = devm_kzalloc(dev, sizeof(*hyperbus), GFP_KERNEL);
|
|
if (!hyperbus)
|
|
return -ENOMEM;
|
|
|
|
error = rpcif_sw_init(&hyperbus->rpc, pdev->dev.parent);
|
|
if (error)
|
|
return error;
|
|
|
|
platform_set_drvdata(pdev, hyperbus);
|
|
|
|
rpcif_enable_rpm(&hyperbus->rpc);
|
|
|
|
error = rpcif_hw_init(&hyperbus->rpc, true);
|
|
if (error)
|
|
return error;
|
|
|
|
hyperbus->hbdev.map.size = hyperbus->rpc.size;
|
|
hyperbus->hbdev.map.virt = hyperbus->rpc.dirmap;
|
|
|
|
hyperbus->ctlr.dev = dev;
|
|
hyperbus->ctlr.ops = &rpcif_hb_ops;
|
|
hyperbus->hbdev.ctlr = &hyperbus->ctlr;
|
|
hyperbus->hbdev.np = of_get_next_child(pdev->dev.parent->of_node, NULL);
|
|
error = hyperbus_register_device(&hyperbus->hbdev);
|
|
if (error)
|
|
rpcif_disable_rpm(&hyperbus->rpc);
|
|
|
|
return error;
|
|
}
|
|
|
|
static int rpcif_hb_remove(struct platform_device *pdev)
|
|
{
|
|
struct rpcif_hyperbus *hyperbus = platform_get_drvdata(pdev);
|
|
int error = hyperbus_unregister_device(&hyperbus->hbdev);
|
|
|
|
rpcif_disable_rpm(&hyperbus->rpc);
|
|
|
|
return error;
|
|
}
|
|
|
|
static struct platform_driver rpcif_platform_driver = {
|
|
.probe = rpcif_hb_probe,
|
|
.remove = rpcif_hb_remove,
|
|
.driver = {
|
|
.name = "rpc-if-hyperflash",
|
|
},
|
|
};
|
|
|
|
module_platform_driver(rpcif_platform_driver);
|
|
|
|
MODULE_DESCRIPTION("Renesas RPC-IF HyperFlash driver");
|
|
MODULE_LICENSE("GPL v2");
|