mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'for-linus-20171120' of git://git.infradead.org/linux-mtd
Pull MTD updates from Richard Weinberger:
"General changes:
- Unconfuse get_unmapped_area and point/unpoint driver methods
- New partition parser: sharpslpart
- Kill GENERIC_IO
- Various fixes
NAND changes:
- Add a flag to mark NANDs that require 3 address cycles to encode a
page address
- Set a default ECC/free layout when NAND_ECC_NONE is requested
- Fix a bug in panic_nand_write()
- Another batch of cleanups for the denali driver
- Fix PM support in the atmel driver
- Remove support for platform data in the omap driver
- Fix subpage write in the omap driver
- Fix irq handling in the mtk driver
- Change link order of mtk_ecc and mtk_nand drivers to speed up boot
time
- Change log level of ECC error messages in the mxc driver
- Patch the pxa3xx driver to support Armada 8k platforms
- Add BAM DMA support to the qcom driver
- Convert gpio-nand to the GPIO desc API
- Fix ECC handling in the mt29f driver
SPI-NOR changes:
- Introduce system power management support
- New mechanism to select the proper .quad_enable() hook by JEDEC
ID, when needed, instead of only by manufacturer ID
- Add support to new memory parts from Gigadevice, Winbond, Macronix
and Everspin
- Maintainance for Cadence, Intel, Mediatek and STM32 drivers"
* tag 'for-linus-20171120' of git://git.infradead.org/linux-mtd: (85 commits)
mtd: Avoid probe failures when mtd->dbg.dfs_dir is invalid
mtd: sharpslpart: Add sharpslpart partition parser
mtd: Add sanity checks in mtd_write/read_oob()
mtd: remove the get_unmapped_area method
mtd: implement mtd_get_unmapped_area() using the point method
mtd: chips/map_rom.c: implement point and unpoint methods
mtd: chips/map_ram.c: implement point and unpoint methods
mtd: mtdram: properly handle the phys argument in the point method
mtd: mtdswap: fix spelling mistake: 'TRESHOLD' -> 'THRESHOLD'
mtd: slram: use memremap() instead of ioremap()
kconfig: kill off GENERIC_IO option
mtd: Fix C++ comment in include/linux/mtd/mtd.h
mtd: constify mtd_partition
mtd: plat-ram: Replace manual resource management by devm
mtd: nand: Fix writing mtdoops to nand flash.
mtd: intel-spi: Add Intel Lewisburg PCH SPI super SKU PCI ID
mtd: nand: mtk: fix infinite ECC decode IRQ issue
mtd: spi-nor: Add support for mr25h128
mtd: nand: mtk: change the compile sequence of mtk_nand.o and mtk_ecc.o
mtd: spi-nor: enable 4B opcodes for mx66l51235l
...
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
* Cadence Quad SPI controller
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "cdns,qspi-nor".
|
||||
- compatible : should be one of the following:
|
||||
Generic default - "cdns,qspi-nor".
|
||||
For TI 66AK2G SoC - "ti,k2g-qspi", "cdns,qspi-nor".
|
||||
- reg : Contains two entries, each of which is a tuple consisting of a
|
||||
physical address and length. The first entry is the address and
|
||||
length of the controller register set. The second entry is the
|
||||
@@ -14,6 +16,9 @@ Required properties:
|
||||
|
||||
Optional properties:
|
||||
- cdns,is-decoded-cs : Flag to indicate whether decoder is used or not.
|
||||
- cdns,rclk-en : Flag to indicate that QSPI return clock is used to latch
|
||||
the read data rather than the QSPI clock. Make sure that QSPI return
|
||||
clock is populated on the board before using this property.
|
||||
|
||||
Optional subnodes:
|
||||
Subnodes of the Cadence Quad SPI controller are spi slave nodes with additional
|
||||
|
||||
@@ -29,7 +29,7 @@ nand: nand@ff900000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "altr,socfpga-denali-nand";
|
||||
reg = <0xff900000 0x100000>, <0xffb80000 0x10000>;
|
||||
reg = <0xff900000 0x20>, <0xffb80000 0x1000>;
|
||||
reg-names = "nand_data", "denali_reg";
|
||||
interrupts = <0 144 4>;
|
||||
};
|
||||
|
||||
@@ -14,6 +14,7 @@ Required properties:
|
||||
at25df641
|
||||
at26df081a
|
||||
en25s64
|
||||
mr25h128
|
||||
mr25h256
|
||||
mr25h10
|
||||
mr25h40
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
* Serial NOR flash controller for MTK MT81xx (and similar)
|
||||
|
||||
Required properties:
|
||||
- compatible: The possible values are:
|
||||
"mediatek,mt2701-nor"
|
||||
"mediatek,mt7623-nor"
|
||||
- compatible: For mt8173, compatible should be "mediatek,mt8173-nor",
|
||||
and it's the fallback compatible for other Soc.
|
||||
For every other SoC, should contain both the SoC-specific compatible
|
||||
string and "mediatek,mt8173-nor".
|
||||
The possible values are:
|
||||
"mediatek,mt2701-nor", "mediatek,mt8173-nor"
|
||||
"mediatek,mt2712-nor", "mediatek,mt8173-nor"
|
||||
"mediatek,mt7622-nor", "mediatek,mt8173-nor"
|
||||
"mediatek,mt7623-nor", "mediatek,mt8173-nor"
|
||||
"mediatek,mt8173-nor"
|
||||
For mt8173, compatible should be "mediatek,mt8173-nor".
|
||||
For every other SoC, should contain both the SoC-specific compatible string
|
||||
and "mediatek,mt8173-nor".
|
||||
- reg: physical base address and length of the controller's register
|
||||
- clocks: the phandle of the clocks needed by the nor controller
|
||||
- clock-names: the names of the clocks
|
||||
|
||||
@@ -5,9 +5,13 @@ Required properties:
|
||||
- compatible: Should be set to one of the following:
|
||||
marvell,pxa3xx-nand
|
||||
marvell,armada370-nand
|
||||
marvell,armada-8k-nand
|
||||
- reg: The register base for the controller
|
||||
- interrupts: The interrupt to map
|
||||
- #address-cells: Set to <1> if the node includes partitions
|
||||
- marvell,system-controller: Set to retrieve the syscon node that handles
|
||||
NAND controller related registers (only required
|
||||
with marvell,armada-8k-nand compatible).
|
||||
|
||||
Optional properties:
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/mtd/nand-gpio.h>
|
||||
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/pxa2xx_spi.h>
|
||||
|
||||
@@ -176,6 +176,17 @@ static inline void cmx255_init_nor(void) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_MTD_NAND_GPIO) || defined(CONFIG_MTD_NAND_GPIO_MODULE)
|
||||
|
||||
static struct gpiod_lookup_table cmx255_nand_gpiod_table = {
|
||||
.dev_id = "gpio-nand",
|
||||
.table = {
|
||||
GPIO_LOOKUP("gpio-pxa", GPIO_NAND_CS, "nce", GPIO_ACTIVE_HIGH),
|
||||
GPIO_LOOKUP("gpio-pxa", GPIO_NAND_CLE, "cle", GPIO_ACTIVE_HIGH),
|
||||
GPIO_LOOKUP("gpio-pxa", GPIO_NAND_ALE, "ale", GPIO_ACTIVE_HIGH),
|
||||
GPIO_LOOKUP("gpio-pxa", GPIO_NAND_RB, "rdy", GPIO_ACTIVE_HIGH),
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource cmx255_nand_resource[] = {
|
||||
[0] = {
|
||||
.start = PXA_CS1_PHYS,
|
||||
@@ -198,11 +209,6 @@ static struct mtd_partition cmx255_nand_parts[] = {
|
||||
};
|
||||
|
||||
static struct gpio_nand_platdata cmx255_nand_platdata = {
|
||||
.gpio_nce = GPIO_NAND_CS,
|
||||
.gpio_cle = GPIO_NAND_CLE,
|
||||
.gpio_ale = GPIO_NAND_ALE,
|
||||
.gpio_rdy = GPIO_NAND_RB,
|
||||
.gpio_nwp = -1,
|
||||
.parts = cmx255_nand_parts,
|
||||
.num_parts = ARRAY_SIZE(cmx255_nand_parts),
|
||||
.chip_delay = 25,
|
||||
@@ -220,6 +226,7 @@ static struct platform_device cmx255_nand = {
|
||||
|
||||
static void __init cmx255_init_nand(void)
|
||||
{
|
||||
gpiod_add_lookup_table(&cmx255_nand_gpiod_table);
|
||||
platform_device_register(&cmx255_nand);
|
||||
}
|
||||
#else
|
||||
|
||||
@@ -10,7 +10,6 @@ config UML
|
||||
select HAVE_DEBUG_KMEMLEAK
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_CPU_DEVICES
|
||||
select GENERIC_IO
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select HAVE_GCC_PLUGINS
|
||||
select TTY # Needed for line.c
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
menuconfig MTD
|
||||
tristate "Memory Technology Device (MTD) support"
|
||||
depends on GENERIC_IO
|
||||
help
|
||||
Memory Technology Devices are flash, RAM and similar chips, often
|
||||
used for solid state file systems on embedded devices. This option
|
||||
|
||||
+20
-14
@@ -20,8 +20,9 @@ static int mapram_write (struct mtd_info *, loff_t, size_t, size_t *, const u_ch
|
||||
static int mapram_erase (struct mtd_info *, struct erase_info *);
|
||||
static void mapram_nop (struct mtd_info *);
|
||||
static struct mtd_info *map_ram_probe(struct map_info *map);
|
||||
static unsigned long mapram_unmapped_area(struct mtd_info *, unsigned long,
|
||||
unsigned long, unsigned long);
|
||||
static int mapram_point (struct mtd_info *mtd, loff_t from, size_t len,
|
||||
size_t *retlen, void **virt, resource_size_t *phys);
|
||||
static int mapram_unpoint(struct mtd_info *mtd, loff_t from, size_t len);
|
||||
|
||||
|
||||
static struct mtd_chip_driver mapram_chipdrv = {
|
||||
@@ -65,11 +66,12 @@ static struct mtd_info *map_ram_probe(struct map_info *map)
|
||||
mtd->type = MTD_RAM;
|
||||
mtd->size = map->size;
|
||||
mtd->_erase = mapram_erase;
|
||||
mtd->_get_unmapped_area = mapram_unmapped_area;
|
||||
mtd->_read = mapram_read;
|
||||
mtd->_write = mapram_write;
|
||||
mtd->_panic_write = mapram_write;
|
||||
mtd->_point = mapram_point;
|
||||
mtd->_sync = mapram_nop;
|
||||
mtd->_unpoint = mapram_unpoint;
|
||||
mtd->flags = MTD_CAP_RAM;
|
||||
mtd->writesize = 1;
|
||||
|
||||
@@ -81,19 +83,23 @@ static struct mtd_info *map_ram_probe(struct map_info *map)
|
||||
return mtd;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Allow NOMMU mmap() to directly map the device (if not NULL)
|
||||
* - return the address to which the offset maps
|
||||
* - return -ENOSYS to indicate refusal to do the mapping
|
||||
*/
|
||||
static unsigned long mapram_unmapped_area(struct mtd_info *mtd,
|
||||
unsigned long len,
|
||||
unsigned long offset,
|
||||
unsigned long flags)
|
||||
static int mapram_point(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
size_t *retlen, void **virt, resource_size_t *phys)
|
||||
{
|
||||
struct map_info *map = mtd->priv;
|
||||
return (unsigned long) map->virt + offset;
|
||||
|
||||
if (!map->virt)
|
||||
return -EINVAL;
|
||||
*virt = map->virt + from;
|
||||
if (phys)
|
||||
*phys = map->phys + from;
|
||||
*retlen = len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mapram_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mapram_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
|
||||
|
||||
+21
-13
@@ -20,8 +20,10 @@ static int maprom_write (struct mtd_info *, loff_t, size_t, size_t *, const u_ch
|
||||
static void maprom_nop (struct mtd_info *);
|
||||
static struct mtd_info *map_rom_probe(struct map_info *map);
|
||||
static int maprom_erase (struct mtd_info *mtd, struct erase_info *info);
|
||||
static unsigned long maprom_unmapped_area(struct mtd_info *, unsigned long,
|
||||
unsigned long, unsigned long);
|
||||
static int maprom_point (struct mtd_info *mtd, loff_t from, size_t len,
|
||||
size_t *retlen, void **virt, resource_size_t *phys);
|
||||
static int maprom_unpoint(struct mtd_info *mtd, loff_t from, size_t len);
|
||||
|
||||
|
||||
static struct mtd_chip_driver maprom_chipdrv = {
|
||||
.probe = map_rom_probe,
|
||||
@@ -51,7 +53,8 @@ static struct mtd_info *map_rom_probe(struct map_info *map)
|
||||
mtd->name = map->name;
|
||||
mtd->type = MTD_ROM;
|
||||
mtd->size = map->size;
|
||||
mtd->_get_unmapped_area = maprom_unmapped_area;
|
||||
mtd->_point = maprom_point;
|
||||
mtd->_unpoint = maprom_unpoint;
|
||||
mtd->_read = maprom_read;
|
||||
mtd->_write = maprom_write;
|
||||
mtd->_sync = maprom_nop;
|
||||
@@ -66,18 +69,23 @@ static struct mtd_info *map_rom_probe(struct map_info *map)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Allow NOMMU mmap() to directly map the device (if not NULL)
|
||||
* - return the address to which the offset maps
|
||||
* - return -ENOSYS to indicate refusal to do the mapping
|
||||
*/
|
||||
static unsigned long maprom_unmapped_area(struct mtd_info *mtd,
|
||||
unsigned long len,
|
||||
unsigned long offset,
|
||||
unsigned long flags)
|
||||
static int maprom_point(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
size_t *retlen, void **virt, resource_size_t *phys)
|
||||
{
|
||||
struct map_info *map = mtd->priv;
|
||||
return (unsigned long) map->virt + offset;
|
||||
|
||||
if (!map->virt)
|
||||
return -EINVAL;
|
||||
*virt = map->virt + from;
|
||||
if (phys)
|
||||
*phys = map->phys + from;
|
||||
*retlen = len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int maprom_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int maprom_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
|
||||
|
||||
@@ -1814,8 +1814,13 @@ static void __init doc_dbg_register(struct mtd_info *floor)
|
||||
struct dentry *root = floor->dbg.dfs_dir;
|
||||
struct docg3 *docg3 = floor->priv;
|
||||
|
||||
if (IS_ERR_OR_NULL(root))
|
||||
if (IS_ERR_OR_NULL(root)) {
|
||||
if (IS_ENABLED(CONFIG_DEBUG_FS) &&
|
||||
!IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER))
|
||||
dev_warn(floor->dev.parent,
|
||||
"CONFIG_MTD_PARTITIONED_MASTER must be enabled to expose debugfs stuff\n");
|
||||
return;
|
||||
}
|
||||
|
||||
debugfs_create_file("docg3_flashcontrol", S_IRUSR, root, docg3,
|
||||
&flashcontrol_fops);
|
||||
|
||||
@@ -583,7 +583,7 @@ static struct mtd_erase_region_info erase_regions[] = {
|
||||
}
|
||||
};
|
||||
|
||||
static struct mtd_partition lart_partitions[] = {
|
||||
static const struct mtd_partition lart_partitions[] = {
|
||||
/* blob */
|
||||
{
|
||||
.name = "blob",
|
||||
|
||||
@@ -359,6 +359,7 @@ static const struct spi_device_id m25p_ids[] = {
|
||||
{"m25p32-nonjedec"}, {"m25p64-nonjedec"}, {"m25p128-nonjedec"},
|
||||
|
||||
/* Everspin MRAMs (non-JEDEC) */
|
||||
{ "mr25h128" }, /* 128 Kib, 40 MHz */
|
||||
{ "mr25h256" }, /* 256 Kib, 40 MHz */
|
||||
{ "mr25h10" }, /* 1 Mib, 40 MHz */
|
||||
{ "mr25h40" }, /* 4 Mib, 40 MHz */
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/mtdram.h>
|
||||
@@ -69,6 +70,27 @@ static int ram_point(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
{
|
||||
*virt = mtd->priv + from;
|
||||
*retlen = len;
|
||||
|
||||
if (phys) {
|
||||
/* limit retlen to the number of contiguous physical pages */
|
||||
unsigned long page_ofs = offset_in_page(*virt);
|
||||
void *addr = *virt - page_ofs;
|
||||
unsigned long pfn1, pfn0 = vmalloc_to_pfn(addr);
|
||||
|
||||
*phys = __pfn_to_phys(pfn0) + page_ofs;
|
||||
len += page_ofs;
|
||||
while (len > PAGE_SIZE) {
|
||||
len -= PAGE_SIZE;
|
||||
addr += PAGE_SIZE;
|
||||
pfn0++;
|
||||
pfn1 = vmalloc_to_pfn(addr);
|
||||
if (pfn1 != pfn0) {
|
||||
*retlen = addr - *virt;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -77,19 +99,6 @@ static int ram_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allow NOMMU mmap() to directly map the device (if not NULL)
|
||||
* - return the address to which the offset maps
|
||||
* - return -ENOSYS to indicate refusal to do the mapping
|
||||
*/
|
||||
static unsigned long ram_get_unmapped_area(struct mtd_info *mtd,
|
||||
unsigned long len,
|
||||
unsigned long offset,
|
||||
unsigned long flags)
|
||||
{
|
||||
return (unsigned long) mtd->priv + offset;
|
||||
}
|
||||
|
||||
static int ram_read(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
size_t *retlen, u_char *buf)
|
||||
{
|
||||
@@ -134,7 +143,6 @@ int mtdram_init_device(struct mtd_info *mtd, void *mapped_address,
|
||||
mtd->_erase = ram_erase;
|
||||
mtd->_point = ram_point;
|
||||
mtd->_unpoint = ram_unpoint;
|
||||
mtd->_get_unmapped_area = ram_get_unmapped_area;
|
||||
mtd->_read = ram_read;
|
||||
mtd->_write = ram_write;
|
||||
|
||||
|
||||
@@ -163,8 +163,9 @@ static int register_device(char *name, unsigned long start, unsigned long length
|
||||
}
|
||||
|
||||
if (!(((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start =
|
||||
ioremap(start, length))) {
|
||||
E("slram: ioremap failed\n");
|
||||
memremap(start, length,
|
||||
MEMREMAP_WB | MEMREMAP_WT | MEMREMAP_WC))) {
|
||||
E("slram: memremap failed\n");
|
||||
return -EIO;
|
||||
}
|
||||
((slram_priv_t *)(*curmtd)->mtdinfo->priv)->end =
|
||||
@@ -186,7 +187,7 @@ static int register_device(char *name, unsigned long start, unsigned long length
|
||||
|
||||
if (mtd_device_register((*curmtd)->mtdinfo, NULL, 0)) {
|
||||
E("slram: Failed to register new device\n");
|
||||
iounmap(((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start);
|
||||
memunmap(((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start);
|
||||
kfree((*curmtd)->mtdinfo->priv);
|
||||
kfree((*curmtd)->mtdinfo);
|
||||
return(-EAGAIN);
|
||||
@@ -206,7 +207,7 @@ static void unregister_devices(void)
|
||||
while (slram_mtdlist) {
|
||||
nextitem = slram_mtdlist->next;
|
||||
mtd_device_unregister(slram_mtdlist->mtdinfo);
|
||||
iounmap(((slram_priv_t *)slram_mtdlist->mtdinfo->priv)->start);
|
||||
memunmap(((slram_priv_t *)slram_mtdlist->mtdinfo->priv)->start);
|
||||
kfree(slram_mtdlist->mtdinfo->priv);
|
||||
kfree(slram_mtdlist->mtdinfo);
|
||||
kfree(slram_mtdlist);
|
||||
|
||||
@@ -61,7 +61,7 @@ static struct map_info flagadm_map = {
|
||||
.bankwidth = 2,
|
||||
};
|
||||
|
||||
static struct mtd_partition flagadm_parts[] = {
|
||||
static const struct mtd_partition flagadm_parts[] = {
|
||||
{
|
||||
.name = "Bootloader",
|
||||
.offset = FLASH_PARTITION0_ADDR,
|
||||
|
||||
@@ -47,7 +47,7 @@ static struct map_info impa7_map[NUM_FLASHBANKS] = {
|
||||
/*
|
||||
* MTD partitioning stuff
|
||||
*/
|
||||
static struct mtd_partition partitions[] =
|
||||
static const struct mtd_partition partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "FileSystem",
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
/* partition_info gives details on the logical partitions that the split the
|
||||
* single flash device into. If the size if zero we use up to the end of the
|
||||
* device. */
|
||||
static struct mtd_partition partition_info[]={
|
||||
static const struct mtd_partition partition_info[] = {
|
||||
{
|
||||
.name = "NetSc520 boot kernel",
|
||||
.offset = 0,
|
||||
|
||||
@@ -107,7 +107,7 @@ static struct map_info nettel_amd_map = {
|
||||
.bankwidth = AMD_BUSWIDTH,
|
||||
};
|
||||
|
||||
static struct mtd_partition nettel_amd_partitions[] = {
|
||||
static const struct mtd_partition nettel_amd_partitions[] = {
|
||||
{
|
||||
.name = "SnapGear BIOS config",
|
||||
.offset = 0x000e0000,
|
||||
|
||||
@@ -43,7 +43,6 @@ struct platram_info {
|
||||
struct device *dev;
|
||||
struct mtd_info *mtd;
|
||||
struct map_info map;
|
||||
struct resource *area;
|
||||
struct platdata_mtd_ram *pdata;
|
||||
};
|
||||
|
||||
@@ -97,16 +96,6 @@ static int platram_remove(struct platform_device *pdev)
|
||||
|
||||
platram_setrw(info, PLATRAM_RO);
|
||||
|
||||
/* release resources */
|
||||
|
||||
if (info->area) {
|
||||
release_resource(info->area);
|
||||
kfree(info->area);
|
||||
}
|
||||
|
||||
if (info->map.virt != NULL)
|
||||
iounmap(info->map.virt);
|
||||
|
||||
kfree(info);
|
||||
|
||||
return 0;
|
||||
@@ -147,12 +136,11 @@ static int platram_probe(struct platform_device *pdev)
|
||||
info->pdata = pdata;
|
||||
|
||||
/* get the resource for the memory mapping */
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
|
||||
if (res == NULL) {
|
||||
dev_err(&pdev->dev, "no memory resource specified\n");
|
||||
err = -ENOENT;
|
||||
info->map.virt = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(info->map.virt)) {
|
||||
err = PTR_ERR(info->map.virt);
|
||||
dev_err(&pdev->dev, "failed to ioremap() region\n");
|
||||
goto exit_free;
|
||||
}
|
||||
|
||||
@@ -167,26 +155,8 @@ static int platram_probe(struct platform_device *pdev)
|
||||
(char *)pdata->mapname : (char *)pdev->name;
|
||||
info->map.bankwidth = pdata->bankwidth;
|
||||
|
||||
/* register our usage of the memory area */
|
||||
|
||||
info->area = request_mem_region(res->start, info->map.size, pdev->name);
|
||||
if (info->area == NULL) {
|
||||
dev_err(&pdev->dev, "failed to request memory region\n");
|
||||
err = -EIO;
|
||||
goto exit_free;
|
||||
}
|
||||
|
||||
/* remap the memory area */
|
||||
|
||||
info->map.virt = ioremap(res->start, info->map.size);
|
||||
dev_dbg(&pdev->dev, "virt %p, %lu bytes\n", info->map.virt, info->map.size);
|
||||
|
||||
if (info->map.virt == NULL) {
|
||||
dev_err(&pdev->dev, "failed to ioremap() region\n");
|
||||
err = -EIO;
|
||||
goto exit_free;
|
||||
}
|
||||
|
||||
simple_map_init(&info->map);
|
||||
|
||||
dev_dbg(&pdev->dev, "initialised map, probing for mtd\n");
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user