Skip to content

Commit 93a8ec4

Browse files
aasinclairfabiobaltieri
authored andcommitted
drivers: sensor: npm1300_charger: Updating of USB current limit
Added attributes for reading USB current capability, and setting of USB current limit Signed-off-by: Andy Sinclair <[email protected]>
1 parent 0b0f2f1 commit 93a8ec4

File tree

1 file changed

+59
-4
lines changed

1 file changed

+59
-4
lines changed

drivers/sensor/npm1300_charger/npm1300_charger.c

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,10 @@ struct npm1300_charger_data {
7171
#define ADC_OFFSET_IBAT_EN 0x24U
7272

7373
/* nPM1300 VBUS register offsets */
74+
#define VBUS_OFFSET_ILIMUPDATE 0x00U
75+
#define VBUS_OFFSET_ILIM 0x01U
7476
#define VBUS_OFFSET_ILIMSTARTUP 0x02U
77+
#define VBUS_OFFSET_DETECT 0x05U
7578
#define VBUS_OFFSET_STATUS 0x07U
7679

7780
/* Ibat status */
@@ -105,6 +108,11 @@ struct adc_results_t {
105108
#define NTCTEMP_MSB_SHIFT 2U
106109
#define NTCTEMP_LSB_MASK 0x03U
107110

111+
/* VBUS masks */
112+
#define DETECT_HI_MASK 0x0AU
113+
#define DETECT_HI_CURRENT 1500000
114+
#define DETECT_LO_CURRENT 500000
115+
108116
/* Linear range for charger terminal voltage */
109117
static const struct linear_range charger_volt_ranges[] = {
110118
LINEAR_RANGE_INIT(3500000, 50000, 0U, 3U), LINEAR_RANGE_INIT(4000000, 50000, 4U, 13U)};
@@ -310,6 +318,32 @@ static int npm1300_charger_attr_get(const struct device *dev, enum sensor_channe
310318
val->val2 = 0U;
311319
}
312320
return ret;
321+
322+
case SENSOR_CHAN_CURRENT:
323+
if (attr != SENSOR_ATTR_UPPER_THRESH) {
324+
return -ENOTSUP;
325+
}
326+
327+
ret = mfd_npm1300_reg_read(config->mfd, VBUS_BASE, VBUS_OFFSET_DETECT, &data);
328+
if (ret < 0) {
329+
return ret;
330+
}
331+
332+
if (data == 0U) {
333+
/* No charger connected */
334+
val->val1 = 0;
335+
val->val2 = 0;
336+
} else if ((data & DETECT_HI_MASK) != 0U) {
337+
/* CC1 or CC2 indicate 1.5A or 3A capability */
338+
val->val1 = DETECT_HI_CURRENT / 1000000;
339+
val->val2 = DETECT_HI_CURRENT % 1000000;
340+
} else {
341+
val->val1 = DETECT_LO_CURRENT / 1000000;
342+
val->val2 = DETECT_LO_CURRENT % 1000000;
343+
}
344+
345+
return 0;
346+
313347
default:
314348
return -ENOTSUP;
315349
}
@@ -321,12 +355,12 @@ static int npm1300_charger_attr_set(const struct device *dev, enum sensor_channe
321355
const struct npm1300_charger_config *const config = dev->config;
322356
int ret;
323357

358+
if (attr != SENSOR_ATTR_CONFIGURATION) {
359+
return -ENOTSUP;
360+
}
361+
324362
switch ((uint32_t)chan) {
325363
case SENSOR_CHAN_GAUGE_DESIRED_CHARGING_CURRENT:
326-
if (attr != SENSOR_ATTR_CONFIGURATION) {
327-
return -ENOTSUP;
328-
}
329-
330364
if (val->val1 == 0) {
331365
/* Disable charging */
332366
return mfd_npm1300_reg_write(config->mfd, CHGR_BASE, CHGR_OFFSET_EN_CLR,
@@ -340,6 +374,27 @@ static int npm1300_charger_attr_set(const struct device *dev, enum sensor_channe
340374
}
341375
return mfd_npm1300_reg_write(config->mfd, CHGR_BASE, CHGR_OFFSET_EN_SET, 1U);
342376

377+
case SENSOR_CHAN_CURRENT:
378+
/* Set vbus current limit */
379+
int32_t current = (val->val1 * 1000000) + val->val2;
380+
uint16_t idx;
381+
382+
ret = linear_range_group_get_win_index(vbus_current_ranges,
383+
ARRAY_SIZE(vbus_current_ranges), current,
384+
current, &idx);
385+
386+
if (ret == -EINVAL) {
387+
return ret;
388+
}
389+
390+
ret = mfd_npm1300_reg_write(config->mfd, VBUS_BASE, VBUS_OFFSET_ILIM, idx);
391+
if (ret != 0) {
392+
return ret;
393+
}
394+
395+
/* Switch to new current limit, this will be reset automatically on USB removal */
396+
return mfd_npm1300_reg_write(config->mfd, VBUS_BASE, VBUS_OFFSET_ILIMUPDATE, 1U);
397+
343398
default:
344399
return -ENOTSUP;
345400
}

0 commit comments

Comments
 (0)