Lines Matching refs:dev

37 static inline uint8_t r852_read_reg(struct r852_device *dev, int address)  in r852_read_reg()  argument
39 uint8_t reg = readb(dev->mmio + address); in r852_read_reg()
44 static inline void r852_write_reg(struct r852_device *dev, in r852_write_reg() argument
47 writeb(value, dev->mmio + address); in r852_write_reg()
53 static inline uint32_t r852_read_reg_dword(struct r852_device *dev, int address) in r852_read_reg_dword() argument
55 uint32_t reg = le32_to_cpu(readl(dev->mmio + address)); in r852_read_reg_dword()
60 static inline void r852_write_reg_dword(struct r852_device *dev, in r852_write_reg_dword() argument
63 writel(cpu_to_le32(value), dev->mmio + address); in r852_write_reg_dword()
76 static void r852_dma_test(struct r852_device *dev) in r852_dma_test() argument
78 dev->dma_usable = (r852_read_reg(dev, R852_DMA_CAP) & in r852_dma_test()
81 if (!dev->dma_usable) in r852_dma_test()
86 dev->dma_usable = 0; in r852_dma_test()
94 static void r852_dma_enable(struct r852_device *dev) in r852_dma_enable() argument
99 dma_reg = r852_read_reg_dword(dev, R852_DMA_SETTINGS); in r852_dma_enable()
102 if (dev->dma_dir) in r852_dma_enable()
105 if (dev->dma_state == DMA_INTERNAL) { in r852_dma_enable()
109 r852_write_reg_dword(dev, R852_DMA_ADDR, in r852_dma_enable()
110 cpu_to_le32(dev->phys_bounce_buffer)); in r852_dma_enable()
113 r852_write_reg_dword(dev, R852_DMA_ADDR, in r852_dma_enable()
114 cpu_to_le32(dev->phys_dma_addr)); in r852_dma_enable()
118 r852_read_reg_dword(dev, R852_DMA_ADDR); in r852_dma_enable()
120 r852_write_reg_dword(dev, R852_DMA_SETTINGS, dma_reg); in r852_dma_enable()
123 dma_irq_reg = r852_read_reg_dword(dev, R852_DMA_IRQ_ENABLE); in r852_dma_enable()
124 r852_write_reg_dword(dev, R852_DMA_IRQ_ENABLE, in r852_dma_enable()
135 static void r852_dma_done(struct r852_device *dev, int error) in r852_dma_done() argument
137 WARN_ON(dev->dma_stage == 0); in r852_dma_done()
139 r852_write_reg_dword(dev, R852_DMA_IRQ_STA, in r852_dma_done()
140 r852_read_reg_dword(dev, R852_DMA_IRQ_STA)); in r852_dma_done()
142 r852_write_reg_dword(dev, R852_DMA_SETTINGS, 0); in r852_dma_done()
143 r852_write_reg_dword(dev, R852_DMA_IRQ_ENABLE, 0); in r852_dma_done()
146 r852_write_reg_dword(dev, R852_DMA_ADDR, in r852_dma_done()
147 cpu_to_le32(dev->phys_bounce_buffer)); in r852_dma_done()
148 r852_read_reg_dword(dev, R852_DMA_ADDR); in r852_dma_done()
150 dev->dma_error = error; in r852_dma_done()
151 dev->dma_stage = 0; in r852_dma_done()
153 if (dev->phys_dma_addr && dev->phys_dma_addr != dev->phys_bounce_buffer) in r852_dma_done()
154 pci_unmap_single(dev->pci_dev, dev->phys_dma_addr, R852_DMA_LEN, in r852_dma_done()
155 dev->dma_dir ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE); in r852_dma_done()
161 static int r852_dma_wait(struct r852_device *dev) in r852_dma_wait() argument
163 long timeout = wait_for_completion_timeout(&dev->dma_done, in r852_dma_wait()
176 static void r852_do_dma(struct r852_device *dev, uint8_t *buf, int do_read) in r852_do_dma() argument
182 dev->dma_error = 0; in r852_do_dma()
185 dev->dma_dir = do_read; in r852_do_dma()
186 dev->dma_stage = 1; in r852_do_dma()
187 reinit_completion(&dev->dma_done); in r852_do_dma()
193 dev->dma_state = do_read ? DMA_INTERNAL : DMA_MEMORY; in r852_do_dma()
200 dev->phys_dma_addr = pci_map_single(dev->pci_dev, (void *)buf, in r852_do_dma()
204 if (pci_dma_mapping_error(dev->pci_dev, dev->phys_dma_addr)) in r852_do_dma()
210 dev->phys_dma_addr = dev->phys_bounce_buffer; in r852_do_dma()
212 memcpy(dev->bounce_buffer, buf, R852_DMA_LEN); in r852_do_dma()
216 spin_lock_irqsave(&dev->irqlock, flags); in r852_do_dma()
217 r852_dma_enable(dev); in r852_do_dma()
218 spin_unlock_irqrestore(&dev->irqlock, flags); in r852_do_dma()
221 error = r852_dma_wait(dev); in r852_do_dma()
224 r852_dma_done(dev, error); in r852_do_dma()
229 memcpy((void *)buf, dev->bounce_buffer, R852_DMA_LEN); in r852_do_dma()
237 struct r852_device *dev = r852_get_dev(mtd); in r852_write_buf() local
241 if (dev->card_unstable) in r852_write_buf()
245 if (len == R852_DMA_LEN && dev->dma_usable) { in r852_write_buf()
246 r852_do_dma(dev, (uint8_t *)buf, 0); in r852_write_buf()
253 r852_write_reg_dword(dev, R852_DATALINE, reg); in r852_write_buf()
261 r852_write_reg(dev, R852_DATALINE, *buf++); in r852_write_buf()
271 struct r852_device *dev = r852_get_dev(mtd); in r852_read_buf() local
274 if (dev->card_unstable) { in r852_read_buf()
282 if (len == R852_DMA_LEN && dev->dma_usable) { in r852_read_buf()
283 r852_do_dma(dev, buf, 1); in r852_read_buf()
290 reg = r852_read_reg_dword(dev, R852_DATALINE); in r852_read_buf()
300 *buf++ = r852_read_reg(dev, R852_DATALINE); in r852_read_buf()
308 struct r852_device *dev = r852_get_dev(mtd); in r852_read_byte() local
311 if (dev->card_unstable) in r852_read_byte()
314 return r852_read_reg(dev, R852_DATALINE); in r852_read_byte()
322 struct r852_device *dev = r852_get_dev(mtd); in r852_cmdctl() local
324 if (dev->card_unstable) in r852_cmdctl()
329 dev->ctlreg &= ~(R852_CTL_DATA | R852_CTL_COMMAND | in r852_cmdctl()
333 dev->ctlreg |= R852_CTL_DATA; in r852_cmdctl()
336 dev->ctlreg |= R852_CTL_COMMAND; in r852_cmdctl()
339 dev->ctlreg |= (R852_CTL_CARDENABLE | R852_CTL_ON); in r852_cmdctl()
341 dev->ctlreg &= ~R852_CTL_WRITE; in r852_cmdctl()
345 dev->ctlreg |= R852_CTL_WRITE; in r852_cmdctl()
347 r852_write_reg(dev, R852_CTL, dev->ctlreg); in r852_cmdctl()
352 if (dat == NAND_CMD_SEQIN && (dev->ctlreg & R852_CTL_COMMAND)) { in r852_cmdctl()
353 dev->ctlreg |= R852_CTL_WRITE; in r852_cmdctl()
354 r852_write_reg(dev, R852_CTL, dev->ctlreg); in r852_cmdctl()
358 r852_write_reg(dev, R852_DATALINE, dat); in r852_cmdctl()
367 struct r852_device *dev = nand_get_controller_data(chip); in r852_wait() local
382 if (dev->dma_error) { in r852_wait()
384 dev->dma_error = 0; in r852_wait()
395 struct r852_device *dev = r852_get_dev(mtd); in r852_ready() local
396 return !(r852_read_reg(dev, R852_CARD_STA) & R852_CARD_STA_BUSY); in r852_ready()
406 struct r852_device *dev = r852_get_dev(mtd); in r852_ecc_hwctl() local
408 if (dev->card_unstable) in r852_ecc_hwctl()
415 dev->ctlreg |= R852_CTL_ECC_ENABLE; in r852_ecc_hwctl()
418 r852_write_reg(dev, R852_CTL, in r852_ecc_hwctl()
419 dev->ctlreg | R852_CTL_ECC_ACCESS); in r852_ecc_hwctl()
421 r852_read_reg_dword(dev, R852_DATALINE); in r852_ecc_hwctl()
422 r852_write_reg(dev, R852_CTL, dev->ctlreg); in r852_ecc_hwctl()
427 dev->ctlreg &= ~R852_CTL_ECC_ENABLE; in r852_ecc_hwctl()
428 r852_write_reg(dev, R852_CTL, dev->ctlreg); in r852_ecc_hwctl()
439 struct r852_device *dev = r852_get_dev(mtd); in r852_ecc_calculate() local
443 if (dev->card_unstable) in r852_ecc_calculate()
446 dev->ctlreg &= ~R852_CTL_ECC_ENABLE; in r852_ecc_calculate()
447 r852_write_reg(dev, R852_CTL, dev->ctlreg | R852_CTL_ECC_ACCESS); in r852_ecc_calculate()
449 ecc1 = r852_read_reg_dword(dev, R852_DATALINE); in r852_ecc_calculate()
450 ecc2 = r852_read_reg_dword(dev, R852_DATALINE); in r852_ecc_calculate()
460 r852_write_reg(dev, R852_CTL, dev->ctlreg); in r852_ecc_calculate()
475 struct r852_device *dev = r852_get_dev(mtd); in r852_ecc_correct() local
477 if (dev->card_unstable) in r852_ecc_correct()
480 if (dev->dma_error) { in r852_ecc_correct()
481 dev->dma_error = 0; in r852_ecc_correct()
485 r852_write_reg(dev, R852_CTL, dev->ctlreg | R852_CTL_ECC_ACCESS); in r852_ecc_correct()
486 ecc_reg = r852_read_reg_dword(dev, R852_DATALINE); in r852_ecc_correct()
487 r852_write_reg(dev, R852_CTL, dev->ctlreg); in r852_ecc_correct()
534 static void r852_engine_enable(struct r852_device *dev) in r852_engine_enable() argument
536 if (r852_read_reg_dword(dev, R852_HW) & R852_HW_UNKNOWN) { in r852_engine_enable()
537 r852_write_reg(dev, R852_CTL, R852_CTL_RESET | R852_CTL_ON); in r852_engine_enable()
538 r852_write_reg_dword(dev, R852_HW, R852_HW_ENABLED); in r852_engine_enable()
540 r852_write_reg_dword(dev, R852_HW, R852_HW_ENABLED); in r852_engine_enable()
541 r852_write_reg(dev, R852_CTL, R852_CTL_RESET | R852_CTL_ON); in r852_engine_enable()
544 r852_write_reg(dev, R852_CTL, 0); in r852_engine_enable()
552 static void r852_engine_disable(struct r852_device *dev) in r852_engine_disable() argument
554 r852_write_reg_dword(dev, R852_HW, 0); in r852_engine_disable()
555 r852_write_reg(dev, R852_CTL, R852_CTL_RESET); in r852_engine_disable()
562 static void r852_card_update_present(struct r852_device *dev) in r852_card_update_present() argument
567 spin_lock_irqsave(&dev->irqlock, flags); in r852_card_update_present()
568 reg = r852_read_reg(dev, R852_CARD_STA); in r852_card_update_present()
569 dev->card_detected = !!(reg & R852_CARD_STA_PRESENT); in r852_card_update_present()
570 spin_unlock_irqrestore(&dev->irqlock, flags); in r852_card_update_present()
577 static void r852_update_card_detect(struct r852_device *dev) in r852_update_card_detect() argument
579 int card_detect_reg = r852_read_reg(dev, R852_CARD_IRQ_ENABLE); in r852_update_card_detect()
580 dev->card_unstable = 0; in r852_update_card_detect()
585 card_detect_reg |= dev->card_detected ? in r852_update_card_detect()
588 r852_write_reg(dev, R852_CARD_IRQ_ENABLE, card_detect_reg); in r852_update_card_detect()
594 struct mtd_info *mtd = container_of(sys_dev, struct mtd_info, dev); in r852_media_type_show()
595 struct r852_device *dev = r852_get_dev(mtd); in r852_media_type_show() local
596 char *data = dev->sm ? "smartmedia" : "xd"; in r852_media_type_show()
606 static void r852_update_media_status(struct r852_device *dev) in r852_update_media_status() argument
612 spin_lock_irqsave(&dev->irqlock, flags); in r852_update_media_status()
613 if (!dev->card_detected) { in r852_update_media_status()
615 spin_unlock_irqrestore(&dev->irqlock, flags); in r852_update_media_status()
619 readonly = r852_read_reg(dev, R852_CARD_STA) & R852_CARD_STA_RO; in r852_update_media_status()
620 reg = r852_read_reg(dev, R852_DMA_CAP); in r852_update_media_status()
621 dev->sm = (reg & (R852_DMA1 | R852_DMA2)) && (reg & R852_SMBIT); in r852_update_media_status()
624 dev->sm ? "SmartMedia" : "xD", in r852_update_media_status()
627 dev->readonly = readonly; in r852_update_media_status()
628 spin_unlock_irqrestore(&dev->irqlock, flags); in r852_update_media_status()
635 static int r852_register_nand_device(struct r852_device *dev) in r852_register_nand_device() argument
637 struct mtd_info *mtd = nand_to_mtd(dev->chip); in r852_register_nand_device()
639 WARN_ON(dev->card_registred); in r852_register_nand_device()
641 mtd->dev.parent = &dev->pci_dev->dev; in r852_register_nand_device()
643 if (dev->readonly) in r852_register_nand_device()
644 dev->chip->options |= NAND_ROM; in r852_register_nand_device()
646 r852_engine_enable(dev); in r852_register_nand_device()
648 if (sm_register_device(mtd, dev->sm)) in r852_register_nand_device()
651 if (device_create_file(&mtd->dev, &dev_attr_media_type)) { in r852_register_nand_device()
656 dev->card_registred = 1; in r852_register_nand_device()
662 dev->card_detected = 0; in r852_register_nand_device()
670 static void r852_unregister_nand_device(struct r852_device *dev) in r852_unregister_nand_device() argument
672 struct mtd_info *mtd = nand_to_mtd(dev->chip); in r852_unregister_nand_device()
674 if (!dev->card_registred) in r852_unregister_nand_device()
677 device_remove_file(&mtd->dev, &dev_attr_media_type); in r852_unregister_nand_device()
679 r852_engine_disable(dev); in r852_unregister_nand_device()
680 dev->card_registred = 0; in r852_unregister_nand_device()
686 struct r852_device *dev = in r852_card_detect_work() local
689 r852_card_update_present(dev); in r852_card_detect_work()
690 r852_update_card_detect(dev); in r852_card_detect_work()
691 dev->card_unstable = 0; in r852_card_detect_work()
694 if (dev->card_detected == dev->card_registred) in r852_card_detect_work()
698 r852_update_media_status(dev); in r852_card_detect_work()
701 if (dev->card_detected) in r852_card_detect_work()
702 r852_register_nand_device(dev); in r852_card_detect_work()
704 r852_unregister_nand_device(dev); in r852_card_detect_work()
706 r852_update_card_detect(dev); in r852_card_detect_work()
710 static void r852_disable_irqs(struct r852_device *dev) in r852_disable_irqs() argument
713 reg = r852_read_reg(dev, R852_CARD_IRQ_ENABLE); in r852_disable_irqs()
714 r852_write_reg(dev, R852_CARD_IRQ_ENABLE, reg & ~R852_CARD_IRQ_MASK); in r852_disable_irqs()
716 reg = r852_read_reg_dword(dev, R852_DMA_IRQ_ENABLE); in r852_disable_irqs()
717 r852_write_reg_dword(dev, R852_DMA_IRQ_ENABLE, in r852_disable_irqs()
720 r852_write_reg(dev, R852_CARD_IRQ_STA, R852_CARD_IRQ_MASK); in r852_disable_irqs()
721 r852_write_reg_dword(dev, R852_DMA_IRQ_STA, R852_DMA_IRQ_MASK); in r852_disable_irqs()
727 struct r852_device *dev = (struct r852_device *)data; in r852_irq() local
733 spin_lock_irqsave(&dev->irqlock, flags); in r852_irq()
736 card_status = r852_read_reg(dev, R852_CARD_IRQ_STA); in r852_irq()
737 r852_write_reg(dev, R852_CARD_IRQ_STA, card_status); in r852_irq()
742 dev->card_detected = !!(card_status & R852_CARD_IRQ_INSERT); in r852_irq()
746 WARN_ON(dev->card_unstable); in r852_irq()
750 r852_disable_irqs(dev); in r852_irq()
752 if (dev->card_unstable) in r852_irq()
756 dev->card_unstable = 1; in r852_irq()
757 queue_delayed_work(dev->card_workqueue, in r852_irq()
758 &dev->card_detect_work, msecs_to_jiffies(100)); in r852_irq()
764 dma_status = r852_read_reg_dword(dev, R852_DMA_IRQ_STA); in r852_irq()
765 r852_write_reg_dword(dev, R852_DMA_IRQ_STA, dma_status); in r852_irq()
773 r852_dma_done(dev, -EIO); in r852_irq()
774 complete(&dev->dma_done); in r852_irq()
779 WARN_ON_ONCE(dev->dma_stage == 0); in r852_irq()
781 if (dev->dma_stage == 0) in r852_irq()
785 if (dev->dma_state == DMA_INTERNAL && in r852_irq()
788 dev->dma_state = DMA_MEMORY; in r852_irq()
789 dev->dma_stage++; in r852_irq()
793 if (dev->dma_state == DMA_MEMORY && in r852_irq()
795 dev->dma_state = DMA_INTERNAL; in r852_irq()
796 dev->dma_stage++; in r852_irq()
800 if (dev->dma_stage == 2) in r852_irq()
801 r852_dma_enable(dev); in r852_irq()
804 if (dev->dma_stage == 3) { in r852_irq()
805 r852_dma_done(dev, 0); in r852_irq()
806 complete(&dev->dma_done); in r852_irq()
819 spin_unlock_irqrestore(&dev->irqlock, flags); in r852_irq()
827 struct r852_device *dev; in r852_probe() local
877 dev = kzalloc(sizeof(struct r852_device), GFP_KERNEL); in r852_probe()
879 if (!dev) in r852_probe()
882 nand_set_controller_data(chip, dev); in r852_probe()
883 dev->chip = chip; in r852_probe()
884 dev->pci_dev = pci_dev; in r852_probe()
885 pci_set_drvdata(pci_dev, dev); in r852_probe()
887 dev->bounce_buffer = pci_alloc_consistent(pci_dev, R852_DMA_LEN, in r852_probe()
888 &dev->phys_bounce_buffer); in r852_probe()
890 if (!dev->bounce_buffer) in r852_probe()
895 dev->mmio = pci_ioremap_bar(pci_dev, 0); in r852_probe()
897 if (!dev->mmio) in r852_probe()
901 dev->tmp_buffer = kzalloc(SM_SECTOR_SIZE, GFP_KERNEL); in r852_probe()
903 if (!dev->tmp_buffer) in r852_probe()
906 init_completion(&dev->dma_done); in r852_probe()
908 dev->card_workqueue = create_freezable_workqueue(DRV_NAME); in r852_probe()
910 if (!dev->card_workqueue) in r852_probe()
913 INIT_DELAYED_WORK(&dev->card_detect_work, r852_card_detect_work); in r852_probe()
916 r852_engine_disable(dev); in r852_probe()
917 r852_disable_irqs(dev); in r852_probe()
919 r852_dma_test(dev); in r852_probe()
921 dev->irq = pci_dev->irq; in r852_probe()
922 spin_lock_init(&dev->irqlock); in r852_probe()
924 dev->card_detected = 0; in r852_probe()
925 r852_card_update_present(dev); in r852_probe()
930 DRV_NAME, dev)) in r852_probe()
934 queue_delayed_work(dev->card_workqueue, in r852_probe()
935 &dev->card_detect_work, 0); in r852_probe()
942 destroy_workqueue(dev->card_workqueue); in r852_probe()
944 kfree(dev->tmp_buffer); in r852_probe()
946 pci_iounmap(pci_dev, dev->mmio); in r852_probe()
949 dev->bounce_buffer, dev->phys_bounce_buffer); in r852_probe()
951 kfree(dev); in r852_probe()
965 struct r852_device *dev = pci_get_drvdata(pci_dev); in r852_remove() local
969 cancel_delayed_work_sync(&dev->card_detect_work); in r852_remove()
970 destroy_workqueue(dev->card_workqueue); in r852_remove()
973 r852_unregister_nand_device(dev); in r852_remove()
976 r852_disable_irqs(dev); in r852_remove()
977 free_irq(dev->irq, dev); in r852_remove()
980 kfree(dev->tmp_buffer); in r852_remove()
981 pci_iounmap(pci_dev, dev->mmio); in r852_remove()
983 dev->bounce_buffer, dev->phys_bounce_buffer); in r852_remove()
985 kfree(dev->chip); in r852_remove()
986 kfree(dev); in r852_remove()
995 struct r852_device *dev = pci_get_drvdata(pci_dev); in r852_shutdown() local
997 cancel_delayed_work_sync(&dev->card_detect_work); in r852_shutdown()
998 r852_disable_irqs(dev); in r852_shutdown()
999 synchronize_irq(dev->irq); in r852_shutdown()
1006 struct r852_device *dev = pci_get_drvdata(to_pci_dev(device)); in r852_suspend() local
1008 if (dev->ctlreg & R852_CTL_CARDENABLE) in r852_suspend()
1012 cancel_delayed_work_sync(&dev->card_detect_work); in r852_suspend()
1015 r852_disable_irqs(dev); in r852_suspend()
1016 r852_engine_disable(dev); in r852_suspend()
1021 dev->card_unstable = 0; in r852_suspend()
1027 struct r852_device *dev = pci_get_drvdata(to_pci_dev(device)); in r852_resume() local
1028 struct mtd_info *mtd = nand_to_mtd(dev->chip); in r852_resume()
1030 r852_disable_irqs(dev); in r852_resume()
1031 r852_card_update_present(dev); in r852_resume()
1032 r852_engine_disable(dev); in r852_resume()
1036 if (dev->card_detected != dev->card_registred) { in r852_resume()
1038 dev->card_detected ? "added" : "removed"); in r852_resume()
1040 queue_delayed_work(dev->card_workqueue, in r852_resume()
1041 &dev->card_detect_work, msecs_to_jiffies(1000)); in r852_resume()
1046 if (dev->card_registred) { in r852_resume()
1047 r852_engine_enable(dev); in r852_resume()
1048 dev->chip->select_chip(mtd, 0); in r852_resume()
1049 nand_reset_op(dev->chip); in r852_resume()
1050 dev->chip->select_chip(mtd, -1); in r852_resume()
1054 r852_update_card_detect(dev); in r852_resume()