xref: /OK3568_Linux_fs/kernel/include/linux/mtd/hyperbus.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright (C) 2019 Texas Instruments Incorporated - https://www.ti.com/
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #ifndef __LINUX_MTD_HYPERBUS_H__
7*4882a593Smuzhiyun #define __LINUX_MTD_HYPERBUS_H__
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/mtd/map.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun /* HyperBus command bits */
12*4882a593Smuzhiyun #define HYPERBUS_RW	0x80	/* R/W# */
13*4882a593Smuzhiyun #define HYPERBUS_RW_WRITE 0
14*4882a593Smuzhiyun #define HYPERBUS_RW_READ 0x80
15*4882a593Smuzhiyun #define HYPERBUS_AS	0x40	/* Address Space */
16*4882a593Smuzhiyun #define HYPERBUS_AS_MEM	0
17*4882a593Smuzhiyun #define HYPERBUS_AS_REG	0x40
18*4882a593Smuzhiyun #define HYPERBUS_BT	0x20	/* Burst Type */
19*4882a593Smuzhiyun #define HYPERBUS_BT_WRAPPED 0
20*4882a593Smuzhiyun #define HYPERBUS_BT_LINEAR 0x20
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun enum hyperbus_memtype {
23*4882a593Smuzhiyun 	HYPERFLASH,
24*4882a593Smuzhiyun 	HYPERRAM,
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /**
28*4882a593Smuzhiyun  * struct hyperbus_device - struct representing HyperBus slave device
29*4882a593Smuzhiyun  * @map: map_info struct for accessing MMIO HyperBus flash memory
30*4882a593Smuzhiyun  * @np: pointer to HyperBus slave device node
31*4882a593Smuzhiyun  * @mtd: pointer to MTD struct
32*4882a593Smuzhiyun  * @ctlr: pointer to HyperBus controller struct
33*4882a593Smuzhiyun  * @memtype: type of memory device: HyperFlash or HyperRAM
34*4882a593Smuzhiyun  * @priv: pointer to controller specific per device private data
35*4882a593Smuzhiyun  */
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun struct hyperbus_device {
38*4882a593Smuzhiyun 	struct map_info map;
39*4882a593Smuzhiyun 	struct device_node *np;
40*4882a593Smuzhiyun 	struct mtd_info *mtd;
41*4882a593Smuzhiyun 	struct hyperbus_ctlr *ctlr;
42*4882a593Smuzhiyun 	enum hyperbus_memtype memtype;
43*4882a593Smuzhiyun 	void *priv;
44*4882a593Smuzhiyun };
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun /**
47*4882a593Smuzhiyun  * struct hyperbus_ops - struct representing custom HyperBus operations
48*4882a593Smuzhiyun  * @read16: read 16 bit of data from flash in a single burst. Used to read
49*4882a593Smuzhiyun  *          from non default address space, such as ID/CFI space
50*4882a593Smuzhiyun  * @write16: write 16 bit of data to flash in a single burst. Used to
51*4882a593Smuzhiyun  *           send cmd to flash or write single 16 bit word at a time.
52*4882a593Smuzhiyun  * @copy_from: copy data from flash memory
53*4882a593Smuzhiyun  * @copy_to: copy data to flash memory
54*4882a593Smuzhiyun  * @calibrate: calibrate HyperBus controller
55*4882a593Smuzhiyun  */
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun struct hyperbus_ops {
58*4882a593Smuzhiyun 	u16 (*read16)(struct hyperbus_device *hbdev, unsigned long addr);
59*4882a593Smuzhiyun 	void (*write16)(struct hyperbus_device *hbdev,
60*4882a593Smuzhiyun 			unsigned long addr, u16 val);
61*4882a593Smuzhiyun 	void (*copy_from)(struct hyperbus_device *hbdev, void *to,
62*4882a593Smuzhiyun 			  unsigned long from, ssize_t len);
63*4882a593Smuzhiyun 	void (*copy_to)(struct hyperbus_device *dev, unsigned long to,
64*4882a593Smuzhiyun 			const void *from, ssize_t len);
65*4882a593Smuzhiyun 	int (*calibrate)(struct hyperbus_device *dev);
66*4882a593Smuzhiyun };
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /**
69*4882a593Smuzhiyun  * struct hyperbus_ctlr - struct representing HyperBus controller
70*4882a593Smuzhiyun  * @dev: pointer to HyperBus controller device
71*4882a593Smuzhiyun  * @calibrated: flag to indicate ctlr calibration sequence is complete
72*4882a593Smuzhiyun  * @ops: HyperBus controller ops
73*4882a593Smuzhiyun  */
74*4882a593Smuzhiyun struct hyperbus_ctlr {
75*4882a593Smuzhiyun 	struct device *dev;
76*4882a593Smuzhiyun 	bool calibrated;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	const struct hyperbus_ops *ops;
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun /**
82*4882a593Smuzhiyun  * hyperbus_register_device - probe and register a HyperBus slave memory device
83*4882a593Smuzhiyun  * @hbdev: hyperbus_device struct with dev, np and ctlr field populated
84*4882a593Smuzhiyun  *
85*4882a593Smuzhiyun  * Return: 0 for success, others for failure.
86*4882a593Smuzhiyun  */
87*4882a593Smuzhiyun int hyperbus_register_device(struct hyperbus_device *hbdev);
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /**
90*4882a593Smuzhiyun  * hyperbus_unregister_device - deregister HyperBus slave memory device
91*4882a593Smuzhiyun  * @hbdev: hyperbus_device to be unregistered
92*4882a593Smuzhiyun  *
93*4882a593Smuzhiyun  * Return: 0 for success, others for failure.
94*4882a593Smuzhiyun  */
95*4882a593Smuzhiyun int hyperbus_unregister_device(struct hyperbus_device *hbdev);
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun #endif /* __LINUX_MTD_HYPERBUS_H__ */
98