summaryrefslogtreecommitdiff
path: root/mtac.h
blob: 1a84884b073a2e7a82f580e053361b98128dbb0e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#ifndef IO_MODULE_MTAC_H_
#define IO_MODULE_MTAC_H_
// NUM_AP should be defined from the board code
// it should be set to the value of CONFIG_MTS_NUM_ACCESSORY_PORTS
// arch/arm/mach-at91/board-dt-sam9.c
// if it is 0 or undefined, there is no accessory card support on this HW
#ifdef CONFIG_MTS_NUM_ACCESSORY_PORTS

#ifndef NUM_AP
#define NUM_AP CONFIG_MTS_NUM_ACCESSORY_PORTS
#endif

#else
#define NUM_AP 0
#endif


#define PRODUCT_ID_MTAC_GPIOB			"MTAC-GPIOB"
#define PRODUCT_ID_MTAC_MFSER			"MTAC-MFSER"
#define PRODUCT_ID_MTAC_ETH				"MTAC-ETH"
#define PRODUCT_ID_MTAC_LORA			"MTAC-LORA"
#define PRODUCT_ID_MTAC_PULSE			"MTAC-PULSE"
#define PRODUCT_ID_MTAC_XDOT			"MTAC-XDOT"

/* Hardware version must be fewer characters than hw_version
   in struct mts_ap_eeprom_layout */
/* MTAC-LORA with native SPI or FTDI FT4222 */
#define HW_VERSION_MTAC_LORA_0_0		"MTAC-LORA-0.0"
/* MTAC-LORA2 with FTDI FT232H */
#define HW_VERSION_MTAC_LORA_1_0		"MTAC-LORA-1.0"
#define HW_VERSION_MTAC_LORA_1_1		"MTAC-LORA-1.1"
#define HW_VERSION_MTAC_LORA_1_5		"MTAC-LORA-1.5"
/* Code assumes CRESET/CDONE (SPI programming) cases will not
 * exactly match MTAC-LORA-0.0, 1.0, or 1.1.  Also levels before
 * 1.5 must be the same length.
 */

#define HW_VERSION_MTAC_LORA_2G4_0_0	"MTAC-LORA-2G4-0.0"

enum {
	MTAC_NONE,
	MTAC_GPIOB_0_0,
	MTAC_MFSER_0_0,
	MTAC_ETH_0_0,
	MTAC_LORA_0_0,
	MTAC_LORA_1_0,
	MTAC_LORA_1_1,
	MTAC_LORA_1_5,
	MTAC_PULSE_1_0,
	MTAC_XDOT_0_0,
	MTAC_LORA_2G4_0_0,
};

enum ap {
	port_1 = 1,
	port_2,
};

// info for accessory port
// contains function pointers for setup and teardown and useful info
// each type of accessory card should have one of these
struct ap_info {
	char  product_id[32];
	bool (*setup)(enum ap port);
	bool (*teardown)(enum ap port);
	char* (*gpio_pin_name_by_attr_name)(const char* name, int port);
	struct gpio_pin *gpio_pins;
	struct kobject *subdirs;
	struct attribute_group attr_group;
};

extern struct platform_device *mts_io_platform_device;

extern struct mutex mtac_mutex;

extern void mtac_clear_port_pins(int port_index);
extern void mtac_set_port_pins(int port_index, struct gpio_pin *pins, struct kobject *subdir);
extern struct kobj_attribute* mtac_create_attribute(const char* _name, umode_t _mode);
extern int mtac_port_from_kobject(struct kobject *kobj);
extern ssize_t mtac_show_product_info(struct kobject *kobj, struct kobj_attribute *attr, char *buf);
extern bool mtac_add_product_info_attributes(int port, struct attribute** attrs, int* index);
extern struct gpio_pin *mtac_gpio_pin_by_attr_name(const char *name, int port);
extern ssize_t mtac_attr_show_ap_gpio_pin(struct kobject *kobj,
			struct kobj_attribute *attr,
			char *buf);
extern ssize_t mtac_attr_store_ap_gpio_pin(struct kobject *kobj,
		struct kobj_attribute *attr, const char *buf, size_t count);
extern struct gpio_pin *mtac_gpio_pin_by_num(unsigned num, int port_index);
extern struct gpio_pin *mtac_gpio_pin_by_name(const char *name, int port_index);
extern void mtac_clear_port_pins(int port_index);
extern int mtac_find(void(*set_info)(struct ap_info* info), const char *target_product_id);
extern struct ap_info *mtac_port_info[];
extern void mtac_free(const char * product_id, bool (* setup)(enum ap port), const char *link);
#define MTS_AP_EEPROM_SIZE (512)
extern uint8_t mts_ap_eeprom[NUM_AP][MTS_AP_EEPROM_SIZE];
#endif /* IO_MODULE_MTAC_H_ */