Merge branch '6.6/scsi-staging' into 6.6/scsi-fixes
[platform/kernel/linux-starfive.git] / include / linux / maple.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __LINUX_MAPLE_H
3 #define __LINUX_MAPLE_H
4
5 #include <mach/maple.h>
6
7 struct device;
8 extern struct bus_type maple_bus_type;
9
10 /* Maple Bus command and response codes */
11 enum maple_code {
12         MAPLE_RESPONSE_FILEERR =        -5,
13         MAPLE_RESPONSE_AGAIN,   /* retransmit */
14         MAPLE_RESPONSE_BADCMD,
15         MAPLE_RESPONSE_BADFUNC,
16         MAPLE_RESPONSE_NONE,    /* unit didn't respond*/
17         MAPLE_COMMAND_DEVINFO =         1,
18         MAPLE_COMMAND_ALLINFO,
19         MAPLE_COMMAND_RESET,
20         MAPLE_COMMAND_KILL,
21         MAPLE_RESPONSE_DEVINFO,
22         MAPLE_RESPONSE_ALLINFO,
23         MAPLE_RESPONSE_OK,
24         MAPLE_RESPONSE_DATATRF,
25         MAPLE_COMMAND_GETCOND,
26         MAPLE_COMMAND_GETMINFO,
27         MAPLE_COMMAND_BREAD,
28         MAPLE_COMMAND_BWRITE,
29         MAPLE_COMMAND_BSYNC,
30         MAPLE_COMMAND_SETCOND,
31         MAPLE_COMMAND_MICCONTROL
32 };
33
34 enum maple_file_errors {
35         MAPLE_FILEERR_INVALID_PARTITION =       0x01000000,
36         MAPLE_FILEERR_PHASE_ERROR =             0x02000000,
37         MAPLE_FILEERR_INVALID_BLOCK =           0x04000000,
38         MAPLE_FILEERR_WRITE_ERROR =             0x08000000,
39         MAPLE_FILEERR_INVALID_WRITE_LENGTH =    0x10000000,
40         MAPLE_FILEERR_BAD_CRC =                 0x20000000
41 };
42
43 struct maple_buffer {
44         char bufx[0x400];
45         void *buf;
46 };
47
48 struct mapleq {
49         struct list_head list;
50         struct maple_device *dev;
51         struct maple_buffer *recvbuf;
52         void *sendbuf, *recvbuf_p2;
53         unsigned char length;
54         enum maple_code command;
55 };
56
57 struct maple_devinfo {
58         unsigned long function;
59         unsigned long function_data[3];
60         unsigned char area_code;
61         unsigned char connector_direction;
62         char product_name[31];
63         char product_licence[61];
64         unsigned short standby_power;
65         unsigned short max_power;
66 };
67
68 struct maple_device {
69         struct maple_driver *driver;
70         struct mapleq *mq;
71         void (*callback) (struct mapleq * mq);
72         void (*fileerr_handler)(struct maple_device *mdev, void *recvbuf);
73         int (*can_unload)(struct maple_device *mdev);
74         unsigned long when, interval, function;
75         struct maple_devinfo devinfo;
76         unsigned char port, unit;
77         char product_name[32];
78         char product_licence[64];
79         atomic_t busy;
80         wait_queue_head_t maple_wait;
81         struct device dev;
82 };
83
84 struct maple_driver {
85         unsigned long function;
86         struct device_driver drv;
87 };
88
89 void maple_getcond_callback(struct maple_device *dev,
90                             void (*callback) (struct mapleq * mq),
91                             unsigned long interval,
92                             unsigned long function);
93 int maple_driver_register(struct maple_driver *);
94 void maple_driver_unregister(struct maple_driver *);
95
96 int maple_add_packet(struct maple_device *mdev, u32 function,
97         u32 command, u32 length, void *data);
98 void maple_clear_dev(struct maple_device *mdev);
99
100 #define to_maple_dev(n) container_of(n, struct maple_device, dev)
101 #define to_maple_driver(n) container_of(n, struct maple_driver, drv)
102
103 #define maple_get_drvdata(d)            dev_get_drvdata(&(d)->dev)
104 #define maple_set_drvdata(d,p)          dev_set_drvdata(&(d)->dev, (p))
105
106 #endif                          /* __LINUX_MAPLE_H */