mtd: nand: add NAND driver "library" for Broadcom STB NAND controller
This core originated in Set-Top Box chips (BCM7xxx) but is used in a
variety of other Broadcom chips, including some BCM63xxx, BCM33xx, and
iProc/Cygnus. It's been used only on ARM and MIPS SoCs, so restrict it
to those architectures.
There are multiple revisions of this core throughout the years, and
almost every version broke register compatibility in some small way, but
with some effort, this driver is able to support v4.0, v5.0, v6.x, v7.0,
and v7.1. It's been tested on v5.0, v6.0, v6.1, v7.0, and v7.1 recently,
so there hopefully are no more lurking inconsistencies.
This patch adds just some library support, on which platform drivers can
be built.
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Tested-by: Florian Fainelli <f.fainelli@gmail.com>
2015-03-07 03:38:08 +08:00
|
|
|
/*
|
|
|
|
* Copyright © 2015 Broadcom Corporation
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
|
|
* published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __BRCMNAND_H__
|
|
|
|
#define __BRCMNAND_H__
|
|
|
|
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include <linux/io.h>
|
|
|
|
|
|
|
|
struct platform_device;
|
|
|
|
struct dev_pm_ops;
|
|
|
|
|
|
|
|
struct brcmnand_soc {
|
2015-05-13 03:09:28 +08:00
|
|
|
bool (*ctlrdy_ack)(struct brcmnand_soc *soc);
|
|
|
|
void (*ctlrdy_set_enabled)(struct brcmnand_soc *soc, bool en);
|
2016-07-21 05:53:50 +08:00
|
|
|
void (*prepare_data_bus)(struct brcmnand_soc *soc, bool prepare,
|
|
|
|
bool is_param);
|
mtd: nand: add NAND driver "library" for Broadcom STB NAND controller
This core originated in Set-Top Box chips (BCM7xxx) but is used in a
variety of other Broadcom chips, including some BCM63xxx, BCM33xx, and
iProc/Cygnus. It's been used only on ARM and MIPS SoCs, so restrict it
to those architectures.
There are multiple revisions of this core throughout the years, and
almost every version broke register compatibility in some small way, but
with some effort, this driver is able to support v4.0, v5.0, v6.x, v7.0,
and v7.1. It's been tested on v5.0, v6.0, v6.1, v7.0, and v7.1 recently,
so there hopefully are no more lurking inconsistencies.
This patch adds just some library support, on which platform drivers can
be built.
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Tested-by: Florian Fainelli <f.fainelli@gmail.com>
2015-03-07 03:38:08 +08:00
|
|
|
};
|
|
|
|
|
2016-07-21 05:53:50 +08:00
|
|
|
static inline void brcmnand_soc_data_bus_prepare(struct brcmnand_soc *soc,
|
|
|
|
bool is_param)
|
2015-05-13 03:09:28 +08:00
|
|
|
{
|
|
|
|
if (soc && soc->prepare_data_bus)
|
2016-07-21 05:53:50 +08:00
|
|
|
soc->prepare_data_bus(soc, true, is_param);
|
2015-05-13 03:09:28 +08:00
|
|
|
}
|
|
|
|
|
2016-07-21 05:53:50 +08:00
|
|
|
static inline void brcmnand_soc_data_bus_unprepare(struct brcmnand_soc *soc,
|
|
|
|
bool is_param)
|
2015-05-13 03:09:28 +08:00
|
|
|
{
|
|
|
|
if (soc && soc->prepare_data_bus)
|
2016-07-21 05:53:50 +08:00
|
|
|
soc->prepare_data_bus(soc, false, is_param);
|
2015-05-13 03:09:28 +08:00
|
|
|
}
|
|
|
|
|
mtd: nand: add NAND driver "library" for Broadcom STB NAND controller
This core originated in Set-Top Box chips (BCM7xxx) but is used in a
variety of other Broadcom chips, including some BCM63xxx, BCM33xx, and
iProc/Cygnus. It's been used only on ARM and MIPS SoCs, so restrict it
to those architectures.
There are multiple revisions of this core throughout the years, and
almost every version broke register compatibility in some small way, but
with some effort, this driver is able to support v4.0, v5.0, v6.x, v7.0,
and v7.1. It's been tested on v5.0, v6.0, v6.1, v7.0, and v7.1 recently,
so there hopefully are no more lurking inconsistencies.
This patch adds just some library support, on which platform drivers can
be built.
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Tested-by: Florian Fainelli <f.fainelli@gmail.com>
2015-03-07 03:38:08 +08:00
|
|
|
static inline u32 brcmnand_readl(void __iomem *addr)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* MIPS endianness is configured by boot strap, which also reverses all
|
|
|
|
* bus endianness (i.e., big-endian CPU + big endian bus ==> native
|
|
|
|
* endian I/O).
|
|
|
|
*
|
|
|
|
* Other architectures (e.g., ARM) either do not support big endian, or
|
|
|
|
* else leave I/O in little endian mode.
|
|
|
|
*/
|
2015-08-06 12:29:37 +08:00
|
|
|
if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
|
mtd: nand: add NAND driver "library" for Broadcom STB NAND controller
This core originated in Set-Top Box chips (BCM7xxx) but is used in a
variety of other Broadcom chips, including some BCM63xxx, BCM33xx, and
iProc/Cygnus. It's been used only on ARM and MIPS SoCs, so restrict it
to those architectures.
There are multiple revisions of this core throughout the years, and
almost every version broke register compatibility in some small way, but
with some effort, this driver is able to support v4.0, v5.0, v6.x, v7.0,
and v7.1. It's been tested on v5.0, v6.0, v6.1, v7.0, and v7.1 recently,
so there hopefully are no more lurking inconsistencies.
This patch adds just some library support, on which platform drivers can
be built.
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Tested-by: Florian Fainelli <f.fainelli@gmail.com>
2015-03-07 03:38:08 +08:00
|
|
|
return __raw_readl(addr);
|
|
|
|
else
|
|
|
|
return readl_relaxed(addr);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void brcmnand_writel(u32 val, void __iomem *addr)
|
|
|
|
{
|
|
|
|
/* See brcmnand_readl() comments */
|
2015-08-06 12:29:37 +08:00
|
|
|
if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
|
mtd: nand: add NAND driver "library" for Broadcom STB NAND controller
This core originated in Set-Top Box chips (BCM7xxx) but is used in a
variety of other Broadcom chips, including some BCM63xxx, BCM33xx, and
iProc/Cygnus. It's been used only on ARM and MIPS SoCs, so restrict it
to those architectures.
There are multiple revisions of this core throughout the years, and
almost every version broke register compatibility in some small way, but
with some effort, this driver is able to support v4.0, v5.0, v6.x, v7.0,
and v7.1. It's been tested on v5.0, v6.0, v6.1, v7.0, and v7.1 recently,
so there hopefully are no more lurking inconsistencies.
This patch adds just some library support, on which platform drivers can
be built.
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Tested-by: Florian Fainelli <f.fainelli@gmail.com>
2015-03-07 03:38:08 +08:00
|
|
|
__raw_writel(val, addr);
|
|
|
|
else
|
|
|
|
writel_relaxed(val, addr);
|
|
|
|
}
|
|
|
|
|
|
|
|
int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc);
|
|
|
|
int brcmnand_remove(struct platform_device *pdev);
|
|
|
|
|
|
|
|
extern const struct dev_pm_ops brcmnand_pm_ops;
|
|
|
|
|
|
|
|
#endif /* __BRCMNAND_H__ */
|