Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
240fbe23
Commit
240fbe23
authored
Jan 05, 2013
by
Anton Vorontsov
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-anton' of
git://git.linaro.org/people/ljones/linux-3.0-ux500
parents
2fbb520d
215cf5c9
Changes
8
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
594 additions
and
519 deletions
+594
-519
drivers/mfd/ab8500-core.c
drivers/mfd/ab8500-core.c
+0
-8
drivers/power/Makefile
drivers/power/Makefile
+1
-1
drivers/power/ab8500_bmdata.c
drivers/power/ab8500_bmdata.c
+254
-269
drivers/power/ab8500_btemp.c
drivers/power/ab8500_btemp.c
+51
-45
drivers/power/ab8500_charger.c
drivers/power/ab8500_charger.c
+158
-64
drivers/power/ab8500_fg.c
drivers/power/ab8500_fg.c
+61
-62
drivers/power/abx500_chargalg.c
drivers/power/abx500_chargalg.c
+66
-67
include/linux/mfd/abx500.h
include/linux/mfd/abx500.h
+3
-3
No files found.
drivers/mfd/ab8500-core.c
View file @
240fbe23
...
...
@@ -1011,40 +1011,32 @@ static struct mfd_cell ab8500_bm_devs[] = {
.
of_compatible
=
"stericsson,ab8500-charger"
,
.
num_resources
=
ARRAY_SIZE
(
ab8500_charger_resources
),
.
resources
=
ab8500_charger_resources
,
#ifndef CONFIG_OF
.
platform_data
=
&
ab8500_bm_data
,
.
pdata_size
=
sizeof
(
ab8500_bm_data
),
#endif
},
{
.
name
=
"ab8500-btemp"
,
.
of_compatible
=
"stericsson,ab8500-btemp"
,
.
num_resources
=
ARRAY_SIZE
(
ab8500_btemp_resources
),
.
resources
=
ab8500_btemp_resources
,
#ifndef CONFIG_OF
.
platform_data
=
&
ab8500_bm_data
,
.
pdata_size
=
sizeof
(
ab8500_bm_data
),
#endif
},
{
.
name
=
"ab8500-fg"
,
.
of_compatible
=
"stericsson,ab8500-fg"
,
.
num_resources
=
ARRAY_SIZE
(
ab8500_fg_resources
),
.
resources
=
ab8500_fg_resources
,
#ifndef CONFIG_OF
.
platform_data
=
&
ab8500_bm_data
,
.
pdata_size
=
sizeof
(
ab8500_bm_data
),
#endif
},
{
.
name
=
"ab8500-chargalg"
,
.
of_compatible
=
"stericsson,ab8500-chargalg"
,
.
num_resources
=
ARRAY_SIZE
(
ab8500_chargalg_resources
),
.
resources
=
ab8500_chargalg_resources
,
#ifndef CONFIG_OF
.
platform_data
=
&
ab8500_bm_data
,
.
pdata_size
=
sizeof
(
ab8500_bm_data
),
#endif
},
};
...
...
drivers/power/Makefile
View file @
240fbe23
...
...
@@ -38,7 +38,7 @@ obj-$(CONFIG_CHARGER_PCF50633) += pcf50633-charger.o
obj-$(CONFIG_BATTERY_JZ4740)
+=
jz4740-battery.o
obj-$(CONFIG_BATTERY_INTEL_MID)
+=
intel_mid_battery.o
obj-$(CONFIG_BATTERY_RX51)
+=
rx51_battery.o
obj-$(CONFIG_AB8500_BM)
+=
ab8500_bmdata.o ab8500_charger.o ab8500_
btemp.o ab8500_fg
.o abx500_chargalg.o
obj-$(CONFIG_AB8500_BM)
+=
ab8500_bmdata.o ab8500_charger.o ab8500_
fg.o ab8500_btemp
.o abx500_chargalg.o
obj-$(CONFIG_CHARGER_ISP1704)
+=
isp1704_charger.o
obj-$(CONFIG_CHARGER_MAX8903)
+=
max8903_charger.o
obj-$(CONFIG_CHARGER_TWL4030)
+=
twl4030_charger.o
...
...
drivers/power/ab8500_bmdata.c
View file @
240fbe23
...
...
@@ -182,7 +182,7 @@ static struct batres_vs_temp temp_to_batres_tbl_9100[] = {
};
static
struct
abx500_battery_type
bat_type_thermistor
[]
=
{
[
BATTERY_UNKNOWN
]
=
{
[
BATTERY_UNKNOWN
]
=
{
/* First element always represent the UNKNOWN battery */
.
name
=
POWER_SUPPLY_TECHNOLOGY_UNKNOWN
,
.
resis_high
=
0
,
...
...
@@ -209,8 +209,8 @@ static struct abx500_battery_type bat_type_thermistor[] = {
.
v_to_cap_tbl
=
cap_tbl
,
.
n_batres_tbl_elements
=
ARRAY_SIZE
(
temp_to_batres_tbl_thermistor
),
.
batres_tbl
=
temp_to_batres_tbl_thermistor
,
},
{
},
{
.
name
=
POWER_SUPPLY_TECHNOLOGY_LIPO
,
.
resis_high
=
53407
,
.
resis_low
=
12500
,
...
...
@@ -237,8 +237,8 @@ static struct abx500_battery_type bat_type_thermistor[] = {
.
n_batres_tbl_elements
=
ARRAY_SIZE
(
temp_to_batres_tbl_thermistor
),
.
batres_tbl
=
temp_to_batres_tbl_thermistor
,
},
{
},
{
.
name
=
POWER_SUPPLY_TECHNOLOGY_LIPO
,
.
resis_high
=
200000
,
.
resis_low
=
82869
,
...
...
@@ -264,11 +264,11 @@ static struct abx500_battery_type bat_type_thermistor[] = {
.
v_to_cap_tbl
=
cap_tbl_B_thermistor
,
.
n_batres_tbl_elements
=
ARRAY_SIZE
(
temp_to_batres_tbl_thermistor
),
.
batres_tbl
=
temp_to_batres_tbl_thermistor
,
},
},
};
static
struct
abx500_battery_type
bat_type_ext_thermistor
[]
=
{
[
BATTERY_UNKNOWN
]
=
{
[
BATTERY_UNKNOWN
]
=
{
/* First element always represent the UNKNOWN battery */
.
name
=
POWER_SUPPLY_TECHNOLOGY_UNKNOWN
,
.
resis_high
=
0
,
...
...
@@ -295,13 +295,13 @@ static struct abx500_battery_type bat_type_ext_thermistor[] = {
.
v_to_cap_tbl
=
cap_tbl
,
.
n_batres_tbl_elements
=
ARRAY_SIZE
(
temp_to_batres_tbl_thermistor
),
.
batres_tbl
=
temp_to_batres_tbl_thermistor
,
},
},
/*
* These are the batteries that doesn't have an internal NTC resistor to measure
* its temperature. The temperature in this case is measure with a NTC placed
* near the battery but on the PCB.
*/
{
{
.
name
=
POWER_SUPPLY_TECHNOLOGY_LIPO
,
.
resis_high
=
76000
,
.
resis_low
=
53000
,
...
...
@@ -327,8 +327,8 @@ static struct abx500_battery_type bat_type_ext_thermistor[] = {
.
v_to_cap_tbl
=
cap_tbl
,
.
n_batres_tbl_elements
=
ARRAY_SIZE
(
temp_to_batres_tbl_thermistor
),
.
batres_tbl
=
temp_to_batres_tbl_thermistor
,
},
{
},
{
.
name
=
POWER_SUPPLY_TECHNOLOGY_LION
,
.
resis_high
=
30000
,
.
resis_low
=
10000
,
...
...
@@ -354,8 +354,8 @@ static struct abx500_battery_type bat_type_ext_thermistor[] = {
.
v_to_cap_tbl
=
cap_tbl
,
.
n_batres_tbl_elements
=
ARRAY_SIZE
(
temp_to_batres_tbl_thermistor
),
.
batres_tbl
=
temp_to_batres_tbl_thermistor
,
},
{
},
{
.
name
=
POWER_SUPPLY_TECHNOLOGY_LION
,
.
resis_high
=
95000
,
.
resis_low
=
76001
,
...
...
@@ -381,7 +381,7 @@ static struct abx500_battery_type bat_type_ext_thermistor[] = {
.
v_to_cap_tbl
=
cap_tbl
,
.
n_batres_tbl_elements
=
ARRAY_SIZE
(
temp_to_batres_tbl_thermistor
),
.
batres_tbl
=
temp_to_batres_tbl_thermistor
,
},
},
};
static
const
struct
abx500_bm_capacity_levels
cap_levels
=
{
...
...
@@ -452,70 +452,55 @@ struct abx500_bm_data ab8500_bm_data = {
.
fg_params
=
&
fg
,
};
int
__devinit
bmdevs_of_probe
(
struct
device
*
dev
,
int
__devinit
ab8500_bm_of_probe
(
struct
device
*
dev
,
struct
device_node
*
np
,
struct
abx500_bm_data
**
battery
)
struct
abx500_bm_data
*
bm
)
{
struct
abx500_battery_type
*
btype
;
struct
device_node
*
np_bat_supply
;
struct
abx500_bm_data
*
bat
;
struct
batres_vs_temp
*
tmp_batres_tbl
;
struct
device_node
*
battery_node
;
const
char
*
btech
;
char
bat_tech
[
8
];
int
i
,
thermistor
;
*
battery
=
&
ab8500_bm_data
;
int
i
;
/* get phandle to 'battery-info' node */
np_bat_supply
=
of_parse_phandle
(
np
,
"battery"
,
0
);
if
(
!
np_bat_supply
)
{
dev_err
(
dev
,
"
missing property battery
\n
"
);
battery_node
=
of_parse_phandle
(
np
,
"battery"
,
0
);
if
(
!
battery_node
)
{
dev_err
(
dev
,
"
battery node or reference missing
\n
"
);
return
-
EINVAL
;
}
if
(
of_property_read_bool
(
np_bat_supply
,
"thermistor-on-batctrl"
))
thermistor
=
NTC_INTERNAL
;
else
thermistor
=
NTC_EXTERNAL
;
bat
=
*
battery
;
if
(
thermistor
==
NTC_EXTERNAL
)
{
bat
->
n_btypes
=
4
;
bat
->
bat_type
=
bat_type_ext_thermistor
;
bat
->
adc_therm
=
ABx500_ADC_THERM_BATTEMP
;
}
btech
=
of_get_property
(
np_bat_supply
,
"stericsson,battery-type"
,
NULL
);
btech
=
of_get_property
(
battery_node
,
"stericsson,battery-type"
,
NULL
);
if
(
!
btech
)
{
dev_warn
(
dev
,
"missing property battery-name/type
\n
"
);
strcpy
(
bat_tech
,
"UNKNOWN"
);
}
else
{
strcpy
(
bat_tech
,
btech
);
return
-
EINVAL
;
}
if
(
strncmp
(
b
at_
tech
,
"LION"
,
4
)
==
0
)
{
b
at
->
no_maintenance
=
true
;
b
at
->
chg_unknown_bat
=
true
;
b
at
->
bat_type
[
BATTERY_UNKNOWN
].
charge_full_design
=
2600
;
b
at
->
bat_type
[
BATTERY_UNKNOWN
].
termination_vol
=
4150
;
b
at
->
bat_type
[
BATTERY_UNKNOWN
].
recharge_vol
=
4130
;
b
at
->
bat_type
[
BATTERY_UNKNOWN
].
normal_cur_lvl
=
520
;
b
at
->
bat_type
[
BATTERY_UNKNOWN
].
normal_vol_lvl
=
4200
;
if
(
strncmp
(
btech
,
"LION"
,
4
)
==
0
)
{
b
m
->
no_maintenance
=
true
;
b
m
->
chg_unknown_bat
=
true
;
b
m
->
bat_type
[
BATTERY_UNKNOWN
].
charge_full_design
=
2600
;
b
m
->
bat_type
[
BATTERY_UNKNOWN
].
termination_vol
=
4150
;
b
m
->
bat_type
[
BATTERY_UNKNOWN
].
recharge_vol
=
4130
;
b
m
->
bat_type
[
BATTERY_UNKNOWN
].
normal_cur_lvl
=
520
;
b
m
->
bat_type
[
BATTERY_UNKNOWN
].
normal_vol_lvl
=
4200
;
}
/* select the battery resolution table */
for
(
i
=
0
;
i
<
bat
->
n_btypes
;
++
i
)
{
btype
=
(
bat
->
bat_type
+
i
);
if
(
thermistor
==
NTC_EXTERNAL
)
{
btype
->
batres_tbl
=
temp_to_batres_tbl_ext_thermistor
;
}
else
if
(
strncmp
(
bat_tech
,
"LION"
,
4
)
==
0
)
{
btype
->
batres_tbl
=
temp_to_batres_tbl_9100
;
if
(
of_property_read_bool
(
battery_node
,
"thermistor-on-batctrl"
))
{
if
(
strncmp
(
btech
,
"LION"
,
4
)
==
0
)
tmp_batres_tbl
=
temp_to_batres_tbl_9100
;
else
tmp_batres_tbl
=
temp_to_batres_tbl_thermistor
;
}
else
{
btype
->
batres_tbl
=
temp_to_batres_tbl_thermistor
;
}
bm
->
n_btypes
=
4
;
bm
->
bat_type
=
bat_type_ext_thermistor
;
bm
->
adc_therm
=
ABx500_ADC_THERM_BATTEMP
;
tmp_batres_tbl
=
temp_to_batres_tbl_ext_thermistor
;
}
of_node_put
(
np_bat_supply
);
/* select the battery resolution table */
for
(
i
=
0
;
i
<
bm
->
n_btypes
;
++
i
)
bm
->
bat_type
[
i
].
batres_tbl
=
tmp_batres_tbl
;
of_node_put
(
battery_node
);
return
0
;
}
drivers/power/ab8500_btemp.c
View file @
240fbe23
...
...
@@ -78,12 +78,13 @@ struct ab8500_btemp_ranges {
* @parent: Pointer to the struct ab8500
* @gpadc: Pointer to the struct gpadc
* @fg: Pointer to the struct fg
* @b
at: Pointer to the abx500_bm platform data
* @b
m: Platform specific battery management information
* @btemp_psy: Structure for BTEMP specific battery properties
* @events: Structure for information about events triggered
* @btemp_ranges: Battery temperature range structure
* @btemp_wq: Work queue for measuring the temperature periodically
* @btemp_periodic_work: Work for measuring the temperature periodically
* @initialized: True if battery id read.
*/
struct
ab8500_btemp
{
struct
device
*
dev
;
...
...
@@ -94,12 +95,13 @@ struct ab8500_btemp {
struct
ab8500
*
parent
;
struct
ab8500_gpadc
*
gpadc
;
struct
ab8500_fg
*
fg
;
struct
abx500_bm_data
*
b
at
;
struct
abx500_bm_data
*
b
m
;
struct
power_supply
btemp_psy
;
struct
ab8500_btemp_events
events
;
struct
ab8500_btemp_ranges
btemp_ranges
;
struct
workqueue_struct
*
btemp_wq
;
struct
delayed_work
btemp_periodic_work
;
bool
initialized
;
};
/* BTEMP power supply properties */
...
...
@@ -147,13 +149,13 @@ static int ab8500_btemp_batctrl_volt_to_res(struct ab8500_btemp *di,
return
(
450000
*
(
v_batctrl
))
/
(
1800
-
v_batctrl
);
}
if
(
di
->
b
at
->
adc_therm
==
ABx500_ADC_THERM_BATCTRL
)
{
if
(
di
->
b
m
->
adc_therm
==
ABx500_ADC_THERM_BATCTRL
)
{
/*
* If the battery has internal NTC, we use the current
* source to calculate the resistance, 7uA or 20uA
*/
rbs
=
(
v_batctrl
*
1000
-
di
->
b
at
->
gnd_lift_resistance
*
inst_curr
)
-
di
->
b
m
->
gnd_lift_resistance
*
inst_curr
)
/
di
->
curr_source
;
}
else
{
/*
...
...
@@ -209,7 +211,7 @@ static int ab8500_btemp_curr_source_enable(struct ab8500_btemp *di,
return
0
;
/* Only do this for batteries with internal NTC */
if
(
di
->
b
at
->
adc_therm
==
ABx500_ADC_THERM_BATCTRL
&&
enable
)
{
if
(
di
->
b
m
->
adc_therm
==
ABx500_ADC_THERM_BATCTRL
&&
enable
)
{
if
(
di
->
curr_source
==
BTEMP_BATCTRL_CURR_SRC_7UA
)
curr
=
BAT_CTRL_7U_ENA
;
else
...
...
@@ -241,7 +243,7 @@ static int ab8500_btemp_curr_source_enable(struct ab8500_btemp *di,
__func__
);
goto
disable_curr_source
;
}
}
else
if
(
di
->
b
at
->
adc_therm
==
ABx500_ADC_THERM_BATCTRL
&&
!
enable
)
{
}
else
if
(
di
->
b
m
->
adc_therm
==
ABx500_ADC_THERM_BATCTRL
&&
!
enable
)
{
dev_dbg
(
di
->
dev
,
"Disable BATCTRL curr source
\n
"
);
/* Write 0 to the curr bits */
...
...
@@ -457,9 +459,9 @@ static int ab8500_btemp_measure_temp(struct ab8500_btemp *di)
int
rbat
,
rntc
,
vntc
;
u8
id
;
id
=
di
->
b
at
->
batt_id
;
id
=
di
->
b
m
->
batt_id
;
if
(
di
->
b
at
->
adc_therm
==
ABx500_ADC_THERM_BATCTRL
&&
if
(
di
->
b
m
->
adc_therm
==
ABx500_ADC_THERM_BATCTRL
&&
id
!=
BATTERY_UNKNOWN
)
{
rbat
=
ab8500_btemp_get_batctrl_res
(
di
);
...
...
@@ -474,8 +476,8 @@ static int ab8500_btemp_measure_temp(struct ab8500_btemp *di)
}
temp
=
ab8500_btemp_res_to_temp
(
di
,
di
->
b
at
->
bat_type
[
id
].
r_to_t_tbl
,
di
->
b
at
->
bat_type
[
id
].
n_temp_tbl_elements
,
rbat
);
di
->
b
m
->
bat_type
[
id
].
r_to_t_tbl
,
di
->
b
m
->
bat_type
[
id
].
n_temp_tbl_elements
,
rbat
);
}
else
{
vntc
=
ab8500_gpadc_convert
(
di
->
gpadc
,
BTEMP_BALL
);
if
(
vntc
<
0
)
{
...
...
@@ -491,8 +493,8 @@ static int ab8500_btemp_measure_temp(struct ab8500_btemp *di)
rntc
=
230000
*
vntc
/
(
VTVOUT_V
-
vntc
);
temp
=
ab8500_btemp_res_to_temp
(
di
,
di
->
b
at
->
bat_type
[
id
].
r_to_t_tbl
,
di
->
b
at
->
bat_type
[
id
].
n_temp_tbl_elements
,
rntc
);
di
->
b
m
->
bat_type
[
id
].
r_to_t_tbl
,
di
->
b
m
->
bat_type
[
id
].
n_temp_tbl_elements
,
rntc
);
prev
=
temp
;
}
dev_dbg
(
di
->
dev
,
"Battery temperature is %d
\n
"
,
temp
);
...
...
@@ -513,7 +515,7 @@ static int ab8500_btemp_id(struct ab8500_btemp *di)
u8
i
;
di
->
curr_source
=
BTEMP_BATCTRL_CURR_SRC_7UA
;
di
->
b
at
->
batt_id
=
BATTERY_UNKNOWN
;
di
->
b
m
->
batt_id
=
BATTERY_UNKNOWN
;
res
=
ab8500_btemp_get_batctrl_res
(
di
);
if
(
res
<
0
)
{
...
...
@@ -522,23 +524,23 @@ static int ab8500_btemp_id(struct ab8500_btemp *di)
}
/* BATTERY_UNKNOWN is defined on position 0, skip it! */
for
(
i
=
BATTERY_UNKNOWN
+
1
;
i
<
di
->
b
at
->
n_btypes
;
i
++
)
{
if
((
res
<=
di
->
b
at
->
bat_type
[
i
].
resis_high
)
&&
(
res
>=
di
->
b
at
->
bat_type
[
i
].
resis_low
))
{
for
(
i
=
BATTERY_UNKNOWN
+
1
;
i
<
di
->
b
m
->
n_btypes
;
i
++
)
{
if
((
res
<=
di
->
b
m
->
bat_type
[
i
].
resis_high
)
&&
(
res
>=
di
->
b
m
->
bat_type
[
i
].
resis_low
))
{
dev_dbg
(
di
->
dev
,
"Battery detected on %s"
" low %d < res %d < high: %d"
" index: %d
\n
"
,
di
->
b
at
->
adc_therm
==
ABx500_ADC_THERM_BATCTRL
?
di
->
b
m
->
adc_therm
==
ABx500_ADC_THERM_BATCTRL
?
"BATCTRL"
:
"BATTEMP"
,
di
->
b
at
->
bat_type
[
i
].
resis_low
,
res
,
di
->
b
at
->
bat_type
[
i
].
resis_high
,
i
);
di
->
b
m
->
bat_type
[
i
].
resis_low
,
res
,
di
->
b
m
->
bat_type
[
i
].
resis_high
,
i
);
di
->
b
at
->
batt_id
=
i
;
di
->
b
m
->
batt_id
=
i
;
break
;
}
}
if
(
di
->
b
at
->
batt_id
==
BATTERY_UNKNOWN
)
{
if
(
di
->
b
m
->
batt_id
==
BATTERY_UNKNOWN
)
{
dev_warn
(
di
->
dev
,
"Battery identified as unknown"
", resistance %d Ohm
\n
"
,
res
);
return
-
ENXIO
;
...
...
@@ -548,13 +550,13 @@ static int ab8500_btemp_id(struct ab8500_btemp *di)
* We only have to change current source if the
* detected type is Type 1, else we use the 7uA source
*/
if
(
di
->
b
at
->
adc_therm
==
ABx500_ADC_THERM_BATCTRL
&&
di
->
b
at
->
batt_id
==
1
)
{
if
(
di
->
b
m
->
adc_therm
==
ABx500_ADC_THERM_BATCTRL
&&
di
->
b
m
->
batt_id
==
1
)
{
dev_dbg
(
di
->
dev
,
"Set BATCTRL current source to 20uA
\n
"
);
di
->
curr_source
=
BTEMP_BATCTRL_CURR_SRC_20UA
;
}
return
di
->
b
at
->
batt_id
;
return
di
->
b
m
->
batt_id
;
}
/**
...
...
@@ -569,6 +571,13 @@ static void ab8500_btemp_periodic_work(struct work_struct *work)
struct
ab8500_btemp
*
di
=
container_of
(
work
,
struct
ab8500_btemp
,
btemp_periodic_work
.
work
);
if
(
!
di
->
initialized
)
{
di
->
initialized
=
true
;
/* Identify the battery */
if
(
ab8500_btemp_id
(
di
)
<
0
)
dev_warn
(
di
->
dev
,
"failed to identify the battery
\n
"
);
}
di
->
bat_temp
=
ab8500_btemp_measure_temp
(
di
);
if
(
di
->
bat_temp
!=
di
->
prev_bat_temp
)
{
...
...
@@ -577,9 +586,9 @@ static void ab8500_btemp_periodic_work(struct work_struct *work)
}
if
(
di
->
events
.
ac_conn
||
di
->
events
.
usb_conn
)
interval
=
di
->
b
at
->
temp_interval_chg
;
interval
=
di
->
b
m
->
temp_interval_chg
;
else
interval
=
di
->
b
at
->
temp_interval_nochg
;
interval
=
di
->
b
m
->
temp_interval_nochg
;
/* Schedule a new measurement */
queue_delayed_work
(
di
->
btemp_wq
,
...
...
@@ -806,7 +815,7 @@ static int ab8500_btemp_get_property(struct power_supply *psy,
val
->
intval
=
1
;
break
;
case
POWER_SUPPLY_PROP_TECHNOLOGY
:
val
->
intval
=
di
->
b
at
->
bat_type
[
di
->
bat
->
batt_id
].
name
;
val
->
intval
=
di
->
b
m
->
bat_type
[
di
->
bm
->
batt_id
].
name
;
break
;
case
POWER_SUPPLY_PROP_TEMP
:
val
->
intval
=
ab8500_btemp_get_temp
(
di
);
...
...
@@ -967,6 +976,7 @@ static char *supply_interface[] = {
static
int
ab8500_btemp_probe
(
struct
platform_device
*
pdev
)
{
struct
device_node
*
np
=
pdev
->
dev
.
of_node
;
struct
abx500_bm_data
*
plat
=
pdev
->
dev
.
platform_data
;
struct
ab8500_btemp
*
di
;
int
irq
,
i
,
ret
=
0
;
u8
val
;
...
...
@@ -976,21 +986,19 @@ static int ab8500_btemp_probe(struct platform_device *pdev)
dev_err
(
&
pdev
->
dev
,
"%s no mem for ab8500_btemp
\n
"
,
__func__
);
return
-
ENOMEM
;
}
di
->
bat
=
pdev
->
mfd_cell
->
platform_data
;
if
(
!
di
->
bat
)
{
if
(
!
plat
)
{
dev_err
(
&
pdev
->
dev
,
"no battery management data supplied
\n
"
);
return
-
EINVAL
;
}
di
->
bm
=
plat
;
if
(
np
)
{
ret
=
bmdevs_of_probe
(
&
pdev
->
dev
,
np
,
&
di
->
bat
);
ret
=
ab8500_bm_of_probe
(
&
pdev
->
dev
,
np
,
di
->
bm
);
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"failed to get battery information
\n
"
);
dev_err
(
&
pdev
->
dev
,
"failed to get battery information
\n
"
);
return
ret
;
}
}
else
{
dev_err
(
&
pdev
->
dev
,
"missing dt node for ab8500_btemp
\n
"
);
return
-
EINVAL
;
}
}
else
{
dev_info
(
&
pdev
->
dev
,
"falling back to legacy platform data
\n
"
);
}
/* get parent data */
...
...
@@ -998,6 +1006,8 @@ static int ab8500_btemp_probe(struct platform_device *pdev)
di
->
parent
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
di
->
gpadc
=
ab8500_gpadc_get
(
"ab8500-gpadc.0"
);
di
->
initialized
=
false
;
/* BTEMP supply */
di
->
btemp_psy
.
name
=
"ab8500_btemp"
;
di
->
btemp_psy
.
type
=
POWER_SUPPLY_TYPE_BATTERY
;
...
...
@@ -1022,10 +1032,6 @@ static int ab8500_btemp_probe(struct platform_device *pdev)
INIT_DEFERRABLE_WORK
(
&
di
->
btemp_periodic_work
,
ab8500_btemp_periodic_work
);
/* Identify the battery */
if
(
ab8500_btemp_id
(
di
)
<
0
)
dev_warn
(
di
->
dev
,
"failed to identify the battery
\n
"
);
/* Set BTEMP thermal limits. Low and Med are fixed */
di
->
btemp_ranges
.
btemp_low_limit
=
BTEMP_THERMAL_LOW_LIMIT
;
di
->
btemp_ranges
.
btemp_med_limit
=
BTEMP_THERMAL_MED_LIMIT
;
...
...
drivers/power/ab8500_charger.c
View file @
240fbe23
This diff is collapsed.
Click to expand it.
drivers/power/ab8500_fg.c
View file @
240fbe23
This diff is collapsed.
Click to expand it.
drivers/power/abx500_chargalg.c
View file @
240fbe23
This diff is collapsed.
Click to expand it.
include/linux/mfd/abx500.h
View file @
240fbe23
...
...
@@ -279,9 +279,9 @@ enum {
NTC_INTERNAL
,
};
int
bmdevs
_of_probe
(
struct
device
*
dev
,
int
ab8500_bm
_of_probe
(
struct
device
*
dev
,
struct
device_node
*
np
,
struct
abx500_bm_data
**
battery
);
struct
abx500_bm_data
*
bm
);
int
abx500_set_register_interruptible
(
struct
device
*
dev
,
u8
bank
,
u8
reg
,
u8
value
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment