patches for FPGA
cover patches for FPGA
Hi Greg,
Please take these two fpga fixes patches. They have been reviewed on the mailing list and apply cleanly on current linux-next.
Thanks,
Alan
Anatolij Gustschin (2):
fpga: altera-cvp: fix probing for multiple FPGAs on the bus
fpga: mgr: altera-ps-spi: enable usage on non-dt platforms
drivers/fpga/altera-cvp.c | 34 ++++++++++++++++++++++++---------- drivers/fpga/altera-ps-spi.c | 40 +++++++++++++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 15 deletions(-)
Signature · 1 line
2.7.4
PATCH 1/2 fpga: altera-cvp: fix probing for multiple FPGAs on the bus
From: Anatolij Gustschin <[email protected]>
Currently registering CvP managers works only for first probed CvP device, for all other devices it is refused due to duplicated chkcfg sysfs entry:
fpga_manager fpga3: Altera CvP FPGA Manager @0000:0c:00.0 registered
sysfs: cannot create duplicate filename '/bus/pci/drivers/altera-cvp/chkcfg'
CPU: 0 PID: 3808 Comm: bash Tainted: G O 4.19.0-custom+ #5 Call Trace: dump_stack+0x46/0x5b sysfs_warn_dup+0x53/0x60 sysfs_add_file_mode_ns+0x16d/0x180 sysfs_create_file_ns+0x51/0x60 altera_cvp_probe+0x16f/0x2a0 [altera_cvp] local_pci_probe+0x3f/0xa0 ? pci_match_device+0xb1/0xf0 pci_device_probe+0x116/0x170 really_probe+0x21b/0x2c0 driver_probe_device+0x4b/0xe0 bind_store+0xcb/0x130 kernfs_fop_write+0xfd/0x180 __vfs_write+0x21/0x150 ? selinux_file_permission+0xdc/0x130 vfs_write+0xa8/0x1a0 ? find_vma+0xd/0x60 ksys_write+0x3d/0x90 do_syscall_64+0x44/0xf0 entry_SYSCALL_64_after_hwframe+0x44/0xa9 ... altera-cvp 0000:0c:00.0: Can't create sysfs chkcfg file fpga_manager fpga3: fpga_mgr_unregister Altera CvP FPGA Manager @0000:0c:00.0
Move chkcfg creation to module init as suggested by Alan.
--- drivers/fpga/altera-cvp.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-)
drivers/fpga/altera-cvp.c +24 -10
@@ -475,14 +475,6 @@ static int altera_cvp_probe(struct pci_dev *pdev,if (ret) goto err_unmap; - ret =driver_create_file (&altera_cvp_driver.driver, - &driver_attr_chkcfg); -if (ret) { -dev_err (&pdev->dev,"Can't create sysfs chkcfg file\n" ); -fpga_mgr_unregister (mgr); - goto err_unmap; - } -return 0 ; err_unmap:
@@ -501,7 +493,6 @@ static void altera_cvp_remove(struct pci_dev *pdev)struct altera_cvp_conf *conf = mgr->priv;u16 cmd; -driver_remove_file (&altera_cvp_driver.driver, &driver_attr_chkcfg);fpga_mgr_unregister (mgr);if (conf->map)pci_iounmap (pdev, conf->map);
@@ -511,7 +502,30 @@ static void altera_cvp_remove(struct pci_dev *pdev)pci_write_config_word (pdev,PCI_COMMAND , cmd); } -module_pci_driver (altera_cvp_driver); +static int __init altera_cvp_init (void ) +{ +int ret; + + ret =pci_register_driver (&altera_cvp_driver); +if (ret) +return ret; + + ret =driver_create_file (&altera_cvp_driver.driver, + &driver_attr_chkcfg); +if (ret) +pr_warn ("Can't create sysfs chkcfg file\n" ); + +return 0 ; +} + +static void __exit altera_cvp_exit(void) +{ +driver_remove_file (&altera_cvp_driver.driver, &driver_attr_chkcfg); +pci_unregister_driver (&altera_cvp_driver); +} + +module_init (altera_cvp_init); +module_exit (altera_cvp_exit);MODULE_LICENSE ("GPL v2" );MODULE_AUTHOR ("Anatolij Gustschin <[email protected]>" );
Signature · 1 line
2.7.4
PATCH 2/2 fpga: mgr: altera-ps-spi: enable usage on non-dt platforms
In reply to Alan TullFrom: Anatolij Gustschin <[email protected]>
Driver probing fails on non-dt platforms since of_match_device() always returns NULL here. Add spi ids with device names and matching driver data as an index of a map array with data for supported devices. Add this map array and a function for mapping spi ids to driver data. This allows driver binding to dynamically added PS-SPI devices (e.g. when added via spi_new_device() after hot-plugging).
--- drivers/fpga/altera-ps-spi.c | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-)
drivers/fpga/altera-ps-spi.c +35 -5
@@ -75,6 +75,12 @@ static struct altera_ps_data a10_data = { .t_st2ck_us = 10, /* min(t_ST2CK) */ }; +/* Array index is enum altera_ps_devtype */ +static const struct altera_ps_data *altera_ps_data_map[] = { + &c5_data, + &a10_data, +}; +static const struct of_device_id of_ef_match[] = { { .compatible ="altr,fpga-passive-serial" , .data = &c5_data }, { .compatible ="altr,fpga-arria10-passive-serial" , .data = &a10_data },
@@ -234,6 +240,22 @@ static const struct fpga_manager_ops altera_ps_ops = { .write_complete = altera_ps_write_complete, }; +static const struct altera_ps_data *id_to_data (const struct spi_device_id *id) +{ +kernel_ulong_t devtype = id->driver_data; +const struct altera_ps_data *data; + +/* someone added a altera_ps_devtype without adding to the map array */ +if (devtype >=ARRAY_SIZE (altera_ps_data_map)) +return NULL ; + + data = altera_ps_data_map[devtype]; +if (!data || data->devtype != devtype) +return NULL ; + +return data; +} +static int altera_ps_probe (struct spi_device *spi) {struct altera_ps_conf *conf;
@@ -244,11 +266,17 @@ static int altera_ps_probe(struct spi_device *spi)if (!conf)return -ENOMEM ; - of_id =of_match_device (of_ef_match, &spi->dev); -if (!of_id) -return -ENODEV ; +if (spi->dev.of_node) { + of_id =of_match_device (of_ef_match, &spi->dev); +if (!of_id) +return -ENODEV ; + conf->data = of_id->data; + }else { + conf->data =id_to_data (spi_get_device_id (spi)); +if (!conf->data) +return -ENODEV ; + } - conf->data = of_id->data; conf->spi = spi; conf->config =devm_gpiod_get (&spi->dev,"nconfig" ,GPIOD_OUT_LOW );if (IS_ERR (conf->config)) {
@@ -294,7 +322,9 @@ static int altera_ps_remove(struct spi_device *spi) }static const struct spi_device_id altera_ps_spi_ids[] = { - {"cyclone-ps-spi" ,0 }, + {"cyclone-ps-spi" ,CYCLONE5 }, + {"fpga-passive-serial" ,CYCLONE5 }, + {"fpga-arria10-passive-serial" ,ARRIA10 }, {} };MODULE_DEVICE_TABLE (spi, altera_ps_spi_ids);
Signature · 1 line
2.7.4