Lines Matching +full:pwr +full:- +full:reg

1 // SPDX-License-Identifier: GPL-2.0+
12 #include <linux/nvmem-provider.h>
43 static int isl12026_read_reg(struct i2c_client *client, int reg) in isl12026_read_reg() argument
45 u8 addr[] = {0, reg}; in isl12026_read_reg()
51 .addr = client->addr, in isl12026_read_reg()
56 .addr = client->addr, in isl12026_read_reg()
63 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in isl12026_read_reg()
65 dev_err(&client->dev, "read reg error, ret=%d\n", ret); in isl12026_read_reg()
66 ret = ret < 0 ? ret : -EIO; in isl12026_read_reg()
79 .addr = client->addr, in isl12026_arm_write()
90 ret = i2c_transfer(client->adapter, &msg, 1); in isl12026_arm_write()
92 dev_err(&client->dev, "write error SR.WEL, ret=%d\n", ret); in isl12026_arm_write()
93 ret = ret < 0 ? ret : -EIO; in isl12026_arm_write()
100 ret = i2c_transfer(client->adapter, &msg, 1); in isl12026_arm_write()
102 dev_err(&client->dev, in isl12026_arm_write()
104 ret = ret < 0 ? ret : -EIO; in isl12026_arm_write()
118 .addr = client->addr, in isl12026_disarm_write()
124 ret = i2c_transfer(client->adapter, &msg, 1); in isl12026_disarm_write()
126 dev_err(&client->dev, in isl12026_disarm_write()
128 ret = ret < 0 ? ret : -EIO; in isl12026_disarm_write()
136 static int isl12026_write_reg(struct i2c_client *client, int reg, u8 val) in isl12026_write_reg() argument
139 u8 op[3] = {0, reg, val}; in isl12026_write_reg()
141 .addr = client->addr, in isl12026_write_reg()
151 ret = i2c_transfer(client->adapter, &msg, 1); in isl12026_write_reg()
153 dev_err(&client->dev, "write error CCR, ret=%d\n", ret); in isl12026_write_reg()
154 ret = ret < 0 ? ret : -EIO; in isl12026_write_reg()
171 .addr = client->addr, in isl12026_rtc_set_time()
184 op[2] = bin2bcd(tm->tm_sec); /* SC */ in isl12026_rtc_set_time()
185 op[3] = bin2bcd(tm->tm_min); /* MN */ in isl12026_rtc_set_time()
186 op[4] = bin2bcd(tm->tm_hour) | ISL12026_REG_HR_MIL; /* HR */ in isl12026_rtc_set_time()
187 op[5] = bin2bcd(tm->tm_mday); /* DT */ in isl12026_rtc_set_time()
188 op[6] = bin2bcd(tm->tm_mon + 1); /* MO */ in isl12026_rtc_set_time()
189 op[7] = bin2bcd(tm->tm_year % 100); /* YR */ in isl12026_rtc_set_time()
190 op[8] = bin2bcd(tm->tm_wday & 7); /* DW */ in isl12026_rtc_set_time()
191 op[9] = bin2bcd(tm->tm_year >= 100 ? 20 : 19); /* Y2K */ in isl12026_rtc_set_time()
192 ret = i2c_transfer(client->adapter, &msg, 1); in isl12026_rtc_set_time()
194 dev_err(&client->dev, "write error CCR, ret=%d\n", ret); in isl12026_rtc_set_time()
195 ret = ret < 0 ? ret : -EIO; in isl12026_rtc_set_time()
213 .addr = client->addr, in isl12026_rtc_read_time()
218 .addr = client->addr, in isl12026_rtc_read_time()
229 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in isl12026_rtc_read_time()
231 dev_err(&client->dev, "read error, ret=%d\n", ret); in isl12026_rtc_read_time()
232 ret = ret < 0 ? ret : -EIO; in isl12026_rtc_read_time()
237 dev_warn(&client->dev, "Real-Time Clock Failure on read\n"); in isl12026_rtc_read_time()
239 dev_warn(&client->dev, "Oscillator Failure on read\n"); in isl12026_rtc_read_time()
247 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in isl12026_rtc_read_time()
249 dev_err(&client->dev, "read error, ret=%d\n", ret); in isl12026_rtc_read_time()
250 ret = ret < 0 ? ret : -EIO; in isl12026_rtc_read_time()
254 tm->tm_sec = bcd2bin(ccr[0] & 0x7F); in isl12026_rtc_read_time()
255 tm->tm_min = bcd2bin(ccr[1] & 0x7F); in isl12026_rtc_read_time()
257 tm->tm_hour = bcd2bin(ccr[2] & 0x3F); in isl12026_rtc_read_time()
259 tm->tm_hour = bcd2bin(ccr[2] & 0x1F) + in isl12026_rtc_read_time()
261 tm->tm_mday = bcd2bin(ccr[3] & 0x3F); in isl12026_rtc_read_time()
262 tm->tm_mon = bcd2bin(ccr[4] & 0x1F) - 1; in isl12026_rtc_read_time()
263 tm->tm_year = bcd2bin(ccr[5]); in isl12026_rtc_read_time()
265 tm->tm_year += 100; in isl12026_rtc_read_time()
266 tm->tm_wday = ccr[6] & 0x07; in isl12026_rtc_read_time()
286 .addr = priv->nvm_client->addr, in isl12026_nvm_read()
291 .addr = priv->nvm_client->addr, in isl12026_nvm_read()
301 ret = mutex_lock_interruptible(&priv->rtc->ops_lock); in isl12026_nvm_read()
309 ret = i2c_transfer(priv->nvm_client->adapter, msgs, ARRAY_SIZE(msgs)); in isl12026_nvm_read()
311 mutex_unlock(&priv->rtc->ops_lock); in isl12026_nvm_read()
314 dev_err(&priv->nvm_client->dev, in isl12026_nvm_read()
316 return ret < 0 ? ret : -EIO; in isl12026_nvm_read()
332 .addr = priv->nvm_client->addr, in isl12026_nvm_write()
342 ret = mutex_lock_interruptible(&priv->rtc->ops_lock); in isl12026_nvm_write()
349 ISL12026_PAGESIZE - offset; in isl12026_nvm_write()
359 ret = i2c_transfer(priv->nvm_client->adapter, in isl12026_nvm_write()
362 dev_err(&priv->nvm_client->dev, in isl12026_nvm_write()
364 ret = ret < 0 ? ret : -EIO; in isl12026_nvm_write()
368 bytes -= chunk_size; in isl12026_nvm_write()
374 mutex_unlock(&priv->rtc->ops_lock); in isl12026_nvm_write()
382 int pwr, requested_pwr; in isl12026_force_power_modes() local
391 ret = of_property_read_u32(client->dev.of_node, in isl12026_force_power_modes()
392 "isil,pwr-bsw", &bsw_val); in isl12026_force_power_modes()
395 ret = of_property_read_u32(client->dev.of_node, in isl12026_force_power_modes()
396 "isil,pwr-sbib", &sbib_val); in isl12026_force_power_modes()
399 /* Check if PWR.BSW and/or PWR.SBIB need specified values */ in isl12026_force_power_modes()
403 pwr = isl12026_read_reg(client, ISL12026_REG_PWR); in isl12026_force_power_modes()
404 if (pwr < 0) { in isl12026_force_power_modes()
405 dev_warn(&client->dev, "Error: Failed to read PWR %d\n", pwr); in isl12026_force_power_modes()
409 requested_pwr = pwr; in isl12026_force_power_modes()
425 if (pwr >= 0 && pwr != requested_pwr) { in isl12026_force_power_modes()
426 dev_dbg(&client->dev, "PWR: %02x\n", pwr); in isl12026_force_power_modes()
427 dev_dbg(&client->dev, "Updating PWR to: %02x\n", requested_pwr); in isl12026_force_power_modes()
437 .name = "isl12026-", in isl12026_probe_new()
438 .base_dev = &client->dev, in isl12026_probe_new()
446 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) in isl12026_probe_new()
447 return -ENODEV; in isl12026_probe_new()
449 priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL); in isl12026_probe_new()
451 return -ENOMEM; in isl12026_probe_new()
457 priv->nvm_client = i2c_new_dummy_device(client->adapter, ISL12026_EEPROM_ADDR); in isl12026_probe_new()
458 if (IS_ERR(priv->nvm_client)) in isl12026_probe_new()
459 return PTR_ERR(priv->nvm_client); in isl12026_probe_new()
461 priv->rtc = devm_rtc_allocate_device(&client->dev); in isl12026_probe_new()
462 ret = PTR_ERR_OR_ZERO(priv->rtc); in isl12026_probe_new()
466 priv->rtc->ops = &isl12026_rtc_ops; in isl12026_probe_new()
468 ret = devm_rtc_nvmem_register(priv->rtc, &nvm_cfg); in isl12026_probe_new()
472 return devm_rtc_register_device(priv->rtc); in isl12026_probe_new()
479 i2c_unregister_device(priv->nvm_client); in isl12026_remove()
491 .name = "rtc-isl12026",