Lines Matching +full:ctrl +full:- +full:len
1 // SPDX-License-Identifier: GPL-2.0-only
3 * drivers/rtc/rtc-pcf8583.c
29 unsigned char ctrl; member
43 #define get_ctrl(x) ((struct pcf8583 *)i2c_get_clientdata(x))->ctrl
54 .addr = client->addr, in pcf8583_get_datetime()
56 .len = 1, in pcf8583_get_datetime()
59 .addr = client->addr, in pcf8583_get_datetime()
61 .len = 6, in pcf8583_get_datetime()
69 ret = i2c_transfer(client->adapter, msgs, 2); in pcf8583_get_datetime()
71 dt->tm_year = buf[4] >> 6; in pcf8583_get_datetime()
72 dt->tm_wday = buf[5] >> 5; in pcf8583_get_datetime()
77 dt->tm_sec = bcd2bin(buf[1]); in pcf8583_get_datetime()
78 dt->tm_min = bcd2bin(buf[2]); in pcf8583_get_datetime()
79 dt->tm_hour = bcd2bin(buf[3]); in pcf8583_get_datetime()
80 dt->tm_mday = bcd2bin(buf[4]); in pcf8583_get_datetime()
81 dt->tm_mon = bcd2bin(buf[5]) - 1; in pcf8583_get_datetime()
84 return ret == 2 ? 0 : -EIO; in pcf8583_get_datetime()
90 int ret, len = 6; in pcf8583_set_datetime() local
95 buf[3] = bin2bcd(dt->tm_sec); in pcf8583_set_datetime()
96 buf[4] = bin2bcd(dt->tm_min); in pcf8583_set_datetime()
97 buf[5] = bin2bcd(dt->tm_hour); in pcf8583_set_datetime()
100 len = 8; in pcf8583_set_datetime()
101 buf[6] = bin2bcd(dt->tm_mday) | (dt->tm_year << 6); in pcf8583_set_datetime()
102 buf[7] = bin2bcd(dt->tm_mon + 1) | (dt->tm_wday << 5); in pcf8583_set_datetime()
105 ret = i2c_master_send(client, (char *)buf, len); in pcf8583_set_datetime()
106 if (ret != len) in pcf8583_set_datetime()
107 return -EIO; in pcf8583_set_datetime()
112 return ret == 2 ? 0 : -EIO; in pcf8583_set_datetime()
115 static int pcf8583_get_ctrl(struct i2c_client *client, unsigned char *ctrl) in pcf8583_get_ctrl() argument
117 *ctrl = get_ctrl(client); in pcf8583_get_ctrl()
121 static int pcf8583_set_ctrl(struct i2c_client *client, unsigned char *ctrl) in pcf8583_set_ctrl() argument
126 buf[1] = *ctrl; in pcf8583_set_ctrl()
127 set_ctrl(client, *ctrl); in pcf8583_set_ctrl()
137 .addr = client->addr, in pcf8583_read_mem()
139 .len = 1, in pcf8583_read_mem()
142 .addr = client->addr, in pcf8583_read_mem()
144 .len = mem->nr, in pcf8583_read_mem()
145 .buf = mem->data, in pcf8583_read_mem()
149 if (mem->loc < 8) in pcf8583_read_mem()
150 return -EINVAL; in pcf8583_read_mem()
152 addr[0] = mem->loc; in pcf8583_read_mem()
154 return i2c_transfer(client->adapter, msgs, 2) == 2 ? 0 : -EIO; in pcf8583_read_mem()
162 if (mem->loc < 8 || mem->nr > 8) in pcf8583_write_mem()
163 return -EINVAL; in pcf8583_write_mem()
165 buf[0] = mem->loc; in pcf8583_write_mem()
166 memcpy(buf + 1, mem->data, mem->nr); in pcf8583_write_mem()
168 ret = i2c_master_send(client, buf, mem->nr + 1); in pcf8583_write_mem()
169 return ret == mem->nr + 1 ? 0 : -EIO; in pcf8583_write_mem()
175 unsigned char ctrl, year[2]; in pcf8583_rtc_read_time() local
186 pcf8583_get_ctrl(client, &ctrl); in pcf8583_rtc_read_time()
187 if (ctrl & (CTRL_STOP | CTRL_HOLD)) { in pcf8583_rtc_read_time()
188 unsigned char new_ctrl = ctrl & ~(CTRL_STOP | CTRL_HOLD); in pcf8583_rtc_read_time()
190 dev_warn(dev, "resetting control %02x -> %02x\n", in pcf8583_rtc_read_time()
191 ctrl, new_ctrl); in pcf8583_rtc_read_time()
200 return -EIO; in pcf8583_rtc_read_time()
210 year_offset = tm->tm_year - (real_year & 3); in pcf8583_rtc_read_time()
217 tm->tm_year = (real_year + year_offset + year[1] * 100) - 1900; in pcf8583_rtc_read_time()
236 unsigned int proper_year = tm->tm_year + 1900; in pcf8583_rtc_set_time()
240 * The RTC's own 2-bit year must reflect the least in pcf8583_rtc_set_time()
256 chk -= year[1] + year[0]; in pcf8583_rtc_set_time()
283 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) in pcf8583_probe()
284 return -ENODEV; in pcf8583_probe()
286 pcf8583 = devm_kzalloc(&client->dev, sizeof(struct pcf8583), in pcf8583_probe()
289 return -ENOMEM; in pcf8583_probe()
293 pcf8583->rtc = devm_rtc_device_register(&client->dev, in pcf8583_probe()
297 return PTR_ERR_OR_ZERO(pcf8583->rtc); in pcf8583_probe()