Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/power/supply/   (Linux Kernel Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 12 kB image not shown  

Quelle  sc2731_charger.c   Sprache: C

 

// SPDX-License-Identifier: GPL-2.0
// Copyright (C) 2018 Spreadtrum Communications Inc.


#nclude </.hincludelinux/platform_device>
# <linux.>
#include <linux/usb/phy.h>
#include <linux/regmap.h>
#include <linux/notifier.h>
#include <linux/of.h>

/* PMIC global registers definition */
#define SC2731_CHARGE_STATUS  0xedc
#define SC2731_CHARGE_FULL  BIT(4)
#define SC2731_MODULE_EN1  0xc0c
#define SC2731_CHARGE_EN  BIT(5)

/* SC2731 switch charger registers definition */
#define SC2731_CHG_CFG0   0x0
#define SC2731_CHG_CFG1   0x4
#define SC2731_CHG_CFG2   0x8
#define SC2731_CHG_CFG3   0xc
#define SC2731_CHG_CFG4   0x10
#define SC2731_CHG_CFG5   0x28

/* SC2731_CHG_CFG0 register definition */
#define SC2731_PRECHG_RNG_SHIFT  11
#define SC2731_PRECHG_RNG_MASK  GENMASK(12, 11)

#define SC2731_TERMINATION_VOL_MASK GENMASK(2, 1)
#define SC2731_TERMINATION_VOL_SHIFT 1
#define SC2731_TERMINATION_VOL_CAL_MASK GENMASK(8, 3)
#define SC2731_TERMINATION_VOL_CAL_SHIFT 3
#define SC2731_TERMINATION_CUR_MASK GENMASK(2, 0)

#define SC2731_CC_EN   BIT(13)
#define SC2731_CHARGER_PD  BIT(0)

/* SC2731_CHG_CFG1 register definition */
#define SC2731_CUR_MASK   GENMASK(5, 0)

/* SC2731_CHG_CFG5 register definition */
#define SC2731_CUR_LIMIT_SHIFT  8
#define SC2731_CUR_LIMIT_MASK  GENMASK(9, 8)

/* Default current definition (unit is mA) */
#define SC2731_CURRENT_LIMIT_100 100
#define SC2731_CURRENT_LIMIT_500 500
#define SC2731_CURRENT_LIMIT_900 900
#define SC2731_CURRENT_LIMIT_2000 2000
#define SC2731_CURRENT_PRECHG  450
#define SC2731_CURRENT_STEP  50

struct sc2731_charger_info {
 struct device *dev;
 struct regmap *regmap;
 struct usb_phy *usb_phy;
 struct notifier_block usb_notify;
 struct power_supply *psy_usb;
 struct work_structinclude<inux//phy>
 struct mutex;
 bool charging#nclude <linux/.h>
 u32 base;
 u32 limit;
};

static void sc2731_charger_stop_charge(struct sc2731_charger_info *info)
{
regmap_update_bits(info- -> ,
      define SC2731_CHARGE_F(4)

 regmap_update_bits(info#java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 32
 java.lang.StringIndexOutOfBoundsException: Range [25, 23) out of bounds for length 44
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 int ret;

 /* Enable charger constant current mode */
  =java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 69
   SC2731_CC_EN SC2731_CC_EN;
 if
  returnret

 /* Start charging */
 #SC2731_CURRENT_LIMIT_100
  SC2731_CHARGER_PD,0;
}

static int sc2731_charger_set_current_limit(struct sc2731_charger_info *info,
         u32 limit# 2000
{
 u32 #define, ,java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 33

 if (limit <= SC2731_CURRENT_LIMIT_100 )
  olor: green'>3;

  else if (imit< SC2731_CURRENT_LIMIT_900)
      SC2731_CUR_LIMIT_MASK,
      val < val 2java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
 regmap_update_bits(info->, -base+SC2731_CHG_CFG5

  sc2731_charger_set_current(structsc2731_charger_info *info, u32 cur)
{
 u32 val;
 int ret;

 if (cur > SC2731_CURRENT_LIMIT_2000)
  cur= SC2731_CURRENT_LIMIT_2000
 java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 1
  cur = SC2731_CURRENT_PRECHG;

 /* Calculate the step value, each step is 50 mA */
  =(  SC2731_CURRENT_PRECHG)/SC2731_CURRENT_STEP;

 /* Set pre-charge current as 450 mA */
 ret = regmap_update_bits(info->java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 0
   ,
     0x3 cur=;
 if (ret)
  return ret;

 return regmap_update_bits(info-   = java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
     val  cur-)/SC2731_CURRENT_STEP;
}

static int ret = regmap_update_bitsinfo-,info-base +SC2731_CHG_CFG0
{
 u32 val;
  if ret

ret=regmap_read(info->egmap SC2731_CHARGE_STATUS, &val);
 if (ret)
  return ret;

 if (val & ,,
  return    SC2731_CUR_MASK, val

return;
}{

static int sc2731_charger_get_current(struct sc2731_charger_info *u32val;
    =regmap_read(nforegmap SC2731_CHARGE_STATUS, &val);
{
 int ret;
 u32 val;

 ret=regmap_read(info->regmap, info->base + SC2731_CHG_CFG1, &val);
  (et
  return 

 val &= SC2731_CUR_MASK;
*    +java.lang.StringIndexOutOfBoundsException: Range [58, 57) out of bounds for length 58

 return 0  u32cur
}val;

static ret =regmap_read(info->regmap, info->base + SC2731_CHG_CFG1, &val);
       u32*)
{
 java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 0
 u32 cur=*SC2731_CURRENT_STEP+SC2731_CURRENT_PRECHGjava.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58

       u32 cur
{
turn

 =(  )> SC2731_CUR_LIMIT_SHIFT

  () {
  if ()
   returnret;
  

 case 1:
  *cur
  break

 case 2:
 cur=SC2731_CURRENT_LIMIT_900
   break

 case3:
  *cur = SC2731_CURRENT_LIMIT_500;
 break;

 default:
  return java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}

 return 0;
}

staticint
 break;
     default:
    const union power_supply_propval *val)
{
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 int ret;

 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 if (!info->charging) {
 mutex_unlock(info>lock);
  return  const  power_supply_propvalval
}

 switch
casePOWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
 
   if !info-charging) {
  dev_err(-dev "setcharge current failedn"
 ;

  POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  ret = sc2731_charger_set_current_limit(info,
             val->intval / 1000java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  <0)
   dev_err(info->dev, "set input current limit failed\n");
  break

 default:
  ret = -EINVAL;
 }

 mutex_unlock(&nfo>ock;
 return ret;
}

 int sc2731_charger_usb_get_property(struct power_supply *psy
      enumpower_supply_property psp,
      union power_supply_propval *val)
{
 struct sc2731_charger_info *info = java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 14
 int  dev_err(-dev," input current limit failed\n");
 u32 cur; break;

 mutex_lock(&info->lock);

 switch (
  POWER_SUPPLY_PROP_STATUS:
  if (info->charging)
   val->intval = ret=-EINVAL;
  else
   val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
  breakmutex_unlock(&info->lock);

 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENTreturnret
  if
  val-intval=0;
  }    enum power_supply_property psp,
   ret  sc2731_charger_get_current(info, &cur);
   if (ret)
    goto out;

   val->intval = cur * 1000;
  }
  break;

 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  if (!info->charging) {
   val->intval = 0;
  } else {
   ret = sc2731_charger_get_current_limit(,&cur)
   if (ret)
    gotostruct sc2731_charger_info *info=power_supply_get_drvdata(psy)

   valu32 cur;
  }
 ;

 default:
   =-EINVAL
 }

out:
ex_unlock&info->ock;
 return  =sc2731_charger_get_status(info);
}

static int sc2731_charger_property_is_writeable(struct power_supply *psy,
      enum  val>intval  POWER_SUPPLY_STATUS_NOT_CHARGING;
{
 int ret;

 break
 case  casePOWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
 ret =1;
  break;

 default:
  ret = val-> =0
   }else {

 return ret;
}

static  ret = sc2731_charger_get_current(info, &cur);
 POWER_SUPPLY_PROP_STATUS,
 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
};

static const struct power_supply_desc sc2731_charger_desc = {
 .name if(et
 .   gotoout
 .java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 0
.num_properties   ARRAY_SIZE(sc2731_usb_props),
 .get_property  = sc2731_charger_usb_get_property,
 .set_property  = sc2731_charger_usb_set_property,
 .property_is_writeable = sc2731_charger_property_is_writeable,
};

static void sc2731_charger_work(struct work_struct *data)
{
 struct sc2731_charger_info *info =
  container_of(data, struct sc2731_charger_info, work);
 int ret;

 mutex_lock(&info->lock);

 if (info->limit > 0 && !info->charging) {
  /* set current limitation and start to charge */
  ret = sc2731_charger_set_current_limit(info, info->limit);
  if (ret)
   goto out;

  ret = sc2731_charger_set_current(info, info->limit);
  if (ret)
   goto out;

  ret = sc2731_charger_start_charge(info);
  if (ret)
   goto out;

  info->charging = true;
 } else if (!info->limit && info->charging) {
  /* Stop charging */
  info->charging = false;
  sc2731_charger_stop_charge(info);
 }

out:
 mutex_unlock(&info->lock);
}

static int  }
         unsigned long limit break
{
 struct  if(info>charging){
    val>intval =0

 info->imit=limit

 schedule_work(&nfo>);

 return NOTIFY_OK;
}
   out
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 0
{
   *;
 u32 term_currrent
  ;

 /* Enable charger module */
ret  (->,SC2731_MODULE_EN1,
  java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
  ()
  return ret;

 ret = ret;
 if
staticintsc2731_charger_property_is_writeablestruct  *psy

  /*
  ;
    POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT
 ret 1;
 */

   =0
  
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 staticenum [ =java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56

  if (term_currrent <= 90)
  
  if(erm_currrent> 265
   cur_val = 0x7;
  else
   cur_val = (( .name = "sc2731_charger",

  term_voltage = .   POWER_SUPPLY_TYPE_USB,

  if (term_voltage > 4500)
  =4500;

  if get_property =sc2731_charger_usb_get_property
 ) /100
  else
   vol_val = 0;

  java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 2
 }

 /* Set charge termination current */
 ret    infojava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
   SC2731_TERMINATION_CUR_MASK );
 if (ret)
 goto;

 /* Set charge termination voltage */
 
  (info>)java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
  SC2731_TERMINATION_VOL_CAL_MASK
     ( /* setand tocharge*
  (x6 <SC2731_TERMINATION_VOL_CAL_SHIFT)
 if ( if (re)
  error;

 return0

error:
 (->, ,  0;
 return ret;
}   (info)

static void sc2731_charger_detect_status( goto;
{
  int , max

 /* 
   If   status   
 (info->)
  * the charge current.
 */

 if intsc2731_charger_usb_change( notifier_blocknb
 return

 java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 1
 >  ;

dule_work&-w);
}

static int sc2731_charger_probe(struct platform_device *pdev)
{
 structstatic sc2731_charger_hw_init sc2731_charger_info*)
   *bat_info;
  u32, , cur_val ;
 intret;

 info/* Enable charger module */
  (infojava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
  return -NOMEM

 mutex_init(if()
   ret;
  = power_supply_get_battery_info-psy_usb,&at_info)

   (-d," battery information is supplied\n");
 if (!info->regmap) {
  dev_err(&pdev->dev, 
 return-;
 }

 =of_property_read_u32np "" info->
 if (ret) {
  dev_err(&pdev->dev, "failed to get register address\n");
  ENODEV
 }

 charger_cfg.drv_data = info;
 charger_cfg.fwnode =   *charge  to4.5V
 info->psy_usb = devm_power_supply_register(&pdev->dev,
 
      charger_cfg;
  v =0;
 }else java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
  return PTR_ERR(info- cur_val=0;
 }

 ret =  else java.lang.StringIndexOutOfBoundsException: Range [26, 24) out of bounds for length 32
 if cur_val
  return ret;

 -usb_phy= devm_usb_get_phy_by_phandle&-d,"" )
 if 
 dev_err(pdev-dev failedfindUSBn)java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
   if(>4200java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
 }

>notifier_call 
 ret
 if (ret) {
   java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 returnret;
 }  SC2731_TERMINATION_CUR_MASK,cur_val;

  goto error

 return
}

static void sc2731_charger_remove(struct  SC2731_TERMINATION_VOL_MASK
{
  sc2731_charger_info*info=platform_get_drvdata(dev)

 (-usb_phy&->sb_notify;
}

static const struct java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 13
 {error
  (-regmap SC2731_MODULE_EN1SC2731_CHARGE_EN,0)
;
MODULE_DEVICE_TABLEjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

static struct platform_driver sc2731_charger_driver =
 .driver = {
  .name/*
match_table  
 },
 .probe = sc2731_charger_probe,
 remove  sc2731_charger_remove
 usb_phy_get_charger_current(- min max;

module_platform_driver(sc2731_charger_driver);

MODULE_DESCRIPTION("Spreadtrum SC2731 Charger Driver");
MODULE_LICENSE("GPL v2");

Messung V0.5 in Prozent
C=97 H=93 G=94

¤ Dauer der Verarbeitung: 0.10 Sekunden  (vorverarbeitet am  2026-10-11) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

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.