blob: e05270f685b53fd9ebad7f51e11af0c558b31968 [file] [log] [blame]
Angel Ponsc74dae92020-04-02 23:48:16 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Yidi Lind33ebd12016-03-15 14:38:44 +08002
Nico Huber0f2dd1e2017-08-01 14:02:40 +02003#include <device/i2c_simple.h>
Duncan Laurieec009682016-06-07 15:38:14 -07004#include <stdint.h>
5
Martin Roth38ddbfb2019-10-23 21:41:00 -06006int i2c_read_field(unsigned int bus, uint8_t chip, uint8_t reg, uint8_t *data,
Yidi Lind33ebd12016-03-15 14:38:44 +08007 uint8_t mask, uint8_t shift)
8{
9 int ret;
10 uint8_t buf = 0;
11
12 ret = i2c_readb(bus, chip, reg, &buf);
13
14 buf &= (mask << shift);
15 *data = (buf >> shift);
16
17 return ret;
18}
19
Martin Roth38ddbfb2019-10-23 21:41:00 -060020int i2c_write_field(unsigned int bus, uint8_t chip, uint8_t reg, uint8_t data,
Yidi Lind33ebd12016-03-15 14:38:44 +080021 uint8_t mask, uint8_t shift)
22{
23 int ret;
24 uint8_t buf = 0;
25
26 ret = i2c_readb(bus, chip, reg, &buf);
27
28 buf &= ~(mask << shift);
29 buf |= (data << shift);
30
31 ret |= i2c_writeb(bus, chip, reg, buf);
32
33 return ret;
34}