Commit | Line | Data |
---|---|---|
5b5513b8 EJ |
1 | // SPDX-License-Identifier: GPL-2.0 |
2 | ||
3 | #include <linux/device.h> | |
4 | ||
5 | #include "common.h" | |
6 | ||
7 | static int occ_poll(struct occ *occ) | |
8 | { | |
9 | u16 checksum = occ->poll_cmd_data + 1; | |
10 | u8 cmd[8]; | |
11 | ||
12 | /* big endian */ | |
13 | cmd[0] = 0; /* sequence number */ | |
14 | cmd[1] = 0; /* cmd type */ | |
15 | cmd[2] = 0; /* data length msb */ | |
16 | cmd[3] = 1; /* data length lsb */ | |
17 | cmd[4] = occ->poll_cmd_data; /* data */ | |
18 | cmd[5] = checksum >> 8; /* checksum msb */ | |
19 | cmd[6] = checksum & 0xFF; /* checksum lsb */ | |
20 | cmd[7] = 0; | |
21 | ||
22 | return occ->send_cmd(occ, cmd); | |
23 | } | |
24 | ||
25 | int occ_setup(struct occ *occ, const char *name) | |
26 | { | |
27 | int rc; | |
28 | ||
29 | rc = occ_poll(occ); | |
30 | if (rc == -ESHUTDOWN) { | |
31 | dev_info(occ->bus_dev, "host is not ready\n"); | |
32 | return rc; | |
33 | } else if (rc < 0) { | |
34 | dev_err(occ->bus_dev, "failed to get OCC poll response: %d\n", | |
35 | rc); | |
36 | return rc; | |
37 | } | |
38 | ||
39 | return 0; | |
40 | } |