ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); if (ret != ARRAY_SIZE(msgs)) {
dev_err(&client->dev, "read error, ret=%d\n", ret);
ret = ret < 0 ? ret : -EIO; goto out;
}
if (sr & ISL12026_REG_SR_RTCF)
dev_warn(&client->dev, "Real-Time Clock Failure on read\n"); if (sr & ISL12026_REG_SR_OSCF)
dev_warn(&client->dev, "Oscillator Failure on read\n");
/* * offset and bytes checked and limited by nvmem core, so * proceed without further checks.
*/
ret = mutex_lock_interruptible(&priv->rtc->ops_lock); if (ret) return ret;
/* 2 bytes of address, most significant first */
addr[0] = offset >> 8;
addr[1] = offset;
msgs[1].len = bytes;
ret = i2c_transfer(priv->nvm_client->adapter, msgs, ARRAY_SIZE(msgs));
mutex_unlock(&priv->rtc->ops_lock);
if (ret != ARRAY_SIZE(msgs)) {
dev_err(&priv->nvm_client->dev, "nvmem read error, ret=%d\n", ret); return ret < 0 ? ret : -EIO;
}
/* * offset and bytes checked and limited by nvmem core, so * proceed without further checks.
*/
ret = mutex_lock_interruptible(&priv->rtc->ops_lock); if (ret) return ret;
num_written = 0; while (bytes) {
chunk_size = round_down(offset, ISL12026_PAGESIZE) +
ISL12026_PAGESIZE - offset;
chunk_size = min(bytes, chunk_size); /* * 2 bytes of address, most significant first, followed * by page data bytes
*/
memcpy(payload + 2, v + num_written, chunk_size);
payload[0] = offset >> 8;
payload[1] = offset;
msgs[0].len = chunk_size + 2;
ret = i2c_transfer(priv->nvm_client->adapter,
msgs, ARRAY_SIZE(msgs)); if (ret != ARRAY_SIZE(msgs)) {
dev_err(&priv->nvm_client->dev, "nvmem write error, ret=%d\n", ret);
ret = ret < 0 ? ret : -EIO; break;
}
ret = 0;
bytes -= chunk_size;
offset += chunk_size;
num_written += chunk_size;
msleep(ISL12026_NVMEM_WRITE_TIME);
}
mutex_unlock(&priv->rtc->ops_lock);
return ret;
}
staticvoid isl12026_force_power_modes(struct i2c_client *client)
{ int ret; int pwr, requested_pwr;
u32 bsw_val, sbib_val; bool set_bsw, set_sbib;
/* * If we can read the of_property, set the specified value. * If there is an error reading the of_property (likely * because it does not exist), keep the current value.
*/
ret = of_property_read_u32(client->dev.of_node, "isil,pwr-bsw", &bsw_val);
set_bsw = (ret == 0);
ret = of_property_read_u32(client->dev.of_node, "isil,pwr-sbib", &sbib_val);
set_sbib = (ret == 0);
/* Check if PWR.BSW and/or PWR.SBIB need specified values */ if (!set_bsw && !set_sbib) return;
pwr = isl12026_read_reg(client, ISL12026_REG_PWR); if (pwr < 0) {
dev_warn(&client->dev, "Error: Failed to read PWR %d\n", pwr); return;
}
requested_pwr = pwr;
if (set_bsw) { if (bsw_val)
requested_pwr |= ISL12026_REG_PWR_BSW; else
requested_pwr &= ~ISL12026_REG_PWR_BSW;
} /* else keep current BSW */
if (set_sbib) { if (sbib_val)
requested_pwr |= ISL12026_REG_PWR_SBIB; else
requested_pwr &= ~ISL12026_REG_PWR_SBIB;
} /* else keep current SBIB */
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.