| /* | 
 |  * Freescale Memory Controller kernel module | 
 |  * | 
 |  * Author: York Sun <york.sun@nxp.com> | 
 |  * | 
 |  * Copyright 2016 NXP Semiconductor | 
 |  * | 
 |  * Derived from mpc85xx_edac.c | 
 |  * Author: Dave Jiang <djiang@mvista.com> | 
 |  * | 
 |  * 2006-2007 (c) MontaVista Software, Inc. This file is licensed under | 
 |  * the terms of the GNU General Public License version 2. This program | 
 |  * is licensed "as is" without any warranty of any kind, whether express | 
 |  * or implied. | 
 |  */ | 
 |  | 
 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | 
 |  | 
 | #include "edac_module.h" | 
 | #include "fsl_ddr_edac.h" | 
 |  | 
 | static const struct of_device_id fsl_ddr_mc_err_of_match[] = { | 
 | 	{ .compatible = "fsl,qoriq-memory-controller", }, | 
 | 	{}, | 
 | }; | 
 | MODULE_DEVICE_TABLE(of, fsl_ddr_mc_err_of_match); | 
 |  | 
 | static struct platform_driver fsl_ddr_mc_err_driver = { | 
 | 	.probe = fsl_mc_err_probe, | 
 | 	.remove = fsl_mc_err_remove, | 
 | 	.driver = { | 
 | 		.name = "fsl_ddr_mc_err", | 
 | 		.of_match_table = fsl_ddr_mc_err_of_match, | 
 | 	}, | 
 | }; | 
 |  | 
 | static int __init fsl_ddr_mc_init(void) | 
 | { | 
 | 	int res; | 
 |  | 
 | 	/* make sure error reporting method is sane */ | 
 | 	switch (edac_op_state) { | 
 | 	case EDAC_OPSTATE_POLL: | 
 | 	case EDAC_OPSTATE_INT: | 
 | 		break; | 
 | 	default: | 
 | 		edac_op_state = EDAC_OPSTATE_INT; | 
 | 		break; | 
 | 	} | 
 |  | 
 | 	res = platform_driver_register(&fsl_ddr_mc_err_driver); | 
 | 	if (res) { | 
 | 		pr_err("MC fails to register\n"); | 
 | 		return res; | 
 | 	} | 
 |  | 
 | 	return 0; | 
 | } | 
 |  | 
 | module_init(fsl_ddr_mc_init); | 
 |  | 
 | static void __exit fsl_ddr_mc_exit(void) | 
 | { | 
 | 	platform_driver_unregister(&fsl_ddr_mc_err_driver); | 
 | } | 
 |  | 
 | module_exit(fsl_ddr_mc_exit); | 
 |  | 
 | MODULE_LICENSE("GPL"); | 
 | MODULE_AUTHOR("NXP Semiconductor"); | 
 | module_param(edac_op_state, int, 0444); | 
 | MODULE_PARM_DESC(edac_op_state, | 
 | 		 "EDAC Error Reporting state: 0=Poll, 2=Interrupt"); |