Lines Matching +full:axi4 +full:- +full:lite
1 // SPDX-License-Identifier: GPL-2.0
64 /* Write Only - Interrupt Enable Register */
66 /* Write Only - Interrupt Disable Register */
68 /* Read Only - Interrupt Mask Register */
100 /* Write Only - ECC Interrupt Enable Register */
102 /* Write Only - ECC Interrupt Disable Register */
104 /* Read Only - ECC Interrupt Mask Register */
168 * struct xsdfec_clks - For managing SD-FEC clocks
170 * @axi_clk: AXI4-Lite memory-mapped clock
171 * @din_words_clk: DIN Words AXI4-Stream Slave clock
172 * @din_clk: DIN AXI4-Stream Slave clock
173 * @dout_clk: DOUT Words AXI4-Stream Slave clock
174 * @dout_words_clk: DOUT AXI4-Stream Slave clock
175 * @ctrl_clk: Control AXI4-Stream Slave clock
176 * @status_clk: Status AXI4-Stream Slave clock
190 * struct xsdfec_dev - Driver data for SDFEC
237 dev_dbg(xsdfec->dev, "Writing 0x%x to offset 0x%x", value, addr); in xsdfec_regwrite()
238 iowrite32(value, xsdfec->regs + addr); in xsdfec_regwrite()
245 rval = ioread32(xsdfec->regs + addr); in xsdfec_regread()
246 dev_dbg(xsdfec->dev, "Read value = 0x%x from offset 0x%x", rval, addr); in xsdfec_regread()
268 xsdfec->config.order = reg_value; in update_config_from_hw()
272 &xsdfec->config.bypass); in update_config_from_hw()
276 &xsdfec->config.code_wr_protect); in update_config_from_hw()
279 xsdfec->config.irq.enable_isr = (reg_value & XSDFEC_ISR_MASK) > 0; in update_config_from_hw()
282 xsdfec->config.irq.enable_ecc_isr = in update_config_from_hw()
288 xsdfec->state = XSDFEC_STARTED; in update_config_from_hw()
290 xsdfec->state = XSDFEC_STOPPED; in update_config_from_hw()
299 spin_lock_irqsave(&xsdfec->error_data_lock, xsdfec->flags); in xsdfec_get_status()
300 status.state = xsdfec->state; in xsdfec_get_status()
301 xsdfec->state_updated = false; in xsdfec_get_status()
302 spin_unlock_irqrestore(&xsdfec->error_data_lock, xsdfec->flags); in xsdfec_get_status()
308 err = -EFAULT; in xsdfec_get_status()
317 err = copy_to_user(arg, &xsdfec->config, sizeof(xsdfec->config)); in xsdfec_get_config()
319 err = -EFAULT; in xsdfec_get_config()
333 dev_dbg(xsdfec->dev, in xsdfec_isr_enable()
335 return -EIO; in xsdfec_isr_enable()
342 dev_dbg(xsdfec->dev, in xsdfec_isr_enable()
344 return -EIO; in xsdfec_isr_enable()
360 dev_dbg(xsdfec->dev, in xsdfec_ecc_isr_enable()
362 return -EIO; in xsdfec_ecc_isr_enable()
373 dev_dbg(xsdfec->dev, in xsdfec_ecc_isr_enable()
375 return -EIO; in xsdfec_ecc_isr_enable()
390 return -EFAULT; in xsdfec_set_irq()
395 xsdfec->config.irq.enable_isr = irq.enable_isr; in xsdfec_set_irq()
400 xsdfec->config.irq.enable_ecc_isr = irq.enable_ecc_isr; in xsdfec_set_irq()
403 err = -EIO; in xsdfec_set_irq()
416 return -EFAULT; in xsdfec_set_turbo()
419 return -EINVAL; in xsdfec_set_turbo()
422 return -EINVAL; in xsdfec_set_turbo()
425 if (xsdfec->config.code == XSDFEC_LDPC_CODE) in xsdfec_set_turbo()
426 return -EIO; in xsdfec_set_turbo()
441 if (xsdfec->config.code == XSDFEC_LDPC_CODE) in xsdfec_get_turbo()
442 return -EIO; in xsdfec_get_turbo()
453 err = -EFAULT; in xsdfec_get_turbo()
465 dev_dbg(xsdfec->dev, "N value is not in range"); in xsdfec_reg0_write()
466 return -EINVAL; in xsdfec_reg0_write()
472 dev_dbg(xsdfec->dev, "K value is not in range"); in xsdfec_reg0_write()
473 return -EINVAL; in xsdfec_reg0_write()
480 dev_dbg(xsdfec->dev, "Writing outside of LDPC reg0 space 0x%x", in xsdfec_reg0_write()
483 return -EINVAL; in xsdfec_reg0_write()
498 dev_dbg(xsdfec->dev, "Psize is not in range"); in xsdfec_reg1_write()
499 return -EINVAL; in xsdfec_reg1_write()
503 dev_dbg(xsdfec->dev, "No-packing bit register invalid"); in xsdfec_reg1_write()
508 dev_dbg(xsdfec->dev, "NM is beyond 10 bits"); in xsdfec_reg1_write()
514 dev_dbg(xsdfec->dev, "Writing outside of LDPC reg1 space 0x%x", in xsdfec_reg1_write()
517 return -EINVAL; in xsdfec_reg1_write()
534 dev_dbg(xsdfec->dev, "Nlayers is not in range"); in xsdfec_reg2_write()
535 return -EINVAL; in xsdfec_reg2_write()
539 dev_dbg(xsdfec->dev, "NMQC exceeds 11 bits"); in xsdfec_reg2_write()
543 dev_dbg(xsdfec->dev, "Norm type is invalid"); in xsdfec_reg2_write()
547 dev_dbg(xsdfec->dev, "Special QC in invalid"); in xsdfec_reg2_write()
552 dev_dbg(xsdfec->dev, "No final parity check invalid"); in xsdfec_reg2_write()
558 dev_dbg(xsdfec->dev, "Max Schedule exceeds 2 bits"); in xsdfec_reg2_write()
567 dev_dbg(xsdfec->dev, "Writing outside of LDPC reg2 space 0x%x", in xsdfec_reg2_write()
570 return -EINVAL; in xsdfec_reg2_write()
588 dev_dbg(xsdfec->dev, "Writing outside of LDPC reg3 space 0x%x", in xsdfec_reg3_write()
591 return -EINVAL; in xsdfec_reg3_write()
617 dev_dbg(xsdfec->dev, "Write exceeds SC table length"); in xsdfec_table_write()
618 return -EINVAL; in xsdfec_table_write()
626 return -EINVAL; in xsdfec_table_write()
635 return -EINVAL; in xsdfec_table_write()
662 if (xsdfec->config.code == XSDFEC_TURBO_CODE) { in xsdfec_add_ldpc()
663 ret = -EIO; in xsdfec_add_ldpc()
668 if (xsdfec->state == XSDFEC_STARTED) { in xsdfec_add_ldpc()
669 ret = -EIO; in xsdfec_add_ldpc()
673 if (xsdfec->config.code_wr_protect) { in xsdfec_add_ldpc()
674 ret = -EIO; in xsdfec_add_ldpc()
679 ret = xsdfec_reg0_write(xsdfec, ldpc->n, ldpc->k, ldpc->psize, in xsdfec_add_ldpc()
680 ldpc->code_id); in xsdfec_add_ldpc()
685 ret = xsdfec_reg1_write(xsdfec, ldpc->psize, ldpc->no_packing, ldpc->nm, in xsdfec_add_ldpc()
686 ldpc->code_id); in xsdfec_add_ldpc()
691 ret = xsdfec_reg2_write(xsdfec, ldpc->nlayers, ldpc->nmqc, in xsdfec_add_ldpc()
692 ldpc->norm_type, ldpc->special_qc, in xsdfec_add_ldpc()
693 ldpc->no_final_parity, ldpc->max_schedule, in xsdfec_add_ldpc()
694 ldpc->code_id); in xsdfec_add_ldpc()
699 ret = xsdfec_reg3_write(xsdfec, ldpc->sc_off, ldpc->la_off, in xsdfec_add_ldpc()
700 ldpc->qc_off, ldpc->code_id); in xsdfec_add_ldpc()
705 n = ldpc->nlayers / 4; in xsdfec_add_ldpc()
706 if (ldpc->nlayers % 4) in xsdfec_add_ldpc()
709 ret = xsdfec_table_write(xsdfec, ldpc->sc_off, ldpc->sc_table, n, in xsdfec_add_ldpc()
715 ret = xsdfec_table_write(xsdfec, 4 * ldpc->la_off, ldpc->la_table, in xsdfec_add_ldpc()
716 ldpc->nlayers, XSDFEC_LDPC_LA_TABLE_ADDR_BASE, in xsdfec_add_ldpc()
721 ret = xsdfec_table_write(xsdfec, 4 * ldpc->qc_off, ldpc->qc_table, in xsdfec_add_ldpc()
722 ldpc->nqc, XSDFEC_LDPC_QC_TABLE_ADDR_BASE, in xsdfec_add_ldpc()
737 return -EFAULT; in xsdfec_set_order()
742 return -EINVAL; in xsdfec_set_order()
745 if (xsdfec->state == XSDFEC_STARTED) in xsdfec_set_order()
746 return -EIO; in xsdfec_set_order()
750 xsdfec->config.order = order; in xsdfec_set_order()
762 return -EFAULT; in xsdfec_set_bypass()
765 if (xsdfec->state == XSDFEC_STARTED) in xsdfec_set_bypass()
766 return -EIO; in xsdfec_set_bypass()
773 xsdfec->config.bypass = bypass; in xsdfec_set_bypass()
789 return -EFAULT; in xsdfec_is_active()
835 struct xsdfec_config *config = &xsdfec->config; in xsdfec_cfg_axi_streams()
839 xsdfec_translate_axis_words_cfg_val(config->dout_word_include); in xsdfec_cfg_axi_streams()
841 xsdfec_translate_axis_width_cfg_val(config->dout_width); in xsdfec_cfg_axi_streams()
843 xsdfec_translate_axis_words_cfg_val(config->din_word_include); in xsdfec_cfg_axi_streams()
845 xsdfec_translate_axis_width_cfg_val(config->din_width); in xsdfec_cfg_axi_streams()
873 if (regread != xsdfec->config.code) { in xsdfec_start()
874 dev_dbg(xsdfec->dev, in xsdfec_start()
876 __func__, regread, xsdfec->config.code); in xsdfec_start()
877 return -EINVAL; in xsdfec_start()
884 xsdfec->state = XSDFEC_STARTED; in xsdfec_start()
892 if (xsdfec->state != XSDFEC_STARTED) in xsdfec_stop()
893 dev_dbg(xsdfec->dev, "Device not started correctly"); in xsdfec_stop()
899 xsdfec->state = XSDFEC_STOPPED; in xsdfec_stop()
905 spin_lock_irqsave(&xsdfec->error_data_lock, xsdfec->flags); in xsdfec_clear_stats()
906 xsdfec->isr_err_count = 0; in xsdfec_clear_stats()
907 xsdfec->uecc_count = 0; in xsdfec_clear_stats()
908 xsdfec->cecc_count = 0; in xsdfec_clear_stats()
909 spin_unlock_irqrestore(&xsdfec->error_data_lock, xsdfec->flags); in xsdfec_clear_stats()
919 spin_lock_irqsave(&xsdfec->error_data_lock, xsdfec->flags); in xsdfec_get_stats()
920 user_stats.isr_err_count = xsdfec->isr_err_count; in xsdfec_get_stats()
921 user_stats.cecc_count = xsdfec->cecc_count; in xsdfec_get_stats()
922 user_stats.uecc_count = xsdfec->uecc_count; in xsdfec_get_stats()
923 xsdfec->stats_updated = false; in xsdfec_get_stats()
924 spin_unlock_irqrestore(&xsdfec->error_data_lock, xsdfec->flags); in xsdfec_get_stats()
928 err = -EFAULT; in xsdfec_get_stats()
936 xsdfec_regwrite(xsdfec, XSDFEC_FEC_CODE_ADDR, xsdfec->config.code); in xsdfec_set_default_config()
948 int rval = -EINVAL; in xsdfec_dev_ioctl()
950 xsdfec = container_of(fptr->private_data, struct xsdfec_dev, miscdev); in xsdfec_dev_ioctl()
953 if (xsdfec->state == XSDFEC_NEEDS_RESET && in xsdfec_dev_ioctl()
956 return -EPERM; in xsdfec_dev_ioctl()
960 return -ENOTTY; in xsdfec_dev_ioctl()
1032 xsdfec = container_of(file->private_data, struct xsdfec_dev, miscdev); in xsdfec_poll()
1037 poll_wait(file, &xsdfec->waitq, wait); in xsdfec_poll()
1040 spin_lock_irqsave(&xsdfec->error_data_lock, xsdfec->flags); in xsdfec_poll()
1041 if (xsdfec->state_updated) in xsdfec_poll()
1044 if (xsdfec->stats_updated) in xsdfec_poll()
1046 spin_unlock_irqrestore(&xsdfec->error_data_lock, xsdfec->flags); in xsdfec_poll()
1064 struct device *dev = xsdfec->dev; in xsdfec_parse_of()
1065 struct device_node *node = dev->of_node; in xsdfec_parse_of()
1073 rval = of_property_read_string(node, "xlnx,sdfec-code", &fec_code); in xsdfec_parse_of()
1078 xsdfec->config.code = XSDFEC_LDPC_CODE; in xsdfec_parse_of()
1080 xsdfec->config.code = XSDFEC_TURBO_CODE; in xsdfec_parse_of()
1082 return -EINVAL; in xsdfec_parse_of()
1084 rval = of_property_read_u32(node, "xlnx,sdfec-din-words", in xsdfec_parse_of()
1090 xsdfec->config.din_word_include = din_word_include; in xsdfec_parse_of()
1092 return -EINVAL; in xsdfec_parse_of()
1094 rval = of_property_read_u32(node, "xlnx,sdfec-din-width", &din_width); in xsdfec_parse_of()
1103 xsdfec->config.din_width = din_width; in xsdfec_parse_of()
1106 return -EINVAL; in xsdfec_parse_of()
1109 rval = of_property_read_u32(node, "xlnx,sdfec-dout-words", in xsdfec_parse_of()
1115 xsdfec->config.dout_word_include = dout_word_include; in xsdfec_parse_of()
1117 return -EINVAL; in xsdfec_parse_of()
1119 rval = of_property_read_u32(node, "xlnx,sdfec-dout-width", &dout_width); in xsdfec_parse_of()
1128 xsdfec->config.dout_width = dout_width; in xsdfec_parse_of()
1131 return -EINVAL; in xsdfec_parse_of()
1135 xsdfec_regwrite(xsdfec, XSDFEC_FEC_CODE_ADDR, xsdfec->config.code); in xsdfec_parse_of()
1154 WARN_ON(xsdfec->irq != irq); in xsdfec_irq_thread()
1167 /* Count uncorrectable 2-bit errors */ in xsdfec_irq_thread()
1171 /* Number of correctable 1-bit ECC error */ in xsdfec_irq_thread()
1172 cecc_count = aecc_count - 2 * uecc_count; in xsdfec_irq_thread()
1175 dev_dbg(xsdfec->dev, "tmp=%x, uecc=%x, aecc=%x, cecc=%x, isr=%x", tmp, in xsdfec_irq_thread()
1177 dev_dbg(xsdfec->dev, "uecc=%x, cecc=%x, isr=%x", xsdfec->uecc_count, in xsdfec_irq_thread()
1178 xsdfec->cecc_count, xsdfec->isr_err_count); in xsdfec_irq_thread()
1180 spin_lock_irqsave(&xsdfec->error_data_lock, xsdfec->flags); in xsdfec_irq_thread()
1181 /* Add new errors to a 2-bits counter */ in xsdfec_irq_thread()
1183 xsdfec->uecc_count += uecc_count; in xsdfec_irq_thread()
1184 /* Add new errors to a 1-bits counter */ in xsdfec_irq_thread()
1186 xsdfec->cecc_count += cecc_count; in xsdfec_irq_thread()
1189 xsdfec->isr_err_count += isr_err_count; in xsdfec_irq_thread()
1194 xsdfec->state = XSDFEC_NEEDS_RESET; in xsdfec_irq_thread()
1196 xsdfec->state = XSDFEC_PL_RECONFIGURE; in xsdfec_irq_thread()
1197 xsdfec->stats_updated = true; in xsdfec_irq_thread()
1198 xsdfec->state_updated = true; in xsdfec_irq_thread()
1202 xsdfec->stats_updated = true; in xsdfec_irq_thread()
1205 xsdfec->state = XSDFEC_NEEDS_RESET; in xsdfec_irq_thread()
1206 xsdfec->stats_updated = true; in xsdfec_irq_thread()
1207 xsdfec->state_updated = true; in xsdfec_irq_thread()
1210 spin_unlock_irqrestore(&xsdfec->error_data_lock, xsdfec->flags); in xsdfec_irq_thread()
1211 dev_dbg(xsdfec->dev, "state=%x, stats=%x", xsdfec->state_updated, in xsdfec_irq_thread()
1212 xsdfec->stats_updated); in xsdfec_irq_thread()
1215 if (xsdfec->state_updated || xsdfec->stats_updated) in xsdfec_irq_thread()
1216 wake_up_interruptible(&xsdfec->waitq); in xsdfec_irq_thread()
1232 clks->core_clk = devm_clk_get(&pdev->dev, "core_clk"); in xsdfec_clk_init()
1233 if (IS_ERR(clks->core_clk)) { in xsdfec_clk_init()
1234 dev_err(&pdev->dev, "failed to get core_clk"); in xsdfec_clk_init()
1235 return PTR_ERR(clks->core_clk); in xsdfec_clk_init()
1238 clks->axi_clk = devm_clk_get(&pdev->dev, "s_axi_aclk"); in xsdfec_clk_init()
1239 if (IS_ERR(clks->axi_clk)) { in xsdfec_clk_init()
1240 dev_err(&pdev->dev, "failed to get axi_clk"); in xsdfec_clk_init()
1241 return PTR_ERR(clks->axi_clk); in xsdfec_clk_init()
1244 clks->din_words_clk = devm_clk_get(&pdev->dev, "s_axis_din_words_aclk"); in xsdfec_clk_init()
1245 if (IS_ERR(clks->din_words_clk)) { in xsdfec_clk_init()
1246 if (PTR_ERR(clks->din_words_clk) != -ENOENT) { in xsdfec_clk_init()
1247 err = PTR_ERR(clks->din_words_clk); in xsdfec_clk_init()
1250 clks->din_words_clk = NULL; in xsdfec_clk_init()
1253 clks->din_clk = devm_clk_get(&pdev->dev, "s_axis_din_aclk"); in xsdfec_clk_init()
1254 if (IS_ERR(clks->din_clk)) { in xsdfec_clk_init()
1255 if (PTR_ERR(clks->din_clk) != -ENOENT) { in xsdfec_clk_init()
1256 err = PTR_ERR(clks->din_clk); in xsdfec_clk_init()
1259 clks->din_clk = NULL; in xsdfec_clk_init()
1262 clks->dout_clk = devm_clk_get(&pdev->dev, "m_axis_dout_aclk"); in xsdfec_clk_init()
1263 if (IS_ERR(clks->dout_clk)) { in xsdfec_clk_init()
1264 if (PTR_ERR(clks->dout_clk) != -ENOENT) { in xsdfec_clk_init()
1265 err = PTR_ERR(clks->dout_clk); in xsdfec_clk_init()
1268 clks->dout_clk = NULL; in xsdfec_clk_init()
1271 clks->dout_words_clk = in xsdfec_clk_init()
1272 devm_clk_get(&pdev->dev, "s_axis_dout_words_aclk"); in xsdfec_clk_init()
1273 if (IS_ERR(clks->dout_words_clk)) { in xsdfec_clk_init()
1274 if (PTR_ERR(clks->dout_words_clk) != -ENOENT) { in xsdfec_clk_init()
1275 err = PTR_ERR(clks->dout_words_clk); in xsdfec_clk_init()
1278 clks->dout_words_clk = NULL; in xsdfec_clk_init()
1281 clks->ctrl_clk = devm_clk_get(&pdev->dev, "s_axis_ctrl_aclk"); in xsdfec_clk_init()
1282 if (IS_ERR(clks->ctrl_clk)) { in xsdfec_clk_init()
1283 if (PTR_ERR(clks->ctrl_clk) != -ENOENT) { in xsdfec_clk_init()
1284 err = PTR_ERR(clks->ctrl_clk); in xsdfec_clk_init()
1287 clks->ctrl_clk = NULL; in xsdfec_clk_init()
1290 clks->status_clk = devm_clk_get(&pdev->dev, "m_axis_status_aclk"); in xsdfec_clk_init()
1291 if (IS_ERR(clks->status_clk)) { in xsdfec_clk_init()
1292 if (PTR_ERR(clks->status_clk) != -ENOENT) { in xsdfec_clk_init()
1293 err = PTR_ERR(clks->status_clk); in xsdfec_clk_init()
1296 clks->status_clk = NULL; in xsdfec_clk_init()
1299 err = clk_prepare_enable(clks->core_clk); in xsdfec_clk_init()
1301 dev_err(&pdev->dev, "failed to enable core_clk (%d)", err); in xsdfec_clk_init()
1305 err = clk_prepare_enable(clks->axi_clk); in xsdfec_clk_init()
1307 dev_err(&pdev->dev, "failed to enable axi_clk (%d)", err); in xsdfec_clk_init()
1311 err = clk_prepare_enable(clks->din_clk); in xsdfec_clk_init()
1313 dev_err(&pdev->dev, "failed to enable din_clk (%d)", err); in xsdfec_clk_init()
1317 err = clk_prepare_enable(clks->din_words_clk); in xsdfec_clk_init()
1319 dev_err(&pdev->dev, "failed to enable din_words_clk (%d)", err); in xsdfec_clk_init()
1323 err = clk_prepare_enable(clks->dout_clk); in xsdfec_clk_init()
1325 dev_err(&pdev->dev, "failed to enable dout_clk (%d)", err); in xsdfec_clk_init()
1329 err = clk_prepare_enable(clks->dout_words_clk); in xsdfec_clk_init()
1331 dev_err(&pdev->dev, "failed to enable dout_words_clk (%d)", in xsdfec_clk_init()
1336 err = clk_prepare_enable(clks->ctrl_clk); in xsdfec_clk_init()
1338 dev_err(&pdev->dev, "failed to enable ctrl_clk (%d)", err); in xsdfec_clk_init()
1342 err = clk_prepare_enable(clks->status_clk); in xsdfec_clk_init()
1344 dev_err(&pdev->dev, "failed to enable status_clk (%d)\n", err); in xsdfec_clk_init()
1351 clk_disable_unprepare(clks->ctrl_clk); in xsdfec_clk_init()
1353 clk_disable_unprepare(clks->dout_words_clk); in xsdfec_clk_init()
1355 clk_disable_unprepare(clks->dout_clk); in xsdfec_clk_init()
1357 clk_disable_unprepare(clks->din_words_clk); in xsdfec_clk_init()
1359 clk_disable_unprepare(clks->din_clk); in xsdfec_clk_init()
1361 clk_disable_unprepare(clks->axi_clk); in xsdfec_clk_init()
1363 clk_disable_unprepare(clks->core_clk); in xsdfec_clk_init()
1370 clk_disable_unprepare(clks->status_clk); in xsdfec_disable_all_clks()
1371 clk_disable_unprepare(clks->ctrl_clk); in xsdfec_disable_all_clks()
1372 clk_disable_unprepare(clks->dout_words_clk); in xsdfec_disable_all_clks()
1373 clk_disable_unprepare(clks->dout_clk); in xsdfec_disable_all_clks()
1374 clk_disable_unprepare(clks->din_words_clk); in xsdfec_disable_all_clks()
1375 clk_disable_unprepare(clks->din_clk); in xsdfec_disable_all_clks()
1376 clk_disable_unprepare(clks->core_clk); in xsdfec_disable_all_clks()
1377 clk_disable_unprepare(clks->axi_clk); in xsdfec_disable_all_clks()
1388 xsdfec = devm_kzalloc(&pdev->dev, sizeof(*xsdfec), GFP_KERNEL); in xsdfec_probe()
1390 return -ENOMEM; in xsdfec_probe()
1392 xsdfec->dev = &pdev->dev; in xsdfec_probe()
1393 spin_lock_init(&xsdfec->error_data_lock); in xsdfec_probe()
1395 err = xsdfec_clk_init(pdev, &xsdfec->clks); in xsdfec_probe()
1399 dev = xsdfec->dev; in xsdfec_probe()
1401 xsdfec->regs = devm_ioremap_resource(dev, res); in xsdfec_probe()
1402 if (IS_ERR(xsdfec->regs)) { in xsdfec_probe()
1403 err = PTR_ERR(xsdfec->regs); in xsdfec_probe()
1407 xsdfec->irq = platform_get_irq(pdev, 0); in xsdfec_probe()
1408 if (xsdfec->irq < 0) { in xsdfec_probe()
1423 init_waitqueue_head(&xsdfec->waitq); in xsdfec_probe()
1425 err = devm_request_threaded_irq(dev, xsdfec->irq, NULL, in xsdfec_probe()
1427 "xilinx-sdfec16", xsdfec); in xsdfec_probe()
1429 dev_err(dev, "unable to request IRQ%d", xsdfec->irq); in xsdfec_probe()
1437 xsdfec->dev_id = err; in xsdfec_probe()
1439 snprintf(xsdfec->dev_name, DEV_NAME_LEN, "xsdfec%d", xsdfec->dev_id); in xsdfec_probe()
1440 xsdfec->miscdev.minor = MISC_DYNAMIC_MINOR; in xsdfec_probe()
1441 xsdfec->miscdev.name = xsdfec->dev_name; in xsdfec_probe()
1442 xsdfec->miscdev.fops = &xsdfec_fops; in xsdfec_probe()
1443 xsdfec->miscdev.parent = dev; in xsdfec_probe()
1444 err = misc_register(&xsdfec->miscdev); in xsdfec_probe()
1452 ida_free(&dev_nrs, xsdfec->dev_id); in xsdfec_probe()
1454 xsdfec_disable_all_clks(&xsdfec->clks); in xsdfec_probe()
1463 misc_deregister(&xsdfec->miscdev); in xsdfec_remove()
1464 ida_free(&dev_nrs, xsdfec->dev_id); in xsdfec_remove()
1465 xsdfec_disable_all_clks(&xsdfec->clks); in xsdfec_remove()
1471 .compatible = "xlnx,sd-fec-1.1",
1479 .name = "xilinx-sdfec",
1489 MODULE_DESCRIPTION("Xilinx SD-FEC16 Driver");