@@ -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 */
109117static 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