blob: e113aec94a30608b1c919f2b874c9d6f35c267bb [file] [log] [blame]
Angel Pons32859fc2020-04-02 23:48:27 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Kyösti Mälkki1cae4542020-01-06 12:31:34 +02002
3#ifndef __DEVICE_SMBUS_HOST_H__
4#define __DEVICE_SMBUS_HOST_H__
5
Elyes HAOUAS5817c562020-07-12 09:03:22 +02006#include <stddef.h>
Kyösti Mälkki1cae4542020-01-06 12:31:34 +02007#include <stdint.h>
Kyösti Mälkkif555a582020-01-06 19:41:42 +02008#include <console/console.h>
Kyösti Mälkki1cae4542020-01-06 12:31:34 +02009
10/* Low-level SMBUS host controller. */
11
12int do_smbus_recv_byte(uintptr_t base, u8 device);
13int do_smbus_send_byte(uintptr_t base, u8 device, u8 val);
14int do_smbus_read_byte(uintptr_t base, u8 device, u8 address);
15int do_smbus_write_byte(uintptr_t base, u8 device, u8 address, u8 data);
16int do_smbus_read_word(uintptr_t base, u8 device, u8 address);
17int do_smbus_write_word(uintptr_t base, u8 device, u8 address, u16 data);
18
19int do_smbus_block_read(uintptr_t base, u8 device, u8 cmd, size_t max_bytes, u8 *buf);
20int do_smbus_block_write(uintptr_t base, u8 device, u8 cmd, size_t bytes, const u8 *buf);
Christian Walter04953eb2020-03-27 11:59:43 +010021int do_smbus_process_call(uintptr_t base, u8 device, u8 cmd, u16 data, u16 *buf);
Kyösti Mälkki1cae4542020-01-06 12:31:34 +020022
23/* For Intel, implemented since ICH5. */
24int do_i2c_eeprom_read(uintptr_t base, u8 device, u8 offset, size_t bytes, u8 *buf);
25int do_i2c_block_write(uintptr_t base, u8 device, size_t bytes, u8 *buf);
26
Kyösti Mälkki7cdcc382020-01-06 19:00:31 +020027/* Upstream API */
28
Kyösti Mälkkif555a582020-01-06 19:41:42 +020029uintptr_t smbus_base(void);
30int smbus_enable_iobar(uintptr_t base);
Kyösti Mälkki7cdcc382020-01-06 19:00:31 +020031void smbus_host_reset(uintptr_t base);
Kyösti Mälkki73451fd2020-01-06 19:00:31 +020032void smbus_set_slave_addr(uintptr_t base, u8 slave_address);
Kyösti Mälkki7cdcc382020-01-06 19:00:31 +020033
Kyösti Mälkkif555a582020-01-06 19:41:42 +020034static inline void enable_smbus(void)
35{
36 uintptr_t base = smbus_base();
37
38 if (smbus_enable_iobar(base) < 0)
39 die("SMBus controller not found!");
40
41 smbus_host_reset(base);
42 printk(BIOS_DEBUG, "SMBus controller enabled\n");
43}
44
Kyösti Mälkki1a1b04e2020-01-07 22:34:33 +020045#if DEVTREE_EARLY
46static inline int smbus_read_byte(u8 device, u8 address)
47{
48 uintptr_t base = smbus_base();
49 return do_smbus_read_byte(base, device, address);
50}
51
52static inline int smbus_read_word(u8 device, u8 address)
53{
54 uintptr_t base = smbus_base();
55 return do_smbus_read_word(base, device, address);
56}
57
58static inline int smbus_write_byte(u8 device, u8 address, u8 data)
59{
60 uintptr_t base = smbus_base();
61 return do_smbus_write_byte(base, device, address, data);
62}
63
64static inline int smbus_block_read(u8 device, u8 cmd, size_t max_bytes, u8 *buf)
65{
66 uintptr_t base = smbus_base();
67 return do_smbus_block_read(base, device, cmd, max_bytes, buf);
68}
69
70static inline int smbus_block_write(u8 device, u8 cmd, size_t bytes, const u8 *buf)
71{
72 uintptr_t base = smbus_base();
73 return do_smbus_block_write(base, device, cmd, bytes, buf);
74}
75
76static inline int i2c_eeprom_read(u8 device, u8 offset, size_t bytes, u8 *buf)
77{
78 uintptr_t base = smbus_base();
79 return do_i2c_eeprom_read(base, device, offset, bytes, buf);
80}
81#endif
82
Kyösti Mälkki1cae4542020-01-06 12:31:34 +020083#endif