Lines Matching +full:bitstream +full:- +full:flash

1 // SPDX-License-Identifier: GPL-2.0
16 #include <linux/nvmem-consumer.h>
17 #include <linux/nvmem-provider.h>
19 #include <linux/spi/flash.h>
34 #define CP500_RECONFIG_REG 0x11 /* upper 8-bits of STARTUP register */
68 /* SPI flash running at full speed */
74 #define CP500_IS_CP035(dev) ((dev)->pci_dev->device == PCI_DEVICE_ID_KEBA_CP035)
75 #define CP500_IS_CP505(dev) ((dev)->pci_dev->device == PCI_DEVICE_ID_KEBA_CP505)
76 #define CP500_IS_CP520(dev) ((dev)->pci_dev->device == PCI_DEVICE_ID_KEBA_CP520)
207 .name = "system-flash-parts",
215 .name = "system-flash",
221 .name = "system-flash",
226 { /* system FPGA configuration bitstream flash */
253 n += scnprintf(buf + n, max_len - n, "_FPGA_%d.%02d", in cp500_get_fpga_version()
254 cp500->version.major, cp500->version.minor); in cp500_get_fpga_version()
257 if (cp500->version.build & CP500_BUILD_TEST) in cp500_get_fpga_version()
258 n += scnprintf(buf + n, max_len - n, "Test%d", in cp500_get_fpga_version()
259 cp500->version.build & ~CP500_BUILD_TEST); in cp500_get_fpga_version()
261 n += scnprintf(buf + n, max_len - n, "\n"); in cp500_get_fpga_version()
285 if (ioread8(cp500->system_startup_addr + CP500_RECONFIG_REG) & in keep_cfg_show()
299 return -EINVAL; in keep_cfg_store()
310 iowrite8(0, cp500->system_startup_addr + CP500_RECONFIG_REG); in keep_cfg_store()
313 cp500->system_startup_addr + CP500_RECONFIG_REG); in keep_cfg_store()
338 cp500->i2c = kzalloc(sizeof(*cp500->i2c), GFP_KERNEL); in cp500_register_i2c()
339 if (!cp500->i2c) in cp500_register_i2c()
340 return -ENOMEM; in cp500_register_i2c()
342 cp500->i2c->auxdev.name = "i2c"; in cp500_register_i2c()
343 cp500->i2c->auxdev.id = 0; in cp500_register_i2c()
344 cp500->i2c->auxdev.dev.release = cp500_i2c_release; in cp500_register_i2c()
345 cp500->i2c->auxdev.dev.parent = &cp500->pci_dev->dev; in cp500_register_i2c()
346 cp500->i2c->io = (struct resource) { in cp500_register_i2c()
348 .start = (resource_size_t) cp500->sys_hwbase + in cp500_register_i2c()
349 cp500->devs->i2c.offset, in cp500_register_i2c()
350 .end = (resource_size_t) cp500->sys_hwbase + in cp500_register_i2c()
351 cp500->devs->i2c.offset + in cp500_register_i2c()
352 cp500->devs->i2c.size - 1, in cp500_register_i2c()
355 cp500->i2c->info_size = ARRAY_SIZE(cp500_i2c_info); in cp500_register_i2c()
356 cp500->i2c->info = cp500_i2c_info; in cp500_register_i2c()
358 ret = auxiliary_device_init(&cp500->i2c->auxdev); in cp500_register_i2c()
360 kfree(cp500->i2c); in cp500_register_i2c()
361 cp500->i2c = NULL; in cp500_register_i2c()
365 ret = __auxiliary_device_add(&cp500->i2c->auxdev, "keba"); in cp500_register_i2c()
367 auxiliary_device_uninit(&cp500->i2c->auxdev); in cp500_register_i2c()
368 cp500->i2c = NULL; in cp500_register_i2c()
389 cp500->spi = kzalloc(sizeof(*cp500->spi), GFP_KERNEL); in cp500_register_spi()
390 if (!cp500->spi) in cp500_register_spi()
391 return -ENOMEM; in cp500_register_spi()
398 info_size = ARRAY_SIZE(cp500_spi_info) - 1; in cp500_register_spi()
400 cp500->spi->auxdev.name = "spi"; in cp500_register_spi()
401 cp500->spi->auxdev.id = 0; in cp500_register_spi()
402 cp500->spi->auxdev.dev.release = cp500_spi_release; in cp500_register_spi()
403 cp500->spi->auxdev.dev.parent = &cp500->pci_dev->dev; in cp500_register_spi()
404 cp500->spi->io = (struct resource) { in cp500_register_spi()
406 .start = (resource_size_t) cp500->sys_hwbase + in cp500_register_spi()
407 cp500->devs->spi.offset, in cp500_register_spi()
408 .end = (resource_size_t) cp500->sys_hwbase + in cp500_register_spi()
409 cp500->devs->spi.offset + in cp500_register_spi()
410 cp500->devs->spi.size - 1, in cp500_register_spi()
413 cp500->spi->info_size = info_size; in cp500_register_spi()
414 cp500->spi->info = cp500_spi_info; in cp500_register_spi()
416 ret = auxiliary_device_init(&cp500->spi->auxdev); in cp500_register_spi()
418 kfree(cp500->spi); in cp500_register_spi()
419 cp500->spi = NULL; in cp500_register_spi()
423 ret = __auxiliary_device_add(&cp500->spi->auxdev, "keba"); in cp500_register_spi()
425 auxiliary_device_uninit(&cp500->spi->auxdev); in cp500_register_spi()
426 cp500->spi = NULL; in cp500_register_spi()
446 cp500->fan = kzalloc(sizeof(*cp500->fan), GFP_KERNEL); in cp500_register_fan()
447 if (!cp500->fan) in cp500_register_fan()
448 return -ENOMEM; in cp500_register_fan()
450 cp500->fan->auxdev.name = "fan"; in cp500_register_fan()
451 cp500->fan->auxdev.id = 0; in cp500_register_fan()
452 cp500->fan->auxdev.dev.release = cp500_fan_release; in cp500_register_fan()
453 cp500->fan->auxdev.dev.parent = &cp500->pci_dev->dev; in cp500_register_fan()
454 cp500->fan->io = (struct resource) { in cp500_register_fan()
456 .start = (resource_size_t) cp500->sys_hwbase + in cp500_register_fan()
457 cp500->devs->fan.offset, in cp500_register_fan()
458 .end = (resource_size_t) cp500->sys_hwbase + in cp500_register_fan()
459 cp500->devs->fan.offset + in cp500_register_fan()
460 cp500->devs->fan.size - 1, in cp500_register_fan()
464 ret = auxiliary_device_init(&cp500->fan->auxdev); in cp500_register_fan()
466 kfree(cp500->fan); in cp500_register_fan()
467 cp500->fan = NULL; in cp500_register_fan()
471 ret = __auxiliary_device_add(&cp500->fan->auxdev, "keba"); in cp500_register_fan()
473 auxiliary_device_uninit(&cp500->fan->auxdev); in cp500_register_fan()
474 cp500->fan = NULL; in cp500_register_fan()
494 cp500->batt = kzalloc(sizeof(*cp500->batt), GFP_KERNEL); in cp500_register_batt()
495 if (!cp500->batt) in cp500_register_batt()
496 return -ENOMEM; in cp500_register_batt()
498 cp500->batt->auxdev.name = "batt"; in cp500_register_batt()
499 cp500->batt->auxdev.id = 0; in cp500_register_batt()
500 cp500->batt->auxdev.dev.release = cp500_batt_release; in cp500_register_batt()
501 cp500->batt->auxdev.dev.parent = &cp500->pci_dev->dev; in cp500_register_batt()
502 cp500->batt->io = (struct resource) { in cp500_register_batt()
504 .start = (resource_size_t) cp500->sys_hwbase + in cp500_register_batt()
505 cp500->devs->batt.offset, in cp500_register_batt()
506 .end = (resource_size_t) cp500->sys_hwbase + in cp500_register_batt()
507 cp500->devs->batt.offset + in cp500_register_batt()
508 cp500->devs->batt.size - 1, in cp500_register_batt()
512 ret = auxiliary_device_init(&cp500->batt->auxdev); in cp500_register_batt()
514 kfree(cp500->batt); in cp500_register_batt()
515 cp500->batt = NULL; in cp500_register_batt()
519 ret = __auxiliary_device_add(&cp500->batt->auxdev, "keba"); in cp500_register_batt()
521 auxiliary_device_uninit(&cp500->batt->auxdev); in cp500_register_batt()
522 cp500->batt = NULL; in cp500_register_batt()
546 return -ENOMEM; in cp500_register_uart()
548 (*uart)->auxdev.name = name; in cp500_register_uart()
549 (*uart)->auxdev.id = 0; in cp500_register_uart()
550 (*uart)->auxdev.dev.release = cp500_uart_release; in cp500_register_uart()
551 (*uart)->auxdev.dev.parent = &cp500->pci_dev->dev; in cp500_register_uart()
552 (*uart)->io = (struct resource) { in cp500_register_uart()
554 .start = (resource_size_t) cp500->sys_hwbase + info->offset, in cp500_register_uart()
555 .end = (resource_size_t) cp500->sys_hwbase + info->offset + in cp500_register_uart()
556 info->size - 1, in cp500_register_uart()
559 (*uart)->irq = irq; in cp500_register_uart()
561 ret = auxiliary_device_init(&(*uart)->auxdev); in cp500_register_uart()
568 ret = __auxiliary_device_add(&(*uart)->auxdev, "keba"); in cp500_register_uart()
570 auxiliary_device_uninit(&(*uart)->auxdev); in cp500_register_uart()
585 ret = nvmem_device_read(nvmem->base_nvmem, nvmem->offset + offset, in cp500_nvmem_read()
599 ret = nvmem_device_write(nvmem->base_nvmem, nvmem->offset + offset, in cp500_nvmem_write()
610 struct device *dev = &cp500->pci_dev->dev; in cp500_nvmem_register()
630 cp500->nvmem_cpu.base_nvmem = base_nvmem; in cp500_nvmem_register()
631 cp500->nvmem_cpu.offset = CP500_EEPROM_CPU_OFFSET; in cp500_nvmem_register()
634 nvmem_config.priv = &cp500->nvmem_cpu; in cp500_nvmem_register()
638 cp500->nvmem_cpu.nvmem = tmp; in cp500_nvmem_register()
640 cp500->nvmem_user.base_nvmem = base_nvmem; in cp500_nvmem_register()
641 cp500->nvmem_user.offset = CP500_EEPROM_USER_OFFSET; in cp500_nvmem_register()
644 nvmem_config.priv = &cp500->nvmem_user; in cp500_nvmem_register()
647 nvmem_unregister(cp500->nvmem_cpu.nvmem); in cp500_nvmem_register()
648 cp500->nvmem_cpu.nvmem = NULL; in cp500_nvmem_register()
652 cp500->nvmem_user.nvmem = tmp; in cp500_nvmem_register()
661 if (cp500->nvmem_user.nvmem) { in cp500_nvmem_unregister()
662 nvmem_unregister(cp500->nvmem_user.nvmem); in cp500_nvmem_unregister()
663 cp500->nvmem_user.nvmem = NULL; in cp500_nvmem_unregister()
665 if (cp500->nvmem_cpu.nvmem) { in cp500_nvmem_unregister()
666 nvmem_unregister(cp500->nvmem_cpu.nvmem); in cp500_nvmem_unregister()
667 cp500->nvmem_cpu.nvmem = NULL; in cp500_nvmem_unregister()
671 notified = atomic_read(&cp500->nvmem_notified); in cp500_nvmem_unregister()
673 nvmem_device_put(cp500->nvmem_cpu.base_nvmem); in cp500_nvmem_unregister()
682 dev = dev->parent; in cp500_nvmem_match()
684 if (!client || client->addr != CP500_EEPROM_ADDR) in cp500_nvmem_match()
686 while ((dev = dev->parent)) in cp500_nvmem_match()
687 if (dev == &cp500->pci_dev->dev) in cp500_nvmem_match()
706 dev = &cp500->pci_dev->dev; in cp500_nvmem()
709 notified = atomic_read(&cp500->nvmem_notified); in cp500_nvmem()
715 if (!atomic_try_cmpxchg_relaxed(&cp500->nvmem_notified, &notified, 1)) { in cp500_nvmem()
742 struct device *dev = &cp500->pci_dev->dev; in cp500_register_auxiliary_devs()
743 u8 present = ioread8(cp500->system_startup_addr + CP500_PRESENT_REG); in cp500_register_auxiliary_devs()
752 if (cp500->devs->uart0_rfb.size && in cp500_register_auxiliary_devs()
753 cp500->devs->uart0_rfb.msix < cp500->msix_num) { in cp500_register_auxiliary_devs()
754 int irq = pci_irq_vector(cp500->pci_dev, in cp500_register_auxiliary_devs()
755 cp500->devs->uart0_rfb.msix); in cp500_register_auxiliary_devs()
757 if (cp500_register_uart(cp500, &cp500->uart0_rfb, "rs485-uart", in cp500_register_auxiliary_devs()
758 &cp500->devs->uart0_rfb, irq)) in cp500_register_auxiliary_devs()
761 if (cp500->devs->uart1_dbg.size && in cp500_register_auxiliary_devs()
762 cp500->devs->uart1_dbg.msix < cp500->msix_num) { in cp500_register_auxiliary_devs()
763 int irq = pci_irq_vector(cp500->pci_dev, in cp500_register_auxiliary_devs()
764 cp500->devs->uart1_dbg.msix); in cp500_register_auxiliary_devs()
766 if (cp500_register_uart(cp500, &cp500->uart1_dbg, "rs232-uart", in cp500_register_auxiliary_devs()
767 &cp500->devs->uart1_dbg, irq)) in cp500_register_auxiliary_devs()
770 if (cp500->devs->uart2_si1.size && in cp500_register_auxiliary_devs()
771 cp500->devs->uart2_si1.msix < cp500->msix_num) { in cp500_register_auxiliary_devs()
772 int irq = pci_irq_vector(cp500->pci_dev, in cp500_register_auxiliary_devs()
773 cp500->devs->uart2_si1.msix); in cp500_register_auxiliary_devs()
775 if (cp500_register_uart(cp500, &cp500->uart2_si1, "uart", in cp500_register_auxiliary_devs()
776 &cp500->devs->uart2_si1, irq)) in cp500_register_auxiliary_devs()
789 if (cp500->spi) { in cp500_unregister_auxiliary_devs()
790 cp500_unregister_dev(&cp500->spi->auxdev); in cp500_unregister_auxiliary_devs()
791 cp500->spi = NULL; in cp500_unregister_auxiliary_devs()
793 if (cp500->i2c) { in cp500_unregister_auxiliary_devs()
794 cp500_unregister_dev(&cp500->i2c->auxdev); in cp500_unregister_auxiliary_devs()
795 cp500->i2c = NULL; in cp500_unregister_auxiliary_devs()
797 if (cp500->fan) { in cp500_unregister_auxiliary_devs()
798 cp500_unregister_dev(&cp500->fan->auxdev); in cp500_unregister_auxiliary_devs()
799 cp500->fan = NULL; in cp500_unregister_auxiliary_devs()
801 if (cp500->batt) { in cp500_unregister_auxiliary_devs()
802 cp500_unregister_dev(&cp500->batt->auxdev); in cp500_unregister_auxiliary_devs()
803 cp500->batt = NULL; in cp500_unregister_auxiliary_devs()
805 if (cp500->uart0_rfb) { in cp500_unregister_auxiliary_devs()
806 cp500_unregister_dev(&cp500->uart0_rfb->auxdev); in cp500_unregister_auxiliary_devs()
807 cp500->uart0_rfb = NULL; in cp500_unregister_auxiliary_devs()
809 if (cp500->uart1_dbg) { in cp500_unregister_auxiliary_devs()
810 cp500_unregister_dev(&cp500->uart1_dbg->auxdev); in cp500_unregister_auxiliary_devs()
811 cp500->uart1_dbg = NULL; in cp500_unregister_auxiliary_devs()
813 if (cp500->uart2_si1) { in cp500_unregister_auxiliary_devs()
814 cp500_unregister_dev(&cp500->uart2_si1->auxdev); in cp500_unregister_auxiliary_devs()
815 cp500->uart2_si1 = NULL; in cp500_unregister_auxiliary_devs()
822 u32 axi_address = ioread32(cp500->system_startup_addr + CP500_AXI_REG); in cp500_axi_handler()
828 dev_err(&cp500->pci_dev->dev, "AXI response error at 0x%08x\n", in cp500_axi_handler()
836 int axi_irq = -1; in cp500_enable()
839 if (cp500->msix_num > CP500_NUM_MSIX_NO_AXI) { in cp500_enable()
840 axi_irq = pci_irq_vector(cp500->pci_dev, CP500_AXI_MSIX); in cp500_enable()
844 dev_err(&cp500->pci_dev->dev, in cp500_enable()
857 if (cp500->msix_num > CP500_NUM_MSIX_NO_AXI) { in cp500_disable()
858 axi_irq = pci_irq_vector(cp500->pci_dev, CP500_AXI_MSIX); in cp500_disable()
865 struct device *dev = &pci_dev->dev; in cp500_probe()
874 return -ENOMEM; in cp500_probe()
875 cp500->pci_dev = pci_dev; in cp500_probe()
876 cp500->sys_hwbase = pci_resource_start(pci_dev, CP500_SYS_BAR); in cp500_probe()
877 cp500->ecm_hwbase = pci_resource_start(pci_dev, CP500_ECM_BAR); in cp500_probe()
878 if (!cp500->sys_hwbase || !cp500->ecm_hwbase) in cp500_probe()
879 return -ENODEV; in cp500_probe()
882 cp500->devs = &cp035_devices; in cp500_probe()
884 cp500->devs = &cp505_devices; in cp500_probe()
886 cp500->devs = &cp520_devices; in cp500_probe()
888 return -ENODEV; in cp500_probe()
896 startup.end = startup.start + cp500->devs->startup.size - 1; in cp500_probe()
897 cp500->system_startup_addr = devm_ioremap_resource(&pci_dev->dev, in cp500_probe()
899 if (IS_ERR(cp500->system_startup_addr)) { in cp500_probe()
900 ret = PTR_ERR(cp500->system_startup_addr); in cp500_probe()
904 cp500->msix_num = pci_alloc_irq_vectors(pci_dev, CP500_NUM_MSIX_NO_MMI, in cp500_probe()
906 if (cp500->msix_num < CP500_NUM_MSIX_NO_MMI) { in cp500_probe()
907 dev_err(&pci_dev->dev, in cp500_probe()
908 "Hardware does not support enough MSI-X interrupts\n"); in cp500_probe()
909 ret = -ENODEV; in cp500_probe()
913 cp500_vers = ioread32(cp500->system_startup_addr + CP500_VERSION_REG); in cp500_probe()
914 cp500->version.major = (cp500_vers & 0xff); in cp500_probe()
915 cp500->version.minor = (cp500_vers >> 8) & 0xff; in cp500_probe()
916 cp500->version.build = (cp500_vers >> 16) & 0xffff; in cp500_probe()
919 dev_info(&pci_dev->dev, "FPGA version %s", buf); in cp500_probe()
923 cp500->nvmem_notifier.notifier_call = cp500_nvmem; in cp500_probe()
924 ret = nvmem_register_notifier(&cp500->nvmem_notifier); in cp500_probe()
937 nvmem_unregister_notifier(&cp500->nvmem_notifier); in cp500_probe()
955 nvmem_unregister_notifier(&cp500->nvmem_notifier); in cp500_remove()