|
@@ -10,11 +10,6 @@
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
|
* more details.
|
|
|
- *
|
|
|
- * You should have received a copy of the GNU General Public License along with
|
|
|
- * this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
- * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
- *
|
|
|
*/
|
|
|
|
|
|
#include <linux/bitfield.h>
|
|
@@ -64,10 +59,6 @@ MODULE_LICENSE("GPL");
|
|
|
*/
|
|
|
#define DENALI_CLK_X_MULT 6
|
|
|
|
|
|
-/*
|
|
|
- * this macro allows us to convert from an MTD structure to our own
|
|
|
- * device context (denali) structure.
|
|
|
- */
|
|
|
static inline struct denali_nand_info *mtd_to_denali(struct mtd_info *mtd)
|
|
|
{
|
|
|
return container_of(mtd_to_nand(mtd), struct denali_nand_info, nand);
|
|
@@ -450,9 +441,8 @@ static int denali_sw_ecc_fixup(struct mtd_info *mtd,
|
|
|
} while (!(err_cor_info & ERR_CORRECTION_INFO__LAST_ERR));
|
|
|
|
|
|
/*
|
|
|
- * Once handle all ecc errors, controller will trigger a
|
|
|
- * ECC_TRANSACTION_DONE interrupt, so here just wait for
|
|
|
- * a while for this interrupt
|
|
|
+ * Once handle all ECC errors, controller will trigger an
|
|
|
+ * ECC_TRANSACTION_DONE interrupt.
|
|
|
*/
|
|
|
irq_status = denali_wait_for_irq(denali, INTR__ECC_TRANSACTION_DONE);
|
|
|
if (!(irq_status & INTR__ECC_TRANSACTION_DONE))
|
|
@@ -613,7 +603,6 @@ static int denali_dma_xfer(struct denali_nand_info *denali, void *buf,
|
|
|
denali_reset_irq(denali);
|
|
|
denali_setup_dma(denali, dma_addr, page, write);
|
|
|
|
|
|
- /* wait for operation to complete */
|
|
|
irq_status = denali_wait_for_irq(denali, irq_mask);
|
|
|
if (!(irq_status & INTR__DMA_CMD_COMP))
|
|
|
ret = -EIO;
|
|
@@ -1185,22 +1174,6 @@ static const struct mtd_ooblayout_ops denali_ooblayout_ops = {
|
|
|
.free = denali_ooblayout_free,
|
|
|
};
|
|
|
|
|
|
-/* initialize driver data structures */
|
|
|
-static void denali_drv_init(struct denali_nand_info *denali)
|
|
|
-{
|
|
|
- /*
|
|
|
- * the completion object will be used to notify
|
|
|
- * the callee that the interrupt is done
|
|
|
- */
|
|
|
- init_completion(&denali->complete);
|
|
|
-
|
|
|
- /*
|
|
|
- * the spinlock will be used to synchronize the ISR with any
|
|
|
- * element that might be access shared data (interrupt status)
|
|
|
- */
|
|
|
- spin_lock_init(&denali->irq_lock);
|
|
|
-}
|
|
|
-
|
|
|
static int denali_multidev_fixup(struct denali_nand_info *denali)
|
|
|
{
|
|
|
struct nand_chip *chip = &denali->nand;
|
|
@@ -1260,11 +1233,12 @@ int denali_init(struct denali_nand_info *denali)
|
|
|
|
|
|
mtd->dev.parent = denali->dev;
|
|
|
denali_hw_init(denali);
|
|
|
- denali_drv_init(denali);
|
|
|
+
|
|
|
+ init_completion(&denali->complete);
|
|
|
+ spin_lock_init(&denali->irq_lock);
|
|
|
|
|
|
denali_clear_irq_all(denali);
|
|
|
|
|
|
- /* Request IRQ after all the hardware initialization is finished */
|
|
|
ret = devm_request_irq(denali->dev, denali->irq, denali_isr,
|
|
|
IRQF_SHARED, DENALI_NAND_NAME, denali);
|
|
|
if (ret) {
|
|
@@ -1282,7 +1256,6 @@ int denali_init(struct denali_nand_info *denali)
|
|
|
if (!mtd->name)
|
|
|
mtd->name = "denali-nand";
|
|
|
|
|
|
- /* register the driver with the NAND core subsystem */
|
|
|
chip->select_chip = denali_select_chip;
|
|
|
chip->read_byte = denali_read_byte;
|
|
|
chip->write_byte = denali_write_byte;
|
|
@@ -1295,11 +1268,6 @@ int denali_init(struct denali_nand_info *denali)
|
|
|
if (denali->clk_x_rate)
|
|
|
chip->setup_data_interface = denali_setup_data_interface;
|
|
|
|
|
|
- /*
|
|
|
- * scan for NAND devices attached to the controller
|
|
|
- * this is the first stage in a two step process to register
|
|
|
- * with the nand subsystem
|
|
|
- */
|
|
|
ret = nand_scan_ident(mtd, denali->max_banks, NULL);
|
|
|
if (ret)
|
|
|
goto disable_irq;
|
|
@@ -1323,18 +1291,9 @@ int denali_init(struct denali_nand_info *denali)
|
|
|
chip->buf_align = 16;
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * second stage of the NAND scan
|
|
|
- * this stage requires information regarding ECC and
|
|
|
- * bad block management.
|
|
|
- */
|
|
|
-
|
|
|
chip->bbt_options |= NAND_BBT_USE_FLASH;
|
|
|
chip->bbt_options |= NAND_BBT_NO_OOB;
|
|
|
-
|
|
|
chip->ecc.mode = NAND_ECC_HW_SYNDROME;
|
|
|
-
|
|
|
- /* no subpage writes on denali */
|
|
|
chip->options |= NAND_NO_SUBPAGE_WRITE;
|
|
|
|
|
|
ret = denali_ecc_setup(mtd, chip, denali);
|
|
@@ -1418,7 +1377,6 @@ disable_irq:
|
|
|
}
|
|
|
EXPORT_SYMBOL(denali_init);
|
|
|
|
|
|
-/* driver exit point */
|
|
|
void denali_remove(struct denali_nand_info *denali)
|
|
|
{
|
|
|
struct mtd_info *mtd = nand_to_mtd(&denali->nand);
|