Lines Matching full:fpga
3 * UP Board FPGA driver.
5 * FPGA provides more GPIO driving power, LEDS and pin mux function.
19 #include <linux/mfd/upboard-fpga.h>
44 struct upboard_fpga *fpga = context; in upboard_fpga_read() local
48 gpiod_set_value(fpga->clear_gpio, 0); in upboard_fpga_read()
49 gpiod_set_value(fpga->clear_gpio, 1); in upboard_fpga_read()
55 gpiod_set_value(fpga->strobe_gpio, 0); in upboard_fpga_read()
56 gpiod_set_value(fpga->datain_gpio, !!(reg & BIT(i))); in upboard_fpga_read()
57 gpiod_set_value(fpga->strobe_gpio, 1); in upboard_fpga_read()
60 gpiod_set_value(fpga->strobe_gpio, 0); in upboard_fpga_read()
65 gpiod_set_value(fpga->strobe_gpio, 1); in upboard_fpga_read()
66 gpiod_set_value(fpga->strobe_gpio, 0); in upboard_fpga_read()
67 *val |= gpiod_get_value(fpga->dataout_gpio) << i; in upboard_fpga_read()
70 gpiod_set_value(fpga->strobe_gpio, 1); in upboard_fpga_read()
77 struct upboard_fpga *fpga = context; in upboard_fpga_write() local
81 gpiod_set_value(fpga->clear_gpio, 0); in upboard_fpga_write()
82 gpiod_set_value(fpga->clear_gpio, 1); in upboard_fpga_write()
86 gpiod_set_value(fpga->strobe_gpio, 0); in upboard_fpga_write()
87 gpiod_set_value(fpga->datain_gpio, !!(reg & BIT(i))); in upboard_fpga_write()
88 gpiod_set_value(fpga->strobe_gpio, 1); in upboard_fpga_write()
91 gpiod_set_value(fpga->strobe_gpio, 0); in upboard_fpga_write()
95 gpiod_set_value(fpga->datain_gpio, !!(val & BIT(i))); in upboard_fpga_write()
96 gpiod_set_value(fpga->strobe_gpio, 1); in upboard_fpga_write()
97 gpiod_set_value(fpga->strobe_gpio, 0); in upboard_fpga_write()
100 gpiod_set_value(fpga->strobe_gpio, 1); in upboard_fpga_write()
190 static int upboard_fpga_gpio_init(struct upboard_fpga *fpga) in upboard_fpga_gpio_init() argument
192 fpga->enable_gpio = devm_gpiod_get(fpga->dev, "enable", GPIOD_ASIS); in upboard_fpga_gpio_init()
193 if (IS_ERR(fpga->enable_gpio)) in upboard_fpga_gpio_init()
194 return PTR_ERR(fpga->enable_gpio); in upboard_fpga_gpio_init()
196 fpga->clear_gpio = devm_gpiod_get(fpga->dev, "clear", GPIOD_OUT_LOW); in upboard_fpga_gpio_init()
197 if (IS_ERR(fpga->clear_gpio)) in upboard_fpga_gpio_init()
198 return PTR_ERR(fpga->clear_gpio); in upboard_fpga_gpio_init()
200 fpga->strobe_gpio = devm_gpiod_get(fpga->dev, "strobe", GPIOD_OUT_LOW); in upboard_fpga_gpio_init()
201 if (IS_ERR(fpga->strobe_gpio)) in upboard_fpga_gpio_init()
202 return PTR_ERR(fpga->strobe_gpio); in upboard_fpga_gpio_init()
204 fpga->datain_gpio = devm_gpiod_get(fpga->dev, "datain", GPIOD_OUT_LOW); in upboard_fpga_gpio_init()
205 if (IS_ERR(fpga->datain_gpio)) in upboard_fpga_gpio_init()
206 return PTR_ERR(fpga->datain_gpio); in upboard_fpga_gpio_init()
208 fpga->dataout_gpio = devm_gpiod_get(fpga->dev, "dataout", GPIOD_IN); in upboard_fpga_gpio_init()
209 if (IS_ERR(fpga->dataout_gpio)) in upboard_fpga_gpio_init()
210 return PTR_ERR(fpga->dataout_gpio); in upboard_fpga_gpio_init()
212 gpiod_set_value(fpga->enable_gpio, 1); in upboard_fpga_gpio_init()
217 static int upboard_fpga_get_firmware_version(struct upboard_fpga *fpga) in upboard_fpga_get_firmware_version() argument
222 if (!fpga) in upboard_fpga_get_firmware_version()
225 ret = regmap_read(fpga->regmap, UPBOARD_REG_PLATFORM_ID, &platform_id); in upboard_fpga_get_firmware_version()
231 return dev_err_probe(fpga->dev, -ENODEV, in upboard_fpga_get_firmware_version()
232 "driver not compatible with custom FPGA FW from manufacturer id %#02x.", in upboard_fpga_get_firmware_version()
235 ret = regmap_read(fpga->regmap, UPBOARD_REG_FIRMWARE_ID, &fpga->firmware_version); in upboard_fpga_get_firmware_version()
239 if (FIELD_GET(UPBOARD_FW_ID_MAJOR_MASK, fpga->firmware_version) != in upboard_fpga_get_firmware_version()
241 return dev_err_probe(fpga->dev, -ENODEV, in upboard_fpga_get_firmware_version()
242 "unsupported FPGA FW v%lu.%lu.%lu build %#02lx", in upboard_fpga_get_firmware_version()
243 FIELD_GET(UPBOARD_FW_ID_MAJOR_MASK, fpga->firmware_version), in upboard_fpga_get_firmware_version()
244 FIELD_GET(UPBOARD_FW_ID_MINOR_MASK, fpga->firmware_version), in upboard_fpga_get_firmware_version()
245 FIELD_GET(UPBOARD_FW_ID_PATCH_MASK, fpga->firmware_version), in upboard_fpga_get_firmware_version()
246 FIELD_GET(UPBOARD_FW_ID_BUILD_MASK, fpga->firmware_version)); in upboard_fpga_get_firmware_version()
253 struct upboard_fpga *fpga = dev_get_drvdata(dev); in upboard_fpga_version_show() local
255 return sysfs_emit(buf, "FPGA FW v%lu.%lu.%lu build %#02lx\n", in upboard_fpga_version_show()
256 FIELD_GET(UPBOARD_FW_ID_MAJOR_MASK, fpga->firmware_version), in upboard_fpga_version_show()
257 FIELD_GET(UPBOARD_FW_ID_MINOR_MASK, fpga->firmware_version), in upboard_fpga_version_show()
258 FIELD_GET(UPBOARD_FW_ID_PATCH_MASK, fpga->firmware_version), in upboard_fpga_version_show()
259 FIELD_GET(UPBOARD_FW_ID_BUILD_MASK, fpga->firmware_version)); in upboard_fpga_version_show()
274 struct upboard_fpga *fpga; in upboard_fpga_probe() local
277 fpga = devm_kzalloc(dev, sizeof(*fpga), GFP_KERNEL); in upboard_fpga_probe()
278 if (!fpga) in upboard_fpga_probe()
281 fpga->fpga_data = device_get_match_data(dev); in upboard_fpga_probe()
283 fpga->dev = dev; in upboard_fpga_probe()
285 platform_set_drvdata(pdev, fpga); in upboard_fpga_probe()
287 fpga->regmap = devm_regmap_init(dev, NULL, fpga, fpga->fpga_data->regmap_config); in upboard_fpga_probe()
288 if (IS_ERR(fpga->regmap)) in upboard_fpga_probe()
289 return PTR_ERR(fpga->regmap); in upboard_fpga_probe()
291 ret = upboard_fpga_gpio_init(fpga); in upboard_fpga_probe()
293 return dev_err_probe(dev, ret, "Failed to initialize FPGA common GPIOs"); in upboard_fpga_probe()
295 ret = upboard_fpga_get_firmware_version(fpga); in upboard_fpga_probe()
312 .name = "upboard-fpga",
323 MODULE_DESCRIPTION("UP Board FPGA driver");