Lines Matching +full:pwr +full:- +full:reg
1 // SPDX-License-Identifier: GPL-2.0+
12 #include <linux/nvmem-provider.h>
42 static int isl12026_read_reg(struct i2c_client *client, int reg) in isl12026_read_reg() argument
44 u8 addr[] = {0, reg}; in isl12026_read_reg()
50 .addr = client->addr, in isl12026_read_reg()
55 .addr = client->addr, in isl12026_read_reg()
62 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in isl12026_read_reg()
64 dev_err(&client->dev, "read reg error, ret=%d\n", ret); in isl12026_read_reg()
65 ret = ret < 0 ? ret : -EIO; in isl12026_read_reg()
78 .addr = client->addr, in isl12026_arm_write()
89 ret = i2c_transfer(client->adapter, &msg, 1); in isl12026_arm_write()
91 dev_err(&client->dev, "write error SR.WEL, ret=%d\n", ret); in isl12026_arm_write()
92 ret = ret < 0 ? ret : -EIO; in isl12026_arm_write()
99 ret = i2c_transfer(client->adapter, &msg, 1); in isl12026_arm_write()
101 dev_err(&client->dev, in isl12026_arm_write()
103 ret = ret < 0 ? ret : -EIO; in isl12026_arm_write()
117 .addr = client->addr, in isl12026_disarm_write()
123 ret = i2c_transfer(client->adapter, &msg, 1); in isl12026_disarm_write()
125 dev_err(&client->dev, in isl12026_disarm_write()
127 ret = ret < 0 ? ret : -EIO; in isl12026_disarm_write()
135 static int isl12026_write_reg(struct i2c_client *client, int reg, u8 val) in isl12026_write_reg() argument
138 u8 op[3] = {0, reg, val}; in isl12026_write_reg()
140 .addr = client->addr, in isl12026_write_reg()
150 ret = i2c_transfer(client->adapter, &msg, 1); in isl12026_write_reg()
152 dev_err(&client->dev, "write error CCR, ret=%d\n", ret); in isl12026_write_reg()
153 ret = ret < 0 ? ret : -EIO; in isl12026_write_reg()
170 .addr = client->addr, in isl12026_rtc_set_time()
183 op[2] = bin2bcd(tm->tm_sec); /* SC */ in isl12026_rtc_set_time()
184 op[3] = bin2bcd(tm->tm_min); /* MN */ in isl12026_rtc_set_time()
185 op[4] = bin2bcd(tm->tm_hour) | ISL12026_REG_HR_MIL; /* HR */ in isl12026_rtc_set_time()
186 op[5] = bin2bcd(tm->tm_mday); /* DT */ in isl12026_rtc_set_time()
187 op[6] = bin2bcd(tm->tm_mon + 1); /* MO */ in isl12026_rtc_set_time()
188 op[7] = bin2bcd(tm->tm_year % 100); /* YR */ in isl12026_rtc_set_time()
189 op[8] = bin2bcd(tm->tm_wday & 7); /* DW */ in isl12026_rtc_set_time()
190 op[9] = bin2bcd(tm->tm_year >= 100 ? 20 : 19); /* Y2K */ in isl12026_rtc_set_time()
191 ret = i2c_transfer(client->adapter, &msg, 1); in isl12026_rtc_set_time()
193 dev_err(&client->dev, "write error CCR, ret=%d\n", ret); in isl12026_rtc_set_time()
194 ret = ret < 0 ? ret : -EIO; in isl12026_rtc_set_time()
212 .addr = client->addr, in isl12026_rtc_read_time()
217 .addr = client->addr, in isl12026_rtc_read_time()
228 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in isl12026_rtc_read_time()
230 dev_err(&client->dev, "read error, ret=%d\n", ret); in isl12026_rtc_read_time()
231 ret = ret < 0 ? ret : -EIO; in isl12026_rtc_read_time()
236 dev_warn(&client->dev, "Real-Time Clock Failure on read\n"); in isl12026_rtc_read_time()
238 dev_warn(&client->dev, "Oscillator Failure on read\n"); in isl12026_rtc_read_time()
246 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in isl12026_rtc_read_time()
248 dev_err(&client->dev, "read error, ret=%d\n", ret); in isl12026_rtc_read_time()
249 ret = ret < 0 ? ret : -EIO; in isl12026_rtc_read_time()
253 tm->tm_sec = bcd2bin(ccr[0] & 0x7F); in isl12026_rtc_read_time()
254 tm->tm_min = bcd2bin(ccr[1] & 0x7F); in isl12026_rtc_read_time()
256 tm->tm_hour = bcd2bin(ccr[2] & 0x3F); in isl12026_rtc_read_time()
258 tm->tm_hour = bcd2bin(ccr[2] & 0x1F) + in isl12026_rtc_read_time()
260 tm->tm_mday = bcd2bin(ccr[3] & 0x3F); in isl12026_rtc_read_time()
261 tm->tm_mon = bcd2bin(ccr[4] & 0x1F) - 1; in isl12026_rtc_read_time()
262 tm->tm_year = bcd2bin(ccr[5]); in isl12026_rtc_read_time()
264 tm->tm_year += 100; in isl12026_rtc_read_time()
265 tm->tm_wday = ccr[6] & 0x07; in isl12026_rtc_read_time()
285 .addr = priv->nvm_client->addr, in isl12026_nvm_read()
290 .addr = priv->nvm_client->addr, in isl12026_nvm_read()
300 ret = mutex_lock_interruptible(&priv->rtc->ops_lock); in isl12026_nvm_read()
308 ret = i2c_transfer(priv->nvm_client->adapter, msgs, ARRAY_SIZE(msgs)); in isl12026_nvm_read()
310 mutex_unlock(&priv->rtc->ops_lock); in isl12026_nvm_read()
313 dev_err(&priv->nvm_client->dev, in isl12026_nvm_read()
315 return ret < 0 ? ret : -EIO; in isl12026_nvm_read()
331 .addr = priv->nvm_client->addr, in isl12026_nvm_write()
341 ret = mutex_lock_interruptible(&priv->rtc->ops_lock); in isl12026_nvm_write()
348 ISL12026_PAGESIZE - offset; in isl12026_nvm_write()
358 ret = i2c_transfer(priv->nvm_client->adapter, in isl12026_nvm_write()
361 dev_err(&priv->nvm_client->dev, in isl12026_nvm_write()
363 ret = ret < 0 ? ret : -EIO; in isl12026_nvm_write()
367 bytes -= chunk_size; in isl12026_nvm_write()
373 mutex_unlock(&priv->rtc->ops_lock); in isl12026_nvm_write()
381 int pwr, requested_pwr; in isl12026_force_power_modes() local
390 ret = of_property_read_u32(client->dev.of_node, in isl12026_force_power_modes()
391 "isil,pwr-bsw", &bsw_val); in isl12026_force_power_modes()
394 ret = of_property_read_u32(client->dev.of_node, in isl12026_force_power_modes()
395 "isil,pwr-sbib", &sbib_val); in isl12026_force_power_modes()
398 /* Check if PWR.BSW and/or PWR.SBIB need specified values */ in isl12026_force_power_modes()
402 pwr = isl12026_read_reg(client, ISL12026_REG_PWR); in isl12026_force_power_modes()
403 if (pwr < 0) { in isl12026_force_power_modes()
404 dev_warn(&client->dev, "Error: Failed to read PWR %d\n", pwr); in isl12026_force_power_modes()
408 requested_pwr = pwr; in isl12026_force_power_modes()
424 if (pwr >= 0 && pwr != requested_pwr) { in isl12026_force_power_modes()
425 dev_dbg(&client->dev, "PWR: %02x\n", pwr); in isl12026_force_power_modes()
426 dev_dbg(&client->dev, "Updating PWR to: %02x\n", requested_pwr); in isl12026_force_power_modes()
436 .name = "isl12026-", in isl12026_probe()
437 .base_dev = &client->dev, in isl12026_probe()
445 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) in isl12026_probe()
446 return -ENODEV; in isl12026_probe()
448 priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL); in isl12026_probe()
450 return -ENOMEM; in isl12026_probe()
456 priv->nvm_client = i2c_new_dummy_device(client->adapter, ISL12026_EEPROM_ADDR); in isl12026_probe()
457 if (IS_ERR(priv->nvm_client)) in isl12026_probe()
458 return PTR_ERR(priv->nvm_client); in isl12026_probe()
460 priv->rtc = devm_rtc_allocate_device(&client->dev); in isl12026_probe()
461 ret = PTR_ERR_OR_ZERO(priv->rtc); in isl12026_probe()
465 priv->rtc->ops = &isl12026_rtc_ops; in isl12026_probe()
467 ret = devm_rtc_nvmem_register(priv->rtc, &nvm_cfg); in isl12026_probe()
471 return devm_rtc_register_device(priv->rtc); in isl12026_probe()
478 i2c_unregister_device(priv->nvm_client); in isl12026_remove()
489 .name = "rtc-isl12026",