staticint mp8859_set_current_limit(struct regulator_dev *rdev, int min_uA, int max_uA)
{ unsignedint cur_val, new_val; int ret, i;
/* Steps of 50mA */
new_val = max_uA / 50000; if (new_val > MP8859_IOUT_LIM_MASK) return -EINVAL; if (new_val == 0) return -EINVAL;
/* * If the regulator is limiting then ramp gradually as per * datasheet, otherwise just set the value directly.
*/
ret = regmap_read(rdev->regmap, MP8859_STATUS_REG, &cur_val); if (ret != 0) return ret; if (!(cur_val & MP8859_CC_CV_MASK)) { return regmap_update_bits(rdev->regmap, MP8859_IOUT_LIM_REG,
MP8859_IOUT_LIM_MASK, new_val);
}
ret = regmap_read(rdev->regmap, MP8859_IOUT_LIM_REG, &cur_val); if (ret != 0) return ret;
if (cur_val >= new_val) { for (i = cur_val; i >= new_val; i--) {
ret = regmap_update_bits(rdev->regmap,
MP8859_IOUT_LIM_REG,
MP8859_IOUT_LIM_MASK,
cur_val - i); if (ret != 0) return ret;
}
} else { for (i = cur_val; i <= new_val; i++) {
ret = regmap_update_bits(rdev->regmap,
MP8859_IOUT_LIM_REG,
MP8859_IOUT_LIM_MASK,
cur_val + i); if (ret != 0) return ret;
}
}
return 0;
}
staticint mp8859_get_status(struct regulator_dev *rdev)
{ unsignedint val; int ret;
/* Output status is only meaingful when enabled */
ret = regmap_read(rdev->regmap, MP8859_CTL1_REG, &val); if (ret != 0) return ret; if (!(val & MP8859_ENABLE_MASK)) return REGULATOR_STATUS_UNDEFINED;
ret = regmap_read(rdev->regmap, MP8859_STATUS_REG, &val); if (ret != 0) return ret;
if (val & MP8859_PG_MASK) return REGULATOR_STATUS_ON; else return REGULATOR_STATUS_ERROR;
}
/* Output status is only meaingful when enabled */
ret = regmap_read(rdev->regmap, MP8859_CTL1_REG, &enabled); if (ret != 0) return ret;
enabled &= MP8859_ENABLE_MASK;
ret = regmap_read(rdev->regmap, MP8859_STATUS_REG, &status); if (ret != 0) return ret;
if (enabled && !(status & MP8859_PG_MASK))
status |= REGULATOR_ERROR_FAIL; if (status & MP8859_OTP_MASK)
status |= REGULATOR_ERROR_OVER_TEMP; if (status & MP8859_OTW_MASK)
status |= REGULATOR_ERROR_OVER_TEMP_WARN; if (status & MP8859_CC_CV_MASK)
status |= REGULATOR_ERROR_OVER_CURRENT;
staticbool mp8859_readable(struct device *dev, unsignedint reg)
{ switch (reg) { case MP8859_VOUT_L_REG: case MP8859_VOUT_H_REG: case MP8859_VOUT_GO_REG: case MP8859_IOUT_LIM_REG: case MP8859_CTL1_REG: case MP8859_CTL2_REG: case MP8859_STATUS_REG: case MP8859_INTERRUPT_REG: case MP8859_MASK_REG: case MP8859_ID1_REG: case MP8859_MFR_ID_REG: case MP8859_DEV_ID_REG: case MP8859_IC_REV_REG: returntrue; default: returnfalse;
}
}
staticbool mp8859_volatile(struct device *dev, unsignedint reg)
{ switch (reg) { case MP8859_VOUT_GO_REG: case MP8859_STATUS_REG: case MP8859_INTERRUPT_REG: returntrue; default: returnfalse;
}
}
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.