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 */
ingenic_ecc_calculate(struct ingenic_ecc * ecc,struct ingenic_ecc_params * params,const u8 * buf,u8 * ecc_code)39*650a8884SArnd Bergmann static inline 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 
ingenic_ecc_correct(struct ingenic_ecc * ecc,struct ingenic_ecc_params * params,u8 * buf,u8 * ecc_code)46*650a8884SArnd Bergmann static inline 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 
ingenic_ecc_release(struct ingenic_ecc * ecc)53*650a8884SArnd Bergmann static inline void ingenic_ecc_release(struct ingenic_ecc *ecc)
5415de8c6eSPaul Cercueil {
5515de8c6eSPaul Cercueil }
5615de8c6eSPaul Cercueil 
of_ingenic_ecc_get(struct device_node * np)57*650a8884SArnd Bergmann static inline 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