xref: /OK3568_Linux_fs/kernel/include/linux/c2port.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *  Silicon Labs C2 port Linux support
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *  Copyright (c) 2007 Rodolfo Giometti <giometti@linux.it>
6*4882a593Smuzhiyun  *  Copyright (c) 2007 Eurotech S.p.A. <info@eurotech.it>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #define C2PORT_NAME_LEN			32
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun struct device;
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /*
14*4882a593Smuzhiyun  * C2 port basic structs
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun /* Main struct */
18*4882a593Smuzhiyun struct c2port_ops;
19*4882a593Smuzhiyun struct c2port_device {
20*4882a593Smuzhiyun 	unsigned int access:1;
21*4882a593Smuzhiyun 	unsigned int flash_access:1;
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun 	int id;
24*4882a593Smuzhiyun 	char name[C2PORT_NAME_LEN];
25*4882a593Smuzhiyun 	struct c2port_ops *ops;
26*4882a593Smuzhiyun 	struct mutex mutex;		/* prevent races during read/write */
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun 	struct device *dev;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	void *private_data;
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /* Basic operations */
34*4882a593Smuzhiyun struct c2port_ops {
35*4882a593Smuzhiyun 	/* Flash layout */
36*4882a593Smuzhiyun 	unsigned short block_size;	/* flash block size in bytes */
37*4882a593Smuzhiyun 	unsigned short blocks_num;	/* flash blocks number */
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun 	/* Enable or disable the access to C2 port */
40*4882a593Smuzhiyun 	void (*access)(struct c2port_device *dev, int status);
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 	/* Set C2D data line as input/output */
43*4882a593Smuzhiyun 	void (*c2d_dir)(struct c2port_device *dev, int dir);
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun 	/* Read/write C2D data line */
46*4882a593Smuzhiyun 	int (*c2d_get)(struct c2port_device *dev);
47*4882a593Smuzhiyun 	void (*c2d_set)(struct c2port_device *dev, int status);
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 	/* Write C2CK clock line */
50*4882a593Smuzhiyun 	void (*c2ck_set)(struct c2port_device *dev, int status);
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /*
54*4882a593Smuzhiyun  * Exported functions
55*4882a593Smuzhiyun  */
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun extern struct c2port_device *c2port_device_register(char *name,
58*4882a593Smuzhiyun 					struct c2port_ops *ops, void *devdata);
59*4882a593Smuzhiyun extern void c2port_device_unregister(struct c2port_device *dev);
60