Lines Matching +full:fpga +full:- +full:passive +full:- +full:serial
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Altera Passive Serial SPI Driver
9 * Manage Altera FPGA firmware that is loaded over SPI using the passive
10 * serial configuration method.
18 #include <linux/fpga/fpga-mgr.h>
75 { .compatible = "altr,fpga-passive-serial", .data = &c5_data },
76 { .compatible = "altr,fpga-arria10-passive-serial", .data = &a10_data },
83 struct altera_ps_conf *conf = mgr->priv; in altera_ps_state()
85 if (gpiod_get_value_cansleep(conf->status)) in altera_ps_state()
103 struct altera_ps_conf *conf = mgr->priv; in altera_ps_write_init()
107 conf->info_flags = info->flags; in altera_ps_write_init()
109 if (info->flags & FPGA_MGR_PARTIAL_RECONFIG) { in altera_ps_write_init()
110 dev_err(&mgr->dev, "Partial reconfiguration not supported.\n"); in altera_ps_write_init()
111 return -EINVAL; in altera_ps_write_init()
114 gpiod_set_value_cansleep(conf->config, 1); in altera_ps_write_init()
117 altera_ps_delay(conf->data->t_cfg_us); in altera_ps_write_init()
119 if (!gpiod_get_value_cansleep(conf->status)) { in altera_ps_write_init()
120 dev_err(&mgr->dev, "Status pin failed to show a reset\n"); in altera_ps_write_init()
121 return -EIO; in altera_ps_write_init()
124 gpiod_set_value_cansleep(conf->config, 0); in altera_ps_write_init()
126 min = conf->data->status_wait_min_us; in altera_ps_write_init()
127 max = conf->data->status_wait_max_us; in altera_ps_write_init()
135 if (!gpiod_get_value_cansleep(conf->status)) { in altera_ps_write_init()
137 altera_ps_delay(conf->data->t_st2ck_us); in altera_ps_write_init()
142 dev_err(&mgr->dev, "Status pin not ready.\n"); in altera_ps_write_init()
143 return -EIO; in altera_ps_write_init()
150 const u32 *fw_end = (u32 *)(buf + len - extra_bytes); in rev_buf()
163 extra_bytes--; in rev_buf()
171 struct altera_ps_conf *conf = mgr->priv; in altera_ps_write()
177 size_t stride = min_t(size_t, fw_data_end - fw_data, SZ_4K); in altera_ps_write()
179 if (!(conf->info_flags & FPGA_MGR_BITSTREAM_LSB_FIRST)) in altera_ps_write()
182 ret = spi_write(conf->spi, fw_data, stride); in altera_ps_write()
184 dev_err(&mgr->dev, "spi error in firmware write: %d\n", in altera_ps_write()
197 struct altera_ps_conf *conf = mgr->priv; in altera_ps_write_complete()
201 if (gpiod_get_value_cansleep(conf->status)) { in altera_ps_write_complete()
202 dev_err(&mgr->dev, "Error during configuration.\n"); in altera_ps_write_complete()
203 return -EIO; in altera_ps_write_complete()
206 if (conf->confd) { in altera_ps_write_complete()
207 if (!gpiod_get_raw_value_cansleep(conf->confd)) { in altera_ps_write_complete()
208 dev_err(&mgr->dev, "CONF_DONE is inactive!\n"); in altera_ps_write_complete()
209 return -EIO; in altera_ps_write_complete()
217 ret = spi_write(conf->spi, dummy, 1); in altera_ps_write_complete()
219 dev_err(&mgr->dev, "spi error during end sequence: %d\n", ret); in altera_ps_write_complete()
238 conf = devm_kzalloc(&spi->dev, sizeof(*conf), GFP_KERNEL); in altera_ps_probe()
240 return -ENOMEM; in altera_ps_probe()
242 conf->data = spi_get_device_match_data(spi); in altera_ps_probe()
243 conf->spi = spi; in altera_ps_probe()
244 conf->config = devm_gpiod_get(&spi->dev, "nconfig", GPIOD_OUT_LOW); in altera_ps_probe()
245 if (IS_ERR(conf->config)) { in altera_ps_probe()
246 dev_err(&spi->dev, "Failed to get config gpio: %ld\n", in altera_ps_probe()
247 PTR_ERR(conf->config)); in altera_ps_probe()
248 return PTR_ERR(conf->config); in altera_ps_probe()
251 conf->status = devm_gpiod_get(&spi->dev, "nstat", GPIOD_IN); in altera_ps_probe()
252 if (IS_ERR(conf->status)) { in altera_ps_probe()
253 dev_err(&spi->dev, "Failed to get status gpio: %ld\n", in altera_ps_probe()
254 PTR_ERR(conf->status)); in altera_ps_probe()
255 return PTR_ERR(conf->status); in altera_ps_probe()
258 conf->confd = devm_gpiod_get_optional(&spi->dev, "confd", GPIOD_IN); in altera_ps_probe()
259 if (IS_ERR(conf->confd)) { in altera_ps_probe()
260 dev_err(&spi->dev, "Failed to get confd gpio: %ld\n", in altera_ps_probe()
261 PTR_ERR(conf->confd)); in altera_ps_probe()
262 return PTR_ERR(conf->confd); in altera_ps_probe()
263 } else if (!conf->confd) { in altera_ps_probe()
264 dev_warn(&spi->dev, "Not using confd gpio"); in altera_ps_probe()
268 snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s %s", in altera_ps_probe()
269 dev_driver_string(&spi->dev), dev_name(&spi->dev)); in altera_ps_probe()
271 mgr = devm_fpga_mgr_register(&spi->dev, conf->mgr_name, in altera_ps_probe()
277 { "cyclone-ps-spi", (uintptr_t)&c5_data },
278 { "fpga-passive-serial", (uintptr_t)&c5_data },
279 { "fpga-arria10-passive-serial", (uintptr_t)&a10_data },
286 .name = "altera-ps-spi",
297 MODULE_DESCRIPTION("Module to load Altera FPGA firmware over SPI");