@@ -94,10 +94,12 @@ static int bmp5_sensor_handle_interrupt(struct sensor *sensor);
9494static int bmp5_sensor_set_config (struct sensor * sensor , void * cfg );
9595
9696/** Internal API declarations */
97- static int set_pwr_ctrl_settings (uint32_t desired_settings , struct bmp5_dev * dev );
97+ static int set_pwr_ctrl_settings (struct bmp5_dev * dev );
9898
9999static int set_odr_filter_settings (uint32_t desired_settings , struct bmp5_dev * dev );
100100
101+ static int bmp5_set_pwr_mode_bycfg (struct bmp5_dev * dev );
102+
101103/* Sensor framework driver callbacks */
102104static const struct sensor_driver g_bmp5_sensor_driver = {
103105 .sd_read = bmp5_sensor_read ,
@@ -333,20 +335,12 @@ bmp5_check_and_return(int rc, const char *func)
333335 * settings of the sensor.
334336 */
335337static int
336- set_pwr_ctrl_settings (uint32_t desired_settings , struct bmp5_dev * dev )
338+ set_pwr_ctrl_settings (struct bmp5_dev * dev )
337339{
338340 int rc ;
339- uint8_t reg_data ;
340- uint8_t reg_addr = BMP5_ODR_CONFIG_ADDR ;
341341
342- rc = bmp5_get_regs (reg_addr , & reg_data , 1 , dev );
343- if (!rc ) {
344- }
345-
346- if (desired_settings & BMP5_POWER_MODE_SEL ) {
347- /* Set the power mode settings in the register variable */
348- rc = set_power_mode (dev -> settings .pwr_mode , dev );
349- }
342+ /* Set the power mode settings in the register variable */
343+ rc = set_power_mode (dev -> settings .pwr_mode , dev );
350344
351345 return bmp5_check_and_return (rc , __func__ );
352346}
@@ -611,10 +605,16 @@ bmp5_set_sensor_settings(uint32_t desired_settings, struct bmp5_dev *dev)
611605{
612606 int rc = 0 ;
613607
614- if (desired_settings & BMP5_POWER_MODE_SEL ) {
615- /* Set the power control settings */
616- rc = set_pwr_ctrl_settings (desired_settings , dev );
608+ if ((desired_settings & BMP5_POWER_MODE_SEL ) == 0 ) {
609+ /* Put the device to standby mode before changing any settings */
610+ rc = set_power_mode (BMP5_STANDBY_MODE , dev );
611+ if (rc ) {
612+ goto err ;
613+ }
617614 }
615+ /* Give some time for device to go into sleep mode */
616+ delay_msec (2 );
617+
618618 if ((desired_settings & BMP5_ODR_FILTER ) && (!rc )) {
619619 /* Set the over sampling, odr and filter settings */
620620 rc = set_odr_filter_settings (desired_settings , dev );
@@ -631,6 +631,20 @@ bmp5_set_sensor_settings(uint32_t desired_settings, struct bmp5_dev *dev)
631631 /* Set the power mode */
632632 rc = set_temp_press_compensate (desired_settings , dev );
633633 }
634+
635+ if ((desired_settings & BMP5_POWER_MODE_SEL ) == 0 ) {
636+ /* Force set the power control settings without
637+ * reading the existing power mode
638+ */
639+ rc = set_pwr_ctrl_settings (dev );
640+ } else if (!rc ) {
641+ /* Read the most recent power mode, if the device is in the same power
642+ * as what we want to configure, don't reconfigure, if not, put the
643+ * sensor into the requested power mode.
644+ */
645+ rc = bmp5_set_pwr_mode_bycfg (dev );
646+ }
647+ err :
634648 return bmp5_check_and_return (rc , __func__ );
635649}
636650
@@ -2814,6 +2828,14 @@ bmp5_config(struct bmp5 *bmp5, struct bmp5_cfg *cfg)
28142828 BMP5_LOG_ERROR ("%s:gets BMP5 chipID 0x%x\n" , __func__ , chip_id );
28152829 }
28162830
2831+ /* Configure sensor in standby mode */
2832+ rc = bmp5_set_power_mode (bmp5 , BMP5_STANDBY_MODE );
2833+ if (rc ) {
2834+ goto err ;
2835+ }
2836+
2837+ delay_msec (2 );
2838+
28172839 rc = bmp5_set_int_pp_od (bmp5 , cfg -> int_pp_od );
28182840 if (rc ) {
28192841 goto err ;
@@ -2848,13 +2870,6 @@ bmp5_config(struct bmp5 *bmp5, struct bmp5_cfg *cfg)
28482870
28492871 bmp5 -> cfg .rate = cfg -> rate ;
28502872
2851- rc = bmp5_set_power_mode (bmp5 , cfg -> power_mode );
2852- if (rc ) {
2853- goto err ;
2854- }
2855-
2856- bmp5 -> cfg .power_mode = cfg -> power_mode ;
2857-
28582873 rc = bmp5_set_fifo_cfg (bmp5 , cfg -> fifo_mode , cfg -> fifo_threshold );
28592874 if (rc ) {
28602875 goto err ;
@@ -2865,6 +2880,13 @@ bmp5_config(struct bmp5 *bmp5, struct bmp5_cfg *cfg)
28652880
28662881 bmp5 -> cfg .int_enable_type = cfg -> int_enable_type ;
28672882
2883+ rc = bmp5_set_power_mode (bmp5 , cfg -> power_mode );
2884+ if (rc ) {
2885+ goto err ;
2886+ }
2887+
2888+ bmp5 -> cfg .power_mode = cfg -> power_mode ;
2889+
28682890 rc = sensor_set_type_mask (& (bmp5 -> sensor ), cfg -> mask );
28692891 if (rc ) {
28702892 goto err ;
0 commit comments