1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Xilinx Spartan6 and 7 Series Slave Serial SPI Driver
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2017 DENX Software Engineering
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Anatolij Gustschin <agust@denx.de>
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * Manage Xilinx FPGA firmware that is loaded over SPI using
10*4882a593Smuzhiyun * the slave serial configuration interface.
11*4882a593Smuzhiyun */
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #include <linux/delay.h>
14*4882a593Smuzhiyun #include <linux/device.h>
15*4882a593Smuzhiyun #include <linux/fpga/fpga-mgr.h>
16*4882a593Smuzhiyun #include <linux/gpio/consumer.h>
17*4882a593Smuzhiyun #include <linux/module.h>
18*4882a593Smuzhiyun #include <linux/mod_devicetable.h>
19*4882a593Smuzhiyun #include <linux/of.h>
20*4882a593Smuzhiyun #include <linux/spi/spi.h>
21*4882a593Smuzhiyun #include <linux/sizes.h>
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun struct xilinx_spi_conf {
24*4882a593Smuzhiyun struct spi_device *spi;
25*4882a593Smuzhiyun struct gpio_desc *prog_b;
26*4882a593Smuzhiyun struct gpio_desc *init_b;
27*4882a593Smuzhiyun struct gpio_desc *done;
28*4882a593Smuzhiyun };
29*4882a593Smuzhiyun
get_done_gpio(struct fpga_manager * mgr)30*4882a593Smuzhiyun static int get_done_gpio(struct fpga_manager *mgr)
31*4882a593Smuzhiyun {
32*4882a593Smuzhiyun struct xilinx_spi_conf *conf = mgr->priv;
33*4882a593Smuzhiyun int ret;
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun ret = gpiod_get_value(conf->done);
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun if (ret < 0)
38*4882a593Smuzhiyun dev_err(&mgr->dev, "Error reading DONE (%d)\n", ret);
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun return ret;
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun
xilinx_spi_state(struct fpga_manager * mgr)43*4882a593Smuzhiyun static enum fpga_mgr_states xilinx_spi_state(struct fpga_manager *mgr)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun if (!get_done_gpio(mgr))
46*4882a593Smuzhiyun return FPGA_MGR_STATE_RESET;
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun return FPGA_MGR_STATE_UNKNOWN;
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun /**
52*4882a593Smuzhiyun * wait_for_init_b - wait for the INIT_B pin to have a given state, or wait
53*4882a593Smuzhiyun * a given delay if the pin is unavailable
54*4882a593Smuzhiyun *
55*4882a593Smuzhiyun * @mgr: The FPGA manager object
56*4882a593Smuzhiyun * @value: Value INIT_B to wait for (1 = asserted = low)
57*4882a593Smuzhiyun * @alt_udelay: Delay to wait if the INIT_B GPIO is not available
58*4882a593Smuzhiyun *
59*4882a593Smuzhiyun * Returns 0 when the INIT_B GPIO reached the given state or -ETIMEDOUT if
60*4882a593Smuzhiyun * too much time passed waiting for that. If no INIT_B GPIO is available
61*4882a593Smuzhiyun * then always return 0.
62*4882a593Smuzhiyun */
wait_for_init_b(struct fpga_manager * mgr,int value,unsigned long alt_udelay)63*4882a593Smuzhiyun static int wait_for_init_b(struct fpga_manager *mgr, int value,
64*4882a593Smuzhiyun unsigned long alt_udelay)
65*4882a593Smuzhiyun {
66*4882a593Smuzhiyun struct xilinx_spi_conf *conf = mgr->priv;
67*4882a593Smuzhiyun unsigned long timeout = jiffies + msecs_to_jiffies(1000);
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun if (conf->init_b) {
70*4882a593Smuzhiyun while (time_before(jiffies, timeout)) {
71*4882a593Smuzhiyun int ret = gpiod_get_value(conf->init_b);
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun if (ret == value)
74*4882a593Smuzhiyun return 0;
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun if (ret < 0) {
77*4882a593Smuzhiyun dev_err(&mgr->dev, "Error reading INIT_B (%d)\n", ret);
78*4882a593Smuzhiyun return ret;
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun usleep_range(100, 400);
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun dev_err(&mgr->dev, "Timeout waiting for INIT_B to %s\n",
85*4882a593Smuzhiyun value ? "assert" : "deassert");
86*4882a593Smuzhiyun return -ETIMEDOUT;
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun udelay(alt_udelay);
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun return 0;
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun
xilinx_spi_write_init(struct fpga_manager * mgr,struct fpga_image_info * info,const char * buf,size_t count)94*4882a593Smuzhiyun static int xilinx_spi_write_init(struct fpga_manager *mgr,
95*4882a593Smuzhiyun struct fpga_image_info *info,
96*4882a593Smuzhiyun const char *buf, size_t count)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun struct xilinx_spi_conf *conf = mgr->priv;
99*4882a593Smuzhiyun int err;
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun if (info->flags & FPGA_MGR_PARTIAL_RECONFIG) {
102*4882a593Smuzhiyun dev_err(&mgr->dev, "Partial reconfiguration not supported\n");
103*4882a593Smuzhiyun return -EINVAL;
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun gpiod_set_value(conf->prog_b, 1);
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun err = wait_for_init_b(mgr, 1, 1); /* min is 500 ns */
109*4882a593Smuzhiyun if (err) {
110*4882a593Smuzhiyun gpiod_set_value(conf->prog_b, 0);
111*4882a593Smuzhiyun return err;
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun gpiod_set_value(conf->prog_b, 0);
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun err = wait_for_init_b(mgr, 0, 0);
117*4882a593Smuzhiyun if (err)
118*4882a593Smuzhiyun return err;
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun if (get_done_gpio(mgr)) {
121*4882a593Smuzhiyun dev_err(&mgr->dev, "Unexpected DONE pin state...\n");
122*4882a593Smuzhiyun return -EIO;
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun /* program latency */
126*4882a593Smuzhiyun usleep_range(7500, 7600);
127*4882a593Smuzhiyun return 0;
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun
xilinx_spi_write(struct fpga_manager * mgr,const char * buf,size_t count)130*4882a593Smuzhiyun static int xilinx_spi_write(struct fpga_manager *mgr, const char *buf,
131*4882a593Smuzhiyun size_t count)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun struct xilinx_spi_conf *conf = mgr->priv;
134*4882a593Smuzhiyun const char *fw_data = buf;
135*4882a593Smuzhiyun const char *fw_data_end = fw_data + count;
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun while (fw_data < fw_data_end) {
138*4882a593Smuzhiyun size_t remaining, stride;
139*4882a593Smuzhiyun int ret;
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun remaining = fw_data_end - fw_data;
142*4882a593Smuzhiyun stride = min_t(size_t, remaining, SZ_4K);
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun ret = spi_write(conf->spi, fw_data, stride);
145*4882a593Smuzhiyun if (ret) {
146*4882a593Smuzhiyun dev_err(&mgr->dev, "SPI error in firmware write: %d\n",
147*4882a593Smuzhiyun ret);
148*4882a593Smuzhiyun return ret;
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun fw_data += stride;
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun return 0;
154*4882a593Smuzhiyun }
155*4882a593Smuzhiyun
xilinx_spi_apply_cclk_cycles(struct xilinx_spi_conf * conf)156*4882a593Smuzhiyun static int xilinx_spi_apply_cclk_cycles(struct xilinx_spi_conf *conf)
157*4882a593Smuzhiyun {
158*4882a593Smuzhiyun struct spi_device *spi = conf->spi;
159*4882a593Smuzhiyun const u8 din_data[1] = { 0xff };
160*4882a593Smuzhiyun int ret;
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun ret = spi_write(conf->spi, din_data, sizeof(din_data));
163*4882a593Smuzhiyun if (ret)
164*4882a593Smuzhiyun dev_err(&spi->dev, "applying CCLK cycles failed: %d\n", ret);
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun return ret;
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun
xilinx_spi_write_complete(struct fpga_manager * mgr,struct fpga_image_info * info)169*4882a593Smuzhiyun static int xilinx_spi_write_complete(struct fpga_manager *mgr,
170*4882a593Smuzhiyun struct fpga_image_info *info)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun struct xilinx_spi_conf *conf = mgr->priv;
173*4882a593Smuzhiyun unsigned long timeout = jiffies + usecs_to_jiffies(info->config_complete_timeout_us);
174*4882a593Smuzhiyun bool expired = false;
175*4882a593Smuzhiyun int done;
176*4882a593Smuzhiyun int ret;
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun /*
179*4882a593Smuzhiyun * This loop is carefully written such that if the driver is
180*4882a593Smuzhiyun * scheduled out for more than 'timeout', we still check for DONE
181*4882a593Smuzhiyun * before giving up and we apply 8 extra CCLK cycles in all cases.
182*4882a593Smuzhiyun */
183*4882a593Smuzhiyun while (!expired) {
184*4882a593Smuzhiyun expired = time_after(jiffies, timeout);
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun done = get_done_gpio(mgr);
187*4882a593Smuzhiyun if (done < 0)
188*4882a593Smuzhiyun return done;
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun ret = xilinx_spi_apply_cclk_cycles(conf);
191*4882a593Smuzhiyun if (ret)
192*4882a593Smuzhiyun return ret;
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun if (done)
195*4882a593Smuzhiyun return 0;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun if (conf->init_b) {
199*4882a593Smuzhiyun ret = gpiod_get_value(conf->init_b);
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun if (ret < 0) {
202*4882a593Smuzhiyun dev_err(&mgr->dev, "Error reading INIT_B (%d)\n", ret);
203*4882a593Smuzhiyun return ret;
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun dev_err(&mgr->dev,
207*4882a593Smuzhiyun ret ? "CRC error or invalid device\n"
208*4882a593Smuzhiyun : "Missing sync word or incomplete bitstream\n");
209*4882a593Smuzhiyun } else {
210*4882a593Smuzhiyun dev_err(&mgr->dev, "Timeout after config data transfer\n");
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun return -ETIMEDOUT;
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun static const struct fpga_manager_ops xilinx_spi_ops = {
217*4882a593Smuzhiyun .state = xilinx_spi_state,
218*4882a593Smuzhiyun .write_init = xilinx_spi_write_init,
219*4882a593Smuzhiyun .write = xilinx_spi_write,
220*4882a593Smuzhiyun .write_complete = xilinx_spi_write_complete,
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun
xilinx_spi_probe(struct spi_device * spi)223*4882a593Smuzhiyun static int xilinx_spi_probe(struct spi_device *spi)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun struct xilinx_spi_conf *conf;
226*4882a593Smuzhiyun struct fpga_manager *mgr;
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun conf = devm_kzalloc(&spi->dev, sizeof(*conf), GFP_KERNEL);
229*4882a593Smuzhiyun if (!conf)
230*4882a593Smuzhiyun return -ENOMEM;
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun conf->spi = spi;
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun /* PROGRAM_B is active low */
235*4882a593Smuzhiyun conf->prog_b = devm_gpiod_get(&spi->dev, "prog_b", GPIOD_OUT_LOW);
236*4882a593Smuzhiyun if (IS_ERR(conf->prog_b))
237*4882a593Smuzhiyun return dev_err_probe(&spi->dev, PTR_ERR(conf->prog_b),
238*4882a593Smuzhiyun "Failed to get PROGRAM_B gpio\n");
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun conf->init_b = devm_gpiod_get_optional(&spi->dev, "init-b", GPIOD_IN);
241*4882a593Smuzhiyun if (IS_ERR(conf->init_b))
242*4882a593Smuzhiyun return dev_err_probe(&spi->dev, PTR_ERR(conf->init_b),
243*4882a593Smuzhiyun "Failed to get INIT_B gpio\n");
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun conf->done = devm_gpiod_get(&spi->dev, "done", GPIOD_IN);
246*4882a593Smuzhiyun if (IS_ERR(conf->done))
247*4882a593Smuzhiyun return dev_err_probe(&spi->dev, PTR_ERR(conf->done),
248*4882a593Smuzhiyun "Failed to get DONE gpio\n");
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun mgr = devm_fpga_mgr_create(&spi->dev,
251*4882a593Smuzhiyun "Xilinx Slave Serial FPGA Manager",
252*4882a593Smuzhiyun &xilinx_spi_ops, conf);
253*4882a593Smuzhiyun if (!mgr)
254*4882a593Smuzhiyun return -ENOMEM;
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun spi_set_drvdata(spi, mgr);
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun return fpga_mgr_register(mgr);
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun
xilinx_spi_remove(struct spi_device * spi)261*4882a593Smuzhiyun static int xilinx_spi_remove(struct spi_device *spi)
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun struct fpga_manager *mgr = spi_get_drvdata(spi);
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun fpga_mgr_unregister(mgr);
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun return 0;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun static const struct of_device_id xlnx_spi_of_match[] = {
271*4882a593Smuzhiyun { .compatible = "xlnx,fpga-slave-serial", },
272*4882a593Smuzhiyun {}
273*4882a593Smuzhiyun };
274*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, xlnx_spi_of_match);
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun static struct spi_driver xilinx_slave_spi_driver = {
277*4882a593Smuzhiyun .driver = {
278*4882a593Smuzhiyun .name = "xlnx-slave-spi",
279*4882a593Smuzhiyun .of_match_table = of_match_ptr(xlnx_spi_of_match),
280*4882a593Smuzhiyun },
281*4882a593Smuzhiyun .probe = xilinx_spi_probe,
282*4882a593Smuzhiyun .remove = xilinx_spi_remove,
283*4882a593Smuzhiyun };
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun module_spi_driver(xilinx_slave_spi_driver)
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
288*4882a593Smuzhiyun MODULE_AUTHOR("Anatolij Gustschin <agust@denx.de>");
289*4882a593Smuzhiyun MODULE_DESCRIPTION("Load Xilinx FPGA firmware over SPI");
290