115de8c6eSPaul Cercueil /* SPDX-License-Identifier: GPL-2.0 */ 215de8c6eSPaul Cercueil #ifndef __DRIVERS_MTD_NAND_INGENIC_ECC_INTERNAL_H__ 315de8c6eSPaul Cercueil #define __DRIVERS_MTD_NAND_INGENIC_ECC_INTERNAL_H__ 415de8c6eSPaul Cercueil 515de8c6eSPaul Cercueil #include <linux/compiler_types.h> 615de8c6eSPaul Cercueil #include <linux/err.h> 715de8c6eSPaul Cercueil #include <linux/mutex.h> 815de8c6eSPaul Cercueil #include <linux/types.h> 915de8c6eSPaul Cercueil #include <uapi/asm-generic/errno-base.h> 1015de8c6eSPaul Cercueil 1115de8c6eSPaul Cercueil struct clk; 1215de8c6eSPaul Cercueil struct device; 1315de8c6eSPaul Cercueil struct ingenic_ecc; 1415de8c6eSPaul Cercueil struct platform_device; 1515de8c6eSPaul Cercueil 1615de8c6eSPaul Cercueil /** 1715de8c6eSPaul Cercueil * struct ingenic_ecc_params - ECC parameters 1815de8c6eSPaul Cercueil * @size: data bytes per ECC step. 1915de8c6eSPaul Cercueil * @bytes: ECC bytes per step. 2015de8c6eSPaul Cercueil * @strength: number of correctable bits per ECC step. 2115de8c6eSPaul Cercueil */ 2215de8c6eSPaul Cercueil struct ingenic_ecc_params { 2315de8c6eSPaul Cercueil int size; 2415de8c6eSPaul Cercueil int bytes; 2515de8c6eSPaul Cercueil int strength; 2615de8c6eSPaul Cercueil }; 2715de8c6eSPaul Cercueil 2815de8c6eSPaul Cercueil #if IS_ENABLED(CONFIG_MTD_NAND_INGENIC_ECC) 2915de8c6eSPaul Cercueil int ingenic_ecc_calculate(struct ingenic_ecc *ecc, 3015de8c6eSPaul Cercueil struct ingenic_ecc_params *params, 3115de8c6eSPaul Cercueil const u8 *buf, u8 *ecc_code); 3215de8c6eSPaul Cercueil int ingenic_ecc_correct(struct ingenic_ecc *ecc, 3315de8c6eSPaul Cercueil struct ingenic_ecc_params *params, u8 *buf, 3415de8c6eSPaul Cercueil u8 *ecc_code); 3515de8c6eSPaul Cercueil 3615de8c6eSPaul Cercueil void ingenic_ecc_release(struct ingenic_ecc *ecc); 3715de8c6eSPaul Cercueil struct ingenic_ecc *of_ingenic_ecc_get(struct device_node *np); 3815de8c6eSPaul Cercueil #else /* CONFIG_MTD_NAND_INGENIC_ECC */ 3915de8c6eSPaul Cercueil int ingenic_ecc_calculate(struct ingenic_ecc *ecc, 4015de8c6eSPaul Cercueil struct ingenic_ecc_params *params, 4115de8c6eSPaul Cercueil const u8 *buf, u8 *ecc_code) 4215de8c6eSPaul Cercueil { 4315de8c6eSPaul Cercueil return -ENODEV; 4415de8c6eSPaul Cercueil } 4515de8c6eSPaul Cercueil 4615de8c6eSPaul Cercueil int ingenic_ecc_correct(struct ingenic_ecc *ecc, 4715de8c6eSPaul Cercueil struct ingenic_ecc_params *params, u8 *buf, 4815de8c6eSPaul Cercueil u8 *ecc_code) 4915de8c6eSPaul Cercueil { 5015de8c6eSPaul Cercueil return -ENODEV; 5115de8c6eSPaul Cercueil } 5215de8c6eSPaul Cercueil 5315de8c6eSPaul Cercueil void ingenic_ecc_release(struct ingenic_ecc *ecc) 5415de8c6eSPaul Cercueil { 5515de8c6eSPaul Cercueil } 5615de8c6eSPaul Cercueil 5715de8c6eSPaul Cercueil struct ingenic_ecc *of_ingenic_ecc_get(struct device_node *np) 5815de8c6eSPaul Cercueil { 5915de8c6eSPaul Cercueil return ERR_PTR(-ENODEV); 6015de8c6eSPaul Cercueil } 6115de8c6eSPaul Cercueil #endif /* CONFIG_MTD_NAND_INGENIC_ECC */ 6215de8c6eSPaul Cercueil 6315de8c6eSPaul Cercueil struct ingenic_ecc_ops { 6415de8c6eSPaul Cercueil void (*disable)(struct ingenic_ecc *ecc); 6515de8c6eSPaul Cercueil int (*calculate)(struct ingenic_ecc *ecc, 6615de8c6eSPaul Cercueil struct ingenic_ecc_params *params, 6715de8c6eSPaul Cercueil const u8 *buf, u8 *ecc_code); 6815de8c6eSPaul Cercueil int (*correct)(struct ingenic_ecc *ecc, 6915de8c6eSPaul Cercueil struct ingenic_ecc_params *params, 7015de8c6eSPaul Cercueil u8 *buf, u8 *ecc_code); 7115de8c6eSPaul Cercueil }; 7215de8c6eSPaul Cercueil 7315de8c6eSPaul Cercueil struct ingenic_ecc { 7415de8c6eSPaul Cercueil struct device *dev; 7515de8c6eSPaul Cercueil const struct ingenic_ecc_ops *ops; 7615de8c6eSPaul Cercueil void __iomem *base; 7715de8c6eSPaul Cercueil struct clk *clk; 7815de8c6eSPaul Cercueil struct mutex lock; 7915de8c6eSPaul Cercueil }; 8015de8c6eSPaul Cercueil 8115de8c6eSPaul Cercueil int ingenic_ecc_probe(struct platform_device *pdev); 8215de8c6eSPaul Cercueil 8315de8c6eSPaul Cercueil #endif /* __DRIVERS_MTD_NAND_INGENIC_ECC_INTERNAL_H__ */ 84