hwmon: Add On-Chip Controller (OCC) hwmon driver
[linux-2.6-block.git] / drivers / hwmon / occ / common.c
CommitLineData
5b5513b8
EJ
1// SPDX-License-Identifier: GPL-2.0
2
3#include <linux/device.h>
4
5#include "common.h"
6
7static 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
25int 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}