Lines Matching defs:mtd

21 #include <linux/mtd/mtd.h>
22 #include <linux/mtd/rawnand.h>
23 #include <linux/mtd/partitions.h>
119 static void mpc5121_nfc_done(struct mtd_info *mtd);
122 static inline u16 nfc_read(struct mtd_info *mtd, uint reg)
124 struct nand_chip *chip = mtd_to_nand(mtd);
131 static inline void nfc_write(struct mtd_info *mtd, uint reg, u16 val)
133 struct nand_chip *chip = mtd_to_nand(mtd);
140 static inline void nfc_set(struct mtd_info *mtd, uint reg, u16 bits)
142 nfc_write(mtd, reg, nfc_read(mtd, reg) | bits);
146 static inline void nfc_clear(struct mtd_info *mtd, uint reg, u16 bits)
148 nfc_write(mtd, reg, nfc_read(mtd, reg) & ~bits);
152 static inline void mpc5121_nfc_send_addr(struct mtd_info *mtd, u16 addr)
154 nfc_write(mtd, NFC_FLASH_ADDR, addr);
155 nfc_write(mtd, NFC_CONFIG2, NFC_ADDRESS);
156 mpc5121_nfc_done(mtd);
160 static inline void mpc5121_nfc_send_cmd(struct mtd_info *mtd, u16 cmd)
162 nfc_write(mtd, NFC_FLASH_CMD, cmd);
163 nfc_write(mtd, NFC_CONFIG2, NFC_COMMAND);
164 mpc5121_nfc_done(mtd);
168 static inline void mpc5121_nfc_send_prog_page(struct mtd_info *mtd)
170 nfc_clear(mtd, NFC_BUF_ADDR, NFC_RBA_MASK);
171 nfc_write(mtd, NFC_CONFIG2, NFC_INPUT);
172 mpc5121_nfc_done(mtd);
176 static inline void mpc5121_nfc_send_read_page(struct mtd_info *mtd)
178 nfc_clear(mtd, NFC_BUF_ADDR, NFC_RBA_MASK);
179 nfc_write(mtd, NFC_CONFIG2, NFC_OUTPUT);
180 mpc5121_nfc_done(mtd);
184 static inline void mpc5121_nfc_send_read_id(struct mtd_info *mtd)
186 nfc_clear(mtd, NFC_BUF_ADDR, NFC_RBA_MASK);
187 nfc_write(mtd, NFC_CONFIG2, NFC_ID);
188 mpc5121_nfc_done(mtd);
192 static inline void mpc5121_nfc_send_read_status(struct mtd_info *mtd)
194 nfc_clear(mtd, NFC_BUF_ADDR, NFC_RBA_MASK);
195 nfc_write(mtd, NFC_CONFIG2, NFC_STATUS);
196 mpc5121_nfc_done(mtd);
202 struct mtd_info *mtd = data;
203 struct nand_chip *chip = mtd_to_nand(mtd);
206 nfc_set(mtd, NFC_CONFIG1, NFC_INT_MASK);
213 static void mpc5121_nfc_done(struct mtd_info *mtd)
215 struct nand_chip *chip = mtd_to_nand(mtd);
219 if ((nfc_read(mtd, NFC_CONFIG2) & NFC_INT) == 0) {
220 nfc_clear(mtd, NFC_CONFIG1, NFC_INT_MASK);
222 (nfc_read(mtd, NFC_CONFIG2) & NFC_INT), NFC_TIMEOUT);
229 nfc_clear(mtd, NFC_CONFIG2, NFC_INT);
233 static void mpc5121_nfc_addr_cycle(struct mtd_info *mtd, int column, int page)
235 struct nand_chip *chip = mtd_to_nand(mtd);
239 mpc5121_nfc_send_addr(mtd, column);
240 if (mtd->writesize > 512)
241 mpc5121_nfc_send_addr(mtd, column >> 8);
246 mpc5121_nfc_send_addr(mtd, page & 0xFF);
256 struct mtd_info *mtd = nand_to_mtd(nand);
259 nfc_clear(mtd, NFC_CONFIG1, NFC_CE);
263 nfc_clear(mtd, NFC_BUF_ADDR, NFC_ACTIVE_CS_MASK);
264 nfc_set(mtd, NFC_BUF_ADDR, (chip << NFC_ACTIVE_CS_SHIFT) &
266 nfc_set(mtd, NFC_CONFIG1, NFC_CE);
270 static int ads5121_chipselect_init(struct mtd_info *mtd)
272 struct nand_chip *chip = mtd_to_nand(mtd);
323 struct mtd_info *mtd = nand_to_mtd(chip);
331 mpc5121_nfc_send_prog_page(mtd);
368 mpc5121_nfc_send_cmd(mtd, command);
369 mpc5121_nfc_addr_cycle(mtd, column, page);
373 if (mtd->writesize > 512)
374 mpc5121_nfc_send_cmd(mtd, NAND_CMD_READSTART);
375 mpc5121_nfc_send_read_page(mtd);
379 mpc5121_nfc_send_read_id(mtd);
383 mpc5121_nfc_send_read_status(mtd);
393 static void mpc5121_nfc_copy_spare(struct mtd_info *mtd, uint offset,
396 struct nand_chip *nand = mtd_to_nand(mtd);
416 sbsize = (mtd->oobsize / (mtd->writesize / 512)) & ~1;
445 static void mpc5121_nfc_buf_copy(struct mtd_info *mtd, u_char *buf, int len,
448 struct nand_chip *chip = mtd_to_nand(mtd);
454 if (prv->spareonly || c >= mtd->writesize) {
456 if (c >= mtd->writesize)
457 c -= mtd->writesize;
460 mpc5121_nfc_copy_spare(mtd, c, buf, len, wr);
468 l = min((uint)len, mtd->writesize - c);
480 mpc5121_nfc_buf_copy(mtd, buf, len, wr);
514 static int mpc5121_nfc_read_hw_config(struct mtd_info *mtd)
516 struct nand_chip *chip = mtd_to_nand(mtd);
576 mtd->writesize = rcw_pagesize;
577 mtd->oobsize = rcw_sparesize;
593 static void mpc5121_nfc_free(struct device *dev, struct mtd_info *mtd)
595 struct nand_chip *chip = mtd_to_nand(mtd);
622 struct mtd_info *mtd;
645 mtd = nand_to_mtd(chip);
651 mtd->dev.parent = dev;
657 retval = mpc5121_nfc_read_hw_config(mtd);
695 mtd->name = "MPC5121 NAND";
708 retval = ads5121_chipselect_init(mtd);
727 nfc_set(mtd, NFC_CONFIG1, NFC_RESET);
728 while (nfc_read(mtd, NFC_CONFIG1) & NFC_RESET) {
739 nfc_write(mtd, NFC_CONFIG, NFC_BLS_UNLOCKED);
742 nfc_write(mtd, NFC_UNLOCKSTART_BLK0, 0x0000);
743 nfc_write(mtd, NFC_UNLOCKEND_BLK0, 0xFFFF);
744 nfc_write(mtd, NFC_WRPROT, NFC_WPC_UNLOCK);
751 nfc_write(mtd, NFC_CONFIG1, NFC_BIG_ENDIAN | NFC_INT_MASK |
755 nfc_write(mtd, NFC_SPAS, mtd->oobsize >> 1);
759 mtd);
780 switch (mtd->erasesize / mtd->writesize) {
782 nfc_set(mtd, NFC_CONFIG1, NFC_PPB_32);
786 nfc_set(mtd, NFC_CONFIG1, NFC_PPB_64);
790 nfc_set(mtd, NFC_CONFIG1, NFC_PPB_128);
794 nfc_set(mtd, NFC_CONFIG1, NFC_PPB_256);
803 dev_set_drvdata(dev, mtd);
806 retval = mtd_device_register(mtd, NULL, 0);
814 mpc5121_nfc_free(dev, mtd);
821 struct mtd_info *mtd = dev_get_drvdata(dev);
824 ret = mtd_device_unregister(mtd);
826 nand_cleanup(mtd_to_nand(mtd));
827 mpc5121_nfc_free(dev, mtd);